docker compose

Posted 穷少年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker compose相关的知识,希望对你有一定的参考价值。

文章目录

什么是compose

Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。从功能上看,跟OpenStack 中的Heat 十分类似。其代码目前https://github.com/docker/compose 上开源。

Compose定位是定义和运行多个Docker容器的应用(Defining and running mult-container Docker applications)」,其前身是开源项目Fig。

通过第一部分中的介绍,我们知道使用一个Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个web项目,除了web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。Compose恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose. yml模板文件(YAML格式)来定义一组相关联的应用容器为一个项目(project)。

Compose中有两个重要的概念:

  • 服务( service ):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
  • 项目( project ):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml文件中定义。Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。

Compose项目由 Python编写,实现上调用了Docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持 Docker APl,就可以在其上利用Compose来进行编排管理。

安装compose

linux版

  • 直接去github上下载对应的二进制源码文件,放入/usr/bin目录下,改名为docker-compose即可
  • 不要忘记了,赋予可执行权限,执行docker-compose -v如果可以看到compose的版本信息,则表示安装完成

docker-compose

启动

docker-compose根据提供docker-compse文件,来启动一组服务(容器)

# 根据当前目录下的docker-compose.yml文件,启动一组容器,以前台的方式启动
docker-compose up 

启动完成后,不同容器的日志内容,会通过不同的标签颜色来区分

# 根据当前目录下的docker-compose.yml文件,启动一组容器,以后台服务的方式启动
docker-compose up -d

以后台的方式启动,并不会打印容器的日志等信息

docker-compose文件(模板)

docker-compose文件参考文档

  1. Docker-compose从入门到实践

docker-compose.yml文件用来描述一个项目里面,所有的容器信息,例如:exposevolumesimages等容器关键信息

注意要点:

  1. docker-compose文件默认是yml结尾,YAML文件格式
  2. docker-compose文件同样也支持json格式的文件,以json结尾的文件
  3. 无论是yml文件,还是json文件,推荐里面所有的数字信息都以双引号包括起来,以字符串的形式使用

version

推荐的version应该在3.0-4.0

services

在docker-compose中,可以启动多个服务,在services下指定多个服务(容器)信息

启动一个或多个容器

build(从给定Dockerfile文件构建)

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

version: '3'
services:

  webapp:
    build:
      # context 指令指定 Dockerfile 所在文件夹的路径。
      context: ./dir
      # 指定dockerfile文件的名称。官方默认Dockerfile,但是有时候我们会自定义文件名称
      dockerfile: Dockerfile-alternate
      # 使用 arg 指令指定构建镜像时的变量。
      args:
        buildno: 1

container_name

相当于run --name为当前容器指定一个名称,方便容器之间通过容器名就可以直接调用

image

指定当前服务(容器)从哪个镜像构建的

services:
	tomcat:
		image:"tomcat:9.0" # 代表这从tomcat:9.0构建的

ports(映射端口)

指定当前服务如何映射端口 ,接受一个数组,每个数组元素前必须加“-”符号

services:
	tomcat:
		ports:
			- "8080:8080"
			- "80:8080"
# 代表tomcat服务将8080端口映射到宿主机上的8080,80端口

environment

添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False。

语法示例

environment:
  RACK_ENV: development
  SHOW: 'true'

env_file(从指定的文件中加载环境变量)

  • 从文件中获取环境变量,可以为单独的文件路径或列表。
  • 如果通过 docker-compose -f FILE 方式来指定 Compose 模板文件,则 env_file 中变量的路径会基于模板文件路径

官方规定,env_file的后缀名必须是.env结尾,在服务里可以指定多个环境文件,所以接受数组类型

services:
	tomcat:
		container_name:"tomcat01"
		env_file:
 		 	- "./common.env"
 		 	- "./apps/web.env"
  	   	 	- "/opt/secrets.env"

环境变量文件中每一行必须符合格式,支持 # 开头的注释行。

# common.env: Set development environment
PROG_ENV=development
# 例如
mysql_ROOT_PASSWORD=123456

depends_on(设置容器依赖的服务的启动顺序)

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

version: '3'

services:
  web:
    build: .
    depends_on:
      - db
      - redis

  redis:
    image: redis

  db:
    image: postgres

command

覆盖容器启动时的命令

healthcheck (通过命令检查容器是否健康运行)

services:
  web:
  	image:"tomcat"
	healthcheck:
  		test: ["CMD", "curl", "-f", "http://localhost"]
  		interval: 1m30s
  		timeout: 10s
  		retries: 3

mem_limit(配置服务可以使用内存的上限)

services:
	web:
		image: "tomcat"
		mem_limit: "2GB"

sysctls(配置容器内核参数)

sysctls:
  net.core.somaxconn: 1024
  net.ipv4.tcp_syncookies: 0

sysctls:
  - net.core.somaxconn=1024
  - net.ipv4.tcp_syncookies=0

ulimits(指定容器的 ulimits 限制值。)

例如,指定最大进程数为 65535,指定文件句柄数为 20000(软限制,应用可以随时修改,不能超过硬限制) 和 40000(系统硬限制,只能 root 用户提高)。

  ulimits:
    nproc: 65535
    nofile:
      soft: 20000
      hard: 40000

volumes

设置数据卷挂载,可以设置为宿主机路径(host:container)或者数据卷名称(volume:container),并且可以设置访问模式
同样也是接受一个数组参数

services:
	tomcat:
		volumes:
		- "/usr/webapps:/usr/local/tomcat/webapps:ro"
		- "volume:/usr/local/tomcat/webapps"

注意

  1. 如果路径为数据卷名称,必须在文件中配置数据卷
  2. 如果需要使用已经存在的数据卷,不需要自动创建,需要在volumes中声明卷,然后设置external属性为true

networks

定义声明,服务们所需要使用的网桥(网络),例如多个容器需要在同一个网络内,并且之间可以相互通信

以上是关于docker compose的主要内容,如果未能解决你的问题,请参考以下文章

docker容器日志管理

docker pull 镜像时提示Error response from daemon

Python3 - Docker 容器日志清理方案

Python3 - Docker 容器日志清理方案

Python3 - Docker 容器日志清理方案

Python3 - Docker 容器日志清理方案