使用Docker Config而不是使用嵌入式配置创建镜像怎么样?
在镜像中嵌入配置?
我们经常看到Dockerfile如下所示,其中创建新镜像只是为了将配置添加到基本镜像。
$ cat Dockerfile
FROM marksugar:redis:5.0.0
RUN curl http:/xx/x/xredis.conf -o /etc/redis/redis.conf
在上述中,是将最新的redis.conf文件放到/etc/redis/redis.conf中
除此之外,我们还可以使用变量替换的方式进行处理。变量替换意味着需要设计模板和参数,如果参数过多,配置和替换起来将会耗费更多的时间,也较为复杂,并不是最好最安全的方式。
当然,我们可以直接挂载文件到容器中,那并不优雅,但的确能解决一部分问题。
如果需要频繁的修改文件,且变量替换也无法满足,也不想挂载文件,那现在就可以参考本节的docker config。
阅读本章,你将了解docker config的简单使用和docker swarm的简单使用。
使用场景
有一个配置redis.conf的配置文件在容器内,现在我将容器内的配置文件修改后重新附加到容器内。我修改了密码字段:
masterauth "OTdmOWI4ZTM4NTY1M2M4OTZh.com"
requirepass "OTdmOWI4ZTM4NTY1M2M4OTZh.com"
config创建
现在,使用Docker CLI,我们可以从此配置文件创建配置redis.conf(redis.conf文件此前准备好的配置),我们将此配置命名为redis。
[root@linuxea.com /opt/2019/redis]# docker config create redis redis.conf
269yklanwzva9yk74n6b3j9dk
然后我们可以检查配置,就像我们对其他任何Docker一样:
[root@linuxea.com /opt/2019/redis]# docker config inspect redis
[
{
"ID": "269yklanwzva9yk74n6b3j9dk",
"Version": {
"Index": 24
},
"CreatedAt": "2019-03-02T02:36:19.257840639Z",
"UpdatedAt": "2019-03-02T02:36:19.257840639Z",
"Spec": {
"Name": "redis",
"Labels": {},
"Data": "YmluZCAwLjAuMC4wDQpwcm90ZWN0ZWQtbW9kZSB5ZXMNCnBvcnQgNjM3OQ0KdGNwLWJhY2tsb2cgNTExDQp0aW1lb3V0IDANCnRjcC1rZWVwYWxpdmUgMzAwDQpkYWVtb25pemUgbm8NCnN1cGVydmlzZWQgbm8NCnBpZGZpbGUgL3Zhci9ydW4vcmVkaXNfNjM3OS5waWQNCmxvZ2xldmVsIG5vdGljZQ0KbG9nZmlsZSAiL2RhdGEvbG9ncy9yZWRpc182Mzc5LmxvZyINCmRhdGFiYXNlcyAxNg0KYWx3YXlzLXNob3ctbG9nbyB5ZXMNCnNhdmUgOTAwIDENCnNhdmUgMzAwIDEwDQpzYXZlIDYwIDEwMDAwDQpzdG9wLXdyaXRlcy1vbi1iZ3NhdmUtZXJyb3IgeWVzDQpyZGJjb21wcmVzc2lvbiB5ZXMNCnJkYmNoZWNrc3VtIHllcw0KZGJmaWxlbmFtZSBkdW1wLnJkYg0KZGlyICIvZGF0YS9yZWRpcyINCnJlcGxpY2Etc2VydmUtc3RhbGUtZGF0YSB5ZXMNCnJlcGxpY2EtcmVhZC1vbmx5IHllcw0KcmVwbC1kaXNrbGVzcy1zeW5jIG5vDQpyZXBsLWRpc2tsZXNzLXN5bmMtZGVsYXkgNQ0KcmVwbC1kaXNhYmxlLXRjcC1ub2RlbGF5IG5vDQpyZXBsaWNhLXByaW9yaXR5IDEwMA0KbGF6eWZyZWUtbGF6eS1ldmljdGlvbiBubw0KbGF6eWZyZWUtbGF6eS1leHBpcmUgbm8NCmxhenlmcmVlLWxhenktc2VydmVyLWRlbCBubw0KcmVwbGljYS1sYXp5LWZsdXNoIG5vDQphcHBlbmRvbmx5IG5vDQphcHBlbmRmaWxlbmFtZSAiYXBwZW5kb25seS5hb2YiDQphcHBlbmRmc3luYyBldmVyeXNlYw0Kbm8tYXBwZW5kZnN5bmMtb24tcmV3cml0ZSBubw0KYXV0by1hb2YtcmV3cml0ZS1wZXJjZW50YWdlIDEwMA0KYXV0by1hb2YtcmV3cml0ZS1taW4tc2l6ZSA2NG1iDQphb2YtbG9hZC10cnVuY2F0ZWQgeWVzDQphb2YtdXNlLXJkYi1wcmVhbWJsZSB5ZXMNCmx1YS10aW1lLWxpbWl0IDUwMDANCnNsb3dsb2ctbG9nLXNsb3dlci10aGFuIDEwMDAwDQpzbG93bG9nLW1heC1sZW4gMTI4DQpsYXRlbmN5LW1vbml0b3ItdGhyZXNob2xkIDANCm5vdGlmeS1rZXlzcGFjZS1ldmVudHMgIiINCmhhc2gtbWF4LXppcGxpc3QtZW50cmllcyA1MTINCmhhc2gtbWF4LXppcGxpc3QtdmFsdWUgNjQNCmxpc3QtbWF4LXppcGxpc3Qtc2l6ZSAtMg0KbGlzdC1jb21wcmVzcy1kZXB0aCAwDQpzZXQtbWF4LWludHNldC1lbnRyaWVzIDUxMg0KenNldC1tYXgtemlwbGlzdC1lbnRyaWVzIDEyOA0KenNldC1tYXgtemlwbGlzdC12YWx1ZSA2NA0KaGxsLXNwYXJzZS1tYXgtYnl0ZXMgMzAwMA0Kc3RyZWFtLW5vZGUtbWF4LWJ5dGVzIDQwOTYNCnN0cmVhbS1ub2RlLW1heC1lbnRyaWVzIDEwMA0KYWN0aXZlcmVoYXNoaW5nIHllcw0KY2xpZW50LW91dHB1dC1idWZmZXItbGltaXQgbm9ybWFsIDAgMCAwDQpjbGllbnQtb3V0cHV0LWJ1ZmZlci1saW1pdCByZXBsaWNhIDI1Nm1iIDY0bWIgNjANCmNsaWVudC1vdXRwdXQtYnVmZmVyLWxpbWl0IHB1YnN1YiAzMm1iIDhtYiA2MA0KaHogMTANCmR5bmFtaWMtaHogeWVzDQphb2YtcmV3cml0ZS1pbmNyZW1lbnRhbC1mc3luYyB5ZXMNCnJkYi1zYXZlLWluY3JlbWVudGFsLWZzeW5jIHllcw0KbWF4bWVtb3J5LXBvbGljeSBhbGxrZXlzLWxmdQ0KbGZ1LWxvZy1mYWN0b3IgMTANCmxmdS1kZWNheS10aW1lIDENCm1heGNsaWVudHMgNjAwDQptYXhtZW1vcnkgNDA5Nk0NCm1hc3RlcmF1dGggIk9UZG1PV0k0WlRNNE5UWTFNMk00T1RaaC5jb20iDQpyZXF1aXJlcGFzcyAiT1RkbU9XSTRaVE00TlRZMU0yTTRPVFpoLmNvbSINCg=="
}
}
]
数据仅为base64编码,可以轻松解码。
[root@linuxea.com /opt/2019/redis]# docker config inspect -f '{{json .Spec.Data}}' redis|cut -d '"' -f2 |base64 -d
bind 0.0.0.0
protected-mode yes
port 6379
....
masterauth "OTdmOWI4ZTM4NTY1M2M4OTZh.com"
requirepass "OTdmOWI4ZTM4NTY1M2M4OTZh.com"
我修改了密码字段: OTdmOWI4ZTM4NTY1M2M4OTZh.com
根据定义,配置中的数据不是机密的,因此不加密。
docker-compose config配置
注意:由于配置是在运行应用程序之前创建的,因此在此文件中将其定义为external。如下:
version: '3.7'
services:
redis:
image: marksugar/redis:5.0.0
container_name: redis
restart: always
network_mode: "host"
privileged: true
environment:
- REDIS_CONF=off
- REQUIRE_PASS=OTdmOWI4ZTM4NTY1M2M4OTZh
- MASTER_AUTH=OTdmOWI4ZTM4NTY1M2M4OTZh
- MAXCLIENTS_NUM=600
- MAXMEMORY_SIZE=4096M
volumes:
- /etc/localtime:/etc/localtime:ro
- /data/redis-data:/data/redis:Z
- /data/logs:/data/logs
configs:
- source: redis
target: /etc/redis/redis.conf
configs:
redis:
external: true
其中configs引用如下:
- target: 配置文件在容器中的位置
- configs: 全局调用和局部调用
version: '3.7'
services:
redis:
image:
....
configs:
- source: redis
target: /etc/redis/redis.conf
configs:
redis:
external: true
config的名称为redis,在全局配置中则填写redis,在局部配置中附加配置即可
docker swarm 使用
然后可以使用以下命令运行该应用程序:
[root@linuxea.com /opt/2019/redis]# docker stack deploy -c ./docker-compose.yaml redis
Ignoring unsupported options: network_mode, privileged, restart
Ignoring deprecated options:
container_name: Setting the container name is not supported.
Creating network redis_default
Creating service redis_redis
验证
[root@linuxea.com /opt/2019/redis]# docker exec -it redis_redis.1.s6f35kwutld2d7oc80e4531rp cat /etc/redis/redis.conf
bind 0.0.0.0
protected-mode yes
port 6379
...
masterauth "OTdmOWI4ZTM4NTY1M2M4OTZh.com"
requirepass "OTdmOWI4ZTM4NTY1M2M4OTZh.com"
...
info信息
[root@linuxea.com /opt/2019/redis]# docker exec -i redis_redis.1.s6f35kwutld2d7oc80e4531rp redis-cli -a OTdmOWI4ZTM4NTY1M2M4OTZh.com info|grep cpu
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
used_cpu_sys:1.445721
used_cpu_user:1.499864
used_cpu_sys_children:0.000000
used_cpu_user_children:0.000000
删除命令
[root@linuxea.com /opt/2019/redis]# docker stack rm redis
Removing service redis_redis
Removing network redis_default
update
当需要修改配置的内容时,创建新配置(使用docker config create)然后更新服务以删除先前配置的config,并添加对新配置是一种常见模式。服务命令--config-rm和--config-add是
我们修改配置文件的密码,而后重新创建一个redis1的config文件
masterauth "OTdmOWI4ZTM4NTY1M2M4OTZh.com"
requirepass "OTdmOWI4ZTM4NTY1M2M4OTZh.com.cn"
创建redis1的config
[root@linuxea.com opt/2019/redis]# docker config create redis1 redis.conf
a4soto5rw4if4h7ir8jfrasyv
更新配置文件
- 先删除掉redis的config,而后添加redis1,这个过程会更新redis容器
[root@linuxea.com /opt/2019/redis]# docker service update --config-rm redis --config-add src=redis1,target=/etc/redis/redis.conf redis_redis
redis_redis
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged
查看更新
[root@linuxea.com /opt/2019/redis]# docker exec -it redis_redis.1.5qpc63nvm75w03v3ihk17hgie cat /etc/redis/redis.conf
bind 0.0.0.0
protected-mode yes
....
masterauth "OTdmOWI4ZTM4NTY1M2M4OTZh.com"
requirepass "OTdmOWI4ZTM4NTY1M2M4OTZh.com.cn"