Docker_学习笔记系列之docker-secret

docker 给数据层加密用到的密钥,详细配置参考前面docker-compose节点中关于yaml文件的各关键字配置信息

密钥信息都是需要提前创建的

1.创建新的键值对,生成密钥需要的加密key

openssl req -newkey rsa:4096 -nodes -sha256 -keyout domain.key -x509 -days 365 -out domain.crt# 生成两个文件domain.crt domain.key

2.创建docker-compose.yml中指定的docker密钥

# 创建加密密钥db_passworddocker secret create db_password domain.key# 创建db_cert密钥docker secret create db_cert domain.crt# 创建定义的db_token密钥,无需加密docker secret create db_token -

3.查看所有密钥

docker secret ls
  1. 运用见下面的docker-compose.yml文件中的说明

version: "3.8"
services:

redis: # 将创建单独的容器的redis服务
image: redis:alpine # 指定镜像,一般是包含仓库地址的镜像名,会自动去仓库拉取
ports:

  • "6379:6379" # 指定容器映射出的端口
  • "5000:5000"
    volumes:
  • type: volume # 定义一个volume新卷,注意无论在宿主机还是容器中修改内容都会实时反应到对应文件中
    source: myredis-data # 定义卷名,通过docker volume inspect myredis-data 可查看卷名对应的宿主机目录位置
    target: /app # 定义上面的卷与redis服务中的/app目录
    networks:
  • frontend # 指定容器使用的网络,必须在构建前先存在
    command: python /app/AsyncIssuedMain.py -type 2 # 指定容器启动时启动的命令,默认覆盖dockerfile中cmd指定的命令
    secrets:
  • source: web_token # 指定密钥的名字,需要在外层已经定义存在的,以普通文件挂载到副本中,在宿主机的位置为/run/secrets
    target: secret-name # 定义的密钥文件名,即在副本中为/run/secrets/secret-name
    stop_grace_period: 1m30s # 定义优雅的停服时间,停容器时给id为1的进程发送SIGTERM信号,默认10s,如果10s后没有处理该信号,则会被SIGKILL信号强制杀掉
    deploy: # 此节点是用于集群模式在多台服务器上创建多个副本即多个相同的容器不容的ip和容器名,提升并发
    replicas: 2 # 创建n个副本,默认为1
    update_config: # 定义在滚动升级update时的具体操作
    parallelism: 2 # 每次更新副本的数量
    failure_action: rollback # 定义升级失败后自动回滚,默认是pause升级失败自动阻止其他副本升级
    restart_policy: # 定义容器异常退出时的策略
    condition: on-failure # 容器以非0返回值退出,会立即重启
    max_attempts: 3 # 最多重启次数
    window: 120s # 最多等待时间确认是否重启成功
    delay: 10s # 每次重启的间隔时间
    placement: # 定义本服务和主机属性相关的副本中的限制
    max_replicas_per_node: 1 # 定义最大副本的数量
    constraints:
    • "node.role==manager" # 表示只在管理节点上部署副本,支持副本id、hostname、引擎标签、自定义标签指定

db:
build: . # 基于当前yaml文件目录下的dockerfile文件构建镜像,默认镜像名为:compose文件目录名_compose文件定义的服务名
volumes:

  • /usr/db-data:/var/lib/postgresql/data # 指定主机与容器对应的映射目录
  • /configs/config.py:/app/config.py # 宿主机目录中的文件在容器第一次启动时会覆盖容器中对应文件名的内容
    networks:
  • backend
    secrets:
  • db_password # 指定使用的密钥
    environment: # 在副本中添加环境变量
    DB_USER: SUN
    DB_PASSWD_FILE: /run/secrets/db_password # 密码的位置(挂载到每个服务副本中的密钥)
    DB_NAME: ORDER
    deploy:
    placement: # 定义本服务和主机属性相关的副本中的限制
    constraints:
    • 'node.role == worker' # 部署在工作节点上

      自定义标签需要通过docker node update --label-add db_center=yes 工作节点主机名,部署前提交创建

      • 'node.labels.db_center == yes' # 且工作节点的自定义标签为db_center的机器上
        networks:
        frontend:
        backend:
        driver: overlay # 默认都是采用此网络驱动
        driver_opts:
        encrypted: 'yes' # 是否加密数据层,一般涉及数据库支付等时根据需求配置,会增加开销
        volumes:
        db-data:
        secrets: # 数据层加密时配置密钥
        db_password:
        external: true # 密钥定义为stack部署前必须存在
        web_token:
        file: ./devsecrets/payment_token # 部署时按需创建密钥,需要在主机路劲下的文件中配置
后记:docker笔记系列到这里,就告一段落了,水平一般,能力有限,记录这些笔记用于平常工作及时翻阅解决问题,也希望能给看到的人一些帮助。后期将会针对docker与gitlab、Jenkins实现CI/CD,让开发不在为部署而头疼一切代码开发完即完成交付,敬请关注!
©著作权归作者所有:来自51CTO博客作者mob604756e88498的原创作品,如需转载,请注明出处,否则将追究法律责任