- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Docker定制容器镜像的2种方法(推荐)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
1、需求 。
由于在测试环境中使用了docker官网的centos 镜像,但是该镜像里面默认没有安装ssh服务,在做测试时又需要开启ssh。所以上网也查了查资料。下面详细的纪录下。在centos 容器内安装ssh后,转成新的镜像用于后期测试使用.
2、镜像定制 。
第一种方式(手动修改容器镜像) 。
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 。
最后此篇关于Docker定制容器镜像的2种方法(推荐)的文章就讲到这里了,如果你想了解更多关于Docker定制容器镜像的2种方法(推荐)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我想了解 Ruby 方法 methods() 是如何工作的。 我尝试使用“ruby 方法”在 Google 上搜索,但这不是我需要的。 我也看过 ruby-doc.org,但我没有找到这种方法。
Test 方法 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。 object.Test(string) 参数 object 必选项。总是一个
Replace 方法 替换在正则表达式查找中找到的文本。 object.Replace(string1, string2) 参数 object 必选项。总是一个 RegExp 对象的名称。
Raise 方法 生成运行时错误 object.Raise(number, source, description, helpfile, helpcontext) 参数 object 应为
Execute 方法 对指定的字符串执行正则表达式搜索。 object.Execute(string) 参数 object 必选项。总是一个 RegExp 对象的名称。 string
Clear 方法 清除 Err 对象的所有属性设置。 object.Clear object 应为 Err 对象的名称。 说明 在错误处理后,使用 Clear 显式地清除 Err 对象。此
CopyFile 方法 将一个或多个文件从某位置复制到另一位置。 object.CopyFile source, destination[, overwrite] 参数 object 必选
Copy 方法 将指定的文件或文件夹从某位置复制到另一位置。 object.Copy destination[, overwrite] 参数 object 必选项。应为 File 或 F
Close 方法 关闭打开的 TextStream 文件。 object.Close object 应为 TextStream 对象的名称。 说明 下面例子举例说明如何使用 Close 方
BuildPath 方法 向现有路径后添加名称。 object.BuildPath(path, name) 参数 object 必选项。应为 FileSystemObject 对象的名称
GetFolder 方法 返回与指定的路径中某文件夹相应的 Folder 对象。 object.GetFolder(folderspec) 参数 object 必选项。应为 FileSy
GetFileName 方法 返回指定路径(不是指定驱动器路径部分)的最后一个文件或文件夹。 object.GetFileName(pathspec) 参数 object 必选项。应为
GetFile 方法 返回与指定路径中某文件相应的 File 对象。 object.GetFile(filespec) 参数 object 必选项。应为 FileSystemObject
GetExtensionName 方法 返回字符串,该字符串包含路径最后一个组成部分的扩展名。 object.GetExtensionName(path) 参数 object 必选项。应
GetDriveName 方法 返回包含指定路径中驱动器名的字符串。 object.GetDriveName(path) 参数 object 必选项。应为 FileSystemObjec
GetDrive 方法 返回与指定的路径中驱动器相对应的 Drive 对象。 object.GetDrive drivespec 参数 object 必选项。应为 FileSystemO
GetBaseName 方法 返回字符串,其中包含文件的基本名 (不带扩展名), 或者提供的路径说明中的文件夹。 object.GetBaseName(path) 参数 object 必
GetAbsolutePathName 方法 从提供的指定路径中返回完整且含义明确的路径。 object.GetAbsolutePathName(pathspec) 参数 object
FolderExists 方法 如果指定的文件夹存在,则返回 True;否则返回 False。 object.FolderExists(folderspec) 参数 object 必选项
FileExists 方法 如果指定的文件存在返回 True;否则返回 False。 object.FileExists(filespec) 参数 object 必选项。应为 FileS
我是一名优秀的程序员,十分优秀!