上節演示: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