我們部署一個簡單的java專案,可能就包含3個容器:
而稍微複雜的專案,其中還會有各種各樣的其它中介軟體,需要部署的東西遠不止3個。如果手動的逐一部署,就太麻煩了,同時也無法保證完整性。
而Docker Compose就可以幫助我們實現多個相互關聯的Docker容器的快速部署。它允許使用者通過一個單獨的 docker-compose.yml 模板檔案(YAML 格式)來定義一組相關聯的應用容器。
docker-compose.yml檔案的基本語法可以參考官方檔案:
https://docs.docker.com/compose/compose-file/compose-file-v3/
docker-compose檔案中可以定義多個相互關聯的應用容器,每一個應用容器被稱為一個服務(service)。由於service就是在定義某個應用的執行時引數,因此與docker run
引數非常相似。
舉例來說,用docker run部署MySQL的命令如下:
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
-v ./mysql/data:/var/lib/mysql \
-v ./mysql/conf:/etc/mysql/conf.d \
-v ./mysql/init:/docker-entrypoint-initdb.d \
--network sjdwz_network
mysql
如果用docker-compose.yml
檔案來定義,就是這樣:
version: "3.8"
services:
mysql:
image: mysql
container_name: mysql
ports:
- "3306:3306"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123
volumes:
- "./mysql/conf:/etc/mysql/conf.d"
- "./mysql/data:/var/lib/mysql"
networks:
- new
networks:
new:
name: sjdwz_network
為了方便寫路徑,把我們的dokcerFIle檔案和jar包放到/root目錄;
/root/sjdwz_demo裡的檔案我們就不使用了。
我們的專案部署compose檔案如下:
version: "3.8"
services:
mysql:
image: mysql
container_name: mysql
ports:
- "3306:3306"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123
volumes:
- "./mysql/conf:/etc/mysql/conf.d"
- "./mysql/data:/var/lib/mysql"
- "./mysql/init:/docker-entrypoint-initdb.d"
networks:
- sjdwz-new-network
sjdwzinstance:
build:
context: .
dockerfile: Dockerfile
container_name: sjdwzinstance
ports:
- "8080:8080"
networks:
- sjdwz-new-network
depends_on:
- mysql
nginx:
image: nginx
container_name: nginx
ports:
- "18080:18080"
volumes:
- "./nginx/nginx.conf:/etc/nginx/nginx.conf"
- "./nginx/html:/usr/share/nginx/html"
depends_on:
- sjdwzinstance
networks:
- sjdwz-new-network
networks:
sjdwz-new-network:
name: sjdwz-new-network
編寫好docker-compose.yml檔案,就可以部署專案了。常見的命令:
https://docs.docker.com/compose/reference/
基本語法如下:
docker compose [OPTIONS] [COMMAND]
其中,OPTIONS和COMMAND都是可選引數,比較常見的有:
型別 | 引數或指令 | 說明 |
---|---|---|
Options | -f | 指定compose檔案的路徑和名稱 |
-p | 指定project名稱。project就是當前compose檔案中設定的多個service的集合,是邏輯概念 | |
Commands | up | 建立並啟動所有service容器 |
down | 停止並移除所有容器、網路 | |
ps | 列出所有啟動的容器 | |
logs | 檢視指定容器的紀錄檔 | |
stop | 停止容器 | |
start | 啟動容器 | |
restart | 重啟容器 | |
top | 檢視執行的程序 | |
exec | 在指定的執行中容器中執行命令 |
把我們的dockerCompose檔案放到/root目錄;
# 1.進入root目錄
cd /root
# 2.刪除舊容器
docker rm -f $(docker ps -qa)
# 3.刪除sjdwzservice映象
docker rmi sjdwzservice
# 4.清空MySQL資料
rm -rf mysql/data
# 5.啟動所有, -d 引數是後臺啟動;沒有-f檔案是因為我們的compose檔案就在這裡,名字也是叫docker-compose.yml,所以不用加
docker compose up -d
檢視映象
docker compose images
存取如下