1. Introduction à docker-compose
docker-compose
En dokcer
tant qu'outil d'orchestration officiel, il permet aux utilisateurs de créer et de gérer rapidement des docker
clusters d'applications basés sur des conteneurs en écrivant un fichier de modèle simple . Obtenez docker
une orchestration rapide des clusters de conteneurs. Nous savons que Dockerfile
les fichiers de modèle permettent aux utilisateurs de définir facilement un conteneur d'application distinct. Cependant, dans le travail quotidien, nous rencontrons souvent des situations qui nécessitent plusieurs conteneurs pour coopérer les uns avec les autres pour effectuer une certaine tâche. Par exemple, pour implémenter un projet Web, en plus du web
conteneur de serveur lui-même, il est souvent nécessaire d'ajouter un conteneur de service de base de données principal et même d'inclure des conteneurs d'équilibrage de charge.
Et Compose peut répondre à ces besoins, il permet aux utilisateurs de définir un ensemble de conteneurs d'applications connexes en tant que projet via un docker-compose.yml
fichier de modèle distinct )YAML格式
project
Il y a 2 concepts importants dans Compose:
1) Service service: un conteneur d'application peut en fait contenir plusieurs instances de conteneur exécutant la même image.
2) Projet: une unité commerciale terminée composée d'un groupe de conteneurs d'applications associés, défini dans le fichier docker-compose.yml.
2. installation docker-compose
Téléchargez le fichier binaire Docker-compose et ajoutez l'autorisation d'exécution
[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. Commande de composition
Pour la Compose
plupart des commandes, l'objet peut être soit le projet lui-même, soit le service ou le conteneur du projet. S'il n'y a pas d'explication particulière, l'objet de commande sera le projet, ce qui signifie que tous les services du projet seront affectés par la commande. docker-compose
Le format de base de la commande est le suivant:
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. Composez le fichier modèle
Le fichier de modèle est Compose
au cœur de l'utilisation , et il existe de nombreux mots clés de mots clés de conception. Le nom de fichier de modèle par défaut est docker-compose.yml
et le format est YAML
format. Exemples:
version: "2"
service:
webapp:
image: examplses/web
ports:
- "80:80"
volumes:
- "/data"
Notez que chaque service doit automatiquement créer et générer une image en image
spécifiant l'image ou la build
commande requise Dockerfile
). Si l' build
instruction est utilisée , Dockerfile
les options définies dans (par exemple: CMD、EXPOSE、VOLUME、ENV
etc.) seront automatiquement obtenues sans être docker-compose.yml
réactivées. Voici les principales instructions et fonctions du modèle:
1) instruction de construction
Dockerfile
Le chemin du dossier spécifié peut être un chemin absolu ou un docker-compose.yml
chemin de fichier relatif . ) L' Compose
utilisera pour créer automatiquement cette image, puis utiliser cette image:
build: /path/to/build/dir
2) cap_add, cap_drop
Spécifie les capacités du noyau de l' capacity
allocation de conteneur ). Par exemple, laisser au conteneur toutes les capacités peut être spécifié comme suit:
cap_add:
- ALL
La NET_ADMIN
possibilité de suppression peut être spécifiée comme suit:
cap_drop:
- NET_ADMIN
3) commande
Remplacez la commande par défaut exécutée après le démarrage du conteneur:
command: echo "hello world"
4) cgroup_parent
La spécification du groupe de groupes de contrôle parent signifie que les limites de ressources du groupe seront héritées. Par exemple, un cgroup
groupe est créé en tant que cgroups_1
:
cgroup_parent: cgroups_1
5) nom_conteneur
Spécifiez le nom du conteneur. Par défaut, le format "Project Name_Service Name_Serial Number" sera utilisé. Par exemple:
container_name: docker-web-container
指定容器名称后,该服务将无法进行扩展,因为Docker不允许多个容器具有相同的名称。
6) appareils
Spécifiez la relation de mappage de périphérique, par exemple:
devices:
- "/dev/ttyUSB1:/dev/ttyUSB0"
7) DNS
Serveur DNS personnalisé. Il peut s'agir d'une valeur ou d'une liste, par exemple:
dns: 8.8.8.8
dns:
- 8.8.8.8
- 114.114.114.114
8) dns_search
Configurez le domaine de recherche DNS. Il peut s'agir d'une valeur ou d'une liste, par exemple:
dns_search: example.com
dns_search:
- domain1.example.com
- domain2.example.com
9) Dockerfile
Si nécessaire, spécifiez le fichier Dockerfile supplémentaire de l'image compilée, qui peut être spécifié par cette instruction, par exemple:
cette instruction ne peut pas être utilisée avec l'image, sinon Compose ne sait pas quelle instruction pour générer l'image de service finale.
dockerfile: Dockerfile-alternate
10) fichier_env
Obtenez les variables d'environnement à partir du fichier, qui peut être un chemin ou une liste de fichiers distinct.
Si le fichier modèle Compose est spécifié par docker-compose -f FILE, le chemin de la variable dans env_file sera basé sur le chemin du fichier modèle. En cas de conflit entre le nom de la variable et la directive environnement, la convention prévaudra et cette dernière prévaudra:
env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- ./opt/secrets.env
环境变量文件中每一行都必须符合格式,支持#开头的注释行:
11) environnement
Définissez les variables d'environnement, vous pouvez utiliser le format tableau ou dictionnaire. Une variable avec seulement un nom donné obtiendra automatiquement la valeur de la variable correspondante sur l'hôte exécutant Compose, qui peut être utilisée pour empêcher la divulgation de données inutiles. Par exemple:
environment:
RACK_ENV: development
SESSION_SECRET
或者:
environment:
- RACK_ENV=development
- SESSION_SECRET
12) exposer
Le port est exposé, mais pas mappé à la machine hôte, et n'est autorisé à être accessible que par le service lié. Seuls les ports internes peuvent être spécifiés comme paramètres, comme suit:
expose:
- "3000"
- "8000"
13) étend
Développez en fonction d'autres fichiers de modèle. Par exemple, nous avons déjà un service webapp et définissons un fichier de modèle de base comme common.yml, comme indiqué ci-dessous:
# common.yml
webapp:
build: ./webapp
environment:
- DEBUG=false
- SEND_EMAILS=false
Écrivez un nouveau fichier development.yml et utilisez le service webapp dans common.yml pour développer:
#development.yml
web:
extends:
file: common.yml
service: webapp
ports:
- "8000:8000"
links:
- db
environment:
- DEBUG=true
db:
image: postgres
development.yml héritera automatiquement du service webapp et des définitions de variables d'environnement dans common.yml. Faites attention aux points suivants lors de l'utilisation des extensions:
1. Évitez les dépendances circulaires, telles que A dépend de B, B dépend de C et C dépend de A
2. extend n'hérite pas des ressources de conteneur et de volume de données définies dans links et volume_from.
Dans des circonstances normales, il est recommandé de définir uniquement certaines variables miroir et d'environnement qui peuvent être partagées dans le modèle de base, et de spécifier des variables d'application, des liens, des volumes de données et d'autres informations dans le modèle étendu.
14) liens_externes
Lien vers des conteneurs externes dans docker-compose.yml, ou même des conteneurs externes non gérés par Compose. Le format des paramètres est similaire aux liens
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
15) extra_hosts
Comme pour le paramètre –add-host dans Docker, spécifiez des informations de mappage de nom d'hôte supplémentaires, par exemple:
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) image
Spécifiez le nom ou l'ID de l'image. Si l'image n'existe pas localement, Compose essaiera de tirer l'image.
image: centos
image: nginx
17) étiquettes
Ajoutez des informations de métadonnées Docker au conteneur. Par exemple, vous pouvez ajouter des informations auxiliaires au conteneur:
labels:
com.startupteam.description: "webapp for a startup team"
com.startupteam.department: "devops department"
com,startupteam.release: "rc3 for v1.0"
18) liens
Lien vers des conteneurs dans d'autres services. Utilisez le nom du service comme alias), ou "nom du service: alias de service" tel que SERVICE: ALIAS), un tel format est acceptable, par exemple:
links:
- db
- db:database
- redis
使用的别名会将自动在服务容器中的/etc/hosts里创建。例如:
172.17.2.186 db
172.17.2.186 database
172.17.2.187 redis
所连接容器中相应的环境变量也将创建
19) pilote_log
Similaire au paramètre –log-driver dans Docker, spécifie le type de pilote de journal. Trois types de pilotes de journal sont actuellement pris en charge:
log_driver: "json-file"
log_driver: "syslog"
log_driver: "none"
20) log_opt
Paramètres liés au journal. Par exemple:
log_driver: "syslog"
log_opt:
syslog-address: "tcp://192.168.0.42:123"
21) net
Définissez le mode réseau. Les paramètres sont similaires aux paramètres --net du client Docker
net: "bridge"
net: "none"
net: "container:[name or id]"
net: "host"
22) pid
Partagez l'espace de noms du processus avec le système hôte. Ouvrez l'option entre le conteneur et entre le conteneur et le système hôte peut être consulté et exploité par l'ID de processus:
pid: "host"
23) ports
Exposez les informations de port. Utilisez le format "hôte: conteneur" ou spécifiez simplement le port du conteneur. L'hôte sélectionnera le port au hasard):
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8081:8081"
当使用"HOST:CONTAINER"格式来映射端口时,如果你使用的容器端口小于60并且没有放到引号里,可能会得到错误结果,因为YAML会自动解析xx:yy这种数字格式为60进制。为了避免这种问题的出现,建议数字串都用引号包括起来的字符串格式。
24) security_opt
Spécifiez l'attribut par défaut du mécanisme d'étiquette de modèle de conteneur) (utilisateur, rôle, type, niveau, etc.). Par exemple, le nom d'utilisateur et le nom de rôle de l'étiquette de configuration:
security_opt:
- label:user:USER
- label:role:ROLE
25) ulimits
Spécifiez la valeur limite ulimits du conteneur, par exemple, spécifiez le nombre maximal de processus comme 65535 et spécifiez la limite souple de 20000 pour le nombre de descripteurs de fichier. L'application peut être modifiée à tout moment et ne peut pas dépasser la limite stricte, qui ne peut être augmentée que par l'utilisateur root).
ulimits:
nproc:65535
nofile:
soft:20000
hard:40000
26) volumes
Le paramètre de chemin d'accès du volume de données. Vous pouvez définir le chemin d'hôte HOST: CONTAINER) ou ajouter le mode d'accès HOST: CONTAINER: ro). Le chemin dans cette instruction prend en charge les chemins relatifs. Par exemple:
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro
27) volumes_driver
Les versions plus récentes de Docker prennent en charge les pilotes de plug-in pour les volumes de données. Les utilisateurs peuvent utiliser un pilote tiers pour créer un volume de données, puis utiliser le nom pour y accéder. À ce stade, vous pouvez spécifier le lecteur via volumes_driver:
volume_driver: mydriver
28) volumes_de
Montez son volume de données à partir d'un autre service ou conteneur:
volumes_from:
- service_name
- container_name