返回顶部
首页 > 资讯 > 服务器 >Docker Secret的管理和使用详解
  • 383
分享到

Docker Secret的管理和使用详解

2024-04-02 19:04:59 383人浏览 薄情痞子
摘要

一、什么是Docker Secret (一)情景展现  我们知道有的service是需要设置密码的,比如Mysql服务是需要设置密码的: version: '3'

一、什么是Docker Secret

(一)情景展现

 我们知道有的service是需要设置密码的,比如Mysql服务是需要设置密码的:


version: '3'

services:

 WEB:
  image: Wordpress
  ports:
   - 8080:80
  volumes:
   - ./www:/var/www/html
  environment:
   WORDPRESS_DB_NAME=wordpress
   WORDPRESS_DB_HOST: mysql
   WORDPRESS_DB_PASSWORD: root
  networks:
   - my-network
  depends_on:
   - mysql
  deploy:
   mode: replicated
   replicas: 3
   restart_policy:
    condition: on-failure
    delay: 5s
    max_attempts: 3
   update_config:
    parallelism: 1
    delay: 10s

 mysql:
  image: mysql
  environment:
   MYSQL_ROOT_PASSWORD: root
   MYSQL_DATABASE: wordpress
  volumes:
   - mysql-data:/var/lib/mysql
  networks:
   - my-network
  deploy:
   mode: global
   placement:
    constraints:
     - node.role == manager

volumes:
 mysql-data:

networks:
 my-network:
  driver: overlay

可以看到在这个docker-compose.yml中的两个service密码都是明文,这样就导致了不是很安全,那么究竟什么是Docker secret以及能否解决上面的问题呢?

(二)Docker Secret

   我们知道manager节点保持状态的一致是通过Raft Database这个分布式存储的数据库,它本身就是将信息进行了secret,所以可以利用这个数据库将一些敏感信息,例如账号、密码等信息保存在这里,然后通过给service授权的方式允许它进行访问,这样达到避免密码明文显示的效果。

  总之,secret的Swarm中secret的管理通过以下步骤完成:

  • secret存在于Swarm Manager节点的的Raft Database里
  • secret可以assign给一个service,然后这个service就可以看到这个secret
  • 在container内部secret看起来像文件,实际上就是内存

二、Docker Secret的创建与使用

(一)创建

我们先看看创建的一些帮助说明:


[root@Centos-7 ~]# docker secret --help

Usage:  docker secret COMMAND

Manage Docker secrets

Commands:
 create   Create a secret from a file or STDIN as content
 inspect   Display detailed infORMation on one or more secrets
 ls     List secrets
 rm     Remove one or more secrets

Run 'docker secret COMMAND --help' for more information on a command.

第一个命令就是创建的命令,我们再来看看它有什么帮助信息:


[root@centos-7 ~]# docker secret create --help

Usage:  docker secret create [OPTIONS] SECRET [file|-]

Create a secret from a file or STDIN as content

Options:
 -d, --driver string      Secret driver
 -l, --label list        Secret labels
   --template-driver string  Template driver

可以看到说明secret可以来自于一个文件或者一个标准输出。那么也就是Secret的创建有两种方式,分别是:

  • 基于文件的创建
  • 基于命令行创建

1、基于文件创建

首先先创建一个文件用于存放密码


[root@centos-7 ~]# vim mysql-password
root

然后再进行创建secret


[root@centos-7 ~]# docker secret create mysql-pass mysql-password 
texcct9ojqcz6n40woe97dd7k

  其中,mysql-pass是secret的名称,mysql-password是我们建立存储密码的文件,这样执行后就相当于将文件中的密码存储在Swarm中manager节点的Raft Database中了。为了安全起见,现在可以直接将这个文件删掉,因为Swarm中已经有这个密码了。


[root@centos-7 ~]# rm -f mysql-password 

现在可以查看一下secret列表:


[root@centos-7 ~]# docker secret ls
ID             NAME        DRIVER       CREATED       UPDATED
texcct9ojqcz6n40woe97dd7k  mysql-pass               4 minutes aGo    4 minutes ago

已经存在了。

2、基于命令行创建


[root@centos-7 ~]# echo "root" | docker secret create mysql-pass2 -
hrtmn5yr3r3k66o39ba91r2e4
[root@centos-7 ~]# docker secret ls
ID             NAME        DRIVER       CREATED       UPDATED
texcct9ojqcz6n40woe97dd7k  mysql-pass               6 minutes ago    6 minutes ago
hrtmn5yr3r3k66o39ba91r2e4  mysql-pass2               5 seconds ago    5 seconds ago

这种方式还是很简单的就创建成功了

(二)其它操作

那么secret还有什么其它操作吗?


[root@centos-7 ~]# docker secret --help

Usage:  docker secret COMMAND

Manage Docker secrets

Commands:
 create   Create a secret from a file or STDIN as content
 inspect   Display detailed information on one or more secrets
 ls     List secrets
 rm     Remove one or more secrets

Run 'docker secret COMMAND --help' for more information on a command.

可以看到除了create命令外,还有inspect、ls、以及rm命令。

1、inspect


[root@centos-7 ~]# docker secret inspect mysql-pass2
[
  {
    "ID": "hrtmn5yr3r3k66o39ba91r2e4",
    "Version": {
      "Index": 4061
    },
    "CreatedAt": "2020-02-07T08:39:25.630341396Z",
    "UpdatedAt": "2020-02-07T08:39:25.630341396Z",
    "Spec": {
      "Name": "mysql-pass2",
      "Labels": {}
    }
  }
]

展示secret的一些详情信息

2、rm


[root@centos-7 ~]# docker secret rm mysql-pass2
mysql-pass2
[root@centos-7 ~]# docker secret ls
ID             NAME        DRIVER       CREATED       UPDATED
texcct9ojqcz6n40woe97dd7k  mysql-pass               12 minutes ago   12 minutes ago

删除一个secret

(三)Secret在单容器中的使用

1、容器中查看secret

 我们创建了一个secret,如何在启动一个服务后,将其授权给特定的服务然后它才可以看到呢?先看看创建服务的命令中是否有类似的命令或者参数:


[root@centos-7 ~]# docker service create --help

Usage:  docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]

Create a new service

Options:
   --config config           Specify configurations to expose to the service
...
 --secret secret           Specify secrets to expose to the service
...
...

确实是有这样的命令,在创建服务时可以给服务暴露出secret。

2、创建服务


[root@centos-7 ~]# docker service create --name demo --secret mysql-pass busybox sh -c "while true; do sleep 3600; done"
zwgk5w0rpf17hn77axz6cn8di
overall progress: 1 out of 1 tasks 
1/1: running  
verify: Service converged 

查看这个服务运行在那个节点上:


[root@centos-7 ~]# docker service ls
ID         NAME      MODE        REPLICAS      IMAGE        PORTS
zwgk5w0rpf17    demo      replicated     1/1         busybox:latest   
[root@centos-7 ~]# docker service ps demo
ID         NAME      IMAGE  NODE     DESIRED STATE    CURRENT STATE   ERROR PORTS
yvr9lwvg8oca    demo.1    busybox:latest   localhost.localdomain  Running  Running 51 seconds ago   

可以看到这个服务运行在localhost.localdomain主机的节点上,我们去这个节点上进入到容器内部,看是否能查看secret:


[root@localhost ~]# docker ps
CONTAINER ID  IMAGE        COMMAND      CREATED       STATUS  PORTS        NAMES
36573adf21f6 busybox:latest  "sh -c 'while true; …"4 minutes ago  Up 4 minutes demo.1.yvr9lwvg8ocatym20hdfublhd
[root@localhost ~]# docker exec -it 36573adf21f6 /bin/sh
/ # ls
bin  dev  etc  home proc root run  sys  tmp  usr  var
/ # cd /run/secrets
/run/secrets # ls
mysql-pass
/run/secrets # cat mysql-pass 
root
/run/secrets # 

可以看到确实是可行的。

2、mysql服务

关于mysql镜像,详情查看https://hub.docker.com/_/mysql其中有关于secret的描述:

  作为通过环境变量传递敏感信息的替代方法,_FILE可以将其附加到先前列出的环境变量中,从而使初始化脚本从容器中存在的文件中加载那些变量的值。特别是,这可用于从/run/secrets/<secret_name>文件中存储的Docker Secret加载密码。例如:


$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql-root -d mysql:tag

目前,这仅支持MYSQL_ROOT_PASSWORD,MYSQL_ROOT_HOST,MYSQL_DATABASE,MYSQL_USER,和MYSQL_PASSWORD。

所以我们需要先创建一个文件secret用于存储数据库的敏感信息,因为之前已经创建过,这里无需再创建:


[root@centos-7 ~]# docker secret ls
ID             NAME        DRIVER     CREATED       UPDATED
texcct9ojqcz6n40woe97dd7k  mysql-pass             4 hours ago     4 hours ago

启动mysql服务:


[root@centos-7 ~]# docker service create --name db --secret mysql-pass -e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql-pass mysql
sbpagzqvpwt8ifymavf8o5xmi
overall progress: 1 out of 1 tasks 
1/1: running  
verify: Service converged 

查看mysql服务在那个节点上:


[root@centos-7 ~]# docker service ls
ID         NAME        MODE        REPLICAS      IMAGE        PORTS
sbpagzqvpwt8    db         replicated     0/1         mysql:latest    
[root@centos-7 ~]# docker service ps db
ID      NAME    IMAGE     NODE         DESIRED STATE CURRENT STATE ERROR  PORTS
qlmfm6u7lg8u  db.1  mysql:latest  localhost.localdomain  Running Starting 2 seconds ago 

在worker节点中进入该服务的容器中查看secret:


[root@localhost ~]# docker ps
CONTAINER ID  IMAGE        COMMAND         CREATED       STATUS       PORTS         NAMES
2ac2a810e931 mysql:latest "docker-entrypoint.s…" 3 minutes ago Up 2 minutes 3306/tcp, 33060/tcp db.1.qlmfm6u7lg8u8i1v2m2c3ls3r

[root@localhost ~]# docker exec -it 2ac2a810e931 /bin/sh
# cd /run/secrets/
# ls
mysql-pass
# cat mysql-pass
root

这样知道了密码就可以进入到mysql数据库中了。


# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.19 MySQL CommUnity Server - GPL

Copyright (c) 2000, 2020, oracle and/or its affiliates. All rights reserved.

Oracle is a reGIStered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

(四)Secret在Stack中的使用

Stack利用的就是docker-compose.yml文件来部署stack,那么如何在docker-compose.yml中来定义secret呢?


version: '3'

services:

 web:
  image: wordpress
  ports:
   - 8080:80
  secrets:
   - my-pw
  environment:
   WORDPRESS_DB_HOST: mysql
   WORDPRESS_DB_PASSWORD_FILE: /run/secrets/wordpress-pass
  networks:
   - my-network
  depends_on:
   - mysql
  deploy:
   mode: replicated
   replicas: 3
   restart_policy:
    condition: on-failure
    delay: 5s
    max_attempts: 3
   update_config:
    parallelism: 1
    delay: 10s

 mysql:
  image: mysql
  secrets:
   - my-pw
  environment:
   MYSQL_ROOT_PASSWORD_FILE: /run/secrets/mysql-pass
   MYSQL_DATABASE: wordpress
  volumes:
   - mysql-data:/var/lib/mysql
  networks:
   - my-network
  deploy:
   mode: global
   placement:
    constraints:
     - node.role == manager

volumes:
 mysql-data:

networks:
 my-network:
  driver: overlay

上面通过在environment中定义WORDPRESS_DB_PASSWORD_FILE以及MYSQL_ROOT_PASSWORD_FILE来制定secret,显然我们在运行这个docker-compose.yml文件之前必须先要进行对应的secret文件的创建。然后就可以通过docker stack deploy命令来部署这个stack了。

到此这篇关于Docker Secret的管理和使用详解的文章就介绍到这了,更多相关Docker Secret内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Docker Secret的管理和使用详解

本文链接: https://lsjlt.com/news/121779.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Docker Secret的管理和使用详解
    一、什么是Docker Secret (一)情景展现  我们知道有的service是需要设置密码的,比如mysql服务是需要设置密码的: version: '3' ...
    99+
    2024-04-02
  • k8s中secret的用法详解
    secret可以加密用户名和密码文件,将其打包成一个secret并在API服务器上创建对象 echo -n 'admin' > ./username.txt echo -n '...
    99+
    2023-05-15
    k8s secret使用 k8s secret
  • docker镜像管理命令详解
    目录一、国内Docker镜像仓库三、搜索镜像四、拉取镜像五、列出镜像六、虚悬镜像七、删除本地镜像八、镜像的导入导出导入方式一(不输出详细信息):导入方式二(输出详细信息):一、国内Docker镜像仓库 由于大家都知道的原因,从国外的dock...
    99+
    2024-04-02
  • 如何使用 Docker 部署和管理 MongoDB?
    简介 MongoDB 是一种流行的开源 NoSQL 数据库,旨在存储和管理非结构化数据。它为现代应用程序提供高性能、可扩展性和灵活性。 另一方面,Docker 是一个容器化平台,使开发人员能够将其应用程序和依赖项打包到可在不同环境中一致运行...
    99+
    2023-10-22
  • Docker使用详解
    Docker Docker基础篇 目标: 掌握Docker基础知识,能够理解Docker镜像与容器的概念 完成Docker安装与启动 掌握Docker镜像与容器相关命令 掌握Tomcat Ng...
    99+
    2023-09-03
    docker 运维 容器 java
  • 解决使用Docker Compose管理容器的问题
    在Docker的设计中,一个容器只运行一个应用。但是目前的绝大多数应用系统都不是一个应用就可以组成的。虽然之前提到了容器间互相连接、交换数据的方法,使用这些方法也确实能搭建起一个完整...
    99+
    2024-04-02
  • Vue3状态管理的使用详解
    目录背景 Provide / Inject 抽离共享状态提供数据 注入数据 小结 reactive 抽离共享状态使用共享状态 小结 结语 背景 随着Vue3的逐步应用,对状态管理的...
    99+
    2024-04-02
  • Docker在Windows环境的搭建和使用详解
    目录安装WSL安装Docker镜像下载Docker镜像启动gpu启动传送文件训练yolov5开始训练yolov5更换python版本添加PPA源更新安装python3.8修改pyth...
    99+
    2023-03-02
    Docker Windows环境搭建使用 Docker 搭建使用
  • Google和Facebook不使用Docker的原理解析
    写作本文的起因是我想让修改后的分布式 PyTorch 程序能更快的在 Facebook 的集群上启动。探索过程很有趣,也展示了工业机器学习需要的知识体系。 2007 年我刚毕业后在 ...
    99+
    2024-04-02
  • Docker redmine项目管理工具的使用
    目录一、redmine项目管理工具二、Redmine安装三、Redmine认证配置四、使用Redmine进行项目管理五、配置redmine通知邮件一、redmine项目管理工具 Re...
    99+
    2024-04-02
  • docker 使用GPU的过程详解
    目录下载tf-gpu基于拉的tf-gpu镜像构建自己的镜像启动镜像检查GPU是否可用以TensorFlow2.0为例 下载tf-gpu 在docker hub里选择要下载的tf版本(...
    99+
    2024-04-02
  • 如何使用Nexus管理Docker镜像
    这篇文章将为大家详细讲解有关如何使用Nexus管理Docker镜像,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Nexus简介Nexus是一个多功能的仓库管理器,是企业常用的私有仓库服务器软...
    99+
    2023-06-19
  • 详解使用PM2管理nodejs进程
    pm2 是一个带有负载均衡功能的Node应用的进程管理器. 当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着,0秒的重载, PM2是完美的。 它非常适合IaaS结构,但不要把它用于P...
    99+
    2022-06-04
    详解 进程 nodejs
  • Spring 事务管理详解及使用
    ✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识...
    99+
    2023-09-02
    spring java mybatis
  • ReactNative 状态管理redux使用详解
    目录正文安装和配置开发环境定义数据结构然后创建行为处理函数 todoReducer创建 UI 组件:正文 有同学反馈开发 ReactNative 应用时状态管理不是很明白,接下来几...
    99+
    2023-03-10
    ReactNative状态管理redux ReactNative redux
  • Yarn与Lerna管理monorepo使用详解
    目录什么是 Yarn workspace如何使用 Yarn workspaceLerna 安装依赖的方式Yarn workspace 与 Lerna 结合结合的方式角色的分配好处使用...
    99+
    2024-04-02
  • Vuex中状态管理器的使用详解
    目录一、Vuex是什么?二、什么时候使用Vuex三、Vuex的核心概念和API四、应用举例五、vuex中各种辅助函数的用法,可以使我们更加方便的运用vuex一、Vuex是什么? Vu...
    99+
    2024-04-02
  • React状态管理器Rematch的使用详解
    目录Rematch使用1. Rematch介绍2. Rematch特性3. 基本使用Rematch使用 1. Rematch介绍 Rematch是没有样板文件的Redux的最佳实践,...
    99+
    2024-04-02
  • Node.js安装教程和NPM包管理器使用详解
    2009年的JSCOnf大会上,一个叫Ryan Dahl的年轻程序员向人们展示了一个他正在做的项目,一个基于Google V8引擎的JavaScript运行平台,它提供了一套事件循环和低IO的应用程序编程接...
    99+
    2022-06-04
    管理器 详解 教程
  • iOS内存管理TaggedPointer使用原理详解
    目录正文Tagged Pointer 的原理MacOS 分析如何判断 Tagged Pointer Tagged Pointer 注意点正文 为了节省内存和提高执行效率,...
    99+
    2023-01-06
    iOS内存管理Tagged Pointer iOS Tagged Pointer
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作