1. Introducción a docker-compose
docker-compose
Como dokcer
herramienta oficial de orquestación, permite a los usuarios crear y administrar rápidamente docker
clústeres de aplicaciones basadas en contenedores escribiendo un archivo de plantilla simple . Lograr una docker
rápida orquestación de grupos de contenedores. Sabemos que los Dockerfile
archivos de plantilla permiten a los usuarios definir fácilmente un contenedor de aplicaciones separado. Sin embargo, en el trabajo diario, a menudo nos encontramos con situaciones que requieren que varios contenedores cooperen entre sí para completar una determinada tarea. Por ejemplo, para implementar un proyecto web, además del web
contenedor del servidor en sí, a menudo es necesario agregar un contenedor de servicio de base de datos de fondo e incluso incluir un contenedor de equilibrio de carga.
Y Compose puede satisfacer tales necesidades, ya que permite a los usuarios definir un conjunto de contenedores de aplicaciones relacionadas como un proyecto a través de un docker-compose.yml
archivo de plantilla separado )YAML格式
project
Hay 2 conceptos importantes en Compose:
1) Servicio de servicio: un contenedor de aplicaciones puede contener varias instancias de contenedor que ejecutan la misma imagen.
2) Proyecto: una unidad de negocio completa compuesta por un grupo de contenedores de aplicaciones asociadas, definidos en el archivo docker-compose.yml.
2. instalación compuesta por docker
Descargue el archivo binario Docker-compose y agregue el permiso de ejecución
[root@docker ~]# wget https://github.com/docker/compose/releases/download/1.23.2/docker-compose-`uname -s`-`uname -m`- O /usr/local/bin/docker-compose
[root@docker ~]# chmod +x /usr/local/bin/docker-compose
[root@docker ~]# docker-compose --version
docker-compose version
docker-compose version 1.23.2, build 1110ad01
docker-py version: 3.6.0
CPython version: 3.6.7
OpenSSL version: OpenSSL 1.1.0f 25 May 2017
3. Comando de redacción
Para la Compose
mayoría de los comandos, el objeto puede ser el proyecto mismo o el servicio o contenedor del proyecto. Si no hay una explicación especial, el objeto del comando será el proyecto, lo que significa que todos los servicios del proyecto se verán afectados por el comando. docker-compose
El formato básico del comando es el siguiente:
Usage:
docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
docker-compose -h|--help
Options:
-f, --file FILE 指定使用的Compose模板文件,默认为docker-compose.yml,可多次指定;
-p, --project-name NAME 指定项目名称,默认将使用所在目录名称作为项目名 ;
--verbose 输出更多调试信息;
-v, --version 打印版本信息;
Commands:
build 构建项目中的服务容器
help 获得一个命令的帮助
images 列出所有镜像
kill 通过发送SIGKILL信号来强制停止服务容器
logs 查看服务器容器的输出
pause 暂停一个服务容器
port 打印某个容器的端口所映射的公共端口
ps 列出项目中目前的所有容器
pull 拉取服务依赖的镜像
push 推送服务依赖的镜像
restart 重启项目中的服务
rm 删除所有的服务器容器(停止状态中的)
run 在指定服务上执行一个命令
scale 设置指定服务运行的容器个数
start 启动已经存在的服务容器
stop 停止已经处于运行状态的容器,但不删除它
top 展示运行的进程
unpause 恢复处于暂停状态中的服务
up 自动完成包括构建镜像、创建服务、启动服务并关联服务相关容器的一系列操作
version 打印docker-compose的版本信息
4. Componer archivo de plantilla
El archivo de plantilla es Compose
el núcleo del uso , y hay muchas palabras clave de palabras clave de diseño. El nombre de archivo de plantilla predeterminado es docker-compose.yml
y el formato es YAML
formato. Ejemplos:
version: "2"
service:
webapp:
image: examplses/web
ports:
- "80:80"
volumes:
- "/data"
Tenga en cuenta que cada servicio debe compilar y generar automáticamente una imagen image
especificando la imagen o el build
comando requerido Dockerfile
). Si se utiliza la build
instrucción, Dockerfile
las opciones configuradas en (por ejemplo: CMD、EXPOSE、VOLUME、ENV
etc.) se obtendrán automáticamente sin docker-compose.yml
volver a configurarlas. Las siguientes son las principales instrucciones y funciones de la plantilla:
1) instrucciones de construcción
Dockerfile
La ruta de la carpeta especificada puede ser la ruta absoluta o la ruta relativa del docker-compose.yml
archivo. ) Lo Compose
usará para crear automáticamente esta imagen y luego usará esta imagen:
build: /path/to/build/dir
2) cap_add, cap_drop
Especifica las capacidades del núcleo del contenedor capacity
) asignación. Por ejemplo, dejar que el contenedor tenga todas las capacidades se puede especificar como:
cap_add:
- ALL
La NET_ADMIN
capacidad de eliminar se puede especificar como:
cap_drop:
- NET_ADMIN
3) comando
Anule el comando predeterminado ejecutado después de que se inicie el contenedor:
command: echo "hello world"
4) cgroup_parent
La especificación del grupo cgroup primario significa que los límites de recursos del grupo se heredarán. Por ejemplo, un cgroup
grupo se crea como cgroups_1
:
cgroup_parent: cgroups_1
5) nombre_contenedor
Especifique el nombre del contenedor. De forma predeterminada, se utilizará el formato "Nombre del proyecto_Nombre del servicio_Número de serie". Por ejemplo:
container_name: docker-web-container
指定容器名称后,该服务将无法进行扩展,因为Docker不允许多个容器具有相同的名称。
6) dispositivos
Especifique la relación de mapeo del dispositivo, por ejemplo:
devices:
- "/dev/ttyUSB1:/dev/ttyUSB0"
7) dns
Servidor DNS personalizado. Puede ser un valor o una lista, por ejemplo:
dns: 8.8.8.8
dns:
- 8.8.8.8
- 114.114.114.114
8) dns_search
Configure el dominio de búsqueda DNS. Puede ser un valor o una lista, por ejemplo:
dns_search: example.com
dns_search:
- domain1.example.com
- domain2.example.com
9) dockerfile
Si es necesario, especifique el archivo Dockerfile adicional de la imagen compilada, que puede especificarse mediante esta instrucción, por ejemplo:
esta instrucción no se puede usar con la imagen; de lo contrario, Compose no sabe qué instrucción generar la imagen de servicio final.
dockerfile: Dockerfile-alternate
10) archivo_envío
Obtenga las variables de entorno del archivo, que puede ser una ruta o lista de archivos separada.
Si el archivo de plantilla Componer se especifica mediante docker-compose -f FILE, la ruta de la variable en env_file se basará en la ruta del archivo de plantilla. Si existe un conflicto entre el nombre de la variable y la directiva del entorno, prevalecerá la convención y prevalecerá la última:
env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- ./opt/secrets.env
环境变量文件中每一行都必须符合格式,支持#开头的注释行:
11) medio ambiente
Establecer variables de entorno, puede usar el formato de matriz o diccionario. Una variable con solo un nombre determinado obtendrá automáticamente el valor de la variable correspondiente en el host que ejecuta Compose, que puede usarse para evitar la divulgación de datos innecesarios. Por ejemplo:
environment:
RACK_ENV: development
SESSION_SECRET
或者:
environment:
- RACK_ENV=development
- SESSION_SECRET
12) exponer
El puerto está expuesto, pero no asignado a la máquina host, y solo se permite que el servicio vinculado acceda a él. Solo los puertos internos se pueden especificar como parámetros, de la siguiente manera:
expose:
- "3000"
- "8000"
13) se extiende
Expandir según otros archivos de plantilla. Por ejemplo, ya tenemos un servicio de aplicación web y definimos un archivo de plantilla básico como common.yml, como se muestra a continuación:
# common.yml
webapp:
build: ./webapp
environment:
- DEBUG=false
- SEND_EMAILS=false
Escriba un nuevo archivo development.yml y use el servicio webapp en common.yml para expandir:
#development.yml
web:
extends:
file: common.yml
service: webapp
ports:
- "8000:8000"
links:
- db
environment:
- DEBUG=true
db:
image: postgres
development.yml heredará automáticamente el servicio webapp y las definiciones de variables de entorno en common.yml. Preste atención a los siguientes puntos cuando use extensiones:
1. Evite dependencias circulares, como A depende de B, B depende de C y C depende de A
2. extend no hereda los recursos de contenedor y volumen de datos definidos en enlaces y volume_from.
En circunstancias normales, se recomienda definir solo algunas variables espejo y de entorno que se pueden compartir en la plantilla básica, y especificar variables de aplicación, enlaces, volúmenes de datos y otra información en la plantilla extendida.
14) enlaces_externos
Enlace a contenedores externos en docker-compose.yml, o incluso contenedores externos no administrados por Compose. El formato del parámetro es similar a los enlaces.
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
15) extra_hosts
Similar al parámetro –add-host en Docker, especifique información adicional de asignación de nombres de host, por ejemplo:
extra_hosts:
- "googledns:8.8.8.8"
- "dockerhub:52.1.157.61"
会在启动后的服务容器中/etc/hosts文件中添加以下2个条目:
8.8.8.8 googledns
52.1.157.61 dockerhub
16) imagen
Especifique el nombre de la imagen o la ID de la imagen. Si la imagen no existe localmente, Compose intentará extraer la imagen.
image: centos
image: nginx
17) etiquetas
Agregue información de metadatos de Docker al contenedor. Por ejemplo, puede agregar información auxiliar al contenedor:
labels:
com.startupteam.description: "webapp for a startup team"
com.startupteam.department: "devops department"
com,startupteam.release: "rc3 for v1.0"
18) enlaces
Enlace a contenedores en otros servicios. Utilice el nombre del servicio como un alias) o "nombre del servicio: alias del servicio", como SERVICIO: ALIAS), dicho formato es aceptable, por ejemplo:
links:
- db
- db:database
- redis
使用的别名会将自动在服务容器中的/etc/hosts里创建。例如:
172.17.2.186 db
172.17.2.186 database
172.17.2.187 redis
所连接容器中相应的环境变量也将创建
19) log_driver
Similar al parámetro –log-driver en Docker, especifica el tipo de controlador de registro. Actualmente se admiten tres tipos de controladores de registro:
log_driver: "json-file"
log_driver: "syslog"
log_driver: "none"
20) log_opt
Parámetros relacionados con el registro. Por ejemplo:
log_driver: "syslog"
log_opt:
syslog-address: "tcp://192.168.0.42:123"
21) neto
Establece el modo de red. Los parámetros son similares a los parámetros --net del cliente de Docker
net: "bridge"
net: "none"
net: "container:[name or id]"
net: "host"
22) pid
Comparta el espacio de nombres del proceso con el sistema host. Abra la opción entre el contenedor, y entre el contenedor y el sistema host se puede acceder y operar por ID de proceso:
pid: "host"
23) puertos
Exponer la información del puerto. Utilice el formato "host: contenedor", o simplemente especifique el puerto del contenedor. El host seleccionará aleatoriamente el puerto):
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8081:8081"
当使用"HOST:CONTAINER"格式来映射端口时,如果你使用的容器端口小于60并且没有放到引号里,可能会得到错误结果,因为YAML会自动解析xx:yy这种数字格式为60进制。为了避免这种问题的出现,建议数字串都用引号包括起来的字符串格式。
24) seguridad_opt
Especifique el mecanismo del atributo predeterminado de la etiqueta de la plantilla del contenedor (usuario, rol, tipo, nivel, etc.). Por ejemplo, el nombre de usuario y el nombre de rol de la etiqueta de configuración:
security_opt:
- label:user:USER
- label:role:ROLE
25) ulimits
Especifique el valor límite de ulimits del contenedor, por ejemplo, especifique el número máximo de procesos como 65535 y especifique el límite flexible de 20000 para el número de identificadores de archivo. La aplicación se puede modificar en cualquier momento y no puede exceder el límite rígido.
ulimits:
nproc:65535
nofile:
soft:20000
hard:40000
26) volúmenes
La configuración de ruta del volumen de datos. Puede establecer la ruta de host HOST: CONTAINER) o agregar el modo de acceso HOST: CONTAINER: ro). La ruta en esta instrucción admite rutas relativas. Por ejemplo:
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro
27) volume_driver
Las versiones más recientes de Docker admiten controladores de complementos para volúmenes de datos. Los usuarios pueden usar un controlador de terceros para crear un volumen de datos y luego usar el nombre para acceder a él. En este momento, puede especificar la unidad a través de volume_driver:
volume_driver: mydriver
28) volúmenes_desde
Monte su volumen de datos desde otro servicio o contenedor:
volumes_from:
- service_name
- container_name