docker详解(三):Docker Compose

2024-04-14 17:59:17

浏览:72

评论:0

前言

Docker详解(一)中,已经安装配置了docker-composer。

Docker Composer概述

  • Docker Compose 是 Docker 官方提供的一种工具,用于定义和运行多个 Docker 容器的应用程序。它基于 Docker 命令行工具,提供了一个简单的 YAML 文件格式,用于定义多个容器之间的关系和配置,然后可以使用单个命令来启动、停止和管理这些容器。

  • 使用Docker详解(二)中的Dockerfile我们很容易定义一个单独的应用容器。但在实际的项目中,例如一个 Web 应用程序,其中包含多个容器,例如 Web 服务器、数据库和缓存等。我们可以使用 Docker Compose,通过定义一个 Compose 文件,可以指定每个容器的配置、服务之间的依赖关系以及它们应该运行在哪个网络中。然后使用 Docker Compose 命令来启动整个应用程序,并在需要时停止或重新构建容器。这样就可以轻松地管理和部署一个复杂的应用程序

  • Docker Compose、machine 和 swarm 是docker 原生提供的三大编排工具。简称docker三剑客。

Docker Compose YAML 文件配置

Docker Compose 的 YAML 文件是用于定义多个容器之间的关系和配置的文件,它使用键值对的方式来表示各种配置。以下是 Docker Compose YAML 文件的一些常见配置项

配置项 描述
version 指定 Docker Compose 的版本号,通常是设置版本为 3,这样可以使用更多高级的功能
services 定义了运行服务的Docker容器配置,可以指定每个服务的镜像、容器名称、启动命令、端口映射、环境变量等。
networks 定义各个网络的配置,常见的如 bridge、host、overlay 等
volumes 如果服务中有数据卷名称,必须在文件中配置此数据卷

services下的常用配置项更多配置

配置项 描述
image 指定镜像的名称或者 ID,用于拉取或者使用一个已经存在的镜像
container_name 容器名称,指定一个自定义容器名,而不是默认生成的名称
ports 指定容器内部端口和主机端口之间的映射关系
volumes 定义各个数据卷的配置,可以指定数据卷的类型、名称、挂载目录等
restart always 表示如果服务启动不成功会一直尝试
depends_on 可以配置依赖服务,表示需要先启动 depends_on 下面的服务后,再启动本服务
environment 此节点下的信息会当作环境变量传入容器
command 覆盖容器启动后默认执行的命令

Docker Compose 常用命令

命令 描述
docker-compose down 停止并删除容器、网络、数据卷等资源
docker-compose build 构建 Docker 镜像
docker-compose start/stop/restart 启动/停止/重启/已经存在的容器
docker-compose ps 列出当前项目中所有的容器
docker-compose logs 查看容器的日志输出
docker-compose exec 进入正在运行的容器,并执行输入的命令
docker-compose top 显示容器中运行的进程
docker-compose rm 删除已经停止的容器、网络、数据卷等资源
docker-compose pull 拉取指定的镜像
docker-compose push 推送本地镜像到 Docker 镜像仓库
docker-compose config 验证并查看 Docker Compose 文件的语法
docker-compose version 显示 Docker Compose 的版本号
docker-compose up -d 在后台启动容器
docker-compose up --build 强制重新构建镜像并启动容器

Docker Composer 网络和安全问题

Docker Compose YAML配置实战

version: '3'
services:

  mysql:
    image: mysql:5.7.35 #镜像名称以及版本
    restart: always #重启docker后该容器也重启
    container_name: mysql #容器名称
    environment:
      MYSQL_ROOT_PASSWORD: 123456 #指定用户密码
      TZ: Asia/Shanghai
    ports:
      - 3306:3306 #本地端口号与容器内部端口号
    volumes: #指定挂载目录
      - /usr/etc/mysql/datadir:/var/lib/mysql
      - /usr/etc/mysql/config/my.cnf:/etc/mysql/my.cnf
    command: 
      --max_connections=1000
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --default-authentication-plugin=mysql_native_password
  redis:
    image: redis:4.0.7  #镜像名称以及版本
    restart: always  #重启docker后该容器也重启
    container_name: redis #容器名称
    ports:
      - 6379:6379 #本地端口号与容器内部端口号
    volumes: #指定挂载目录
      - /usr/etc/redis/redis.conf:/usr/local/etc/redis/redis.conf  #redis.conf文件和data目录分别映射了主机的redis.conf文件和主机的data目录
      - /usr/etc/redis/data:/data
    command:
      /bin/bash -c "redis-server /usr/local/etc/redis/redis.conf " #使用command可以覆盖容器启动后默认执行的命令。这里启动执行指定的redis.conf文件
  nginx:
    image: nginx:1.21.3 #镜像名称以及版本
    restart: always #重启docker后该容器也重启
    container_name: nginx #容器名称
    ports:
      - 80:80 #本地端口号与容器内部端口号
      - 443:443 #本地端口号与容器内部端口号
    volumes: #指定挂载目录
      - ./usr/etc/nginx/html:/usr/share/nginx/html
      - ./usr/etc/nginx/log:/var/log/nginx
      - ./usr/etc/nginx/conf:/etc/nginx/