Appearance
六、Docker-compose
1、简介
Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml, 写好多个容器之间的调用关系 。然后,只要一个命令,就能同时启动/关闭这些容器
Docker-Compose是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。
https://docs.docker.com/compose/compose-file/compose-file-v3/
https://docs.docker.com/compose/install/
2、安装与卸载
sh
sudo curl -L "https://github.com/docker/compose/releases/download/v2.12.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 可以进这里看版本
https://github.com/docker/compose/releases/
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
# 如果是使用的 curl 方式来安装的
sudo rm /usr/local/bin/docker-compose
3、核心概念
一文件
docker-compose.yml
两要素
- 服务(service) 一个个应用容器实例,比如订单微服务、库存微服务、mysql容器、nginx容器或者redis容器
- 工程(project) 由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
4、Compose使用的三个步骤
- 编写Dockerfile定义各个微服务应用并构建出对应的镜像文件
- 使用 docker-compose.yml 定义一个完整业务单元,安排好整体应用中的各个容器服务。
- 最后,执行docker-compose up命令 来启动并运行整个应用程序,完成一键部署上线
5、docker-compose常用命令
sh
docker-compose -h # 查看帮助
docker-compose up # 启动所有 docker-compose服务
docker-compose up -d # 启动所有 docker-compose服务 并后台运行
docker-compose down # 停止并删除容器、网络、卷、镜像。
docker-compose exec yml里面的服务id # 进入容器实例内部 docker-compose exec docker-compose.yml文件中写的服务id /bin/bash
docker-compose ps # 展示当前docker-compose编排过的运行的所有容器
docker-compose top # 展示当前docker-compose编排过的容器进程
docker-compose logs yml里面的服务id # 查看容器输出日志
docker-compose config # 检查配置
docker-compose config -q # 检查配置,有问题才有输出
docker-compose restart # 重启服务
docker-compose start # 启动服务
docker-compose stop # 停止服务
docker-compose up -d nginx # 构建建启动nignx容器
docker-compose exec nginx bash # 登录到nginx容器中
docker-compose down # 删除所有nginx容器,镜像
docker-compose ps # 显示所有容器
docker-compose restart nginx # 重新启动nginx容器
docker-compose run --no-deps --rm php-fpm php -v # 在php-fpm中不启动关联容器,并容器执行php -v 执行完成后删除容器
docker-compose build nginx # 构建镜像 。
docker-compose build --no-cache nginx # 不带缓存的构建。
docker-compose logs nginx # 查看nginx的日志
docker-compose logs -f nginx # 查看nginx的实时日志
docker-compose config -q # 验证(docker-compose.yml)文件配置,当配置正确时,不输出任何内容,当文件配置错误,输出错误信息。
docker-compose events --json nginx # 以json的形式输出nginx的docker日志
docker-compose pause nginx # 暂停nignx容器
docker-compose unpause nginx # 恢复ningx容器
docker-compose rm nginx # 删除容器(删除前必须关闭容器)
docker-compose stop nginx # 停止nignx容器
docker-compose start nginx # 启动nignx容器
6、docker-compose-yaml
1、docker-compose.yaml
yaml
version: '2'
services:
tomcat:
image: tomcat:8.5
container_name: tomcat
ports:
- "8081:8080"
volumes:
- ./tomcat/webapps:/usr/local/tomcat/webapps
- ./tomcat/conf/:/usr/local/tomcat/conf/
- ./tomcat/bin/:/usr/local/tomcat/bin/
- ./tomcat/logs/:/usr/local/tomcat/logs/
mysql:
image: mysql:5.7
container_name: mysql
restart: always
ports:
- "3306:3306"
volumes:
- ./mysql/mysql:/etc/mysql
- ./mysql/logs:/var/log/mysql
- ./mysql/data/:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=123456
nginx:
image: nginx
container_name: nginx
ports:
- "80:80"
- "9920:9920"
volumes:
- ./nginx/html:/usr/share/nginx/html
- ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/logs:/var/log/nginx
activemq:
image: webcenter/activemq
container_name: activemq
ports:
- "61616:61616"
- "8161:8161"
volumes:
- ./activemq/conf:/opt/activemq/conf
environment:
- ACTIVEMQ_ADMIN_LOGIN=admin
- ACTIVEMQ_ADMIN_PASSWORD=admin
- ACTIVEMQ_CONFIG_MINMEMORY=512
- ACTIVEMQ_CONFIG_MAXMEMORY=2048
- TZ=Asia/Shanghai
# redis
master:
image: redis
container_name: redis-master
command: redis-server --requirepass boShang@Redis --slave-announce-ip 172.16.253.210 --slave-announce-port 6379
ports:
- "6379:6379"
networks:
- my_network
slave1:
image: redis
container_name: redis-slave-1
ports:
- "6380:6379"
command: redis-server --slave-announce-ip 172.16.253.210 --slave-announce-port 6380 --slaveof redis-master 6379 --requirepass boShang@Redis --masterauth boShang@Redis
depends_on:
- master
networks:
- my_network
slave2:
image: redis
container_name: redis-slave-2
ports:
- "6381:6379"
command: redis-server --slave-announce-ip 172.16.253.210 --slave-announce-port 6381 --slaveof redis-master 6379 --requirepass boShang@Redis --masterauth boShang@Redis
depends_on:
- master
networks:
- my_network
sentinel1:
image: redis
container_name: redis-sentinel-1
ports:
- 26379:26379
command:
- /bin/sh
- -c
- |
mkdir /var/log/redis
touch /var/log/redis/sentinel.log
redis-sentinel /usr/local/etc/redis/sentinel.conf
volumes:
- ./redis/sentinel_1.conf:/usr/local/etc/redis/sentinel.conf
sentinel2:
image: redis
container_name: redis-sentinel-2
ports:
- 26380:26379
command:
- /bin/sh
- -c
- |
mkdir /var/log/redis
touch /var/log/redis/sentinel.log
redis-sentinel /usr/local/etc/redis/sentinel.conf
volumes:
- ./redis/sentinel_2.conf:/usr/local/etc/redis/sentinel.conf
sentinel3:
image: redis
container_name: redis-sentinel-3
ports:
- 26381:26379
command:
- /bin/sh
- -c
- |
mkdir /var/log/redis
touch /var/log/redis/sentinel.log
redis-sentinel /usr/local/etc/redis/sentinel.conf
volumes:
- ./redis/sentinel_3.conf:/usr/local/etc/redis/sentinel.conf
networks:
my_network:
2、docker-compose redis 集群
yaml
version: '2'
services:
master:
image: redis
container_name: redis-master
command: redis-server --requirepass boShang@Redis --slave-announce-ip 172.16.253.210 --slave-announce-port 6379
ports:
- "6379:6379"
networks:
- sentinel-master
slave1:
image: redis
container_name: redis-slave-1
ports:
- "6380:6379"
command: redis-server --slave-announce-ip 172.16.253.210 --slave-announce-port 6380 --slaveof redis-master 6379 --requirepass boShang@Redis --masterauth boShang@Redis
depends_on:
- master
networks:
- sentinel-master
slave2:
image: redis ## 镜像
container_name: redis-slave-2
ports:
- "6381:6379"
command: redis-server --slave-announce-ip 172.16.253.210 --slave-announce-port 6381 --slaveof redis-master 6379 --requirepass boShang@Redis --masterauth boShang@Redis
depends_on:
- master
networks:
- sentinel-master
networks:
sentinel-master:
yaml
# 哨兵模式
version: '2'
services:
sentinel1:
image: redis
container_name: redis-sentinel-1
ports:
- 26379:26379
command:
- /bin/sh
- -c
- |
mkdir /var/log/redis
touch /var/log/redis/sentinel.log
redis-sentinel /usr/local/etc/redis/sentinel.conf
volumes:
- ./sentinel_1.conf:/usr/local/etc/redis/sentinel.conf
sentinel2:
image: redis
container_name: redis-sentinel-2
ports:
- 26380:26379
command:
- /bin/sh
- -c
- |
mkdir /var/log/redis
touch /var/log/redis/sentinel.log
redis-sentinel /usr/local/etc/redis/sentinel.conf
volumes:
- ./sentinel_2.conf:/usr/local/etc/redis/sentinel.conf
sentinel3:
image: redis
container_name: redis-sentinel-3
ports:
- 26381:26379
command:
- /bin/sh
- -c
- |
mkdir /var/log/redis
touch /var/log/redis/sentinel.log
redis-sentinel /usr/local/etc/redis/sentinel.conf
volumes:
- ./sentinel_3.conf:/usr/local/etc/redis/sentinel.conf
networks:
default:
external:
name: redis_sentinel-master
3、zookeeper.compose.yml
yaml
version: '2.0'
services:
zoo1:
image: zookeeper
restart: always
hostname: zoo1
container_name: zookeeper_1
#domainname:
ports:
- 2181:2181
volumes:
- ./zoo1/data:/data
- ./zoo1/datalog:/datalog
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
zoo2:
image: zookeeper
restart: always
hostname: zoo2
container_name: zookeeper_2
ports:
- 2182:2181
volumes:
- ./zoo2/data:/data
- ./zoo2/datalog:/datalog
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
zoo3:
image: zookeeper
restart: always
hostname: zoo3
container_name: zookeeper_3
ports:
- 2183:2181
volumes:
- ./zoo3/data:/data
- ./zoo3/datalog:/datalog
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
4、SpringBoot基本应用
yaml
version: "3"
services:
microService:
image: my_docker:1.6
container_name: ms01
ports:
- "6001:6001"
volumes:
- /app/microService:/data
networks:
- my_net
depends_on:
- redis
- mysql
redis:
image: redis:6.0.8
ports:
- "6379:6379"
volumes:
- /app/redis/redis.conf:/etc/redis/redis.conf
- /app/redis/data:/data
networks:
- my_net
command: redis-server /etc/redis/redis.conf
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: '123456'
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
MYSQL_DATABASE: 'db2021'
MYSQL_USER: 'test_user'
MYSQL_PASSWORD: 'test_user123'
ports:
- "3306:3306"
volumes:
- /app/mysql/db:/var/lib/mysql
- /app/mysql/conf/my.cnf:/etc/my.cnf
- /app/mysql/init:/docker-entrypoint-initdb.d
networks:
- my_net
command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
networks:
my_net: