Docker Secret的管理和使用详解

一、什么是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内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Docker 运行时的用户与组管理的方法

    docker 以进程为核心, 对系统资源进行隔离使用的管理工具. 隔离是通过 cgroups (control groups 进程控制组) 这个操作系统内核特性来实现的. 包括用户的参数限制. 帐户管理. 资源(CPU,内存,磁盘I/O,网络)使用的隔离等. docker 在运行时可以为容器内进程指定用户和组. 没有指定时默认是 root .但因为隔离的原因, 并不会因此丧失安全性. 传统上, 特定的应用都以特定的用户来运行, 在容器内进程指定运行程序的所属用户或组并不需要在 host 中事先创

  • 详解Docker 数据卷管理

    Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume).数据卷可以用来存储Docker应用的数据,也可以用来在Docker容器间进行数据共享. 数据卷呈现给Docker容器的形式就是一个目录,支持多个容器间共享,修改也不会影响镜像.使用Docker的数据卷,类似在系统中使用 mount 挂载一个文件系统. 本节中,我们需要依次完成下面几项任务: 1.创建数据卷 2.管理数据卷权限 3.挂载宿主机文件 4.使用数据卷容器共享数据 5.数据卷备份

  • 详解Docker Volume 之权限管理

    Volume数据卷是Docker的一个重要概念.数据卷是可供一个或多个容器使用的特殊目录,可以为容器应用存储提供有价值的特性: 持久化数据与容器的生命周期解耦:在容器删除之后数据卷中的内容可以保持.Docker 1.9之后引进的named volume(命名文件卷)可以更加方便地管理数据卷的生命周期:数据卷可以被独立地创建和删除. 数据卷可以用于实现容器之间的数据共享 可以支持不同类型的数据存储实现 Docker缺省提供了对宿主机本地文件卷的支持,可以将宿主机的目录挂载到容器之中.由于没有容器分

  • Docker集群的创建与管理实例详解

    本文详细讲述了Docker集群的创建与管理.分享给大家供大家参考,具体如下: 在<Docker简单安装与应用入门教程>中编写一个应用程序,并将其转化为服务,在<Docker分布式应用教程>中,使应用程序在生产过程中扩展5倍,并定义应该如何运行.现在将此应用程序部署到集群上,并在多台机器上运行它,通过将多台机器连接到Dockerized集群上,使多容器.多机器应用成为可能. Swarm(集群)是运行Docker并加入到一个集群中的一组机器,在这种情况下,您将继续运行以往的Docker

  • 详解Docker使用Linux iptables 和 Interfaces管理容器网络

    我使用docker至今已有一段时间了,与绝大部分的人一样,我被docker强大的功能和易用性深深的折服.简单方便是docker的核心之一,它强大的功能被抽象成了非常简单的命令.当我在使用和学习docker的时候,我很想知道docker在后台都做了一些什么事情,特别是在网络这一块(我最感兴趣的一块) 我找到了很多关于创建和操作容器网络的文档,但是关于docker如何使网络工作的却没有那么多. Docker广泛使用linux iptables和网桥接口,这篇文章是我如何用于创建容器网络的总结,大部分

  • 详解Docker数据管理(数据卷&数据卷容器)

    生产环境中使用Docker的过程中,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作. 容器中管理数据主要有两种方式: 1.数据卷(Data Volumes):容器内数据直接映射到本地主机环境:如何在容器内创建数据卷,并且把本地的目录或文件挂载到容器内的数据卷中. 2.数据卷容器(Data Volume Containers):使用特定容器维护数据卷.如何使用数据卷容器在容器和主机.容器和容器之间共享数据,并实现数据的备份和恢复. 数据卷 数据卷是一个可

  • Docker基础学习之数据管理

    前言 docker容器中管理数据主要有两种方式,数据卷(Data Volumes)和数据卷容器(Data Volume Containers),下面我们详细介绍Docker中的数据管理,有需要的一起来学习学习吧. 数据卷 数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以提供很多有用的特性: 数据卷可以在容器之间共享和重用: 对数据卷的修改会立马有效: 对数据卷的更新,不会影响镜像: 卷会一直存在,直到没有容器使用. 数据卷的使用,类似于Linux下对目录或文件进行mount操作. 挂载本

  • Docker容器的网络管理和网络隔离的实现

    一.Docker网络的管理 1.Docker容器的方式 1)Docker访问外网 Docker容器连接到宿主机的Docker0网桥访问外网:默认自动将docker0网桥添加到docker容器中. 2)容器和容器之间通信 需要管理员创建网桥:将不同的容器连接到网桥上实现容器和容器之间相互访问. 3)外部网络访问容器 通过端口映射或者同步docker宿主机网络配置实现通信. 2.Docker容器网络通信的模式 1)bridge 默认容器访问外网通信使用:依赖docker0网桥. 2)none 需要给

  • Docker中容器数据卷(Data Volume)和数据管理详解

    卷(Volume) 众所周知卷(Volume)是容器中的一个数据挂载点,卷可以绕过联合文件系统,从而为Docker 提供持久数据,所提供的数据还可以在宿主机-容器或多个容器之间共享.通过卷,我们可以可以使修改数据直接生效,而不必重新构建镜像. 一.数据卷 数据卷是一个可以绕过联合文件系统的,专门指定的可在一或多个容器间共享目录.卷为提供为持久化或共享数据提供了一些有用的特性. 数据卷设计的初哀是提供持久化数据,而与容器的生命周期无关.因此,在删除容器时,Docker不会自动删除卷,直到没有容器再

  • 浅谈Docker基础之数据管理

    用户在使用 Docker 的过程中,往往需要能查看容器内应用产生的数据,或者需要把容器内的数据进行备份,甚至多个容器之间进行数据的共享,这必然涉及容器的数据管理操作.容器中管理数据主要有两种方式:数据卷(Data Volumes),数据卷容器(Data Volume Containers). 数据卷 数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以提供很多有用的特性: 1.数据卷可以在容器之间共享和重用. 2.对数据卷的更改会立即生效. 3.对数据卷的更新不会影响镜像. 4.数据卷会一直

  • Docker私有仓库的搭建和界面化管理详解

    一.关于Registry 官方的Docker hub是一个用于管理公共镜像的好地方,我们可以在上面找到我们想要的镜像,也可以把我们自己的镜像推送上去. 但是有时候我们的使用场景需要我们拥有一个私有的镜像仓库用于管理我们自己的镜像.这个可以通过开源软件Registry来达成目的. Registry在github上有两份代码:老代码库和新代码库.老代码是采用python编写的,存在pull和push的性能问题,出到0.9.1版本之后就标志为deprecated,不再继续开发. 从2.0版本开始就到在

  • Docker 数据管理Named volume详解

    Docker数据管理:Named volume Docker中可以使用Named volume和data container来进行数据的管理. 单一Container的使用Helloworld Step 1:创建一个Named Volume 事前确认volume的信息,没有VOLUME存在 [root@host88 volumes]# docker volume ls DRIVER VOLUME NAME [root@host88 volumes]# 确认/var/lib/docker/volu

随机推荐