docker 给数据层加密用到的密钥,详细配置参考前面docker-compose节点中关于yaml文件的各关键字配置信息node
密钥信息都是须要提早建立的python
1.建立新的键值对,生成密钥须要的加密keygit
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密钥web
# 建立加密密钥db_password
docker secret create db_password domain.key
# 建立db_cert密钥
docker secret create db_cert domain.crt
# 建立定义的db_token密钥,无需加密
docker secret create db_token -
3.查看全部密钥redis
docker secret ls
- 运用见下面的docker-compose.yml文件中的说明
version: "3.8"
services:sql
redis: # 将建立单独的容器的redis服务
image: redis:alpine # 指定镜像,通常是包含仓库地址的镜像名,会自动去仓库拉取
ports:docker
- "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,让开发不在为部署而头疼一切代码开发完即完成交付,敬请关注!