Docker Compose是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。
定义一个YAML格式的配置文件docker-compose.yml,写好对个容器之间的调用关系。然后,只要一个命令就能同时启动/关闭这些容器。
Docker建议我们每个容器中只运行一个服务,因此需要docker compose多服务部署的工具。
安装Compose Reference地址:Reference | Docker Documentation
Install地址: Manuals | Docker Documentation
CentOS 安装举例:手动安装
DOCKER_CONFIG=${DOCKER_CONFIG:-/usr/local/lib/docker} mkdir -p $DOCKER_CONFIG/cli-plugins curl -SL https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
第一行代码详见${}
的详细用法
下载慢的话可以使用国内镜像源
curl -SL https://get.daocloud.io/docker/compose/releases/download/v2.16.0/docker-compose-`uname -s`-`uname -m` -o $DOCKER_CONFIG /cli-plugins/docker-compose
如果还是慢,可在本地下载完成后,上传到/usr/local/lib/docker/cli-plugins/
,并改名
mv docker-compose-linux-x86_64 docker-compose
添加可执行权限
sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
查看是否安装成功
# docker compose version Docker Compose version v2.16.0
Compose核心概念 一文件
两要素
Compose命令
命令
描述
docker compose -h
查看帮助
docker compose up
启动所有docker compose服务
docker compose up -d
启动所有docker compose服务并后台运行
docker compose down
停止并删除容器、网络、卷、镜像
docker compose exec id /bin/bash
进入容器实例内部,docker-compose.yml中的id
docker compose ps
展示当前docker compose编排过的运行的容器
docker compose top
展示当前docker compose编排过的容器进程
docker compose logs id
查看容器输出日志
docker compose config
检查配置
docker compose config -q
检查配置,有问题才输出
docker compose restart
重启服务
docker compose start
启动服务
docker compose stop
停止服务
Compose实战 准备项目 项目下载地址:
数据库脚本 使用user
表作为案例,其脚本如下:
CREATE TABLE `tb2023`.`t_user` ( `id` int UNSIGNED NOT NULL AUTO_INCREMENT, `username` varchar (50 ) NULL COMMENT '用户名' , `password` varchar (50 ) NULL COMMENT '密码' , `gender` tinyint NULL COMMENT '性别 0=女 1=男' , `version` int DEFAULT '1' COMMENT '乐观锁' , `deleted` tinyint unsigned DEFAULT '1' COMMENT '删除标志,默认0不删除 1删除' , `create_time` timestamp NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间' , `update_time` timestamp NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' , PRIMARY KEY (`id`) );
项目配置文件 application.yml server: port: 8080 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://172.31.193.36:3306/tb2023?useSSL=true&characterEncoding=UTF-8&serverTimezone=UTC username: root password: 123456 redis: host: 172.31 .193 .36 port: 6379 password: 123456 lettuce: pool: max-active: 10 max-idle: 10 min-idle: 1 time-between-eviction-runs: 10s
从配置文件中可以看到项目包含了:
注意:这里mysql和redis的IP地址固定了,使用的是Linux系统的IP地址,使用ip addr
可查看eth0
的IP。
构建镜像 编写Dockerfile文件
Dockerfile FROM openjdk:8 COPY *.jar /app.jar CMD ["--server.port=8080" ] EXPOSE 8080 ENTRYPOINT ["java" , "-jar" , "/app.jar" ]
使用maven打包项目,将Dockerfile和jar一块上传到服务器
打包镜像
docker build -t docker-spring-boot .
查看镜像
[root@swcode compose]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker-spring-boot latest 559521cb1212 10 seconds ago 573MB idea-demo latest 1e0b48277189 28 hours ago 544MB
不使用Compose 单独启动MySQL容器 启动MySQL容器
docker run -d -p 3306:3306 --name mysql8 --privileged=true -v /compose/mysql/conf:/etc/mysql/conf.d -v /compose/mysql/logs:/logs -v /compose/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:8
进入容器
docker exec -it mysql8 bash
登陆mysql,密码是123456
创建数据库tb2023
创建t_user
表
CREATE TABLE `tb2023`.`t_user` ( `id` int UNSIGNED NOT NULL AUTO_INCREMENT, `username` varchar (50 ) NULL COMMENT '用户名' , `password` varchar (50 ) NULL COMMENT '密码' , `gender` tinyint NULL COMMENT '性别 0=女 1=男' , `version` int DEFAULT '1' COMMENT '乐观锁' , `deleted` tinyint unsigned DEFAULT '1' COMMENT '删除标志,默认0不删除 1删除' , `create_time` timestamp NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间' , `update_time` timestamp NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' , PRIMARY KEY (`id`) );
单独启动Redis容器 下载配置文件:https://redis.io/docs/management/config/
修改以下几项
appendonly yes# bind 127.0.0.1 requirepass 123456
启动Redis容器
docker run -p 6379:6379 --name redis708 --privileged=true -v /compose/redis/redis.conf:/etc/redis/redis.conf -v /compose/redis/data:/data -d redis:7.0.8 redis-server /etc/redis/redis.conf
查看是否启动成功
单独启动项目容器 启动项目
docker run -d -p 8080:8080 docker-spring-boot
查看是否启动成功
[root@swcode compose]# docker ps CONTAINER ID IMAGE PORTS NAMES 46f1c4741b04 docker-spring-boot 0.0.0.0:8080->8080/tcp priceless_bassi 19e0fdd1a65f redis:7.0.8 0.0.0.0:6379->6379/tcp redis708 69615c89a053 mysql:8 0.0.0.0:3306->3306/tcp, 33060/tcp mysql8
测试项目 访问Swagger接口:http://ip:8080/swagger-ui/index.html
使用Compose编排 docker-compose文件 docker-compose.yml version: "3" services: microService: image: docker-spring-boot container_name: ms01 ports: - "8080:8080" volumes: - /compose/microService:/data networks: - ms01_net depends_on: - redis - mysql redis: image: redis:7.0.8 ports: - "6379:6379" volumes: - /compose/redis/redis.conf:/etc/redis/redis.conf - /compose/redis/data:/data networks: - ms01_net command: /usr/local/bin/redis-server /etc/redis/redis.conf mysql: image: mysql:8 environment: MYSQL_ROOT_PASSWORD: '123456' MYSQL_ALLOW_EMPTY_PASSWORD: 'no' MYSQL_DATABASE: 'tb2023' MYSQL_USER: 'swcode' MYSQL_PASSWORD: '123456' ports: - "3306:3306" volumes: - /compose/mysql/data:/var/lib/mysql - /compose/mysql/conf:/etc/mysql/conf.d - /compose/mysql/db:/docker-entrypoint-initdb.d - /compose/mysql/logs:/logs networks: - ms01_net command: --default-authentication-plugin=mysql_native_password networks: ms01_net:
修改项目配置
通过服务名访问,IP无关
更改IP为服务名
application.yml spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://mysql:3306/tb2023?useSSL=true&characterEncoding=UTF-8&serverTimezone=UTC username: root password: 123456 redis: host: redis port: 6379 password: 123456 lettuce: pool: max-active: 10 max-idle: 10 min-idle: 1 time-between-eviction-runs: 10s
重新打包上传到服务器,重新构建
docker rmi -f docker-spring-boot docker build -t docker-spring-boot .
启动所有容器项目 清空所有容器
docker rm -f $(docker ps -aq)
创建配置文件/compose/redis/redis/redis.conf
Redis配置文件,下载地址:https://redis.io/docs/management/config/。
修改以下几项
appendonly yes bind 0.0.0.0 requirepass 123456
执行启动命令
docker-compose.yml所在目录
查看运行的服务
[root@swcode compose]# docker ps CONTAINER ID IMAGE PORTS NAMES 06a1106838a6 docker-spring-boot 0.0.0.0:8080->8080/tcp ms01 34559844510c redis:7.0.8 0.0.0.0:6379->6379/tcp compose-redis-1 492dd67129a8 mysql:8 0.0.0.0:3306->3306/tcp, 33060/tcp compose-mysql-1
测试项目 访问Swagger接口:http://ip:8080/swagger-ui/index.html
停止项目