Docker容器(五)Docker Compose

一、概述

1.1介绍

Docker Compose是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器
`Compose` 恰好满足了这样的需求。它允许用户通过一个单独的 `docker-compose.yml` 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。

1.2简介

docker-compose项目是docker官方的开源项目, 负责实现对docker容器集群的快速编排。

docker-compose将所管理的容器分为三层, 分别是工程(project),服务(service)以及容器(containner)

  • 服务 (`service`):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
  • 项目 (`project`):由一组关联的应用容器组成的一个完整业务单元,在 `docker-compose.yml` 文件中定义。
    docker-compose运行目录下的所有文件(docker-compose.yml文件、extends文件或环境变量等)组成一个工程,如无特殊指定,工程名即为当前目录名。

一个工程当中,可以包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。

一个服务中可以包括多个容器实例,docker-compose并没有解决负载均衡的问题。因此需要借助其他工具实现服务发现及负载均衡,比如consul。 `Compose` 定位是 「定义和运行多个 Docker 容器的应用
`Compose` 项目由 Python 编写,实现上调用了 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 `Compose` 来进行编排管理。

1.3使用步骤

1.编写Dockerfile定义各个微服务应用并构建出对应的镜像文件dockerfile的使用,使用dockerfile部署springboot项目。

2 .使用 docker-compose.yml 定义一个完整业务单元,安排好整体应用中的各个容器服务。

3.最后,执行docker-compose up命令 来启动并运行整个应用程序,完成一键部署上线。

bash 复制代码
version: "3.0"  # Docker Compose的版本
services:  # 定义服务
  mysqldb:  # MySQL数据库服务
    image: mysql:5.7.19  # 使用的MySQL镜像版本
    container_name: mysql  # 容器名称
    ports:  # 端口映射
      - "3306:3306"  # 将容器的3306端口映射到宿主机的3306端口
    volumes:  # 数据卷挂载
      - /root/mysql/conf:/etc/mysql/conf.d  # 配置文件目录
      - /root/mysql/logs:/logs  # 日志目录
      - /root/mysql/data:/var/lib/mysql  # 数据目录
    environment:  # 环境变量
      MYSQL_ROOT_PASSWORD: root  # 设置MySQL的root密码为root
    networks:  # 网络配置
      - ems  # 连接到名为ems的网络
    depends_on:  # 依赖服务
      - redis  # 依赖于redis服务

  redis:  # Redis服务
    image: redis:4.0.14  # 使用的Redis镜像版本
    container_name: redis  # 容器名称
    ports:  # 端口映射
      - "6379:6379"  # 将容器的6379端口映射到宿主机的6379端口
    networks:  # 网络配置
      - ems  # 连接到名为ems的网络
    volumes:  # 数据卷挂载
      - /root/redis/data:/data  # 数据目录
    command: redis-server  # 启动Redis服务器的命令

networks:  # 定义网络
  ems:  # 名为ems的网络

启动docker-compose

bash 复制代码
docker-compose -f docker-compose.yaml up -d  //-f调用文件。-d:开启守护进程

1.4 Docker Compose 编排字段部分详解

version

version 字段指定了 Docker Compose 编排文件的版本,例如:

bash 复制代码
version: '3'

services

services 字段指定了在 Docker Compose 编排中要运行的服务。每个服务都有一个名称,并指定要使用的镜像和容器的配置选项。例如:

bash 复制代码
services:
  mysql: #服务名
    image: mysql:5.5 #mysql镜像

build 和 image

build 字段允许在 Docker Compose 编排中指定 Dockerfile 的位置,从而可以使用 Docker Compose 构建镜像。image 字段指定要使用的 Docker 镜像。例如:

bash 复制代码
services:
  mysql: #服务名
    image: mysql:5.5 #mysql镜像
  user: #服务名
    build: ./user #这里为用户微服务文件夹,里面存放的是该服务代码jar包和Dockerfile文件

volumes 和 environment

volumes 字段指定了要使用的数据卷。environment 字段指定了要设置的环境变量。例如:

bash 复制代码
services:
  mysql: #服务名
    image: mysql:5.5 #mysql镜像
    environment:
      MYSQL_ROOT_PASSWORD: 000000 #设置数据库密码
    volumes:
    - "$PWD/mysql/data:/var/lib/mysql" #数据卷挂载

ports 和 expose

ports 字段指定了要宿主机映射到容器的端口(宿主机端口:容器端口)。expose 字段是用于在 Docker 容器内部暴露端口的选项,可以让其他容器连接到这些端口,但不会将它们映射到 Docker 主机上。expose 与 ports 不同的是,expose 字段仅仅是将容器内部的端口暴露给其他容器使用,而不是直接映射到宿主机上的端口

bash 复制代码
 services:
    gateway: #服务名
       build: ./gateway #这里为网关文件夹,里面存放的是该服务代码jar包和Dockerfile文件
       ports:
          -"7000:7000"
    nginx:
        image: nginx
        expose:
          -"8080"
 
   
 
    
 

当然命令还有很多,这里进行部署实战的时候只用到上述这些编排字段,所以这里重点写了这些,其余的进行省略。

networks

配置容器连接的网络。

bash 复制代码
version: "3"
services:

  some-service:
    networks:
     - some-network
     - other-network

networks:
  some-network:
  other-network:

container_name

指定容器名称。默认将会使用 `项目名称_服务名称_序号` 这样的格式。

`environment

设置环境变量。你可以使用数组或字典两种格式。

只给定名称的变量会自动获取运行 Compose 主机上对应变量的值,可以用来防止泄露不必要的数据

bash 复制代码
environment:
  RACK_ENV: development
  SESSION_SECRET:

environment:
  - RACK_ENV=development
  - SESSION_SECRET

command

覆盖容器启动后默认执行的命令。

bash 复制代码
command: echo "hello world"

------------------------------

env_file

从文件中获取环境变量,可以为单独的文件路径或列表。

如果通过 `docker-compose -f FILE` 方式来指定 Compose 模板文件,则 `env_file` 中变量的路径会基于模板文件路径。

如果有变量名称与 `environment` 指令冲突,则按照惯例,以后者为准。

depends_on

解决容器的依赖、启动先后的问题。以下例子中会先启动 `redis` `db` 再启动 `web`

build

指定 `Dockerfile` 所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。 `Compose` 将会利用它自动构建这个镜像,然后使用这个镜像。

总结

1.5Docker Compose 常用命令

bash 复制代码
docker --version #查看版本
 
docker-compose -h    # 查看帮助
 
docker-compose up    # 启动所有docker-compose服务
 
docker-compose up -d    # 启动所有docker-compose服务并后台运行
 
docker-compose down     # 停止并删除容器、网络、卷、镜像。
 
docker-compose exec  yml里面的服务id   # 进入容器实例内部  docker-compose exec docker-compose.yml文件中写的服务id /bin/bash
 
docker-compose ps      # 展示当前docker-compose编排过的运行的所有容器
 
docker-compose top       # 展示当前docker-compose编排过的容器进程
 
docker-compose logs  yml里面的服务id   # 查看容器输出日志
 
docker-compose config     # 检查配置
 
docker-compose config -q  # 检查配置,有问题才有输出
 
docker-compose restart   # 重启服务
 
docker-compose start     # 启动服务
 
docker-compose stop      # 停止服务

docker-compose rm [options] [SERVICE...]  #删除所有(停止状态的)服务容器。

二、实战mongodb

bash 复制代码
version: '3.7'
services:
  mongo:
    image: mongo
    ports:
      - "27017:21017"
    volumes:
      - ./data:/data/db
    environment:
      MONGO_INITDB_ROOT_USERNAME: mongo
      MONGO_INITDB_ROOT_PASSWORD: 1213
      MONGO_INITDB_DATABASE: test
    command: --bind_ip_all
相关推荐
❀͜͡傀儡师4 小时前
docker一键部署HFish蜜罐
运维·docker·容器
DO_Community4 小时前
DigitalOcean容器注册表推出多注册表支持功能
服务器·数据库·docker·kubernetes
dnpao4 小时前
linux onlyoffice服务向docker容器中添加中文字体
linux·运维·docker
回忆是昨天里的海5 小时前
k8s暴露服务-Ingress环境部署
云原生·容器·kubernetes
tzhou644525 小时前
Kubernetes Pod 入门
云原生·容器·kubernetes
java_logo6 小时前
Dify 开源 LLM 应用开发平台企业级 Docker Compose 部署手册
docker·容器·开源·dify部署·dify部署文档·dify部署方案·dify部署教程
jarreyer7 小时前
【docker的gpu加速相关问题解决记录】
运维·docker·容器
韭菜钟7 小时前
制作自定义Docker镜像并部署使用
运维·docker·容器
椰汁菠萝7 小时前
docker部署gitlab
docker·容器·gitlab
知识分享小能手7 小时前
Ubuntu入门学习教程,从入门到精通,Ubuntu 22.04 中安装 Docker 容器 —— 知识点详解(26)
学习·ubuntu·docker