1 Docker概述
Docker和虛擬機一樣,都擁有環境隔離的能力,但它比虛擬機更加輕量級,可以使資源更大化地得到應用。首先來看Docker的架構圖:

理解其中幾個概念:
- Client(Docker客戶端):是Docker的用戶界面,可以接受用戶命令(docker build,docker pull...)和配置標識,並與Docker daemon通信
- Images(Docker鏡像):是一個只讀模板,含創建Docker容器的說明,它與操作系統的安裝光盤有點像
- Containers(容器):鏡像的運行實例,鏡像與容器的關系類比面向對象中的類和對象
- Registry:是一個集中存儲與分發鏡像的服務。最常用的Docker Registry是官方的Docker Hub
2 Docker安裝
CentOS7系統下安裝Docker為例。Docker 軟件包和依賴包已經包含在默認的 CentOS-Extras 軟件源里,安裝命令如下:
yum -y install docker
啟動docker后台服務:
service docker start
驗證是否安裝成功:
[root@localhost hemi]# docker version Client: Version: 1.13.1 API version: 1.26 Package version: <unknown> Go version: go1.8.3 Git commit: 774336d/1.13.1 Built: Wed Mar 7 17:06:16 2018 OS/Arch: linux/amd64 Server: Version: 1.13.1 API version: 1.26 (minimum version 1.12) Package version: <unknown> Go version: go1.8.3 Git commit: 774336d/1.13.1 Built: Wed Mar 7 17:06:16 2018 OS/Arch: linux/amd64 Experimental: false
更詳細的針對各操作系統的安裝見官方文檔:https://docs.docker.com/install/
鏡像加速
鑒於國內網絡問題,后續拉取 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"] }
3 Docker常用命令
3.1 鏡像常用命令
1)搜索鏡像
可以在Docker Hub主頁上搜索鏡像,可以通過docker search命令搜索,如:
docker search [OPTIONS] TERM
OPTIONS說明:
- --automated : 只列出 automated build類型的鏡像;
- --no-trunc : 顯示完整的鏡像描述;
- -s : 列出收藏數不小於指定值的鏡像。
[root@localhost hemi]# docker search -s 20 tomcat INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED docker.io docker.io/tomcat Apache Tomcat is... 1757 [OK] docker.io docker.io/dordoka/tomcat Ubuntu 14.04, Or... 48 [OK] docker.io docker.io/tomee Apache TomEE is ... 47 [OK] docker.io docker.io/davidcaste/alpine-tomcat Apache Tomcat 7/... 24 [OK]
其中,
STARTS:鏡像倉庫收藏數
AUTOMATED:表示是否是自動構建的鏡像倉庫
2)下載鏡像
docker pull [OPTIONS] NAME[:TAG]
OPTIONS說明:
- -a :拉取所有 tagged 鏡像
- --disable-content-trust :忽略鏡像的校驗,默認開啟
舉個栗子
docker pull java #從Docker Hub中下載最新版本的Java鏡像 docker pull reg.itmuch.com/java:8 #從指定Registry中下載標簽為8的Java鏡像
3)列出鏡像
docker images [OPTIONS] [REPOSITORY[:TAG]]
OPTIONS說明:
- -a :列出本地所有的鏡像(含中間映像層,默認情況下,過濾掉中間映像層);
- --digests :顯示鏡像的摘要信息
- -f :顯示滿足條件的鏡像;
- --format :指定返回值的模板文件;
- --no-trunc :顯示完整的鏡像信息;
- -q :只顯示鏡像ID。
舉個栗子:
列出本地鏡像中REPOSITORY為ubuntu的鏡像列表
[hemi@localhost ~]$ docker images ubuntu REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/ubuntu latest 0458a4468cbc 7 weeks ago 111.7 MB docker.io/ubuntu 15.10 9b9cb95443b5 20 months ago 137.2 MB
4)刪除本地鏡像
docker rmi [OPTIONS] IMAGE [IMAGE...]
OPTIONS說明:
- -f :強制刪除;
- --no-prune :不移除該鏡像的過程鏡像,默認移除;
3.2 容器常用命令
1)新建並啟動容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS說明(常用):
- -d: 后台運行容器,並返回容器ID;
- --name="nginx-lb": 為容器指定一個名稱;
- -i:以交互模式運行容器,通常與 -t 同時使用;
- -t:為容器重新分配一個偽輸入終端,通常與 -i 同時使用;
- -P: 隨機端口映射;
- -p: 指定端口映射,有以下四種格式
- ip:hostPort:containerPort
- ip::containerPort
- hostPort:containerPort
- containerPort
- --net="bridge": 指定容器的網絡連接類型,支持 bridge/host/none/container:<name|id> 四種類型;
如:
docker run --name mynginx -d nginx:latest #使用docker鏡像nginx:latest以后台模式啟動一個容器,並將容器命名為mynginx。 docker run -p 91:80 -v /data:/data -d nginx:latest #使用鏡像nginx:latest以后台模式啟動一個容器,將容器的80端口映射到主機的91端口,主機的目錄/data映射到容器的/data。
[hemi@localhost ~]$ docker run -it nginx:latest /bin/bash
root@b8573233d675:/#
#使用鏡像nginx:latest以交互模式啟動一個容器,在容器內執行/bin/bash命令。
2)列出容器
docker ps [OPTIONS]
OPTIONS說明(常用):
- -a :顯示所有的容器,包括未運行的。
- -f :根據條件過濾顯示的內容。
- --format :指定返回值的模板文件。
- -l :顯示最近創建的容器。
- -n :列出最近創建的n個容器。
- --no-trunc :不截斷輸出。
- -q :靜默模式,只顯示容器編號。
- -s :顯示總的文件大小。
3)停止容器
docker stop CONTAINER_ID/CONTAIN_NAME
4)強制停止容器
docker kill CONTAINER_ID/CONTAIN_NAME
5)啟動已停止容器
docker start CONTAINER_ID/CONTAIN_NAME
6)重啟容器
docker restart CONTAINER_ID/CONTAIN_NAME
7)進入容器
docker exec -it CONTAINER_ID bash
如:
[hemi@localhost ~]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 219371844a81 7f94db72116e "tomcat.sh" 7 seconds ago Up 7 seconds 8009/tcp, 8080/tcp, 0.0.0.0:91->80/tcp zen_kalam [hemi@localhost ~]$ docker exec -it 219371844a81 bash bash-4.2$
8)刪除容器
docker rm [OPTIONS] CONTAINER [CONTAINER...]
OPTIONS說明(常用):
- -f :通過SIGKILL信號強制刪除一個運行中的容器
- -l :移除容器間的網絡連接,而非容器本身
- -v :-v 刪除與容器關聯的卷
更多命令見Docker的官方文檔:https://docs.docker.com/edge/engine/reference/commandline/
也可以利用命令行查看,如:
docker rm --help
4 入門實戰



此時瀏覽器訪問結果如下表示正常 

再次訪問瀏覽器如下結果,表示修改正常

但是此時如果重啟容器,則之前的改動將失效。若要保存修改可以提交保存為新鏡像↓

此過程還可以用Dockerfile完成
1、首先新建Dockerfile,內容如下:

2、在Dockerfile所在路徑執行以下命令構建鏡像,並運行:

瀏覽器訪問

Dockerfile官方文檔:https://docs.docker.com/engine/reference/builder/
Dockerfile最佳實踐:https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
5 Docker Compose
Docker Compose用來定義和運行多應用容器。使用Docker Compose大致有3個步驟:
- 使用Dockerfile定義應用程序環境,應標在任何地方重現該環境
- 在docker-compose.yml文件中定義組成應用程序的服務,以便各個服務在一個隔離的環境中一起運行
- 運行docker-compose up 命令,啟動並運行整個應用程序
5.1 安裝Compose
①通過以下命令自動下載並安裝適應系統版本的Compose:
curl -L "https://github.com/docker/compose/releases/download/1.10.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
②為安裝腳本添加執行權限:
chmod +x /usr/local/bin/docker-compose
安裝完成。可以使用以下命令測試安裝結果:
ocker-compose --version
5.2 安裝Compose命令補全工具
curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose
輸入docker-compose並按下Tab鍵,compose就可以自動補全命令了。
5.3 入門實例
個人博客實例,含三個層,分別為nginx、ghost app、mysql
1、創建3個目錄

2、進入ghost目錄,創建兩個文件
① Dockerfile
FROM ghost COPY ./config.production.json /var/lib/ghost/config.production.json EXPOSE 2368
②config.production.json
{ "url": "http://localhost:2368/", "server": { "port": 2368, "host": "0.0.0.0" }, "database": { "client": "mysql", "connection": { "host": "db", "user": "ghost", "password": "ghost", "database": "ghost", "port": 3306, "charset": "utf8" } }, "mail": { "transport": "Direct" }, "logging": { "transports": [ "file", "stdout" ] }, "process": "systemd", "paths": { "contentPath": "/var/lib/ghost/content" } }
3、進入nginx目錄,配置
①Dockerfile
FROM docker.io/nginx COPY nginx.conf /etc/nginx/nginx.conf EXPOSE 80
②nginx.conf
worker_processes 4; events {worker_connections 1024;} http { server { listen 80; location / { proxy_pass http://ghost-app:2368; } } }
4、配置docker-compose.yml
在blog目錄下創建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"
以上即可。隨后在docker-compose.yml所在目錄build鏡像並運行
docker-compost stop #停止容器 docker-compose rm #刪除容器 docker-compose build #重新建立 docker-compose up -d #啟動運行
docker-compose命令-官方文檔:https://docs.docker.com/compose/reference/overview/
