如何使用cloud-init安装Docker?

23

我想在Openstack中创建实例,在SSH到它们之前就已经安装好了Docker。因此,我对Cloud-init技术产生了兴趣,因为它允许我们在虚拟机的第一次启动时安装软件包。现在我正在尝试在实例的启动过程中安装Docker,以下是我传递给用户数据的代码:

#cloud-config

packages:
   - docker.io

这显然不起作用,那么我该如何让它起作用呢?


2
你在使用哪个操作系统来运行OpenStack实例? - Everett Toews
6个回答

35

如果您想在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应该改变其仓库签名密钥,您可以确信更改是合法的,然后使用类似以下命令获取新指纹:

$ 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]

2
很棒的答案,确认这个可行,| gpg 是一个非常方便的时间节省工具。 - G_G
我尝试在Debian上做这件事,但它总是失败,不知道为什么(我用Debian代替了Ubuntu),而且当源失败时,没有用户被创建,因此我无法登录并检查是什么原因导致了它 :( - Peter
1
看起来在尝试添加apt源时,gpg未安装,导致出现以下错误:错误原因:[Errno 2]没有这样的文件或目录:b'gpg' - Peter
对于Debian用户的注意事项:只需在URL中将ubuntu替换为debian,并使用8D81803C0EBFCD88作为keyid。 - David Dahan

19

注意:您不应该使用Docker Convenience脚本(get.docker.com),因为它在生产环境中会发出警告

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

以下是三种使用cloud-init在Ubuntu上安装Docker的方法,适用于所有不使用Docker Convenience脚本的环境。

通过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]

使用默认包进行简化安装:(Gist 参考)

#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]

10

有一个可以 #include 的 Docker 脚本非常方便。 不要使用 #cloud-config,使用:

#include https://get.docker.com

3
请查看“生命之路”在此问题上的回答! https://dev59.com/OmAf5IYBdhLWcg3wqEHp#62540068 - Florian Falk

4

Ricardo的解决方案很棒,如果你只需要将docker添加到已部署的实例中,那么他的解决方案就足够了。但是,在某些情况下,你仍然需要一个#cloud-config(用于自定义其他内容,例如预安装的软件包),这里是一种受他答案启发的简单解决方案,只需添加此命令:

#cloud-config
# ... more config here

runcmd:
  - curl -fsSL https://get.docker.com -o get-docker.sh; sh get-docker.sh

2
还不如更好地使用 curl -fsSL https://get.docker.com | sh 呢? - Phil Frost

1

Debian默认不包含gpg,所以你需要执行以下操作:

#cloud-config

write_files:
  - path: /usr/share/keyrings/docker.asc
    owner: root:root
    permissions: '0644'
    content: |
      -----BEGIN PGP PUBLIC KEY BLOCK-----
      paste content of https://download.docker.com/linux/debian/gpg (do not remove the blank line it fails if you do)
      -----END PGP PUBLIC KEY BLOCK-----

apt:
  sources:
    docker.list:
      source: deb [arch=amd64 signed-by=/usr/share/keyrings/docker.asc] https://download.docker.com/linux/debian $RELEASE stable

packages:
  - docker-ce
  - docker-ce-cli
  - containerd.io
  - docker-compose-plugin

来源:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=970796


0
简单的代码
#cloud-config


groups:
  - docker

system_info:
  default_user:
    groups: [docker]

packages:
    - docker.io

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接