docker入門(7)--docker compose

通常,一個完整的應用都是由多個容器組合而成,我們可以手動的去單獨啟動和管理每個容器,但是這樣會很不方便。Docker Compose是這樣的一個應用,它可以方便的幫助我們構建、運行和擴展一套由多個容器組成的應用。

1. 安裝Docker Compose

參考Docker的github下載程序:

curl -L https://github.com/docker/compose/releases/download/1.23.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

參考Install command completion添加docker-compose命令自動補全功能:

# 先安裝CentOS自己的bash-completion
[root@node2 ~]# yum -y install bash-completion
# 添加Docker Compose的command completion
[root@node2 ~]# curl -L https://raw.githubusercontent.com/docker/compose/1.23.0/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 13238  100 13238    0     0   9156      0  0:00:01  0:00:01 --:--:--  9161
[root@node2 ~]# source /etc/bash_completion.d/docker-compose

2. 使用docker-compose

Docker Compose通過讀取docker-compose.yml配置文件,來啟動相關的服務。一個docker-compose.yml配置示例如下:

version: "3.5"
services:
  web:
    image: fundamentalsofdocker/ch08-web:1.0
    ports:
      - 3000:3000
  db:
    image: fundamentalsofdocker/ch08-db:1.0
    volumes:
      - pets-data:/var/lib/postgresql/data

volumes:
  pets-data:

上面的配置解釋如下:

  • version:不同的docker compose有不同的格式,這里我們使用3.5版本格式。
  • services:服務,通常由多個容器組合而成。
    • web:容器的名稱。同時還指定該容器使用哪個鏡像(該鏡像需要存在于倉庫中,這里是docker hub),開放的端口。
    • db:數據庫容器的名稱。同時也指定了相應的鏡像,以及掛載的數據卷與容器對應目錄的關系。
  • volumes:創建的數據卷。

Tips:容器之間可以通過上面定義的容器名,來進行數據通信交互。

進入到該docker-compose.yml所在的目錄,這里是compose-test目錄,通過docker-compose up命令啟動服務:

[root@node2 compose-test]# docker-compose up
Creating network "compose-test_default" with the default driver
Creating volume "compose-test_pets-data" with default driver
Pulling web (fundamentalsofdocker/ch08-web:1.0)...
1.0: Pulling from fundamentalsofdocker/ch08-web
605ce1bd3f31: Pull complete
188ade417c9f: Pull complete
ad8771290e5e: Pull complete
Pulling db (fundamentalsofdocker/ch08-db:1.0)...
Pulling db (fundamentalsofdocker/ch08-db:1.0)...
1.0: Pulling from fundamentalsofdocker/ch08-db
ff3a5c916c92: Pull complete
ac3385cd756f: Pull complete
Creating compose-test_web_1_1c7e1b7ce98c ... done
Creating compose-test_db_1_14e7442081f6  ... done
Attaching to compose-test_web_1_ec5cf32a5b62, compose-test_db_1_785716b0e082
...
db_1_785716b0e082 | 2018-10-31 01:56:00.122 UTC [20] LOG:  database system was shut down at 2018-10-31 01:55:42 UTC
db_1_785716b0e082 | 2018-10-31 01:56:00.144 UTC [1] LOG:  database system is ready to accept connections
web_1_ec5cf32a5b62 | Listening at 0.0.0.0:3000
web_1_ec5cf32a5b62 | Connecting to DB
web_1_ec5cf32a5b62 | Connected!
...以上輸出內容省略了部分

簡單說明一下:上面的過程分兩步,一是拉取鏡像。二是啟動服務,并打印日志。
啟動完成后,通過瀏覽器訪問http://主機IP:3000/pet,可以查看服務。
按Ctrl+C可結束服務并退出。再次運行時,速度會快很多,因為不用再拉取鏡像,相關的數據卷也已經創建完畢。

將服務放在后臺運行:

[root@node2 compose-test]# docker-compose up -d
Starting compose-test_web_1_ec5cf32a5b62 ... done
Starting compose-test_db_1_785716b0e082  ... done

查看docker compose進程:

[root@node2 compose-test]# docker-compose ps 
             Name                            Command              State           Ports         
------------------------------------------------------------------------------------------------
compose-test_db_1_785716b0e082    docker-entrypoint.sh postgres   Up      5432/tcp              
compose-test_web_1_ec5cf32a5b62   /bin/sh -c node src/server.js   Up      0.0.0.0:3000->3000/tcp

關閉服務:

[root@node2 compose-test]# docker-compose down
Stopping compose-test_db_1_785716b0e082  ... done
Stopping compose-test_web_1_ec5cf32a5b62 ... done
Removing compose-test_db_1_785716b0e082  ... done
Removing compose-test_web_1_ec5cf32a5b62 ... done
Removing network compose-test_default

Tips:你會發現停止web服務總是比較慢,那是因為db服務能夠正確的響應系統發出的SIGTERM信號,正常停止服務。而web不會,所以docker在10秒超時后,強制停用了它。

3. 可伸縮的docker compose服務

當我們上面的服務中,一個web服務形成瓶頸的時候,我們可以快速地的擴充幾個web服務出來。命令如下:

[root@node2 compose-test]# docker-compose up --scale web=3
Creating network "compose-test_default" with the default driver
Creating volume "compose-test_pets-data" with default driver
WARNING: The "web" service specifies a port on the host. If multiple containers for this service are created on a single host, the port will clash.
Creating compose-test_db_1_4a3325f40a66  ... done
Creating compose-test_web_1_34a682b911cd ... done
Creating compose-test_web_2_d1270f3e5ab6 ... error
Creating compose-test_web_3_4eee803fe1dc ... error

ERROR: for compose-test_web_2_d1270f3e5ab6  Cannot start service web: driver failed programming external connectivity on endpoint compose-test_web_2_b339ca2150cf (f9b0c19850ea1218bfa73e96df65e8c048b2936504c2f07baa85a66bbaa304e0): Bind for 0.0.0.0:3000 failed: port is already allocated

ERROR: for compose-test_web_3_4eee803fe1dc  Cannot start service web: driver failed programming external connectivity on endpoint compose-test_web_3_af3222197ecd (101305704ef4a4da659f0aaa53931a8ef7aa103e7a9fc4b3806c98f7a76a2911): Bind for 0.0.0.0:3000 failed: port is already allocated

ERROR: for web  Cannot start service web: driver failed programming external connectivity on endpoint compose-test_web_2_b339ca2150cf (f9b0c19850ea1218bfa73e96df65e8c048b2936504c2f07baa85a66bbaa304e0): Bind for 0.0.0.0:3000 failed: port is already allocated
ERROR: Encountered errors while bringing up the project.

我們發現當創建第二和第三個web服務的時候,發生了錯誤,主要是因為端口沖突問題。我們在docker-compose.yml中指定端口映射的部分進行修改,讓主機隨機啟動三個端口進行映射即可:

version: "3.5"
services:
  web:
    image: fundamentalsofdocker/ch08-web:1.0
    ports:
      - 3000
  db:
    image: fundamentalsofdocker/ch08-db:1.0
    volumes:
      - pets-data:/var/lib/postgresql/data

volumes:
  pets-data:

再次啟動:

# 先關閉剛才啟動的(雖然沒有完全啟動成功)
[root@node2 compose-test]# docker-compose down
[root@node2 compose-test]# docker-compose up -d --scale web=3
Creating network "compose-test_default" with the default driver
Creating compose-test_db_1_6a526a0954dc  ... done
Creating compose-test_web_1_5f57a97855bf ... done
Creating compose-test_web_2_37757fe7fff7 ... done
Creating compose-test_web_3_5db14966adca ... done

查看:

[root@node2 compose-test]# docker-compose ps
             Name                            Command              State            Ports         
-------------------------------------------------------------------------------------------------
compose-test_db_1_a2388d8552ee    docker-entrypoint.sh postgres   Up      5432/tcp               
compose-test_web_1_5445bb723cbe   /bin/sh -c node src/server.js   Up      0.0.0.0:32772->3000/tcp
compose-test_web_2_9253be834670   /bin/sh -c node src/server.js   Up      0.0.0.0:32773->3000/tcp
compose-test_web_3_c4178b44052d   /bin/sh -c node src/server.js   Up      0.0.0.0:32774->3000/tcp
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容