一、概述
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