如果你修改了一个容器的内容,你可以使用docker commit命令将现有的容器状态保存为一个镜像。

下面的例子展示了如何修改一个基于oraclelinux:6.6的容器使得其能够运行Apache HTTP服务器。停止容器后,mymod/httpd:v1将从中创建镜像。

要从oraclelinux:6.6容器创建Apache服务器镜像 :

  1. 在名为guest容器中 运行bash shell命令行中运行以下命令:
[root @ host~]#docker run -i -t --name guest oraclelinux:6.6 /bin/bash
[root @ guest~]#
  1. 如果您使用Web代理,请按照Oracle Linux管理员发行版7指南中的https://docs.oracle.com/cd/E52668_01/E54669/html/ol7-proxy-config.html中的说明编辑guest虚拟机上的yum配置。

  2. 安装httpd包:

[root @ guest~]# yum install httpd
  1. 如果需要,在guest 虚拟机下/var/www/html目录中放置需要显示的Web内容 。

  2. 在主机上使用docker stop命令退出guest容器:

[root @ host~]#个docker stop guest
guest
  1. 使用您停止的容器的ID 创建tag是mymod/httpd的镜像:
[root @ host~]#docker commit -m "ol6 + httpd" -a "A N Other" \
`docker ps -l -q` mymod/httpd:v1
8594abec905e6374db51bed1bfb208804cfb60d96b285efb897db581a01676e9

使用-m和-a 选项来记录镜像及其作者。该命令返回新镜像ID的完整版本号。

如果使用docker images命令,则新镜像现在将显示在列表中:

[root @ host~]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
mymod/httpd v1 8594abec905e 2 minutes ago 938.5 MB
oraclelinux 6 9ac13076d2b5 5 days ago 319.4 MB
oraclelinux 6.6 9ac13076d2b5 5 days ago 319.4 MB
oraclelinux latest 073ded22ac0f 5 days ago 265.2 MB
oraclelinux 7 073ded22ac0f 5 days ago 265.2 MB
oraclelinux 7.0 073ded22ac0f 5 days ago 265.2 MB
  1. 删除名为guest的容器。
#docker rm guest
guest

您现在可以使用新镜像创建一个用作Web服务器的容器,例如:

#docker run -d --name newguest -p 8080:80 mymod/httpd:v1 /usr/sbin/httpd -D FOREGROUND
7afbbefec5191f632e149f85ae10ed0ba88f1c545daad18cb930e575ef6a3e63

所述-d选项运行命令非交互的背景和显示完整版本的独特容器的ID。该-p 8080:80 选项用来射guestr容器的80端口到主机的8080端口上。您可以通过运行docker ps或 docker port来查看端口映射,例如:

[root @ host~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7afbbefec519 mymod/httpd:v1 ... ... 0.0.0.0:8080->80/tcp newguest
[root@host ~]# docker port newguest 80
0.0.0.0:8080

注意

docker ps命令显示容器ID的短的版本号。您可以使用 --no-trunc选项显示长的版本号。

默认IP地址值0.0.0.0表示端口映射适用于主机上的所有网络接口。您可以使用多个-p选项限制重映射适用的IP地址,例如:

# docker run -d --name newguest -p 127.0.0.1:8080:80 -p 192.168.1.2:8080:80 \
mymod/httpd:v1 /usr/sbin/httpd -D FOREGROUND

您可以通过将浏览器指向主机上的端口8080来查看guest虚拟机所服务的Web内容。如果从其他系统访问内容,则可能需要允许到主机端口的传入连接,例如:

[root @ host~]#iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 8080 -j ACCEPT
[root @ host~]#service iptables save

如果需要删除镜像,请使用docker rmi命令:

[root @ host~]# docker rmi mymod/httpd:v1
Untagged: mymod/httpd:v1
Deleted: 7afbbefec5191f632e149f85ae10ed0ba88f1c545daad18cb930e575ef6a3e63

注意

从Docker 1.8版开始,您无法删除正在运行的容器的图像。

在生产环境中,使用docker commit命令创建镜像并不能提供有关如何创建映像的方便记录,因此您可能会发现很难重新创建已丢失或损坏的映像。创建映像的首选方法是设置Dockerfile,你可以使用定义指令的方式创建镜像。请参见 第4.4节“从Dockerfile创建Docker镜像”。

【译】从现有的容器里创建新的Docker镜像的更多相关文章

  1. Windows10下的docker安装与入门 (三) 创建自己的docker镜像并且在容器中运行它

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...

  2. 基于空镜像scratch创建一个新的Docker镜像

    我们在使用Dockerfile构建docker镜像时,一种方式是使用官方预先配置好的容器镜像.优点是我们不用从头开始构建,节省了很多工作量,但付出的代价是需要下载很大的镜像包. 比如我机器上docke ...

  3. Azure ARM (13) 从现有VHD文件,创建新的ARM VM

    <Windows Azure Platform 系列文章目录> 本文参考了Git Hub的ARM Template: https://github.com/Azure/azure-quic ...

  4. 从头基于空镜像scratch创建一个新的Docker镜像

    我们在使用Dockerfile构建docker镜像时,一种方式是使用官方预先配置好的容器镜像.优点是我们不用从头开始构建,节省了很多工作量,但付出的代价是需要下载很大的镜像包. 比如我机器上docke ...

  5. 用dockerfile创建jmeter的docker镜像

    网上多是创建docker镜像是从jmeter官方下载jmeter的tgz包 今天我们用本地已经下载好的tgz包. 以下是dockerfile FROM java:8 ENV http_proxy &q ...

  6. postgresql----根据现有表创建新表

    除普通的建表语句"create table table_name(columns);"之外,还可以根据现有表快速的创建新表: 一.使用create table ... (like ...

  7. Docker部署启动错误,需要手动进入Docker的容器里,启动程序,排查错误

    #docker-compose build --no-cache //重新创建容器,不管有没有 #docker-compose up #docker-compose up -d //后台启动并运行容器 ...

  8. Docker学习笔记 - 在运行中的容器内启动新进程

    docker psdoker top dc1 # 容器情况# 在运行中的容器内启动新进程docker exec [-d] [-i] [-t] 容器名 [command] [args]docker ex ...

  9. 如何在宿主机上执行容器里的jmap,jtack,jstat 命令获取信息(原创)

    一般情况下,我们要获取docker容器里的jvm信息只能进入容器后执行jmap,jstack,jstat 命令去获取,jstack,jstat还好,但是jmap dump的文件要拿出来,得先copy ...

随机推荐

  1. linux 命令——49 at (转)

    在windows系统中,windows提供了计划任务这一功能,在控制面板 -> 性能与维护 -> 任务计划, 它的功能就是安排自动运行的任务. 通过'添加任务计划'的一步步引导,则可建立一 ...

  2. linux下安装和卸载mysql

      卸载: 1 . rpm -qa | grep -i mysql命令查看已经安装过的组件.   2. 使用yum -y remove命令卸载已经安装的MySQL组件,使用下面的命令,对于上面已经安装 ...

  3. vuejs计算属性和侦听器

    <div id='root'> 姓:<input v-model='firstName'/> 名:<input v-model='secondName'/> < ...

  4. linux 查看帐号创建时间

    查看用户的home目录的创建时间 查看日志 用stat 命令,可以看到目录的三个时间.不过这个时间只是用来参考的,确定一个范围. 查看日志是最准确的方法 /var/log/auth.log ,前提是你 ...

  5. Mybatis-延迟加载和缓存

    延迟加载 概念: 就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据.延迟加载也称懒加载. 好处:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表 ...

  6. Problem G: 角谷步数

    Problem G: 角谷步数 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 78  Solved: 28[Submit][Status][Web Bo ...

  7. 文件系统 - Linux 支持的文件系统类型

    NAME 文件系统 - Linux 支持的文件系统类型:minix, ext, ext2, xia, msdos, umsdos, vfat, proc, nfs, iso9660, hpfs, sy ...

  8. CUDA:Supercomputing for the Masses (用于大量数据的超级计算)-第一节

    原文链接 第一节 CUDA 让你可以一边使用熟悉的编程概念,一边开发可在GPU上运行的软件. Rob Farber 是西北太平洋国家实验室(Pacific Northwest National Lab ...

  9. 【转】 bind1st bind2nd的使用

    以前在使用stl的过程中发现bind1st和bind2nd这两个函数,当时不太理解什么意思,今天在网上查了一下相关资料发现竟然很简单,下面我就具体解释一下他们的用法. bind1st和bind2nd函 ...

  10. 数据库sql语句的exists和in的区别

    性能变化的关键: #1 执行的先后顺序 谁是驱动表,谁先执行查询,谁后执行查询 #2 执行过程 exists的优点是:只要存在就返回了,这样的话很有可能不需要扫描整个表.   in需要扫描完整个表,并 ...