| 介紹
Docker開源項目,負責實現(xiàn)對Docker容器集群的快速編排孕荠。
通過一個單獨的docker-compose.yml模板文件沪哺,來定義一組相關聯(lián)的應用容器為一個項目牙瓢。
概念
- 服務
- 項目
Compose默認管理對象是項目,通過子命令對項目中的一組容器進行生命周期的管理。
Compose項目由Python實現(xiàn)勺疼,實現(xiàn)上調用了Docker服務提供的API來對容器進行管理教寂。
version
A3: version指的是docker-compose的version, 詳見https://docs.docker.com/compose/compose-file/#reference-and-guidelines
| 配置解析
資源:https://aisxyz.iteye.com/blog/2393862
deploy
指定與服務部署相關的配置,僅在使用docker stack deploy
部署到swarm時才會生效执庐,會被docker-compose up及docker-compose run忽略酪耕。支持以下子項:
[endpoint_mode]
為連接到服務的外部客戶端指定服務發(fā)現(xiàn)的方式。有兩種方式:
- vip:由 Docker 為服務賦一個虛擬 IP耕肩。Docker 會自動為客戶端和服務工作節(jié)點選擇合適的路由因妇。這是默認的方式。
- dnsrr:使用 DNS 服務發(fā)現(xiàn)猿诸。Docker 會為服務創(chuàng)建一個 DNS 項婚被,以便使用服務名進行 DNS 查詢時能連接到合適的 IP。該選項在你想使用自己的負載均衡器等情況下時是有用的梳虽。
[labels]
為服務(而非容器)設置標簽址芯。
[mode]
可為 global(每個 swarm 節(jié)點只有一個容器)或者 replicated(可有多個容器,默認)窜觉。
[placement]
指定布置約束谷炸。
[replicas]
當 mode 為 replicated 時,指定要運行的容器的數(shù)量禀挫。
[resources]
配置內存旬陡、CPU 等資源限制。
[restart_policy]
配置如何重啟退出的容器
- condition:值為 none语婴、on-failure 或者 any 之一描孟,默認為 any。
- delay:在下次嘗試重啟之前需要等待的時間砰左,默認為 0匿醒。
- max_attempts:最多嘗試重啟的次數(shù),默認從不放棄缠导。
- window:判定一次重啟失敗前要等待的時間廉羔,默認立即判定。
[update_config]
配置如何更新服務
- parallelism:每次要更新的容器數(shù)量僻造。
- delay:更新下一組容器前要等待的時間憋他。
- failure_action:更新失敗時要采取的動作。為 continue髓削、rollback 或 pause 之一举瑰,默認為 pause。
- monitor:判定一次更新失敗前要持續(xù)的時間蔬螟,默認為 0s此迅。
- max_failure_ratio:能容忍的最大更新失敗率。
version: "3.7"
services:
redis:
image: redis:alpine
ports:
- "6379"
networks:
- frontend
deploy:
replicas: 2
update_config: # 配置如何更新服務
parallelism: 2 # 每次要更新的容器數(shù)量
delay: 10s # 更新下一組容器前要等待的時間
restart_policy:
condition: on-failure
db:
image: postgres:9.4
volumes:
- db-data:/var/lib/postgresql/data
networks:
- backend
deploy:
placement:
constraints: [node.role == manager]
vote:
image: dockersamples/examplevotingapp_vote:before
ports:
- "5000:80"
networks:
- frontend
depends_on:
- redis
deploy:
replicas: 2
update_config:
parallelism: 2
restart_policy:
condition: on-failure
result:
image: dockersamples/examplevotingapp_result:before
ports:
- "5001:80"
networks:
- backend
depends_on:
- db
deploy:
replicas: 1
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
worker:
image: dockersamples/examplevotingapp_worker
networks:
- frontend
- backend
deploy:
mode: replicated
replicas: 1
labels: [APP=VOTING]
restart_policy:
condition: on-failure
delay: 10s
max_attempts: 3
window: 120s
placement:
constraints: [node.role == manager]
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
stop_grace_period: 1m30s
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
networks:
frontend:
backend:
volumes:
db-data:
| 安裝
curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose version
| 基本命令
- build
- kill
- logs
- pause
- ps
- restart
- rm
- run
- scale
docker-compose scale web=2 db=2
更新Dockerfile后一定要執(zhí)行docker-compose build重新創(chuàng)建鏡像
docker-compose文件介紹
version: "2"
services:
webapp:
image: examples/web # 每個服務都必須通過Image指令或build指令(需要Dockerfile)來自動構建生成鏡像
port:
- "80:80"
volumes:
- "/data"
| 示例
部署spring-boot應用
spring-boot app打包
mvn clean package -Dmaven.test.skip=true
Dockerfile
FROM openjdk:8-jdk
COPY ./id_gen_svc-0.0.1-SNAPSHOT.jar /usr/local
ENTRYPOINT ["java", "-jar", "/usr/local/id_gen_svc-0.0.1-SNAPSHOT.jar"]
docker-compose.yml
version: '2'
services:
sb1:
restart: always
build:
context: .
ports:
- 8001:8080
sb2:
restart: always
build:
context: .
ports:
- 8002:8080
sb3:
restart: always
build:
context: .
ports:
- 8003:8080
使用docker-compose stack部署
version: "3"
services:
webapp:
image: nginx:alpine
deploy:
replicas: 4
resources:
limits:
cpus: "0.1"
memory: 50M
restart_policy:
condition: on-failure
ports:
- 80:80
mysql+.netcore工程部署
配置結構
docker-compose.yml
version: '2'
services:
patient-svc:
build: ./patient-svc
ports:
- "8001:80"
report-svc:
build: ./report-svc
ports:
- "8002:80"
ucloud-svc:
environment:
MYSQL_ROOT_PASSWORD: "111111"
MYSQL_USER: 'test'
MYSQL_PASS: '111111'
image: "mysql:5.7"
restart: always
volumes:
- "./ucloud-db/db:/var/lib/mysql"
- "./ucloud-db/conf/my.cnf:/etc/my.cnf"
- "./ucloud-db/init:/docker-entrypoint-initdb.d/"
ports:
- "3306:3306"
patient-svc Dockerfile
FROM microsoft/dotnet:2.1-aspnetcore-runtime
COPY ./publish /app
WORKDIR /app
EXPOSE 80
ENTRYPOINT ["dotnet","PatientSvc.dll"]
report-svc Dockerfile
FROM microsoft/dotnet:2.1-aspnetcore-runtime
COPY ./publish /app
WORKDIR /app
EXPOSE 80
ENTRYPOINT ["dotnet","ReportSvc.dll"]
docker-compose部署mysql
docker-compose.yml
version: '2'
services:
mysql:
network_mode: "bridge"
environment:
MYSQL_ROOT_PASSWORD: "111111"
MYSQL_USER: 'test'
MYSQL_PASS: '111111'
image: "mysql:latest"
restart: always
volumes:
- "./db:/var/lib/mysql"
- "./conf/my.cnf:/etc/my.cnf"
- "./init:/docker-entrypoint-initdb.d/"
ports:
- "33060:3306"
其中,
network_mode為容器的網(wǎng)絡模式
MYSQL_ROOT_PASSWORD為數(shù)據(jù)庫的密碼耸序,也就是root用戶的密碼忍些。
MYSQL_USER和MYSQL_PASS另外一個用戶名和密碼。
image為你拉取鏡像的地址和版本坎怪,當然也可以換成自己的鏡像倉庫罢坝,這里使用官方的。
volumes里面的參數(shù)為映射本地和docker容器里面的文件夾和目錄搅窿。
./db 用來存放了數(shù)據(jù)庫表文件
./conf/my.cnf存放自定義的配置文件
./init存放初始化的腳本嘁酿。ports 為映射主機和容器的端口
文件結構
.
├── conf
│ └── my.cnf
├── db
├── docker-compose.yml
└── init
│ └──init.sql
my.cnf
[mysqld]
user=mysql
default-storage-engine=INNODB
character-set-server=utf8
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
init.sql
use mysql;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '111111';
create database test;
use test;
create table user
(
id int auto_increment primary key,
username varchar(64) unique not null,
email varchar(120) unique not null,
password_hash varchar(128) not null,
avatar varchar(128) not null
);
insert into user values(1, "zhangsan","test12345@qq.com","passwd","avaterpath");
insert into user values(2, "lisi","12345test@qq.com","passwd","avaterpath");