这两个Docker编写命令有何区别

c86crjj0  于 2023-02-03  发布在  Docker
关注(0)|答案(2)|浏览(117)

我一直在尝试使用Docker Composer文件设置Vault。我有三个要求,
1.确保创建的密码和其他配置在容器重新启动后保持不变
1.应该能够访问Vault的Web用户界面
1.使用生产模式启动Vault
我尝试了这两个配置部分。

vault-server:
    image: vault:latest
    ports:
       - "8204:8200"
    environment:
       VAULT_ADDR: "http://0.0.0.0:8204"
       VAULT_DEV_ROOT_TOKEN_ID: "vault-plaintext-root-token"
    cap_add:
       - IPC_LOCK
    volumes:
       - ./vault/logs:/vault/logs
       - ./vault/file:/vault/file:rw
  vault_dev:
    hostname: vault
    container_name: vault
    image: vault:latest
    environment:
       VAULT_ADDR: "http://0.0.0.0:8205"
       VAULT_DEV_ROOT_TOKEN_ID: "vault-plaintext-root-token"
       VAULT_DEV_LISTEN_ADDRESS: "0.0.0.0:8205"
    ports:
       - "8205:8200"
    volumes:
       - ./vault/files:/vault/file:rw
    cap_add:
       - IPC_LOCK
    entrypoint: vault server -dev

我的问题是;

  • 通过Vault服务器配置,我可以使用URL http://localhost:8204/ui/访问Vault UI,但重新启动后不会保留创建的密码
  • 使用vault_dev配置(我认为删除-dev命令后,该配置将帮助我在生产模式下启动Vault)时,我无法访问url为http://localhost:8205/ui/的Vault UI

我真的不明白这两个配置段之间的区别是什么,以及如何实现步骤1和3。对于持久化,因为它说我们需要添加一个卷,我尝试挂载文件路径,但当容器重新启动时,内容仍然消失。在一些文档中,它说,在开发模式下,你不能使它持久化,必须在生产模式下运行。但我,无法确定如何修改vault-server配置集以使其在生产模式下运行。
感谢,如果有人可以帮助,因为我已经经历了几个链接在过去几天和种迷失的时刻。

am46iovg

am46iovg1#

我认为导致您出现问题的原因是VAULT_DEV_LISTEN_ADDRESS: "0.0.0.0:8205"
这会导致Vault侦听端口8205而不是默认的8200。因此,执行此操作时,需要Map端口8205而不是8200。如下所示

ports:
   - "8205:8205"

但是当你在一个容器中运行的时候,几乎没有任何理由改变容器中的端口号,因为通常只有一个进程在运行,所以它不会与任何东西发生冲突,所以我只让它监听默认的8200,并将它Map到主机上的8205。
我看了VAULT_ADDR的文档,我认为您也应该删除它,除非您有多个Vault节点,并且在它们前面有一个负载平衡器。
所以你最终会得到

vault_dev:
  hostname: vault
    container_name: vault
    image: vault:latest
    environment:
      VAULT_DEV_ROOT_TOKEN_ID: "vault-plaintext-root-token"
    ports:
      - "8205:8200"
    volumes:
      - ./vault/files:/vault/file:rw
    cap_add:
      - IPC_LOCK
    entrypoint: vault server -dev

则应可在http://localhost:8205/ui上访问Vault。

olhwl3o2

olhwl3o22#

如果您查看Docker Hub page for the vault image文档:
运行不带参数的Vault容器将为您提供development mode的Vault服务器。
/vault/file [用于]在使用file数据存储插件时写入持久存储数据。默认情况下,此处不写入任何内容(dev服务器使用内存中的数据存储);启动容器之前,必须在Vault的配置中启用file数据存储后端。
(在评论中描述这种行为的H/T @ ChrisBecker;它也在well-commented Dockerfile中。)
在该页面的后面是一个名为“在服务器模式下运行Vault以进行开发”的部分。这里的关键点是,您需要显式地提供一个command: vault server,以使其不会在开发模式下启动。
@HansKilian的answer on port setup在这里也很重要,结合这个答案的简化和需要显式运行vault server而不需要-dev,你应该得到如下的结果:

version: '3.8'  # most recent stable Compose file format
services:
  vault:
    image: vault:1.12.2
    environment:
      VAULT_LOCAL_CONFIG: >-
        {
          "storage": {
            "file": {"path": "/vault/file"}
          },
          "listener": [{
            "tcp": {
              "address": "0.0.0.0:8200",
              "tls_disable": true
             }
          }],
          "default_lease_ttl": "168h",
          "max_lease_ttl": "720h",
          "ui": true
        }
    ports:
       - "8204:8200"
    cap_add:
       - IPC_LOCK
    volumes:
       - vault_file:/vault/file:rw
volumes:
  vault_file:

JSON块是从文档中复制的,文档还说明了
不建议在生产环境中禁用TLS并使用file存储后端。
底层Vault存储无法从主机进行有效访问(如果没有其他内容,它是加密的),我选择将其存储在命名的Docker卷中。
由于它不是在开发模式下运行,您需要完成初始化Vault的步骤,这将为您提供一组关键凭据,然后您需要创建用户身份并将凭据添加到Vault。听起来您并不希望在这里进行全自动安装,因此请注意,有些手动步骤涉及一些“不,真的不要丢失这些密钥”输出。

相关问题