Docker学习笔记—day012

Docker学习笔记---day012(容器化编排)

文章目录

一、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下载

  1. 下载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
  1. 赋予文件可执行的权限
powershell 复制代码
chmod +x /usr/local/bin/docker-compose
  1. 验证安装
powershell 复制代码
docker-compose --version
  1. 卸载方式
powershell 复制代码
sudo rm /usr/local/bin/docker-compose

1.4、docker-compose核心概念

一个文件:Docker-Compose.yml文件

两个要素:服务工程

  1. 服务(service)

    一个个应用容器实例。比如:订单微服务、库存微服务、mysql容器、nginx容器实例、Redis容器实例等等

  2. 工程(project)

    由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml文件中定义。

1.5、docker-compose使用的三个步骤

  1. 编写Dockerfile定义各个微服务应用并构建出对应的镜像文件
  2. 使用docker-compose.yml定义一个完整的业务单元,安排好整体应用中的各个容器服务。
  3. 执行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写死

相关推荐
ouliten3 小时前
C++笔记:流式异步日志库
c++·笔记
电饭叔3 小时前
TypeError:unsupported operand type(s) for -: ‘method‘ and ‘int‘
开发语言·笔记·python
qq_5470261793 小时前
Docker 搭建Nexus3私服
运维·docker·容器
我是六月生3 小时前
于windows环境下,使用阿里云oss搭建在线图床,Obsidian/Typora自动将图片上传,实现图片粘贴复制
笔记·阿里云·云计算
Gavin在路上3 小时前
AI学习之Anthropic的访谈者工具
人工智能·学习
driver19994 小时前
hyperV装的windows11安装docker不支持虚拟化
运维·docker·容器
warrah4 小时前
docker portainer的应用
docker
AA陈超4 小时前
LyraStarterGame_5.6 Experience系统加载流程详细实现
c++·笔记·学习·ue5·虚幻引擎·lyra
浦东新村轱天乐4 小时前
2025.12.08-2025.12.14:课题分离,不要在意外在评价。
笔记·职场发展