一、Docker Compose 引入
现有 docker 进行项目部署存在的问题 1、为了完成一个完整项目,势必用到 n 多个容器配合完成项目中业务开发,一旦引入 n 多个容器,n 多个容器之间就会形成某种依赖,也就意味着某些容器的运行需要其它容器优先启动。 此时,容器的编排就很重要。 2、现在这种容器的部署方式,我们没办法站在项目的角度将一组容器划分到一起,日后多服务器部署是个问题。 项目角度管理用到的一组容器
二、Docker Compose 简介
2.1、什么是 Docker Dompose
Docker Compose 项目是 Docker 官方的开源项目,负责实现对Docker容器集群的快速编排。从功能上看,跟 OpenStack 中的 Heat 十分相似。
快速编排:站在项目角度将一组相关联容器整合在一起,对这组容器进行按照指定顺序启动。
Compose 定位是对于多个 Docker 容器管理
2.2、如何使用 Docker Compose
Compose 允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式) 来定义一组相关的应用容器为一个项目 (project)。
Compose 中两个重要概念:
- 项目 (projectg): 由一组关联的应用容器 (服务) 组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
- 服务 (service): 一个应用中某一个的容器,实际上可以包括若干运行相同镜像的容器实例。
Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。 Compose 项目由 Python 编写,实现上调用了 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API ,就可以 在其上利用 Compose 来进行编排管理。
三、安装
注意:只有 Linux 平台上在安装 docker 时没有安装 docker-compose,
- 下载
sudo curl -L https://github.com/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
- 添加可执行权限
sudo chmod +x /usr/local/bin/docker-compose
三、使用
3.1、场景
最常见的项目是 web 网站,该项目应该包含 web 应用和缓存。
- springboot 应用
- mysql 服务
- redis 服务
- elasticsearch 服务
- ……
3.2、使用案例
- 创建一个项目
mkdir hudu_project
- 在 hudu_project 目录创建一个 docker-compose.yml 模板文件
version: docker-compose 版本和 docker 版本对应关系,https://docs.docker.com/compose/compose-file/compose-file-v3
service: 开始定义每一个服务
mysqldb: 自定义服务名,默认容器名称为项目名 + _ + 服务名
image: 使用的哪个镜像,类似于 docker run 指定的镜像名称
ports: 宿主机和容器中端口映射,类似于 docker run -p 参数
volumes: 代表当前容器和宿主机指定数据卷,类似于 docker run -v 参数,注意:docker-compose 使用绝对路径必须先创建才能使用,具名数据卷需要在compose文件中定义,docker volume ls 查看时,发现数据卷别名为 项目名+定义的数据卷名称
environment: 代表给当前容器启动指定环境,类似于 docker run -e MYSQL_ROOT_PASSWORD=root
container_name: 代表给容器指定一个名称,类似于 docker run --name 参数,推荐使用默认名称,不自定义服务名称。
# 代表使用 docker-compose 项目的版本号,与 docker 引擎有关
version: "3.8"
services:
mysqldb:
image: mysql:8.0.28
container_name: mysql
ports:
- "3306:3306"
volumes:
- /root/mysql/conf:/ect/mysql/conf.d
- /root/mysql/logs:/logs
- /root/mysql/data:/var/lib/mysql
environment:
- "MYSQL_ROOT_PASSWORD: root"
network:
- hudu
depends_on:
- redis
redis:
image: redis:6.2.6
container_name: redis
ports:
- "6379:6379"
networks:
- hudu_project
volumes:
- /root/redis/data:/data
command: redis-server
network:
hudu_project:
- 启动 docker-compose 一组服务
docker-compose up -d 这个命令必须在 docker-compose.yml 配置文件所在目录 docker-compose down 会把项目对应的服务的缓存配置都移除
启动后效果如下
3.3、docker-compose 中支持的常用模板命令
3.3.1、build
通过 docker-compose 在启动容器之前,先根据 dockerfile 构建镜像,然后根据构建的镜像启动容器。
3.3.2、command
覆盖容器启动后默认执行的命令,类似于 docker run image 覆盖的命令,
3.3.3、container_name
用来指定 docker-compose 启动容器名称,注意:不推荐指定容器名称
3.3.4、depends_on
解决容器的依赖,启动先后问题。 注意:当前服务不会等待依赖的服务[完全启动]之后才启动
3.3.5、environment
用来给容器启动指定环境变量,相当于 docker run -e 参数
3.3.6、env_file
用来给容器启动指定环境变量文件,相当于 docker run -e 参数
3.3.7、expose
用来指定构建镜像过程中容器暴露的端口号,一半直接在 Dockerfile中已经定义
3.3.8、image
用来指定容器使用的镜像是谁,相当于 docker run image(镜像名)
3.3.9、networks
用来指定启动的容器使用的网桥,相当于 docker run --network,使用时需要声明使用的网桥
3.3.10、ports
用来指定宿主机和容器端口映射,相当于 docker run -p 参数
3.3.11、volumes
用来指定宿主机和容器中的目录映射,相当于 docker run -v 参数
3.3.12、restart
用来指定 docker 容器(服务)总是运行,相当于 docker run --restart=always
3.4、具体使用参考
docker-compose.yml
文件内容
.env
文件内容
Dockerfile
内容
3.5、docker-compose 命令
3.5.1、命令对象与格式
对于 compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器,如果没有特别说明,命令对象将是项目,这意味着项目中的所有的服务都会受到影响。
执行 docker-compose [COMMAND] --help
或者docker-compose help [COMMAND]
可以查看具体某个命令的使用格式。
具基本的使用格式是
docker-compose -f docker-compose.yml 命令 [选项] [服务id]
3.5.2、命令选项
-f, --file FILE
指定使用的Compose模板文件,默认为docker- compose.yml ,可以多次指定。-p,--project-name NAME
指定项目名称,默认将使用所在目录名称作为项目名。--x-networking
使用Docker的可拔插网络后端特性--x-network-driver DRIVER
指定网络后端的驱动,默认为bridge--verbose
输出更多调试信息。-v,--version
打印版本并退出。
3.5.3、命令说明
up -d(后台启动)
docker-compose up :对整个项目操作
docker-compose up 服务id :对当前 docker-copmose 中对应服务id容器操作
该命令十分强大,它将尝试自动完成包括镜像的构建,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作
down
docker-compose down 对整个项目操作
docker-compose down 服务 id,对某个服务容器的操作
作用:关闭所有或者所有服务,并且移除项目及网络,数据卷会保留
exec
docker-compose exce 服务id bash
作用:进入某个服务容器内部
ps
docker-compose ps [options] [service...] 作用:列出项目中目前的所有服务 -a:只列出容器id
restart -t(指定多少秒后进行重启)
docker-compose restart:对整个项目操作
docker-compose restart 服务id:对某个服务进行重启
作用:重启整个项目服务或指定服务
rm
docker-compose rm [options] [service...] 作用:删除所有(停止状态的)服务容器,推荐使用 docker-compose stop 命令来停止容器 -f,-- force 强制直接删除,包括非停止状态的容器。一般尽量不要使用该选项。 -v 删除容器挂在的数据卷
start
docker-compose start [service...] 作用:启动已经存在的服务容器
stop
docker-compose stop [option] [service...]
作用,停止已经处于运行状态的容器,但不删除它,通过docker-compose 可以再次启动这些容器
-t,--timeout TIMEOUT 停止容器时的超时(默认为 10 秒)
top
docker-compose top [服务id]
作用:查看整个项目中所有或者指定的容器服务内的进程
pause、unpause
docker-compose pause [service...]
docker-compose unpause [service...]
作用:pause 暂停和恢复整个项目中所有服务或指定id某个服务
logs
docker-compose logs -f(实时) [service]
作用:查看整个项目所有运行日志,或者指定服务id服务的运行日志
3.6、docker 可视化工具
3.6.1、简介
第三方公司开源 portainer 项目,用来对 docker 引擎中运行的容器进行可视化的展示。
3.6.2、安装 Portainer
docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer