一些鲜为人知的docker-compose功能

互联网上的许多指令都描述了一定程度的最少动作,因此,也给出了最少的命令和机会。


我决定选择一些带灯的功能,功能。 这篇文章并没有声称是唯一的,它可以帮助我提醒一下,也许它可以帮助一些Padawans从docker-compose开始他们的旅程。


使用多个docker-compose.yml文件


有复杂的配置,其中有一定的基本容器层,例如,始终需要这样。 通常情况下,我们会从附近的团队\另一个项目\ Internet中获取并完成您的需求。 但是,如果有多个命令,则可以将基本部分移到一个通用的内部存储库中。 对于大多数项目,我们都获得了相同的基础部件,并且也进行了版本化。


让我们描述一个基本的docker-compose-base.yml的示例。


假设这是一个定制的nginx图像,其中包含证书,调整和说指标。 普罗米修斯的出口商:


version: '2' services: nginx: image: nginx nginx-exporter: image: nginx/nginx-prometheus-exporter 

现在,我们描述docker-compose-app.yml应用程序的示例:


 version: '2' services: backend: image: internal.local/super-app:0.1.2 

首先,我们需要与众不同的普通团队。 我们将指示2个docker-compose文件:


 docker-compose up -d -f docker-compose-base.yml -f docker-compose-app.yml 

瞧,我们得到了一套服务,就像它们在单个docker-compose文件中描述的一样!


通过使用extends指令,还有另一个使用多个文件的选项。


docker-compose-base.yml:


 version: '2' services: nginx: image: nginx nginx-exporter: image: nginx/nginx-prometheus-exporter 

docker-compose-app.yml:


 version: '2' services: backend: image: internal.local/super-app:0.1.2 ###      web: extends: #     (   ) file: docker-compose-base.yml #       service: nginx web-exporter: extends: file: docker-compose-base.yml service: nginx-exporter 

来自iSlava的加载项
您可以在环境变量中描述所有组合文件,并使用docker-compose up -d而不手动指定文件:


 COMPOSE_PATH_SEPARATOR=: COMPOSE_FILE=docker-compose-base.yml:docker-compose-app.yml 

选择哪个选项-您选择。 所有这些,我只想显示选项=)


docker-compose中的继承


以下示例要求版本docker-compose > = 2.4
这也是一个非常有趣的功能,实际上很少提及。
此功能使我们能够在docker-compose文件中描述多个相同类型的服务,而无需重复描述,即继承。
例如,我们有一个像这样的文件:


 version: '2.4' services: backend: image: internal.local/super-app:0.1.2 ports: - 8080:8080 - 9090:9090 volumes: - ./conf/some.conf:/etc/app/some.conf:ro 

并且需要提高几个容器,但是有一些区别,我们当然可以“保存”并进行更改,但是我们可以这样做:


 version: '2.4' services: backend: &base-app #          image: internal.local/super-app:0.1.2 ports: - 8080:8080 - 9090:9090 volumes: - ./conf/some.conf:/etc/app/some.conf:ro backend-2: <<: *base-app # ports: #    - 8081:8080 

因此,我们有机会在一个地方进行更改,而不是编辑每个容器的描述。
还有另一个选项可以移动到根区域,例如:


 version: '2.4' services: x-backend: #   "x-"  ,    . &base-app image: internal.local/super-app:0.1.2 ports: - 8080:8080 - 9090:9090 volumes: - ./conf/some.conf:/etc/app/some.conf:ro backend: <<: *base-app # backend-2: <<: *base-app # ports: #    - 8081:8080 

资源限制


从2.2版本开始,您可以使用容器的资源限制,实际上是从2.1版本开始,但是仍然没有全部交付=)
有细微差别! 在版本3中,这些功能已删除! 已经有对docker swarm的重视。


最简单的CPU资源限制示例MEM:


 version: '2.2' services: backend: cpus: 1.5 #   . cpuset: '0,3' #     . mem_limit: 1gb #  1  memswap_limit: 2gb # SWAP   . oom_kill_disable: true #   ,    OOM Killer        ,       . image: internal.local/super-app:0.1.2 ports: - 8080:8080 - 9090:9090 volumes: - ./conf/some.conf:/etc/app/some.conf:ro 

将图像打包到档案中


不幸的是,并非总是可能在您自己的或云Docker注册表中推送映像。 有时需要从docker-compose文件收集图像并发送文件档案。 有时需要很长时间才能完成操作,所以我绘制了一个简单的脚本,突然有人派上了用场:


 #!/bin/bash dc=${1} if [ ! -z ${dc} ] && [ -f ${dc} ]; then echo "Saving docker images from file ${dc}..." images=`grep image: ${dc} | awk '{print $2}'` docker save ${images} | gzip > docker-images.gz echo "Success!" else echo "ERROR! You must set path to docker-compose.yml as argument!" fi 

保存到文件docker-compose-images-save.sh
我们有权执行:
chmod +x docker-compose-images-save.sh
我们启动它,并将路径作为参数传递给docker-compose文件:
./docker-compose-images-save.sh /home/some_user/docker-compose-app.yml
在输出中,我们进入包含图像的脚本存档所在的文件夹docker-images.gz
我们可以通过任何方式发送到远程服务器。
现在在远程服务器上就可以执行:
gzip -cd docker-images.gz | docker load
所有图像都将上传到本地注册表,然后您可以在此处安全运行
docker-compose up -d ,因为所有映像都位于Internet上的本地注册表中,所以docker不会进入它。


转发IPv6


在某些任务中,ipv6可能非常有用,至少要使Roskomnadzor毫无问题地通过ipv6传递所有流量,并且同一个电报机器人可以正常工作。
我将考虑ipv6不在您的计算机上的情况,无论它是虚拟机还是Internet上的服务器。
确保已启用系统级别ipv6:


  sysctl net.ipv6.conf.all.disable_ipv6 

该值应为0,如果不是,请更改:


  sysctl -w net.ipv6.conf.all.disable_ipv6=0 

安装miredo(这是带有到服务器的内置VPN的服务,它将为我们提供公共ipv6)


  apt-get install miredo -y 

检查服务是否正在运行:


  systemctl status miredo 

我们确认收到了ipv6地址:


  ifconfig teredo 

我们在/etc/docker/daemon.json中编写


  { "ipv6": true, "fixed-cidr-v6": "2001:db8:1::/64" } 

重新启动docker:


  systemctl restart docker 

好吧,仍然需要为ipv6启用NAT,以便我们容器的内部地址可以通过teredo接口到达外部世界:


  ip6tables -t nat -A POSTROUTING -o teredo -j MASQUERADE 

我们提出了我们需要的docker容器,它可以通过ipv6地址发布。


上面带有sysctl和iptables的示例将一直工作到重新引导,如果需要持续进行,则应查看分发说明,两者有所不同。

希望有人提供的信息对您有所帮助。

Source: https://habr.com/ru/post/zh-CN459618/


All Articles