史上最全面的Docker構建工具教程
Docker 是一個開源的應用容器引擎,基於 Go 語言] 並遵從Apache2.0協議開源。Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然後發布到任何流行的 Linux 機器上,也可以實現虛擬化。Docker 使用客戶端-服務器 (C/S) 架構模式,使用遠程API來管理和創建Docker容器。
Docker有免費的CE社區版和收費的EE企業版,本文安裝的是CE版本。
1.Docker安裝
1.1 檢查
Docker 要求 CentOS 系統的內核版本高於 3.10 ,可以通過 uname -r 命令查看你當前的內核版本。
如果CentOS版本是7以上並且為64位,那是完全沒用問題的。
1.2 安裝
安裝一些必要系統工具:
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
添加軟件源信息:
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新 yum 緩存:
sudo yum makecache fast
安裝 Docker-ce:
sudo yum -y install docker-ce
啟動 Docker 後臺服務
sudo systemctl start docker
測試運行 hello-world
docker run hello-world
由於本地沒有hello-world這個鏡像,所以會下載一個hello-world的鏡像,並在容器內運行。
1.3 鏡像加速
例如在使用Maven時我們一般會配置阿裏雲國內鏡像加速,在使用Docker時也是如此。我使用的是網易的鏡像地址:http://hub-mirror.c.163.com。
新版的 Docker 使用 /etc/docker/daemon.json(Linux) 或者 %programdata%\docker\config\daemon.json(Windows) 來配置 Daemon。
請在該配置文件中加入(沒有該文件的話,請先建一個):
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
1.4 卸載Docker
執行以下命令來刪除 Docker CE:
$ sudo yum remove docker-ce
$ sudo rm -rf /var/lib/docker
2.實戰Nginx
2.1 查找Docker Hub上的 nginx 鏡像
docker search nginx
2.2 拉取官方鏡像
docker pull nginx
2.3 拉取成功查看本地鏡像
docker images nginx
2.4 啟動Nginx服務器
docker run -p 8080:80 -d nginx
- -p 8080:80:將本機8080端口映射到Nginx容器的80端口
- -d:後臺啟動
2.5 查看Docker當前運行
docker ps
2.6 訪問測試
2.7 拷貝本地文件到容器內
把當前目錄下的index.html文件拷貝到容器內,替換Nginx的默認首頁。
docker cp index.html dbfc48660aeb://usr/share/nginx/html
dbfc48660aeb是容器內Nginx運行的ID,/usr/share/nginx/html是容器內Nginx的首頁默認路徑。
再次訪問瀏覽器,可以看到首頁已經更換為我們自定義的文件內容。
2.8 停止Docker容器
docker stop ID
刷新瀏覽器,訪問提示無法連接。
2.9 保存容器內更改
再次運行Nginx容器,訪問首頁,發現更改的首頁又復原了。如圖:
這是因為在更改後沒有提交保存導致的。也就是需要下面這句命令:
docker commit -m 'fun' aaef9a68525a nginx-fun
- -a ‘ author‘:作者名
- -m ‘fun‘:是說明文字;
- aaef9a68525a:容器ID,通過ps命令獲取;
- nginx-fun:新生成的image鏡像名稱;
然後查看現有鏡像:
發現新生成了一個nginx-fun鏡像。
2.10 刪除容器
雖然有些容器已經停止了,但是還存有信息,可以通過docker ps -a
查看,再通過docker rm [CONTAINER ID]
刪除。
3.Docker命令小結
命令 | 用途 |
---|---|
docker pull | 獲取image |
docker build | 創建image |
docker images | 列出image |
docker run | 運行container |
docker ps | 列出container |
docker rm | 刪除container |
docker rmi | 刪除image |
docker cp | 在host和container之間拷貝文件 |
docker commit | 保存改動為新的image |
4.DockerFile創建鏡像
創建文件Dockerfile文件,該文件名不可更改
vi Dockerfile
寫入文本
FROM alpine:latest
MAINTAINER smilevt
CMD echo "Hello Docker!
保存退出
docker build命令用於使用 Dockerfile 創建鏡像,
docker build -t hello_docker .
- -t : 鏡像的名字及標簽,通常 name:tag 或者 name
- path : .點代表當前路徑下的所有文件。
運行結果:
查看是否成功創建鏡像並運行
5.Dockerfile安裝Nginx
再次新建文件夾並新建Dockerfile文件,寫入以下內容;
FROM ubuntu
MAINTAINER anthor
RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y nginx
COPY index.html /var/www/html
ENTRYPOINT ["usr/sbin/nginx", "-g", "daemon off;"]
EXPOSE 80
簡單說一下文本含義:從(FROM)ubuntu容器中運行(RUN)3條命令,第一條是修改archive.ubuntu.com為mirrors.ustc.edu.cn國內鏡像,第二、三條是安裝nginx,然後復制(COPY)index.html到容器內,提供容器進入點(ENTRYPOINT),使nginx在前臺運行,之所以使用數組是為了隔開命令,最後暴露80端口。
接下來新建index.html文件,執行build命令創建鏡像:
docker build -t hello-nginx:tag .
使用run命令啟動該hello-nginx容器:
docker run -p 8080:80 -d hello-nginx:tag
測試訪問host:8080端口如下:
可以看到,Nginx成功啟動,並輸出自定義的index.html。
6.Dockerfile命令小結
命令 | 用途 |
---|---|
FROM | base image |
RUN | 執行命令 |
ADD | 添加文件 |
COPY | 拷貝文件 |
CMD | 執行文件 |
EXPOSE | 暴露端口 |
WORKDIR | 指定路徑 |
MAINTAINER | 維護者 |
ENV | 設定環境 |
ENTRYPOINT | 容器入口 |
USER | 指定用戶 |
VOLUME | mount point |
7.鏡像分層
Dockerfile的每一行都會產生一個新層(新ID),比如:
已經存在image裏面的層是只讀的,一旦鏡像運行為容器之後,就會產生一個新層(RW讀寫),分層的好處就是多個image可以共享相同的層,減少存儲大小。
8.Volume
我們知道,Docker容器中的改動是不會被保存的,為了能夠保存(持久化)數據以及共享容器間的數據,Docker提出了Volume的概念。簡單來說,Volume就是目錄或者文件,它可以繞過默認的聯合文件系統,而以正常的文件或者目錄的形式存在於宿主機上。 比如在使用數據庫時就可以使用Volume。
9.Volume操作
說白了,Volume只是-v參數而已。容器和宿主機目錄掛載的三種方式:
1.第一種方式
運行Nginx容器,-d:後臺運行,--name:指定名稱nginx,-v /usr/share/nginx/html:運行容器內部用來訪問網頁的地址,最後的nginx是鏡像名。
docker run -d --name nginx -v /usr/share/nginx/html nginx
獲取容器/鏡像的元數據
docker inspect nginx
可以看到宿主機目錄Source和容器內目錄Destination:
繼續查看宿本機目錄:
註意:如果是mac,則該路徑不是mac上的實際路徑,因為mac上運行docker是還有一層虛擬層,這是docker虛擬層中的路徑,可以在docker中訪問到
2.第二種方式
在啟動Nginx容器時使用-v參數掛載本地目錄到容器目錄
docker run -p 8080:80 --name mynginx -v $PWD:/usr/share/nginx/html -d nginx
這句命令使用PWD環境變量(該變量始終指向當前目錄)將當前目錄掛載到容器/usr/share/nginx/html目錄。
我們訪問主機8080端口
報錯403,因為當前目錄啥也沒有,沒有index.html文件。在當前目錄新建該html文件,輸入hello,訪問網頁
3.第三種方式
使用 docker create 創建一個新的容器但不啟動它:
docker create -v $PWD/data:/var/mydata --name data_container ubuntu
宿主機目錄:$PWD/data
docker目錄:/var/mydata
容器名:data_container
基礎鏡像:ubuntu
啟動 ubuntu 容器鏡像(默認ubuntu基礎鏡像沒有服務):
docker run -it --volumes-from data_container ubuntu /bin/bash
- -it: 以交互模式運行容器,並為容器重新分配一個偽輸入終端
- --volumes-from data_container:以另外一個容器掛載
- 最後在容器內執行/bin/bash命令
進入到容器控制臺後輸入mount,查看掛載:
我們在/var/mydata目錄下新建whatever.txt文件後退出,進入data目錄查看,可以看到剛剛新建的txt文件。
10.Registry介紹
Registry 是鏡像倉庫,我們可以從鏡像倉庫中拉取一些鏡像到本地,也可以提交鏡像到倉庫。
一些術語:
ENGLISH | 中文 |
---|---|
host | 宿主機 |
image | 鏡像 |
container | 容器 |
registry | 倉庫 |
daemon | 守護程序 |
client | 客戶端 |
與registry倉庫的交互:
查找鏡像
docker search whalesay
拖取鏡像
docker pull whalesay
推送鏡像
docker push myname/whalesay
國內的docker鏡像倉庫:
daoclou
時速雲
aliyun
11.Registry實戰
1.查找鏡像
STARS可以理解為點贊數,默認是按照這個排序的。
2.拉取鏡像
3.查看鏡像
可以看到,REPOSITORY是鏡像名,TAG是默認的latest,正常情況是版本號,這兩個比較重要。
CREATED是創建時間,SIZE是占用空間的大小。
4.運行鏡像
5.標記鏡像
使用docker tag命令標記本地鏡像,將其歸入某一倉庫。
docker tag docker/whalesay myhaleasy:tag
6.上傳鏡像
可以使用docker push命令上傳本地鏡像到倉庫,但是需要註冊登錄。
註冊登錄地址:https://hub.docker.com
執行登錄命令,輸入用戶名與密碼即可。
docker login
上傳鏡像前還需要在Docker官網個人中心創建該鏡像。
12.Compose多容器應用
Compose 是一個用戶定義和運行多個容器的 Docker 應用程序。在 Compose 中你可以使用 YAML 文件來配置你的應用服務。然後,只需要一個簡單的命令,就可以創建並啟動你配置的所有服務。
docker-compose 安裝
1.Mac/Windows:
? 安裝docker的時候附帶安裝了。
2.Linux:
curl https://github.com/docker/compose
Linux安裝
執行命令
curl -L https://github.com/docker/compose/releases/download/1.9.0/docker-compose-$(uname -s)-$(uname -m) > /usr/local/bin/docker-compose
該命令會下載文件到(>)/usr/local/bin/docker-compose,在下載地址中使用$(uname -s)是獲取 unmae -s 命令的輸出加到路徑中。
下載完成後,可以設置該目錄的權限為777,意為所有人都可以讀寫該目錄,最後使用 docker-compose --version
檢查是否安裝成功。
13.Compose搭建博客網站
接下來我們使用docker-compose搭建一個含nginx+ghost+db的博客網站。
1.準備
首先創建如下目錄結構:
ghost
- ghost
- Dockfile
- config.js
- nginx
- nginx.conf
- Dockfile
- data
- docker-compose.yml
每個文件的具體內容有:
- ghost/ghost/Dockfile
過時的配置(不使用)
FROM ghost
COPY ./config.js /var/lib/ghost/config.js
EXPOSE 2368
CMD ["npm","start","--production"]
最新版的官方鏡像, 把配置文件改到/var/lib/ghost/content/ ,然後註釋掉了 CMD["npm","start","--production"] 即可。
FROM ghost
COPY ./config.js /var/lib/ghost/content/
EXPOSE 2368
- ghost/ghost/config.js
var path = require('path'),
config;
config = {
production: {
url: 'http://mytestblog.com',
mail: {},
database: {
client: 'mysql',
connection: {
host: 'db',
user: 'ghost',
password: 'ghost',
database: 'ghost',
port: '3306',
charset: 'utf8'
},
debug: false
},
paths: {
contentPath: path.join(process.env.GHOST_CONTENT, '/')
},
server: {
host: '0.0.0.0',
port: '2368'
}
}
};
module.exports = config;
- ghost/nginx/Dockerfile
FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
- ghost/nginx/nginx.conf
worker_processes 4;
events {worker_connections 1024;}
http {
server {
listen 80;
location / {
proxy_pass http://ghost-app:2368;
}
}
}
- ghost/docker-compose.yml
version: '2'
networks:
ghost:
services:
ghost-app:
build: ghost
networks:
- ghost
depends_on:
- db
ports:
- "2368:2368"
nginx:
build: nginx
networks:
- ghost
depends_on:
- ghost-app
ports:
- "80:80"
db:
image: "mysql:5.7.15"
networks:
- ghost
environment:
MYSQL_ROOT_PASSWORD: mysqlroot
MYSQL_USER: ghost
MYSQL_PASSWORD: ghost
volumes:
- $PWD/data:/var/lib/mysql
ports:
- "3306:3306"
此處數據庫相關的配置要和config.js中的配置(user、password)保持一致。
一旦我們為一個服務指定了一個名字(db),它就可以被其它服務所解析。
nginx 中proxy_pass 設置成 http://ghost-app:2368 也是因為在docker-compose.yml 指定了服務是ghost-app。
2.啟動
將所有容器啟動,並以daemon的方式後臺運行。第一次不需要build,因為會自動創建鏡像。
docke-compose up -d
3.查看應用
docker-compose ps
因為文件內容輸入有誤,導致啟動未成功,修改文件後還需要停止、刪除掉容器再重新構建才行。
4.停止(+)
停止所有容器
docker-compose stop
5.刪除(+)
刪除時需要輸入y手動確認
docker-compose rm
6.構建(+)
非首次運行就需要手動創建鏡像了
docker-compose build
最後,在ghost目錄下再次啟動!
7.測試
訪問域名進入搭建的博客網站,可以註冊賬號發布博客。
`
關於ghost的使用這裏不做過多介紹。
14.docker-compose.yml常用命令
命令 | 用途 |
---|---|
build | 本地創建鏡像 |
command | 覆蓋缺省命令 |
depends_on | 連接容器 |
ports | 暴露端口 |
volumes | 卷 |
image | pull鏡像 |
up | 啟動服務 |
stop | 停止服務 |
rm | 刪除服務中的各個容器 |
logs | 觀察各個容器的日誌 |
ps | 列出服務相關的容器 |
6.Docker資源鏈接
Docker官方英文資源
docker官網:http://www.docker.com
Docker中文資源
Docker中文網站:https://www.docker-cn.com/
Docker安裝手冊:https://docs.docker-cn.com/engine/installation/
Docker 國內鏡像
網易加速器:http://hub-mirror.c.163.com
官方中國加速器:https://registry.docker-cn.com
ustc的鏡像:https://docker.mirrors.ustc.edu.cn
daocloud:https://www.daocloud.io/mirror#accelerator-doc(註冊後使用)
史上最全面的Docker構建工具教程