Docker Compose是一個定義和管理多容器的工具,也是一種容器編排工具,前身是Pig,使用Python語言編寫。使用Docker Compose配置文件描述多個容器應用的架構,比如使用什麼鏡像、數據卷、網絡、映射端口等;然後一條命令管理所有服務,比如啓動、停止、重啓等。
Docker Compose的安裝:
1)下載二進制文件
wget https://github.com/docker/compose/releases/download/1.13.0/docker-compose-`uname -s`-`uname -m`
2)添加可執行權限
mv docker-compose-Linux-x86_64 /usr/bin/docker-compose
chmod +x /usr/bin/docker-compose
3)驗證安裝結果
[root@centos7 ~]# docker-compose --version
docker-compose version 1.13.0, build 1719ceb
Docker Compose的使用:
docker compose 將所管理的容器分爲三層,分別是工程(project),服務以及容器。docker compose運行目錄下的所有文件(docker-compose.yml,extends文件或環境變量文件等)組成一個工程(默認爲docker-compose.yml所在目錄的名稱)。一個工程可包含多個服務,每個服務中定義了容器運行的鏡像,參數和依賴,一個服務可包括多個容器實例
Docker Compose的操作步驟:
使用 dockerfile 定義應用程序環境,以便在任何地方重現該環境
在docker-compose.yml文件中定義組成應用程序的服務,以便各個服務在一個隔離的環境中一起運行
運行 docker-compose up 命令,啓動並運行整個應用程序
前面已經介紹過dockerfile,所以這裏介紹一下Docker Compose的配置文件。Docker Compose使用YAML作爲其配置文件格式,在docker-compose.yml文件中定義了容器的鏡像、參數、端口、啓動順序等。YAML是一種標記語言很直觀的數據序列化格式,可讀性高,類似於XML數據描述語言,但語法比XML簡單很多。YAML數據結構通過縮進來表示,連續的項目通過減號來表示,鍵值對用冒號分隔,數組用中括號括起來,hash用花括號括起來。
YAML文件格式注意事項:
不支持製表符tab鍵縮進,需要使用空格縮進;
通常開頭縮進2個空格;
字符後縮進1個空格,如冒號、逗號、橫槓;
用#進行註釋;
如果包含特殊字符用單引號引起來;
布爾值(true、false、yes、no、on、off)必須用引號括起來,這樣分析器會將它們解釋爲字符串;
Compose配置文件常用參數:
build:構建鏡像上下文路徑
dockerfile:指定dockerfile文件名
image:來自鏡像
args:構建參數,在dockerfile中指定的參數
command:覆蓋默認命令
container_name:自定義容器名稱。如果自定義名稱,則無法將服務scale到1容器之外
deploy:指定與部署和運行相關的配置。限版本3
depends_on:服務之間的依賴,控制服務啓動順序,正常是按順序啓動服務
dns:自定義DNS服務器,可以是單個值或列表
entrypoint:覆蓋entrypoint
env_file:從文件添加環境變量,可以是單個值或列表
environment:添加環境變量,可以是數組或字典,布爾值用引號括起來
expose:聲明容器服務端口
links:連接到另一個容器
external_links:連接Compose之外的容器
extra_hosts:添加主機名映射,與--add-host相同
logging:記錄該服務的日誌,與--log-driver相同
network_mode:網絡模式,與--net相同
networks:要加入的網絡
pid:將PID模式設置主機PID模式,與宿主機共享PID地址空間,如pid: "host"
ports:暴露端口,與-p相同,但端口不低於60
sysctls:在容器內設置內核參數,可以是數組或字典
ulimits:覆蓋容器的默認ulimits
volumes:掛載一個目錄或一個已存在的數據卷容器到容器
restart:默認no,可選參數always|on-failure|unless-stopped
hostname:主機名
working_dir:工作目錄
docker-compose.yml示例:
[root@centos7 compose_proj01]# cat docker-compose.yml version: '3' services: nginx: hostname: nginx build: context: ./nginx dockerfile: Dockerfile ports: - "80:80" links: - "tomcat01:tomcat01" - "tomcat02:tomcat02" volumes: - ./webapps:/usr/local/nginx/html depends_on: - tomcat01 - tomcat02 tomcat01: hostname: tomcat01 build: ./tomcat volumes: - ./webapps/tomcat01:/usr/local/tomcat/webapps tomcat02: hostname: tomcat02 build: ./tomcat volumes: - ./webapps/tomcat02:/usr/local/tomcat/webapps
Docker Compose常用選項:
用法:docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
-f, --file FILE:指定Compose配置文件,默認docker-compose.yml
-p, --project-name NAME:指定項目名稱,默認目錄名
--verbose:顯示更多的輸出
-v, --version:顯示docker compose版本
-H, --host HOST:指定守護socket連接到指定的主機
--project-directory PATH:指定一個可選的工作目錄,默認爲當前compose文件所在目錄
Docker Compose常用命令:
build:重新構建服務
用法:build [options] [--build-arg key=val...] [SERVICE...]
--no-cache:不適用緩存構建鏡像
--build-arg key=val:設置構建時的變量
config:驗證和查看Compose文件
用法:config [options]
-q, --quite:只驗證不打印
--services:只打印服務名稱,每行一個
--volumes:打印數據卷名稱,每行一個
exec:在運行的容器裏執行命令
用法:exec [options] SERVICE COMMAND [ARGS...]
-d:在後臺運行命令
--privileged:給這個進程賦予特權權限
--user USER:作爲該用戶運行該命令
-T:禁用分配僞終端,默認分配一個終端
--index=index:多個容器時的索引數字,默認爲1
port:打印綁定的開放端口
用法:port [options] SERVICE PRIVATE_PORT
--protocol=proto:tcp或udp協議,默認爲tcp
--index=index:多個容器時的索引數字,默認爲1
ps:列出容器
用法:ps [options] [SERVICE...]
-q:只顯示ID
rm:刪除停止的服務容器
用法:rm [options] [SERVICE...]
-f, --force:強制刪除
-s, --stop:刪除容器時如果需要先停止容器
-v:刪除與容器相關的任何匿名卷
scale:指定一個服務啓動容器數量
用法:scale [options] [SERVICE=NUM...]
-t, --timeout TIMEOUT:指定一個停止超時時間,單位爲秒,默認爲10秒
up:創建和啓動容器
用法:up [options] [--scale SERVICE=NUM...] [SERVICE...]
-d:在後臺運行容器
--no-deps:不啓動連接服務
--force-recreate:強制重建容器,即使它們的配置和鏡像未發生任何修改
--no-recreate:如果容器存在,不重建它們
--no-build:不構建鏡像,即使它丟失
--build:啓動容器前先構建鏡像
--scale SERVICE=NUM:指定一個服務(容器)的啓動數量
stop:停止服務
用法:stop [options] [SERVICE...]
-t, --timeout TIMEOUT:指定停止服務的超時時間,單位爲秒,默認值爲10
start:啓動服務
用法:start [SERVICE...]
restart:重啓服務
用法:restart [options] [SERVICE...]
top:顯示容器運行的進程
用法:top [SERVICE...]
logs:顯示容器的輸出
用法:logs [options] [SERVICE...]
-f, --follow:實時輸出日誌
-t, --timestamps:顯示時間戳
--tail="all":從日誌末端顯示行數
down:停止容器和刪除容器、網絡、數據卷和鏡像
用法:down [options]
--rmi type:移除鏡像,type能接收的值爲:all,local。如果爲all,則移除該服務用到的所有鏡像;如果爲local,則僅移除那些在image字段沒有設置自定義標籤的鏡像。
-v, --volumes:移除在volume區域定義的且鏈接到容器上的有命名的和匿名的數據卷
--remove-orphans:移除在compose配置文件中爲定義的服務容器
示例1:使用Docker compose部署nginx+tomcat環境
說明:目的是使用docker-compose部署nginx和tomcat的環境,使用nginx反向代理tomcat展示內容。
1)演示的文件目錄結構如下
[root@centos7 compose_proj01]# tree . ├── docker-compose.yml ├── nginx │ ├── Dockerfile │ └── nginx.conf ├── tomcat │ ├── apache-tomcat-8.5.38.tar.gz │ ├── Dockerfile │ └── jdk-8u162-linux-x64.tar.gz └── webapps ├── hello.html ├── timg.jpg ├── tomcat01 │ └── ROOT │ └── index.jsp └── tomcat02 └── ROOT └── index.jsp 7 directories, 10 files
2)nginx目錄的相關設置
注:nginx的Dockerfile使用的是前面dockerfile裏記錄的,所以不在贅述,這裏補充一下nginx裏的相關配置。
...... upstream composeproj01 { server tomcat01:8080; server tomcat02:8080; } server { listen 80; server_name localhost; server_tokens off; location / { proxy_pass http://composeproj01; proxy_set_header Host $host; proxy_set_header X-Real-Ip $remote_addr; proxy_set_header SSL_CERT $ssl_client_cert; proxy_set_header X-Forwarded-For $remote_addr; } location ~ \.(html|css|jpg|png|gif)$ { root /usr/local/nginx/html; } } ......
3)tomcat目錄的相關配置
注:tomcat的Dockerfile是用的也是前面的java鏡像的構建文件,也不再過多介紹。
4)webapps的相關配置
[root@centos7 compose_proj01]# ll webapps/ total 40 -rw-r--r-- 1 root root 13 Apr 17 09:43 hello.html -rw-r--r-- 1 root root 26591 Apr 17 09:29 timg.jpg drwxr-xr-x 3 root root 4096 Apr 17 09:30 tomcat01 drwxr-xr-x 3 root root 4096 Apr 17 09:31 tomcat02 [root@centos7 compose_proj01]# tree webapps/ webapps/ ├── hello.html ├── timg.jpg ├── tomcat01 │ └── ROOT │ └── index.jsp └── tomcat02 └── ROOT └── index.jsp 4 directories, 4 files [root@centos7 compose_proj01]# cat webapps/tomcat01/ROOT/index.jsp Display on tomcat01. [root@centos7 compose_proj01]# cat webapps/tomcat02/ROOT/index.jsp Display on tomcat02.
5)docker-compose.yml配置
[root@centos7 compose_proj01]# cat docker-compose.yml version: '3' services: nginx: hostname: nginx build: context: ./nginx dockerfile: Dockerfile ports: - "80:80" links: - "tomcat01:tomcat01" - "tomcat02:tomcat02" volumes: - ./webapps:/usr/local/nginx/html depends_on: - tomcat01 - tomcat02 tomcat01: hostname: tomcat01 build: ./tomcat volumes: - ./webapps/tomcat01:/usr/local/tomcat/webapps tomcat02: hostname: tomcat02 build: ./tomcat volumes: - ./webapps/tomcat02:/usr/local/tomcat/webapps
6)使用Docker Compose進行構建
[root@centos7 compose_proj01]# docker-compose up -d
<過程略>
7)驗證結果
結論:通過docker-compose.yml成功部署了nginx和tomcat的環境,將webapps目錄分別掛載到nginx和tomcat的工作目錄中,實現動態內容通過tomcat展現,靜態內容通過nginx展現。而這種動靜分離一般都需要分別將服務部署在不同的機器上,使用docker compose很方便的就一步完成了。