| 介绍
Docker开源项目,负责实现对Docker容器集群的快速编排。
通过一个单独的docker-compose.yml模板文件,来定义一组相关联的应用容器为一个项目。
概念
- 服务
- 项目
Compose默认管理对象是项目,通过子命令对项目中的一组容器进行生命周期的管理。
Compose项目由Python实现,实现上调用了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]
为连接到服务的外部客户端指定服务发现的方式。有两种方式:
- vip:由 Docker 为服务赋一个虚拟 IP。Docker 会自动为客户端和服务工作节点选择合适的路由。这是默认的方式。
- dnsrr:使用 DNS 服务发现。Docker 会为服务创建一个 DNS 项,以便使用服务名进行 DNS 查询时能连接到合适的 IP。该选项在你想使用自己的负载均衡器等情况下时是有用的。
[labels]
为服务(而非容器)设置标签。
[mode]
可为 global(每个 swarm 节点只有一个容器)或者 replicated(可有多个容器,默认)。
[placement]
指定布置约束。
[replicas]
当 mode 为 replicated 时,指定要运行的容器的数量。
[resources]
配置内存、CPU 等资源限制。
[restart_policy]
配置如何重启退出的容器
- condition:值为 none、on-failure 或者 any 之一,默认为 any。
- delay:在下次尝试重启之前需要等待的时间,默认为 0。
- max_attempts:最多尝试重启的次数,默认从不放弃。
- window:判定一次重启失败前要等待的时间,默认立即判定。
[update_config]
配置如何更新服务
- parallelism:每次要更新的容器数量。
- delay:更新下一组容器前要等待的时间。
- failure_action:更新失败时要采取的动作。为 continue、rollback 或 pause 之一,默认为 pause。
- monitor:判定一次更新失败前要持续的时间,默认为 0s。
- max_failure_ratio:能容忍的最大更新失败率。
version: "3.7"
services:
redis:
image: redis:alpine
ports:
- "6379"
networks:
- frontend
deploy:
replicas: 2
update_config: # 配置如何更新服务
parallelism: 2 # 每次要更新的容器数量
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后一定要执行docker-compose build重新创建镜像
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为容器的网络模式
MYSQL_ROOT_PASSWORD为数据库的密码,也就是root用户的密码。
MYSQL_USER和MYSQL_PASS另外一个用户名和密码。
image为你拉取镜像的地址和版本,当然也可以换成自己的镜像仓库,这里使用官方的。
volumes里面的参数为映射本地和docker容器里面的文件夹和目录。
./db 用来存放了数据库表文件
./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","[email protected]","passwd","avaterpath");
insert into user values(2, "lisi","[email protected]","passwd","avaterpath");