从EC2 AMI创建一个Docker镜像/容器

32

我对docker非常陌生,正在尝试将我的AWS EC2 AMI导入到docker镜像中。该镜像是一个m2 linux镜像。

我还设置了一个私有的docker hub(artifactory),打算将镜像推送到其中,并使其可供使用。如何将AMI导入到docker镜像中而不是从基本镜像开始更新的步骤?

任何解释的指针也可以。

3个回答

32

以下是我是如何做到的。

  • 在源AMI上,在描述中找到根卷快照ID

/dev/sda1=snap-eb79b0b1:15:true:gp2

  • 使用公共Ubuntu 14.04 AMI启动实例

  • 从快照snap-eb79b0b1创建卷(在与实例相同的区域)。

  • 将卷附加到实例作为/dev/sdf

  • 将卷挂载到/mnt

mount /dev/xvdf /mnt

(或)

mount /dev/xvdf1 /mnt

  • 安装docker

https://docs.docker.com/engine/installation/ubuntulinux/

  • 从已挂载的根卷中导入docker镜像

tar -c -C /mnt/ . | docker import - appcimage-master-1454216413

  • 运行

docker run -t -i 6d6614111fcb03d5ca79541b8a23955202dfda74995d968b5ffb5d45c7e68da9 /bin/bash


1
  1. 挂载/dev/xvdf1到/mnt
  2. 使用脚本安装Docker https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/#install-using-the-convenience-script
- Neftanic
这个答案完全有效。但是,我无法从这个镜像中运行容器。你是怎么做到的? - Keith Harris
我也无法运行它,这个答案还有效吗?或者亚马逊做了一些修改? - rj487
@CodaChang 你是在使用 Amazon Linux 还是 Amazon Linux 2? - Anuj Kumar
@AnujKumar 我试图在AWS中使用RetHat7镜像。 - rj487

3

Docker可以使用docker import命令从tar文件创建镜像。根据文档

Usage: docker import URL|- [REPOSITORY[:TAG]]

Create an empty filesystem image and import the contents of the tarball 
(.tar, .tar.gz, .tgz, .bzip, .tar.xz, .txz) into it, then optionally
tag it.

因此,您应该能够从AMI镜像创建tar归档文件,然后将其提供给docker。


3
所以你应该能够从你的AMI镜像创建一个tar归档文件,然后将其提供给docker。- 我该如何做到这一点,在AWS中我没有看到将AMI转换为tar ball的选项。 - Scooby
1
你可以从特定的 AMI 启动一个实例,然后在实例内运行 tar 命令。 - larsks
1
在实例内运行 tar 是什么意思?我仍然需要向 tar 抛出某些东西。 - Scooby
3
@Scooby,我建议将您想要在Docker中使用的目标EBS卷挂载到另一个实例上作为非引导卷。然后使用类似于tar -czvf drive-image.tgz /media/my-external-drive的语法,假设您将该卷挂载在/media/my-external-drive上,并且您有足够的磁盘空间来存放压缩文件。 - Mark Stosberg

1

在创建tar文件时,cd到目录并从那里tar整个树结构。

cd /media/my-external-drive
tar -czvf /tmp/drive-image.tgz

然后创建镜像 ...

docker import /tmp/drive-image.tgz

这使得 dockerized 容器在运行时可以创建正确的路径。


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