linuxea:docker config的配置使用



使用Docker Config而不是使用嵌入式配置创建镜像怎么样?

I. 在镜像中嵌入配置?

我们经常看到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的简单使用。

II. 使用场景

有一个配置redis.conf的配置文件在容器内,现在我将容器内的配置文件修改后重新附加到容器内。我修改了密码字段:

masterauth "OTdmOWI4ZTM4NTY1M2M4OTZh.com"
requirepass "OTdmOWI4ZTM4NTY1M2M4OTZh.com"

III. 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

根据定义,配置中的数据不是机密的,因此不加密。

IV. 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,在局部配置中附加配置即可

V. 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"
0 分享

您可以选择一种方式赞助本站

支付宝扫码赞助

支付宝扫码赞助

日期: 2019-03-02分类: Docker

标签: docker, swarm, docker-compose

发表评论