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

这是我的问题:

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

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

有什么想法吗?

问候和感谢。

【问题讨论】:

    标签: amazon-web-services docker amazon-ecs


    【解决方案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) 最后,您无需访问服务器即可获取容器信息或部署它们。
          猜你喜欢
          • 2015-10-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-29
          • 2022-08-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多