上節示範:Docker學習筆記之--檢視部署在docker的應用運作日志(環境:centos7)
接下來示範借助Docker Compose進行多容器部署。
前邊的章節示範盡管可以實作需求功能,但是在生産環境當中,維護起來顯然很麻煩,是以下邊示範借助Docker Compose功能,實作一鍵部署!
一個完整的項目需要多個容器(比如Web、Nginx、SqlServer、Mysql、Redis等)協調運作互相支援,一個個的部署很顯然會很麻煩,而且還要為各個容器之間的網絡連接配接而苦惱。
還好,借助Docker Compose,我們可以編寫一個
docker-compose.yml
檔案,可以輕松實作上邊所有容器的一鍵部署。
第一步:安裝 Docker Compose
依次執行以下指令:截止目前最新版本是 1.27.4
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version

第二步:編輯
docker-compose.yml
檔案
在伺服器上的web應用根目錄下建立一個
docker-compose.yml
檔案,跟Dockerfile檔案放在同一個目錄下即可!
然後編寫如下内容:
1 version: '3.8'
2 networks:
3 test_network:
4 external: true
5 services:
6 myapidemo:
7 image: 1312958948/myapidemo:1.1
8 container_name: myapidemo
9 build: .
10 restart: always
11 ports:
12 - "9020:5000"
13 volumes:
14 - /root/apilogs/logs:/app/logs
15 networks:
16 - test_network
17
18 nginxapi:
19 image: nginx
20 container_name: nginxapi
21 restart: always
22 ports:
23 - "80:80"
24 - "443:443"
25 volumes:
26 - /root/nginx/www:/usr/share/nginx/html
27 - /root/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf
28 - /root/nginx/logs:/var/log/nginx
29 - /root/nginx/certs:/etc/nginx/certs
30 networks:
31 - test_network
32
33 mysql:
34 image: mysql:8.0
35 container_name: mysql
36 restart: always
37 ports:
38 - "3306:3306"
volumes:
- /var/lib/docker/volumes/mysqldata/_data:/var/lib/mysql
39 environment:
40 MYSQL_ROOT_PASSWORD: Aa123456
41 MYSQL_DATABASE: MyTest
42 TZ: Asia/Shanghai
43 networks:
44 - test_network
45
46 redistest:
47 image: redis
48 container_name: redistest
49 restart: always
50 ports:
51 - "6379:6379"
52 command: redis-server --requirepass 123456
53 networks:
54 - test_network
代碼解釋:一份标準配置檔案應該包含 version、services、networks 三大部分,其中最關鍵的就是 services 和 networks 兩個部分,這是它基本結構
version: '3.8' 表示版本,截止目前最新是 3.8,可以參考文檔:https://docs.docker.com/compose/compose-file/
services 節點下定義每個容器服務,其中:myapidemo、nginxapi、mysql、redistest等表示容器名稱
image: 1312958948/myapidemo:1.1 指定鏡像名稱和tag版本,如果該鏡像不存在,則會自動拉取或建立鏡像;如果已經存在則會直接使用
container_name: myapidemo 指定容器名
restart: always 表示關機或者重新開機docker時,自動重新開機容器
build: . 指定 Dockerfile 所在檔案夾的路徑(點 . 表示目前目錄)。Compose 将會利用它自動建構這個鏡像,然後使用這個鏡像啟動服務容器
ports: - "9020:5000" 端口
volumes: - /root/apilogs/logs:/app/logs 挂載一個目錄或者一個已存在的資料卷容器,(例如:将/root/apilogs/logs目錄 映射到 容器内的 /app/logs目錄)
networks: - test_network 連接配接到自定義網橋 test_network
特别提醒:因為前邊章節我已經提前建立好 test_network 網橋了,是以在這裡直接使用,下邊這段話表示使用已存在的網橋
networks:
test_network:
external: true
environment: 為容器設定環境變量,等同于 docker run -e MYSQL_ROOT_PASSWORD=Aa123456
(注意前邊沒有橫杠 -)
environment:
MYSQL_ROOT_PASSWORD: Aa123456
MYSQL_DATABASE: MyTest
TZ: Asia/Shanghai
command: redis-server --requirepass 123456 指定一個容器啟動後執行的指令,例如:這裡給 redis 設定密碼
其他還有很多,不依依舉栗了。
參考文檔:
https://blog.csdn.net/zhiaini06/article/details/45287663
https://blog.csdn.net/qq_35720307/article/details/87256684
第三步:一鍵部署容器
使用以下指令建立并運作容器, -d 表示背景運作
docker-compose up -d
如果鏡像都已經存在,則會直接建立容器并運作
如果鏡像不存在,則會嘗試拉取或根據 build指定的路徑尋找 Dockerfile檔案自動建立
從提示可以看出,如果鏡像不存在則自動建立,否則需要調用
docker-compose build
或
docker-compose up --build
Successfully tagged 1312958948/myapidemo:1.1
WARNING: Image for service myapidemo was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
而提示 xxxx is up-to-date,則表示 Docker Compose 認為這些容器已經啟動了,沒必要再次啟動
nginxapi is up-to-date
mysql is up-to-date
redistest is up-to-date
注意:在生産環境下,禁止使用該指令:docker-compose down xxx
擴充:如果要更新疊代應用版本,隻需要按照下列步驟執行即可
1,将最新版本的應用上傳更新到伺服器,使用cd指令切到應用根目錄
2,停止容器 docker-compose stop 容器名
3,自動更新鏡像并啟動容器 docker-compose up -d --build
4,沒了,就3步
到此結束!
參考文檔:https://www.bilibili.com/video/BV1ib411w7L7?p=13
作者:PeterZhang
出處:https://www.cnblogs.com/peterzhang123
本文版權歸作者和部落格園共有,歡迎轉載,但必須給出原文連結,并保留此段聲明,否則保留追究法律責任的權利。