一、需求
由于在测试环境中使用了docker官网的centos 镜像,但是该镜像里面默认没有安装ssh服务,在做测试时又需要开启ssh。所以上网也查了查资料。下面详细的纪录下。在centos 容器内安装ssh后,转成新的镜像用于后期测试使用。
二、镜像定制
第一种方式(手动修改容器镜像)
1.先下载centos镜像
1
|
[root@docker ~] # docker pull centos
|
2.启动容器并进行配置
启动容器,
1
2
|
[root@docker ~] # docker run -it -d --name test-centos1 centos
d72250ecaa5e3e36226a1edd749f494d9f00eddc4143c81ac3565aa4e551791a
|
命令注释:-it : 进行交互式操作
-d : 等同于 -d=true,容器将会在后台运行,不然执行一次命令后,退出后,便是exit状态了。
--name : 容器启动后的名字,默认不指定,将会随机产生一个名字。或者使用 -name="containers_name"
centos:使用的镜像名称
进入容器,安装ssh server,以及配置开机启动
1
2
3
|
[root@docker ~] # docker exec -it test-centos1 /bin/bash
[root@d72250ecaa5e /] # ifconfig
bash : ifconfig : command not found
|
注:命令最后参数 /bin/bash: 指进入容器时执行的命令(command)
我们检查了下容器,暂时安装以下必用的软件吧 net-tools,openssh-server
1
|
[root@d72250ecaa5e /] # yum install openssh-server net-tools -y
|
创建ssh 所需的目录,并在根目录创建sshd 启动脚本
1
2
3
4
5
6
7
|
[root@d72250ecaa5e /] # mkdir -pv /var/run/sshd
mkdir : 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 的账户密码
1
|
[root@d72250ecaa5e /] # echo "root:iloveworld" | chpasswd
|
生成ssh 主机dsa 密钥(不然ssh 该容器时,会出现错误。)
1
2
|
[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记录的时间功能吧,这样方便后期查看
1
|
echo 'export histtimeformat="%f %t `whoami` "' >> /etc/profile
|
ok,配置基本完毕咯。清理命令历史纪录,之后退出容器。现在可以生成一个新的docker 镜像了。
3.配置完成后,进行打包成新的镜像
1
2
3
4
5
6
7
|
[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
|
命令注释:commit: 提交一个具有新配置的容器成为镜像,后面跟容器的name 或者容器id ,最后是生成新镜像的名字
更新:这条命令更方便以后启动,如下:
1
2
|
[root@docker ~] # docker commit --change='cmd ["/auto_sshd.sh"]' -c "expose 22" test-centos1 centos_sshd:7.0
sha256:7bb4efd82c4ff1f241cbc57ee45aab1b05d214b1e9fcd51196696c67d480e70b
|
命令注释: --change : 将后期使用此镜像运行容器时的命令参数、开放的容器端口提前设置好。
4.验证
查看镜像,并启动新的容器
1
2
3
4
5
6
7
8
9
10
|
[root@docker ~] # docker images
repository tag image id created size
centos_sshd 7.0 7bb4efd82c4f 4 minutes ago 310.1 mb
docker.io /ubuntu latest e4415b714b62 12 days ago 128.1 mb
[root@docker ~] # docker run -d -it --name centos_7.0-1 centos_sshd:7.0
ec17e553d5c4c60865afeb99df8dfd1f4e7d4ba6e1b0d5516f9127f09d1d6356
[root@docker ~] # docker ps -a
container id image command created status ports names
ec17e553d5c4 centos_sshd:7.0 "/auto_sshd.sh" 6 seconds ago up 5 seconds 22 /tcp centos_7.0-1
|
进行ssh测试,先查看一下该容器的ip,之后ssh。ok
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
[root@docker ~] # docker exec centos_7.0-1 hostname -i
172.17.0.4
[root@docker ~] # ssh root@172.17.0.4
the 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 )? yes
warning: 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.05
user tty from login@ idle jcpu pcpu what
root pts /0 gateway 16:34 1.00s 0.00s 0.00s w
[root@ec17e553d5c4 ~] # ping gateway
ping 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混乱 )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
[root@docker ~] # mkdir centos7-dockerfile
[root@docker centos7-dockerfile] # cat dockerfile
# the dockerfile has change add sshd services on centos7.0
#centos7:latest image
from centos:latest
maintainer yifeng,http: //www .cnblogs.com /hanyifeng
#install sshd net-tools
run yum install openssh-server net-tools -y
run mkdir /var/run/sshd
#set password for root
run echo 'root:iloveworld' | chpasswd
run sed -i 's/permitrootlogin prohibit-password/permitrootlogin yes/' /etc/ssh/sshd_config
#set history record
env histtimeformat "%f %t "
#fix sshd service:read from socket failed: connection reset by peer?
run ssh -keygen -a
#change timezone cst
run \ cp /usr/share/zoneinfo/asia/shanghai /etc/localtime
#open 22 port
expose 22
#auto running sshd service
cmd [ "/usr/sbin/sshd" , "-d" ]
|
上述文件内容就是一个dockerfile 常见的命令组合。开头带#号的为注释
文件解释:
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命令来创建镜像
1
|
[root@docker centos7-dockerfile] # docker build -t centos_sshd_1 .
|
-t 选项来docker build新的镜像以便于标记构建的镜像,. 表示当前目录,也可以指定dockerfile 文件所在目录。
下面缩略的内容是构建镜像时的输出,可以看下。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
[root@docker centos7-dockerfile] # docker build -t centos_sshd_1 .
sending build context to docker daemon 4.096 kb
step 1 : from centos:latest
---> 0584b3d2cf6d
step 2 : maintainer yifeng,http: //www .cnblogs.com /hanyifeng
---> running in da643b55dc77
---> 1087074d44e4
removing intermediate container da643b55dc77
step 3 : run yum install openssh-server net-tools -y
---> running in 5626d8f0f892
loaded plugins: fastestmirror, ovl
determining fastest mirrors
* base: mirrors.btte.net
* extras: mirrors.tuna.tsinghua.edu.cn
* updates: mirrors.btte.net
resolving dependencies
--> running transaction check
---> package net-tools.x86_64 0:2.0-0.17.20131004git.el7 will be installed
---> package openssh-server.x86_64 0:6.6.1p1-25.el7_2 will be installed
--> processing dependency: openssh = 6.6.1p1-25.el7_2 for package: openssh-server-6.6.1p1-25.el7_2.x86_64
--> processing dependency: fipscheck-lib(x86-64) >= 1.3.0 for package: openssh-server-6.6.1p1-25.el7_2.x86_64
--> processing dependency: libwrap.so.0()(64bit) for package: openssh-server-6.6.1p1-25.el7_2.x86_64
--> processing dependency: libfipscheck.so.1()(64bit) for package: openssh-server-6.6.1p1-25.el7_2.x86_64
--> running transaction check
---> package fipscheck-lib.x86_64 0:1.4.1-5.el7 will be installed
--> processing dependency: /usr/bin/fipscheck for package: fipscheck-lib-1.4.1-5.el7.x86_64
---> package openssh.x86_64 0:6.6.1p1-25.el7_2 will be installed
---> package tcp_wrappers-libs.x86_64 0:7.6-77.el7 will be installed
--> running transaction check
---> package fipscheck.x86_64 0:1.4.1-5.el7 will be installed
--> finished dependency resolution
dependencies resolved
================================================================================
package arch version repository size
================================================================================
installing:
net-tools x86_64 2.0-0.17.20131004git.el7 base 304 k
openssh-server x86_64 6.6.1p1-25.el7_2 updates 436 k
installing for dependencies:
fipscheck x86_64 1.4.1-5.el7 base 21 k
fipscheck-lib x86_64 1.4.1-5.el7 base 11 k
openssh x86_64 6.6.1p1-25.el7_2 updates 435 k
tcp_wrappers-libs x86_64 7.6-77.el7 base 66 k
transaction summary
================================================================================
install 2 packages (+4 dependent packages)
total download size: 1.2 m
installed size: 3.4 m
downloading packages:
public key for fipscheck-lib-1.4.1-5.el7.x86_64.rpm is not installed
warning: /var/cache/yum/x86_64/7/base/packages/fipscheck-lib-1 .4.1-5.el7.x86_64.rpm: header v3 rsa /sha256 signature, key id f4a80eb5: nokey
public key for openssh-6.6.1p1-25.el7_2.x86_64.rpm is not installed
--------------------------------------------------------------------------------
total 593 kb /s | 1.2 mb 00:02
retrieving key from file : ///etc/pki/rpm-gpg/rpm-gpg-key-centos-7
importing gpg key 0xf4a80eb5:
userid : "centos-7 key (centos 7 official signing key) <security@centos.org>"
fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5
package : centos-release-7-2.1511.el7.centos.2.10.x86_64 (@centos)
from : /etc/pki/rpm-gpg/rpm-gpg-key-centos-7
running transaction check
running transaction test
transaction test succeeded
running transaction
installing : fipscheck-1.4.1-5.el7.x86_64 1 /6
installing : fipscheck-lib-1.4.1-5.el7.x86_64 2 /6
installing : openssh-6.6.1p1-25.el7_2.x86_64 3 /6
installing : tcp_wrappers-libs-7.6-77.el7.x86_64 4 /6
installing : openssh-server-6.6.1p1-25.el7_2.x86_64 5 /6
installing : net-tools-2.0-0.17.20131004git.el7.x86_64 6 /6
verifying : openssh-6.6.1p1-25.el7_2.x86_64 1 /6
verifying : openssh-server-6.6.1p1-25.el7_2.x86_64 2 /6
verifying : net-tools-2.0-0.17.20131004git.el7.x86_64 3 /6
verifying : tcp_wrappers-libs-7.6-77.el7.x86_64 4 /6
verifying : fipscheck-lib-1.4.1-5.el7.x86_64 5 /6
verifying : fipscheck-1.4.1-5.el7.x86_64 6 /6
installed:
net-tools.x86_64 0:2.0-0.17.20131004git.el7
openssh-server.x86_64 0:6.6.1p1-25.el7_2
dependency installed:
fipscheck.x86_64 0:1.4.1-5.el7 fipscheck-lib.x86_64 0:1.4.1-5.el7
openssh.x86_64 0:6.6.1p1-25.el7_2 tcp_wrappers-libs.x86_64 0:7.6-77.el7
complete!
---> 7b249ed8cb54
removing intermediate container 5626d8f0f892
step 4 : run mkdir /var/run/sshd
---> running in fc94a139d438
---> ea2826eccc91
removing intermediate container fc94a139d438
step 5 : run echo 'root:iloveworld' | chpasswd
---> running in ba53283081a7
---> 7ce1ddb5d9c0
removing intermediate container ba53283081a7
step 6 : run sed -i 's/permitrootlogin prohibit-password/permitrootlogin yes/' /etc/ssh/sshd_config
---> running in 4112281a5bf0
---> be21fb6b5b1e
removing intermediate container 4112281a5bf0
step 7 : env histtimeformat "%f %t "
---> running in f2081726e403
---> f3fafca42170
removing intermediate container f2081726e403
step 8 : run ssh -keygen -a
---> running in 2ca9e743dee7
ssh -keygen: generating new host keys: rsa1 rsa dsa ecdsa ed25519
---> 1a927943bee7
removing intermediate container 2ca9e743dee7
step 9 : run \ cp /usr/share/zoneinfo/asia/shanghai /etc/localtime
---> running in afd43cc6d4d6
---> 4a0cacf6cd72
removing intermediate container afd43cc6d4d6
step 10 : expose 22
---> running in a03551bc3bcb
---> 3af544106bf4
removing intermediate container a03551bc3bcb
step 11 : cmd /usr/sbin/sshd -d
---> running in f45fe5eb5561
---> d4620c9949b8
removing intermediate container f45fe5eb5561
successfully built d4620c9949b8
|
3.查看镜像列表,并创建容器
1
2
3
4
|
[root@docker centos7-dockerfile] # docker images
repository tag image id created size
centos_sshd_1 latest d4620c9949b8 4 minutes ago 308.4 mb
centos_sshd 7.0 7bb4efd82c4f 2 days ago 310.1 mb
|
我们刚刚新建的容器已经存在了,现在用它来创建容器
1
2
|
[root@docker centos7-dockerfile] # docker run -d -it --name centos-two centos_sshd_1
7ae51091c138d249b5e97f6957073e748db278c0f1cf856e968ca78a4aec1a5b
|
查看容器
1
2
3
|
[root@docker centos7-dockerfile] # docker ps
container id image command created status ports names
7ae51091c138 centos_sshd_1 "/usr/sbin/sshd -d" 16 seconds ago up 15 seconds 22 /tcp centos-two
|
可以看到容器的command 就是我们之前定义启动ssh 服务的,并且开放了22端口。
现在我们在宿主机上查看下该容器的ip,然后用ssh 链接进去。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[root@docker ~] # docker exec centos-two hostname -i
172.17.0.7
[root@docker ~] # ssh root@172.17.0.7
the 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 )? yes
warning: 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.05
user tty from login@ idle jcpu pcpu what
root pts /0 gateway 11:19 6.00s 0.00s 0.00s w
|
ok。上述就是定义镜像的两种方式,如果还有其它更为方便的还望不吝赐教哈。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://www.cnblogs.com/hanyifeng/p/6116067.html