Docker-compose学习杂记
Author:zhoulujun Date:
Docker-compose 是一个定义和运行多个 Docker 应用的工具,你可以使用YMAL文件来配置你的服务,然后使用docker-compose 命令,创建和启动、编排所有你配置的的服务。
compose 可以在任何工作环境中使用,生产环境,开发环境,持续集成等等。
为何要使用Docker-Compose?
默认情况下,docker 每次执行命令,只能负责单个镜像文件的构建、单个容器的管理,但一个实际应用程序中,可能需要同时运行多个容器一起工作,例如 Web后端项目通常需要:Koa + MongoDB,并且两个容器之间进行通信,此时若继续使用 docker 来运行管理则相对显得复杂繁琐一些。
Docker-Compose 就是专门用来管理多个 docker 容器的工具,它弥补了 docker 不易管理多容器的缺陷,提高协助 docker 做好运维工作。
事实上,比 Docker-Compose 更加灵活,功能更强大、对集群、负载平衡更好的程序是 k8s (Kubernetes)。
微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,效率低、维护量大
为了提高效率,我们就需要一种像 Dockerfile 定义 Docker 容器一样,能够定义容器(多个)编排和部署工具。
于是,Docker Compose 出现了(其实应该说 Fig 出现了,Docker 收购了 Fig 并改名为 compose)。
Docker Compose vs. K8s
Docker Compose是Docker公司推出的开源工具,它允许用户在单个主机上定义和运行多个容器应用程序。
Kubernetes(K8s)是一个由Google维护的开源系统,它用于自动化部署、扩展和管理容器化应用程序。
使用K8s,用户可以轻松地在集群中运行容器应用程序。
Docker Compose和K8s都用于部署和管理容器应用程序,但它们的功能有所不同。
Docker Compose主要用于在单个主机上管理和运行多个容器应用程序。
使用Docker Compose,用户可以轻松地定义多个容器和它们之间的依赖关系,并在单个主机上部署和运行它们。
相比之下,K8s更灵活,它不仅可以在单个主机上运行容器应用程序,还可以在多个主机上运行这些应用程序。
此外,K8s提供了许多高级功能,例如:服务发现和自动扩缩容等,使用户可以更轻松地管理容器应用程序。
Docker Compose使用
Compose模板文件格式
Docker Compose 使用 YAML 文件来定义多服务的应用。
Docker Compose 默认 使用文件名 docker-compose.yml。当然,也可以使用 -f 参数指定具体文件
模板案例:
version: "3.7"services: redis: image: redis:alpine ports: - "6379:6379" networks: - frontend deploy: # 指定运行容器的数量 replicas: 2 update_config: # 一次性更新的容器数量 parallelism: 2 # 更新一组容器之间的等待时间 delay: 10s restart_policy: condition: on-failure db: image: postgres:9.4 volumes: - db-data:/var/lib/postgresql/data networks: - backend deploy: placement: constraints: [node.role == manager] vote: image: dockersamples/examplevotingapp_vote:before ports: - 5000:80 networks: - frontend depends_on: - redis deploy: replicas: 2 update_config: # 一次性更新的容器数量 parallelism: 2 restart_policy: condition: on-failure result: image: dockersamples/examplevotingapp_result:before ports: - 5001:80 networks: - backend depends_on: - db deploy: replicas: 1 update_config: # 一次性更新的容器数量 parallelism: 2 # 更新一组容器之间的等待时间 delay: 10s restart_policy: condition: on-failurenetworks: frontend: backend:volumes: db-data:
服务(容器)配置参数
在配置文件中,services 下面每一个服务(容器)都需要根据需求添加对应的设置,docker-compose 中每一个服务(容器)的参数和 dockerfile 相似,但又有不同。
参数名 | 值类型 | 对应含义 |
---|---|---|
build | 字符串 | 构建镜像的 dockerfile 文件路径 (通常情况下不要这样操作,而是通过 image 参数指定镜像名) |
image | 字符串 | 镜像文件名 (通常情况下直接使用镜像名,而不使用 build 参数构建镜像) |
container_name | 字符串 | 创建容器的名字 |
working_dir | 字符串 | 容器中的工作根目录 |
volumes | 数组 | 服务器实际目录与容器目录映射关系,可以设置多条映射关系 (服务器实际目录:容器虚拟目录) |
ports | 数组 | 服务器端口与容器内部端口映射关系,可设置多条映射关系 (服务器实际端口:容器虚拟端口) |
depends_on | 数组 | 本容器运行依赖的其他容器 docker-compose 会优先启动运行依赖的容器,之后再启动本容器 例如 web 容器依赖于数据库(db)容器,因此先启动 db 容器,再启动 web 容器 |
tty | 布尔值 | 表明是否以后台运行 |
command | 字符串 | 执行的命令 |
restart | 字符串 | docker-compose 重启时,容器是否也跟着重启,通常会设置值为:always (注意是 docker-compose restart,而不是 docker-compose up) |
environment | 数组 | 环境变量(数组中每个元素都为 key=value,这些变量是给容器使用的,并且优先级高于在 dockerfile 中定义的变量) |
env_file | 数组 | 配置变量的文件列表(env文件中定义的变量是给 docker-compose.yml 使用的) |
Docker 总体架构
Docker Compose 运行架构
Docker Compose 核心概念
Docker Compose将所管理的容器分为三层,这三个概念均为Compose抽象的数据类型,其中 project 会包含service以及container:
项目/工程(project)
服务(service)
容器(contaienr)
项目(project):代表用户需要完成的一个项目。
一个project拥有特定的名称,并且包含多个或一个service,同时还带有一个Docker Client。
何为项目?Compose的一个配置文件可以解析为一个项目。
即:Compose通过分析指定配置文件,得出配置文件所需完成的所有容器管理与部署操作。
例如:用户在当前目录下执行docker-compose up -d,配置文件为当前目录下的配置文件docker-compose.yml,命令请求类型为up,-d为命令参数,对于配置文件中的内容,compose会将其解析为一个project。
通过 Docker Compose 管理的一个项目被抽象称为一个 project
project 里包括多个 service
service,代表配置文件中的每一项服务,何为服务?
一个service包含的内容,无非是用户对服务的定义。定义一个服务,可以为服务容器指定镜像,设定构建的Dockerfile,可以为其指定link的其他容器,还可以为其指定端口的映射等。
比如,前面的配置文件中包含了两个service,第一个为web,第二个为redis。
即以容器为粒度,用户需要Compose所完成的任务。
每个 service 定义了容器运行的镜像(或构建镜像)、网络端口、文件挂载、参数、依赖等
每个 service 可包括同一个镜像的多个容器实例。
容器(container)
docker-compose下启动容器的过程
首先,用户执行 docker-compose up 命令调用命令行中的启动方法
然后,如果当前宿主机已存在与该应用对应的容器,docker-compose 则进行行为逻辑判断。如果用户指定可以重新启动已有服务,docker-compose 就会执行 service 模块的容器重启方法,否则就直接启动已有容器。这两种操作的区别在于前者会停止旧的容器,创建并启动新的容器,并把旧容器移除掉。
最后,contaier 模块会调用 docker-py 客户端来执行向 docker daemon 发起创建容器的 POST 请求。
Docker-Compose命令
docker-compose 命令格式为:docker-compose [-f <arg>] [options] [COMMAND] [ARGS]
[-f <arg>]:配置文件(docker-compose.yml)路径,也可以在 [options] 中设置,若都不设置则默认为当前目录下的 docker-compose.yml
[options]:其他配置选项
[COMMAND]:命令
[ARGS]:命令的参数
配置项 | 对应值 | 对应含义 |
---|---|---|
-f | --file | 路径 | 配置文件路径,默认为当前目录下的 docker-compose.yml |
-p | --project-name | 名称 | 配置项目别名,默认为当前目录名 |
-c | --context | 名称 | 配置内容名称 |
--verbose | 不需要设置 | 显示更多输出内容(详细细节) |
--log-level | 5选1 | 配置日志的级别,值为: DEBUG(调试)、INFO(信息)、WARNING(警告)、ERROR(错误)、CRITICAL(严重) |
--no-ansi | 不需要设置 | 不打印显示 ANSI 字符 |
-v | --version | 不需要设置 | 打印当前 docker-compose 版本并退出 |
-H | --host | host值 | 守护进程 docket 连接的 host |
--tls | 不需要设置 | 使用 TLS 协议 (安全传输层协议),参数 --tlsverify 默认会设置该值 |
--tlscacert | 路径 | 仅相信由此 CA 签署的证书 |
--tlscert | 路径 | TLS 证书路径 |
--tlskey | 路径 | TLS 证书key 路径 |
--tlsverify | 不需要设置 | 使用 TLS 并验证远程 |
--skip-hostname-check | 不需要设置 | 跳过证书检查 |
--project-directory | 路径 | 配置目录的别名,默认使用 docker-compose.yml 所在的目录名 |
--compatibility | 不需要设置 | 如果设置该项,则将尝试将 配置文件中的 deploy 秘钥转化为他们的非swarm 等价项 |
--env-file | 路径 | 配置环境参数(定义的环境变量)文件路径 |
全部命令
命令 | 对应含义 |
---|---|
build | 构建或重建服务 |
bundle | 从 配置文件(docker-compose.yml) 生成多个容器(容器束) |
config | 验证和查看配置文档 |
create | 创建服务 |
down | 停止并删除容器、网络、镜像、映射关系 |
events | 从容器接收实时事件 |
exec | 在正在运行的容器中执行命令 |
help | 获得命令帮助 |
images | 查看镜像列表 |
kill | 杀死容器 |
logs | 查看容器的输出内容 |
pause | 暂停服务 |
port | 查看内部端口映射的本机端口 |
ps | 查看容器列表 |
pull | 拉取镜像 |
push | 推送镜像 |
restart | 重启服务 |
rm | 移除已停止的容器 |
run | 执行一次性命令 |
scale | 设置容器数量 |
start | 启动服务 |
stop | 停止服务 |
unpause | 显示正在运行的容器(非暂停容器) |
up | 创建并启动容器 |
version | 显示 docker-compose 版本号,以及 docker-compose 依赖其他模块的版本号 (docker-compose -v 仅打印 docker-compose 的版本号) |
参考文章:
Docker Compose 基础教程(概念/基础操作 https://www.cnblogs.com/johnnyzen/p/17785405.html
https://github.com/puxiao/notes/blob/master/Docker-Compose安装与使用.md
转载本站文章《Docker-compose学习杂记》,
请注明出处:https://www.zhoulujun.cn/html/tools/Virtual/docker/9481.html