互联网上的许多指令都描述了一定程度的最少动作,因此,也给出了最少的命令和机会。
我决定选择一些带灯的功能,功能。 这篇文章并没有声称是唯一的,它可以帮助我提醒一下,也许它可以帮助一些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的示例将一直工作到重新引导,如果需要持续进行,则应查看分发说明,两者有所不同。
希望有人提供的信息对您有所帮助。