15

我想在 Openstack 中创建实例,这些实例在 ssh 到它们之前已经安装了 Docker。所以很自然地我对 Cloud-init 技术产生了兴趣,因为它允许我们在首次启动时在虚拟机上安装包。所以现在我试图在启动时在我的实例上安装 Docker,这是我传递给用户数据的代码;

#cloud-config

packages:
   - docker.io

这显然不起作用,那么我怎样才能使它起作用?

4

5 回答 5

23

如果您想在 Ubuntu 实例上从 Docker 存储库安装,并且您并不特别喜欢下载和执行任意 shell 脚本的想法,那么您只需要以下内容:

#cloud-config

apt:
  sources:
    docker.list:
      source: deb [arch=amd64] https://download.docker.com/linux/ubuntu $RELEASE stable
      keyid: 9DC858229FC7DD38854AE2D88D81803C0EBFCD88

packages:
  - docker-ce
  - docker-ce-cli

cloud-init 已经知道如何获取 GPG 密钥、如何添加 APT 源(即使是 HTTPS)、如何在安装软件包之前更新 APT,以及如何执行您在各种 shell 脚本中找到的所有其他内容这样做的繁重方法。

如果 Docker 应该更改他们的 repo 签名密钥,您可以让自己确信更改是合法的,然后通过以下方式获取新指纹:

$ curl -sL https://download.docker.com/linux/ubuntu/gpg | gpg
gpg: keybox '/home/ubuntu/.gnupg/pubring.kbx' created
gpg: WARNING: no command supplied.  Trying to guess what you mean ...
pub   rsa4096 2017-02-22 [SCEA]
      9DC858229FC7DD38854AE2D88D81803C0EBFCD88
uid           Docker Release (CE deb) <docker@docker.com>
sub   rsa4096 2017-02-22 [S]
于 2020-07-02T23:31:47.330 回答
12

注意:您不应该使用 Docker 便利脚本 ( get.docker.com),它带有生产环境的警告:

不建议在生产环境中使用这些脚本

对于不使用 Docker Convenience 脚本的所有环境,这里有三种使用 cloud-init 在 Ubuntu 上安装 Docker 的方法。

通过 apt-source 安装(推荐方法):

#cloud-config

apt:
  sources:
    docker.list:
      source: deb [arch=amd64] https://download.docker.com/linux/ubuntu $RELEASE stable
      keyid: 9DC858229FC7DD38854AE2D88D81803C0EBFCD88

packages:
  - apt-transport-https
  - ca-certificates
  - curl
  - gnupg-agent
  - software-properties-common
  - docker-ce
  - docker-ce-cli
  - containerd.io

# Enable ipv4 forwarding, required on CIS hardened machines
write_files:
  - path: /etc/sysctl.d/enabled_ipv4_forwarding.conf
    content: |
      net.ipv4.conf.all.forwarding=1

# create the docker group
groups:
  - docker

# Add default auto created user to docker group
system_info:
  default_user:
    groups: [docker]

通过 cURL 完全安装:(要点参考

#cloud-config

packages:
  - apt-transport-https
  - ca-certificates
  - curl
  - gnupg-agent
  - software-properties-common

# Enable ipv4 forwarding, required on CIS hardened machines
write_files:
  - path: /etc/sysctl.d/enabled_ipv4_forwarding.conf
    content: |
      net.ipv4.conf.all.forwarding=1


# create the docker group
groups:
  - docker

# Install Docker, for production, consider pinning to stable versions
runcmd:
  - curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
  - add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  - apt-get update -y
  - apt-get install -y docker-ce docker-ce-cli containerd.io
  - systemctl start docker
  - systemctl enable docker

# Add default auto created user to docker group
system_info:
  default_user:
    groups: [docker]

使用默认包简化安装:(要点参考

#cloud-config

packages:
  - docker.io

# create the docker group
groups:
  - docker

# Add default auto created user to docker group
system_info:
  default_user:
    groups: [docker]
于 2020-06-23T17:02:47.660 回答
9

有一个 docker 脚本可以是#include'd,这对 docker 来说非常方便。而不是#cloud-config,使用

#include https://get.docker.com
于 2014-10-30T20:40:24.423 回答
4

如果您只需要将 docker 添加到已部署的实例中,Ricardo 的解决方案就很棒。但是,如果您仍然需要一个#cloud-config(自定义其他东西,例如预安装的软件包),这里有一个受他的回答启发的简单解决方案,只需添加以下命令:

#cloud-config
# ... more config here

runcmd:
  - curl -fsSL https://get.docker.com -o get-docker.sh; sh get-docker.sh
于 2019-04-11T11:37:50.660 回答
0

简单的代码

#cloud-config


groups:
  - docker

system_info:
  default_user:
    groups: [docker]

packages:
    - docker.io
于 2021-09-06T20:33:28.497 回答