Docker Compose 是 Docker 容器進行編排的工具,定義和運行多容器的應用,可以一條命令啟動多個容器。
使用Compose 基本上分為三步:
1. Dockerfile 定義應用的運行環境
2. docker-compose.yml 定義組成應用的各服務
3. docker-compose up 啟動整個應用
基本規則:
1. 大小寫敏感
2. 使用縮進表示層級關系
3. 禁止使用tab縮進,只能使用空格鍵
4. 縮進長度沒有限制,只要元素對齊就表示這些元素屬于一個層級
5. 使用#表示注釋
6. 字符串可以不用引號標注
## 安裝Compose
Compose網站:[https://docs.docker.com/compose/](https://docs.docker.com/compose/)
curl -L https://github.com/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose -v
## 編寫示例
```
version: "3"
services:
nginx:
# docker鏡像,先拉取本地,再拉取云端
image: nginx:${NGINX_VERSION}
# 容器名稱
container_name: web
# 端口映射
ports:
- "${NGINX_HTTP_HOST_PORT}:80"
# 數據掛載 宿主機:docker 此處可以寫相對路徑
volumes:
- ${SOURCE_DIR}:/var/www/html/:rw
# 重啟策略
# no是默認的重啟策略,在任何情況下都不會重啟容器。
# 指定為always時,容器總是重新啟動。
restart: always
# 注意:如果服務之間是在同個networks之下的話就可以通過 服務名:port 來訪問鏈接
networks:
- default
php72:
# build用context指定的dockerfile創建
build:
context: .
# 傳入dockerfile里面的參數,注意與context同級,在dockerfile里面通過ARG接收
args:
- PHP_VERSION: ${PHP72_VERSION}
# 指定容器名稱
container_name: php72
# 鏈接到另一個服務中的容器 SERVICE:ALIAS
# 在當前的web服務的容器中可以通過鏈接的db服務的別名database訪問db容器中的數據庫應用
# 如果沒有指定別名,則可直接使用服務名訪問。
links:
- db:database
# 鏈接到docker-compose.yml 外部的容器
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresq
# 使用該參數,container內的root擁有真正的root權限。
# 否則,container內的root只是外部的一個普通用戶權限。
privileged: true
# 容器名稱
container_name: php72
# 啟動時必須等mysql服務啟動好
depends_on:
- mysql
cap_add:
- SYS_PTRACE
networks:
- default
mysql:
image: mysql:${MYSQL_VERSION}
ports:
- "${MYSQL_HOST_PORT}:3306"
volumes:
- ${MYSQL_CONF_FILE}:/etc/mysql/conf.d/mysql.cnf:ro
- ${MYSQL_DATA_DIR}:/var/lib/mysql/:rw
restart: always
networks:
- default
# 環境變量傳入dockerfile里面的變量
# 與args不同environment定義的變量在容器內部也可以反問
environment:
MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}"
redis:
image: redis:${REDIS_VERSION}
ports:
- "${REDIS_HOST_PORT}:6379"
volumes:
- ${REDIS_CONF_FILE}:/etc/redis.conf:ro
restart: always
entrypoint: ["redis-server", "/etc/redis.conf"]
networks:
- default
# 指定其為同個docker網絡
# docker network ls來查看
# 同一網絡下,可以通過服務名來互聯
networks:
default:
```
- 變量來自同目錄下的.env文件
- php通過同級目錄的dockerfile來構建
- 鏡像改了之后要通過`docker-compose build --no-cache` 來重新構建一下
## 常用命令
* **ps**:列出所有運行容器
~~~
docker-compose ps
~~~
* **logs**:查看服務日志輸出
~~~
docker-compose logs // 加-f,持續輸出。
~~~
* **port**:打印綁定的公共端口,下面命令可以輸出 eureka 服務 8761 端口所綁定的公共端口
~~~
docker-compose port eureka 8761
~~~
* **build**:構建或者重新構建服務
~~~
docker-compose build
~~~
* **start**:啟動指定服務已存在的容器
~~~
docker-compose start eureka
~~~
* **stop**:停止已運行的服務的容器
~~~
docker-compose stop eureka
~~~
* **rm**:刪除指定服務的容器
~~~
docker-compose rm eureka
~~~
* **up**:構建、啟動容器
~~~
docker-compose up
~~~
* **kill**:通過發送 SIGKILL 信號來停止指定服務的容器
~~~
docker-compose kill eureka
~~~
* **pull**:下載服務鏡像
* **scale**:設置指定服務運氣容器的個數,以 service=num 形式指定
~~~
docker-compose scale user=3 movie=3
~~~
* **run**:在一個服務上執行一個命令
~~~
docker-compose run 容器名 bash
~~~
>[info]
> 1. 通過docker-compose編排的的容器是沒有容器自己的ip,因為他們共用一個或多個network,可以通過`docker network ls`來查看,可以通過服務名來鏈接網絡,`docker network inspect <container id>`可以查看對應網絡的配置。
> 2. 通過docker-compose build的dockerfile一定要有CMD \[ "/bin/bash" \]等執行命令,才能通過docker-compose up起來
### 更多參考
* [官方技術文檔](https://docs.docker.com/compose/)
* [compose file reference](https://docs.docker.com/compose/compose-file/)
* [docker-compose的每個設置項都介紹了](https://docs.docker.com/compose/compose-file/#network-configuration-reference)
* [docker-compose各參數中文解釋](https://blog.csdn.net/qq_29349715/article/details/80818605)