如何从亚马逊上正在运行的容器创建新的 docker 镜像?

Posted

技术标签:

【中文标题】如何从亚马逊上正在运行的容器创建新的 docker 镜像?【英文标题】:How to create a new docker image from a running container on Amazon? 【发布时间】:2017-10-17 02:16:00 【问题描述】:

这是我的问题:

我有一个任务在 Amazon ECS 上运行 Docker 映像,但我想从正在运行的容器实例创建一个新的 Docker 映像。

我在 Amazon ECS 上看到了实例的 ID;我已经制作了一个 AMI,但我想制作一个可以从 Amazon 拉取的新 docker 镜像。

有什么想法吗?

问候和感谢。

【问题讨论】:

【参考方案1】:

要从容器创建图像,请执行以下命令:

docker commit container_id imagename

【讨论】:

【参考方案2】:

您可以运行docker commit (docs) 将容器保存到镜像中,然后将该带有新标签的镜像推送到注册表。

【讨论】:

【参考方案3】:

这可以通过使用“docker commit”轻松完成。

假设您需要一个基于 nginx 的最新版本的图像,并安装了 php、build-essential 和 nano。我将引导您完成提取镜像、运行容器、访问容器、添加软件以及将更改提交到新镜像的过程,然后可以轻松地将其用作开发容器的基础。

拉取镜像并运行容器:

sudo docker pull nginx
sudo docker run  -it --name nginx-template-base -p 8080:80 nginx

修改容器:

apt-get install nano
​apt-get install php5

提交更改:

sudo docker commit CONTAINER_ID nginx-template

新创建的模板已准备就绪,您可以使用以下命令运行:

sudo docker run -it --name nginx-dev -p 8080:80 nginx-template

【讨论】:

【参考方案4】:

除了@Ben Whaley 提供的答案,我个人建议你使用 Docker API。要使用 Docker API,你需要配置 docker daemon 端口,过程是在这里解释 configuring docker daemon port

让我们使用基本 Ubuntu 映像运行容器并在容器内创建一个文件夹

#docker run -it ubuntu:14.04 /bin/bash
root@58246867493d:/# 
root@58246867493d:/# cd /root
root@58246867493d:~# ls
root@58246867493d:~# mkdir TEST_DIR
root@58246867493d:~# exit

退出容器的状态:

# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                        PORTS               NAMES
58246867493d        ubuntu:14.04        "/bin/bash"         2 minutes ago       Exited (127) 57 seconds ago                       hungry_turing

作为提交容器的输入的 JSON 文件:

#cat container_create.json 

  "AttachStdin": true,
  "AttachStdout": true,
  "AttachStderr": true,
  "ExposedPorts": 
    "property1": ,
    "property2": 
  ,
  "Tty": true,
  "OpenStdin": true,
  "StdinOnce": true,
  "Cmd": null,
  "Image": "ubuntu:14.04",
  "Volumes": 
    "additionalProperties": 
  ,
  "Labels": 
    "property1": "string",
    "property2": "string"
  

提交容器的 API

# curl -X POST http://127.0.0.1:6000/commit?container=58246867493d\&repo=ubuntu\&tag=15.0 -d @container_create.json --header "Content-Type: application/json" | jq .
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   593  100    81  100   512    175   1106 --:--:-- --:--:-- --:--:--  1108

  "Id": "sha256:acac1f3733b2240b01e335642d2867585e5933b18de2264315f9b07814de113a"

生成的 Id 是通过提交容器构建的新 Image Id。

获取 docker 图片

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
**ubuntu              15.0                acac1f3733b2        10 seconds ago      188MB**
ubuntu              14.04               132b7427a3b4        10 hours ago        188MB

运行新构建的 Image 以查看在前一个容器中提交的更改。

# docker run -it ubuntu:15.0 /bin/bash
root@3a48af5eaec9:/# cd /root/
root@3a48af5eaec9:~# ls
TEST_DIR
root@3a48af5eaec9:~# exit

要从 Docker 文件构建映像,how to build an image using docker API

如需更多关于 docker API 的信息,请参考here.

【讨论】:

您能否解释一下通过 Docker API 创建映像相对于命令行(假设您可以访问命令行)提供哪些优势? 我觉得有几个优点 1) 当您的容器部署在多台服务器上时,使用 API 获取所需信息(容器统计信息、资源使用情况和进程运行)将很容易 2) 自动化和管理 docker如果不使用容器编排器,则可以在多个服务器上进行部署。 3) 最后,您无需访问服务器即可获取容器信息或部署它们。

以上是关于如何从亚马逊上正在运行的容器创建新的 docker 镜像?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Ubuntu上创建及管理LXC容器

Docker 学习总结(70)—— 从正在运行的 Docker 容器创建镜像

Docker 学习总结(70)—— 从正在运行的 Docker 容器创建镜像

amazon elastic beanstalk eb local run 在我的机器上出现问题

如何从 docker 容器运行 webpack 构建?

将 docker 镜像推送到亚马逊 ecs 存储库