Docker学习笔记---day012(容器化编排)
文章目录
-
- 一、Docker-Compose
- 二、Docker-Compose案例
-
- 2.1、编写DockerFile文件
- 2.2、构建镜像
- 2.3、不使用Compose
- 2.4、使用Compose
-
- 2.4.1、编写docker-compose.yml文件
- 2.4.2、修改微服务工程docker_boot
- 2.4.3、编排Dockerfile启动与
- [2.4.4、 进入mysql容器实例并新建数据库表和Redis容器实例](#2.4.4、 进入mysql容器实例并新建数据库表和Redis容器实例)
一、Docker-Compose
Docker-compose是Docker官方开源的项目,负责实现对Docker容器集群的快速编排
1.1、docker-compose是什么
Compose是Docker公司推出的一个工具软件,可以管理多个Docker容器组成的一个应用。只需要定义一个YAML格式的配置文件docker-compse.yml。写出多个容器之间的调用关系。然后,只需一个命令,就能同时启动/关闭这些容器。
1.2、docker-compose能干什么
docker一般是每一个容器只运行一个服务,因为docker容器本来占用的资源比较少,所以最好是将每一个服务单独分割开。
造成的问题:如果我们同时需要部署多个服务,每个服务都使用Dockerfile然后在构建镜像,这样也太麻烦了。
Docker官方提供的Compose多服务部署的工具,就是解决上述问题的。
例如:如果我们要实现一个Web微服务项目,除了Web服务器本身,往往还需要再加上后端使用的Mysql服务容器、Redis服务容器、注册中心Eureka,甚至包含一些负载均衡容器等等。
Compose允许用户通过一个单独的docker-compose.yml模版文件来定义一组相关联的应用容器为一个项目。

Docker-Compose的优点:
- 高效的协作:可共享的YAML文件有助于开发人员和运维人员之间的顺畅协作,优化工作流程并加快问题的解决速度,提高工作效率。
- 快速应用开发:Compose会缓存用于创建容器的配置。当你重启为发生改变的服务时,Compose会重新使用现有的容器。重复使用容器意味着可以非常迅速地对环境进行修改。
- 跨环境的可移植性
1.3、docker-compose下载
- 下载Docker Compose二进制文件
powershell
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
- 赋予文件可执行的权限
powershell
chmod +x /usr/local/bin/docker-compose
- 验证安装
powershell
docker-compose --version
- 卸载方式
powershell
sudo rm /usr/local/bin/docker-compose

1.4、docker-compose核心概念
一个文件:Docker-Compose.yml文件
两个要素:服务 和工程
-
服务(service)
一个个应用容器实例。比如:订单微服务、库存微服务、mysql容器、nginx容器实例、Redis容器实例等等
-
工程(project)
由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml文件中定义。
1.5、docker-compose使用的三个步骤
- 编写Dockerfile定义各个微服务应用并构建出对应的镜像文件
- 使用docker-compose.yml定义一个完整的业务单元,安排好整体应用中的各个容器服务。
- 执行docker-compose up命令来启动并运行整个应用程序,完成一键部署上线
1.6、docker-compose使用的三个步骤
powershell
# 1、查看帮助
docker-compose -h
# 2、启动所有docker-compose服务
docker-compose up
# 3、启动所有docker-compose服务并后台运行
docker-compose up -d
# 4、停止并删除容器、网络、卷、镜像
docker-compose down
# 5、进入容器实例内部
# docker-compose exec docker-compose.yml 文件中写的服务id /bin/bash
docker-compose exec yml里面的服务id
# 6、展示当前docker-compose编排过的运行的所有容器
docker-compose ps
# 7、展示当前docker-compose编排过的容器进程
docker-compose top
# 8、查看容器输出日志
docker-compose logs yml里面的服务id
# 9、检查配置
docker-compose config
# 10、检查配置,有问题才输出
docker-compose config -q
# 11、重启服务
docker=compose restart
# 12、启动服务
docker-compose start
# 13、停止服务
docker-ompose stop
二、Docker-Compose案例
写一个简单的微服务项目,通过mysql、redis实现增删改查
2.1、编写DockerFile文件
powershell
# 基础镜像使用
FROM java:8
# VOLUME 指定临时文件目录/tmp ,在主机var/lib/docker目录下创建一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并命名为radan_docker。jar
ADD docker_boot-0.0.1.SNAPSHOT.jar radan_docker.jar
# 运行jar包
RUN bash -c 'touch /radan_docker.jar'
ENTRYPOINT['java', '-jar', '/radan_docker.jar']
# 保留服务端口
EXPOSE 6001
2.2、构建镜像
powershell
docker build -t radan_docker:1.0 .
2.3、不使用Compose
不使用容器化编排技术的时候,镜像一个一个按顺序启动
很显然得运行三次容器实例
powershell
# 1、新建Mysql容器
docker run -p 3306:3306 --name mysql57 --privileged=true /radan/mysql/conf:/etc/mysql/conf.d -v /radan/mysql/logs:/logs -v /radan/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
# 2、新建redis容器实例
docker run -p 6379:6379 --name redis608 --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app/redis/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf
# 3、启动微服务镜像
docker run -d -p 6001:6001 镜像ID
上面这种方式可以成功部署,但显然操作是花费时间的。
其次。容器间的启停或者宕机,有可能导致IP地址对应的容器实例变化,映射出现问题,要么生产IP写死(不推荐),要么通过服务进行调用
2.4、使用Compose
2.4.1、编写docker-compose.yml文件
yml
version: "3" # 指定Docker Compose文件格式版本
services:
# 微服务应用
microService:
image: zzyy_docker:1.6 # 使用的自定义微服务镜像
container_name: ms01 # 容器名称,方便识别和管理
ports:
- "6001:6001" # 端口映射:主机端口6001映射到容器端口6001
volumes:
- /app/microService:/data # 数据卷挂载:将主机目录挂载到容器
networks:
- atguigu_net # 连接到自定义网络
depends_on:
- redis
- mysql # 依赖关系:先启动redis和mysql服务
# Redis缓存服务
redis:
image: redis:6.0.8 # Redis 6.0.8版本镜像
ports:
- "6379:6379" # Redis默认端口映射
volumes:
- /app/redis/redis.conf:/etc/redis/redis.conf # 挂载Redis配置文件
- /app/redis/data:/data # 挂载Redis数据持久化目录
networks:
- atguigu_net # 连接到自定义网络
command: redis-server /etc/redis/redis.conf # 使用自定义配置启动Redis
# MySQL数据库服务
mysql:
image: mysql:5.7 # MySQL 5.7版本镜像
container_name: mysql57 # MySQL容器名称
environment:
MYSQL_ROOT_PASSWORD: '123456' # 设置root用户密码
MYSQL_ALLOWED_EMPTY_PASSWORD: 'no' # 不允许空密码
MYSQL_DATABASE: 'db2021' # 容器启动时创建的默认数据库
MYSQL_USER: 'zzyy' # 创建额外的普通用户
MYSQL_PASSWORD: 'zzyy123' # 普通用户的密码
ports:
- "3306:3306" # MySQL默认端口映射
volumes:
- /app/mysql/db:/var/lib/mysql # 挂载MySQL数据目录,防止数据丢失
- /app/mysql/conf/my.cnf:/etc/my.cnf # 挂载MySQL配置文件
- /app/mysql/init:/docker-entrypoint-initdb.d # 初始化脚本目录
networks:
- atguigu_net # 连接到自定义网络
command: --default-authentication-plugin=mysql_native_password # 解决外部客户端连接认证问题
# 定义自定义网络
networks:
atguigu_net: # 创建一个名为atguigu_net的桥接网络
# 网络配置(可在此处添加更多网络设置,如driver、ipam等)
2.4.2、修改微服务工程docker_boot
此时,应该通过暴漏的服务名去调用IP
yml
server:
port: 6001
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
# 直接通过容器实例的服务名映射IP
# url: jdbc:mysql://192.168.1.107:3306/db2021?useUnicode=true&characterEncoding=utf-8&useSSL=false
url: jdbc:mysql://mysql:3306/db2021?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: 123456
redis:
database: 0
# host: 192.168.1.107
host: redis
port: 6379
password:
lettuce:
pool:
max-active: 8
max-wait: -1ms
max-idle: 8
min-idle: 0
shutdown-timeout: 100ms
2.4.3、编排Dockerfile启动与
和之前的操作类似,唯一不一样的启动
powershell
# 先看我们编写的docker-compose.yml文件编写的对不对
# 对了,就没有任何输出
docker-compose conf -q
# 进行容器编排
docker-compose up -d


2.4.4、 进入mysql容器实例并新建数据库表和Redis容器实例
powershell
# 进入mysql容器实例
docker exec -it mysql容器实例ID
# 进入redis容器实例
docker exec -it redis容器实例ID
注:使用docker-compose进行容器编排可以一键启动,还可以通过服务名找到对应IP,不必把IP写死