我想在Openstack中创建实例,在SSH到它们之前就已经安装好了Docker。因此,我对Cloud-init技术产生了兴趣,因为它允许我们在虚拟机的第一次启动时安装软件包。现在我正在尝试在实例的启动过程中安装Docker,以下是我传递给用户数据的代码:
#cloud-config
packages:
- docker.io
这显然不起作用,那么我该如何让它起作用呢?
我想在Openstack中创建实例,在SSH到它们之前就已经安装好了Docker。因此,我对Cloud-init技术产生了兴趣,因为它允许我们在虚拟机的第一次启动时安装软件包。现在我正在尝试在实例的启动过程中安装Docker,以下是我传递给用户数据的代码:
#cloud-config
packages:
- docker.io
这显然不起作用,那么我该如何让它起作用呢?
如果您想在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]
| gpg
是一个非常方便的时间节省工具。 - G_G错误原因:[Errno 2]没有这样的文件或目录:b'gpg'
。 - Peterubuntu
替换为debian
,并使用8D81803C0EBFCD88
作为keyid。 - David Dahan注意:您不应该使用Docker Convenience脚本(get.docker.com
),因为它在生产环境中会发出警告:
不建议在生产环境中使用这些脚本。
以下是三种使用cloud-init在Ubuntu上安装Docker的方法,适用于所有不使用Docker Convenience脚本的环境。
#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]
#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]
有一个可以 #include 的 Docker 脚本非常方便。 不要使用 #cloud-config,使用:
#include https://get.docker.com
Ricardo的解决方案很棒,如果你只需要将docker添加到已部署的实例中,那么他的解决方案就足够了。但是,在某些情况下,你仍然需要一个#cloud-config
(用于自定义其他内容,例如预安装的软件包),这里是一种受他答案启发的简单解决方案,只需添加此命令:
#cloud-config
# ... more config here
runcmd:
- curl -fsSL https://get.docker.com -o get-docker.sh; sh get-docker.sh
curl -fsSL https://get.docker.com | sh
呢? - Phil FrostDebian默认不包含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
#cloud-config
groups:
- docker
system_info:
default_user:
groups: [docker]
packages:
- docker.io