[转]Docker 定制容器镜像的2种方法

一、需求
  由于在测试环境中使用了docker官网的centos 镜像,但是该镜像里面默认没有安装ssh服务,在做测试时又需要开启ssh。所以上网也查了查资料。下面详细的纪录下。在centos 容器内安装ssh后,转成新的镜像用于后期测试使用。
  

二、镜像定制
第一种方式(手动修改容器镜像)
1.先下载centos镜像

[root@docker ~]# docker pull centos

2.启动容器并进行配置
启动容器,

[root@docker ~]# docker run -it -d --name test-centos1 centosd72250ecaa5e3e36226a1edd749f494d9f00eddc4143c81ac3565aa4e551791a

命令注释:-it : 进行交互式操作
     -d : 等同于 -d=true,容器将会在后台运行,不然执行一次命令后,退出后,便是exit状态了。
     --name : 容器启动后的名字,默认不指定,将会随机产生一个名字。或者使用 -name="containers_name"
     centos:使用的镜像名称
进入容器,安装ssh server,以及配置开机启动

[root@docker ~]# docker exec -it test-centos1 /bin/bash
[root@d72250ecaa5e /]# ifconfigbash: ifconfig: command not found

注:命令最后参数 /bin/bash: 指进入容器时执行的命令(command)原文来自:飞走不可 _ http://www.cnblogs.com/hanyifeng/p/6116067.html
我们检查了下容器,暂时安装以下必用的软件吧 net-tools,openssh-server

[root@d72250ecaa5e /]# yum install openssh-server net-tools -y

创建ssh 所需的目录,并在根目录创建sshd 启动脚本

[root@d72250ecaa5e /]# mkdir -pv /var/run/sshdmkdir: created directory '/var/run/sshd
[root@d72250ecaa5e /]# cat /auto_sshd.sh #!/bin/bash/usr/sbin/sshd -D
[root@d72250ecaa5e /]# chmod +x /auto_sshd.sh

修改容器内root 的账户密码

[root@d72250ecaa5e /]# echo "root:iloveworld" | chpasswd

生成ssh 主机dsa 密钥(不然ssh 该容器时,会出现错误。)

[root@d72250ecaa5e /]# ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
[root@d72250ecaa5e /]# ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key

我们加一个history记录的时间功能吧,这样方便后期查看

echo 'export HISTTIMEFORMAT="%F %T whoami "' >> /etc/profile

OK,配置基本完毕咯。清理命令历史纪录,之后退出容器。现在可以生成一个新的docker 镜像了。

3.配置完成后,进行打包成新的镜像

[root@docker ~]# docker commit test-centos1 centos_sshd:7.0
sha256:6e3330b30dfff5f029f102874e54cfffffbc37dcf2a4eb7304c817148fbc944d
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE

centos_sshd 7.0 6e3330b30dff 8 seconds ago 310.1 MB
docker.io/ubuntu latest e4415b714b62 12 days ago 128.1 MB
[root@docker ~]# docker commit test-centos1 centos_sshd:7.0sha256:6e3330b30dfff5f029f102874e54cfffffbc37dcf2a4eb7304c817148fbc944d[root@docker ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEcentos_sshd 7.0 6e3330b30dff 8 seconds ago 310.1 MBdocker.io/ubuntu latest e4415b714b62 12 days ago 128.1 MB

命令注释:commit: 提交一个具有新配置的容器成为镜像,后面跟容器的name 或者容器Id ,最后是生成新镜像的名字
更新:这条命令更方便以后启动,如下:

[root@docker ~]# docker commit --change='CMD ["/auto_sshd.sh"]' -c "EXPOSE 22" test-centos1 centos_sshd:7.0sha256:7bb4efd82c4ff1f241cbc57ee45aab1b05d214b1e9fcd51196696c67d480e70b

命令注释: --change : 将后期使用此镜像运行容器时的命令参数、开放的容器端口提前设置好。
4.验证
查看镜像,并启动新的容器

[root@docker ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEcentos_sshd 7.0 7bb4efd82c4f 4 minutes ago 310.1 MBdocker.io/ubuntu latest e4415b714b62 12 days ago 128.1 MB
[root@docker ~]# docker run -d -it --name centos_7.0-1 centos_sshd:7.0ec17e553d5c4c60865afeb99df8dfd1f4e7d4ba6e1b0d5516f9127f09d1d6356
[root@docker ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESec17e553d5c4 centos_sshd:7.0 "/auto_sshd.sh" 6 seconds ago Up 5 seconds 22/tcp centos_7.0-1

进行ssh测试,先查看一下该容器的ip,之后ssh。ok

[root@docker ~]# docker exec centos_7.0-1 hostname -i172.17.0.4][root@docker ~]# ssh root@172.17.0.4The authenticity of host '172.17.0.4 (172.17.0.4)' can't be established.RSA key fingerprint is 87:88:07:12:ac:0a:90:28:10:e1:9e:eb:1f:d6:c9:9d.Are you sure you want to continue connecting (yes/no)? yesWarning: Permanently added '172.17.0.4' (RSA) to the list of known hosts.root@172.17.0.4's password: Last login: Tue Nov 29 16:00:49 2016 from gateway
[root@ec17e553d5c4 ~]# w 16:34:17 up 63 days, 7:49, 1 user, load average: 0.00, 0.02, 0.05USER TTY FROM LOGIN@ IDLE JCPU PCPU WHATroot pts/0 gateway 16:34 1.00s 0.00s 0.00s w
[root@ec17e553d5c4 ~]# ping gatewayPING gateway (172.17.0.1) 56(84) bytes of data.64 bytes from gateway (172.17.0.1): icmp_seq=1 ttl=64 time=0.048 ms

第二种方式(推荐:利用Dockerfile文件)
我的认为它就像ansible的playbook一样。Dockerfile包含创建镜像所需要的全部指令。基于在Dockerfile中的指令,我们可以使用Docker build
命令来创建镜像。通过减少镜像和容器的创建过程来简化部署。
1.创建Dockerfile文件
新建一个目录,在里面新建一个dockerfile文件(新建一个的目录,主要是为了和以防和其它dockerfile混乱 )

[root@docker ~]# mkdir centos7-dockerfile
[root@docker centos7-dockerfile]# cat Dockerfile # The dockerfile has Change add sshd services on Centos7.0#centos7:latest imageFROM centos:latestMAINTAINER Yifeng,http://www.cnblogs.com/hanyifeng#Install sshd net-toolsRUN yum install openssh-server net-tools -yRUN mkdir /var/run/sshd#Set password for rootRUN echo 'root:iloveworld' | chpasswdRUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config#Set history recordENV HISTTIMEFORMAT "%F %T "#Fix sshd service:Read from socket failed: Connection reset by peer?RUN ssh-keygen -A#Change timezone CSTRUN \cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime#Open 22 portEXPOSE 22#Auto running sshd serviceCMD ["/usr/sbin/sshd","-D"]

上述文件内容就是一个dockerfile 常见的命令组合。开头带#号的为注释
原文来自:飞走不可 _ http://www.cnblogs.com/hanyifeng/p/6116067.html
文件解释:
     FROM: 必不可少的命令,从某个镜像作为基。如 FROM <image_name> ,或者 FROM <image_name>:<tag>. 如果不加tag,默认为latest。先从本地镜像仓库去搜索基镜像,如过本地没有,在去网上docker registry去寻找。
     MAINTAINER:标明该Dockerfile作者及联系方式,可忽略不写
     RUN:建立新的镜像时,可以执行在系统里的命令,如安装特定的软件以及设置环境变量。
     ENV:设置系统环境变量(注意:写在/etc/profile里的命令在dockerfile这里会不生效,所以为改成ENV的方式)
     EXPOSE:开放容器内的端口,但不和宿主机进行映射。方便在宿主机上进行开发测试。(如需映射到宿主机端口,可在运行容器时使用 -p host_port:container_port)
     CMD:设置执行的命令,经常用于容器启动时指定的某个操作。如执行自定义脚本服务,或者是执行系统命令。CMD 只能存在一条,如在Dockerfile中有多条CMD的话,只有最后一条CMD生效!
2.执行build 创建镜像
使用docker build命令来创建镜像

[root@docker centos7-dockerfile]# docker build -t centos_sshd_1 .

-t 选项来docker build新的镜像以便于标记构建的镜像,. 表示当前目录,也可以指定dockerfile 文件所在目录。
下面缩略的内容是构建镜像时的输出,可以看下。

3.查看镜像列表,并创建容器

[root@docker centos7-dockerfile]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEcentos_sshd_1 latest d4620c9949b8 4 minutes ago 308.4 MBcentos_sshd 7.0 7bb4efd82c4f 2 days ago 310.1 MB

我们刚刚新建的容器已经存在了,现在用它来创建容器

[root@docker centos7-dockerfile]# docker run -d -it --name centos-two centos_sshd_17ae51091c138d249b5e97f6957073e748db278c0f1cf856e968ca78a4aec1a5b

查看容器

[root@docker centos7-dockerfile]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES7ae51091c138 centos_sshd_1 "/usr/sbin/sshd -D" 16 seconds ago Up 15 seconds 22/tcp centos-two

可以看到容器的command 就是我们之前定义启动ssh 服务的,并且开放了22端口。
现在我们在宿主机上查看下该容器的ip,然后用ssh 链接进去。

[root@docker ~]# docker exec centos-two hostname -I172.17.0.7[root@docker ~]# ssh root@172.17.0.7The authenticity of host '172.17.0.7 (172.17.0.7)' can't be established.ECDSA key fingerprint is 7a:38:69:d7:5e:f4:db:e8:3c:ea:92:a4:1a:a1:7b:9a.Are you sure you want to continue connecting (yes/no)? yesWarning: Permanently added '172.17.0.7' (ECDSA) to the list of known hosts.root@172.17.0.7's password: [root@7ae51091c138 ~]# w 11:19:34 up 65 days, 18:34, 1 user, load average: 0.01, 0.04, 0.05USER TTY FROM LOGIN@ IDLE JCPU PCPU WHATroot pts/0 gateway 11:19 6.00s 0.00s 0.00s w

OK。上述就是定义镜像的两种方式,如果还有其它更为方便的还望不吝赐教哈。
新手在路上...

注:该文属于飞走不可原创,如有转载,请务必在文首注明出处。飞走不可 _ http://www.cnblogs.com/hanyifeng/p/6116067.html

参考链接:
http://serverfault.com/questions/583355/ssh-issues-read-from-socket-failed-connection-reset-by-peer
http://blog.octo.com/en/openshift-3-private-paas-with-docker/
https://docs.docker.com/engine/examples/running_ssh_service/
https://docs.docker.com/engine/tutorials/dockerimages/

每个人都应是守望者,守望我们的心智,我们的理想,以防它在生活中不知不觉地坠落、被操控和被自己遗忘。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容

  • Docker — 云时代的程序分发方式 要说最近一年云计算业界有什么大事件?Google Compute Engi...
    ahohoho阅读 15,514评论 15 147
  • 转载自 http://blog.opskumu.com/docker.html 一、Docker 简介 Docke...
    极客圈阅读 10,477评论 0 120
  • 一、Docker 简介 Docker 两个主要部件:Docker: 开源的容器虚拟化平台Docker Hub: 用...
    R_X阅读 4,382评论 0 27
  • 最近研究了几天docker的快速部署,感觉很有新意,非常轻量级和方便,打算在公司推广一下,解放运维,省得每次部署一...
    Helen_Cat阅读 1,312评论 0 4
  • 天已经灰白,似乎是要下雨的样子。 从商店出来,赫得已然没有了精神,提着一堆方便面,和一张没钱的信用卡。像他这样的月...
    点壹阅读 371评论 0 0