Docker系列(十一):Docker Compose管理部署容器

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)驗證結果

0001.png

0002.png

0004.png

0003.png

結論:通過docker-compose.yml成功部署了nginx和tomcat的環境,將webapps目錄分別掛載到nginx和tomcat的工作目錄中,實現動態內容通過tomcat展現,靜態內容通過nginx展現。而這種動靜分離一般都需要分別將服務部署在不同的機器上,使用docker compose很方便的就一步完成了。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章