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,讓開發不在爲部署而頭疼一切代碼開發完即完成交付,敬請關注!