一、前言
本系列是根据 B 站 尚硅谷 Docker 视频 学习记录笔记。因为没有视频课件,部分内容摘自 https://www.yuque.com/tmfl/cloud/dketq0。
本系列仅为自身学习笔记记录使用,记录存在偏差,推荐阅读原视频内容或本文参考笔记。
二、Docker-compose
1. 基本概念
Docker-Compose 是 Docker 官方的开源项目,负责实现对Docker容器集群的快速编排。
Docker-Compose可以管理多个Docker容器组成一个应用。需要定义一个yaml格式的配置文件 docker-compose.yml,配置好多个容器之间的调用关系,然后只需要一个命令就能同时启动/关闭这些容器。
Docker建议我们每个容器中只运行一个服务,因为Docker容器本身占用资源极少,所以最好是将每个服务单独的分割开来。但是如果我们需要同时部署多个服务,每个服务单独构建镜像构建容器就会比较麻烦。所以 Docker 官方推出了 docker-compose 多服务部署的工具。
Compose允许用户通过一个单独的 docker-compose.yml 模板文件来定义一组相关联的应用容器为一个项目(project)。可以很容易的用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。
核心概念:
- 一文件 :docker-compose.yml
- 两要素 :
- 服务(service):一个个应用容器实例。
- 工程(project):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml中定义。
Compose使用的三个步骤:
- 编写 Dockerfile 定义各个应用容器,并构建出对应的镜像文件
- 编写 docker-compose.yml,定义一个完整的业务单元,安排好整体应用中的各个容器服务
- 执行 docker-compose up 命令,其创建并运行整个应用程序,完成一键部署上线
2. 安装过程
Docker-Compose的版本需要和Docker引擎版本对应,可以参照官网上的对应关系。
安装过程参考官网地址 :Install Compose standalone 。
powershell
# 例如从github下载 2.26.0版本的docker-compose
# 下载下来的文件放到 /usr/local/bin目录下,命名为 docker-compose
curl -SL https://github.com/docker/compose/releases/download/v2.26.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
# 添加权限
chmod +x /usr/local/bin/docker-compose
# 验证
docker-compose version
注:如果从 github 上下载可能会失败,可以通过 下载地址 来下载 docker-compose 后复制到服务器中。
3. 常用命令
powershell
# 查看帮助
docker-compose -h
# 创建并启动docker-compose服务:(类似 docker run)
docker-compose up
# 创建并启动docker-compose服务(后台运行)
docker-compose up -d
# 停止并删除容器、网络、卷、镜像:(类似 docker stop + docker rm)
docker-compose down
# 进入容器实例内部:
docker-compose exec <yml里面的服务id> /bin/bash
# 展示当前docker-compose编排过的运行的所有容器:
docker-compose ps
# 展示当前docker-compose编排过的容器进程
docker-compose top
# 查看容器输出日志
docker-compose log <yml里面的服务id>
# 检查配置
docker-compose config
# 检查配置 :有问题才输出
docker-compose config -q
# 重启服务
docker-compose restart
# 启动服务
docker-compose start
# 停止服务
docker-compose stop
3. 使用示例
-
编写 SpringBoot 微服务,暴露出两个接口,其中需要注意的是在 yml 文件中,MySQL和 Redis的连接是通过 docker 服务名连接的,而非通过IP 直连。如下:
ymlspring: datasource: # 通过 docker 服务名 kingfish_mysql 连接MySQL url: jdbc:mysql://kingfish_mysql:3306/demo?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&serverTimezone=GMT username: root password: root driver-class-name: com.mysql.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource redis: # 通过 docker 服务名 kingfish_redis 连接MySQL host: kingfish_redis mybatis: mapper-locations: classpath*:mapper/*/*.xml,classpath*:mapper/*.xml type-aliases-package: com.kingfish.dao configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl auto-mapping-behavior: full map-underscore-to-camel-case: true server: port: 9090 servlet: context-path: /simple-demo
-
编写 Dockerfile 文件生成该微服务镜像。内容如下:
powershell# 依赖于 JDK 8 FROM jdk:8 MAINTAINER kingfish # 在主机 /var/lib/docker目录下创建一个临时文件,并链接到容器的 /tmp VOLUME /tmp # 将jar包添加到容器中,并命名为 spring-simple-demo.jar ADD spring-simple-demo.jar /spring-simple-demo.jar # 运行jar包 RUN bash -c 'touch /spring-simple-demo.jar' ENTRYPOINT ["java", "-jar", "/spring-simple-demo.jar"] # 暴露服务端口(服务本身暴露9090端口) EXPOSE 9090
-
编写docker-compose.yml 文件,内容如下
powershell# docker-compose文件版本号 version: "3" # 配置各个容器服务 services: microService: image: simple_demo_docker:1.0 container_name: ms01 # 容器名称,如果不指定,会生成一个服务名加上前缀的容器名 ports: - "9090:9090" volumes: - /app/microService:/data networks: - springboot_network depends_on: # 配置该容器服务所依赖的容器服务 - kingfish_redis - kingfish_mysql kingfish_redis: image: redis:6.0.8 ports: - "6379:6379" volumes: - /app/redis/redis.conf:/etc/redis/redis.conf - /app/redis/data:/data networks: - springboot_network command: redis-server /etc/redis/redis.conf kingfish_mysql: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: 'root' MYSQL_ALLOW_EMPTY_PASSWORD: 'no' MYSQL_DATABASE: 'demo' MYSQL_USER: 'springboot' MYSQL_PASSWORD: 'springboot' 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: - springboot_network command: --default-authentication-plugin=mysql_native_password # 解决外部无法访问 networks: # 创建 springboot_network 网桥网络 springboot_network:
-
编写完成docker-compose.yml后,通过
docker-compose config -q
命令对文件语法检查powershell[root@192 spring-demo]# docker-compose config -q
-
语法检查没问题后,通过
docker-compose up -d
命令 进行创建、启动powershell[root@192 spring-demo]# docker-compose up -d WARN[0000] /soft/spring-demo/docker-compose.yml: `version` is obsolete [+] Running 3/4 ⠦ Network spring-demo_springboot_network Created 0.6s ✔ Container spring-demo-kingfish_mysql-1 Started 0.3s ✔ Container spring-demo-kingfish_redis-1 Started 0.3s ✔ Container ms01 Started
-
调用接口测试:
powershell# 从 MySQL 中获取数据 [root@192 spring-demo]# curl 127.0.0.1:9090/simple-demo/demo/getByDb [{"id":232,"name":null,"password":null,"roleId":null,"userId":"1"},{"id":233,"name":null,"password":null,"roleId":null,"userId":"0"},{"id":234,"name":null,"password":null,"roleId":null,"userId":"2"},{"id":235,"name":null,"password":null,"roleId":null,"userId":"3"},{"id":236,"name":null,"password":null,"roleId":null,"userId":"4"},{"id":237,"name":null,"password":null,"roleId":null,"userId":"5"},{"id":238,"name":null,"password":null,"roleId":null,"userId":"7"},{"id":239,"name":null,"password":null,"roleId":null,"userId":"6"},{"id":240,"name":null,"password":null,"roleId":null,"userId":"8"},{"id":241,"name":null,"password":null,"roleId":null,"userId":"9"}] # 从Redis 中获取数据 [root@192 spring-demo]# curl 127.0.0.1:9090/simple-demo/demo/getByRedis?key=aaa 123
-
通过
docker-compose stop
命令停止服务powershell[root@192 spring-demo]# docker-compose stop WARN[0000] /soft/spring-demo/docker-compose.yml: `version` is obsolete [+] Stopping 3/3 ✔ Container ms01 Stopped 0.6s ✔ Container spring-demo-kingfish_mysql-1 Stopped 1.5s ✔ Container spring-demo-kingfish_redis-1 Stopped
三、参考内容
B 站 尚硅谷 Docker 视频
https://www.yuque.com/tmfl/cloud/dketq0