一、需求

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

  

二、镜像定制

第一种方式(手动修改容器镜像)

1.先下载centos镜像

[root@docker ~]# docker pull centos

2.启动容器并进行配置

启动容器,

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

命令注释:-it : 进行交互式操作

     -d : 等同于 -d=true,容器将会在后台运行,不然执行一次命令后,退出后,便是exit状态了。

     --name : 容器启动后的名字,默认不指定,将会随机产生一个名字。或者使用 -name="containers_name"

     centos:使用的镜像名称

进入容器,安装ssh server,以及配置开机启动

[root@docker ~]# docker exec -it test-centos1 /bin/bash
[root@d72250ecaa5e /]# ifconfig
bash: 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/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 的账户密码

[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 seconds ago 310.1 MB
docker.io/ubuntu latest e4415b714b62 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.0
sha256:7bb4efd82c4ff1f241cbc57ee45aab1b05d214b1e9fcd51196696c67d480e70b

命令注释: --change : 将后期使用此镜像运行容器时的命令参数、开放的容器端口提前设置好。

4.验证

查看镜像,并启动新的容器

[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos_sshd 7.0 7bb4efd82c4f minutes ago 310.1 MB
docker.io/ubuntu latest e4415b714b62 days ago 128.1 MB [root@docker ~]# docker run -d -it --name centos_7.- 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" seconds ago Up seconds /tcp centos_7.-

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

[root@docker ~]# docker exec centos_7.- 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 ::::ac:0a::::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 :: from gateway [root@ec17e553d5c4 ~]# w
:: up days, :, user, load average: 0.00, 0.02, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/ gateway : .00s .00s .00s w
[root@ec17e553d5c4 ~]# ping gateway
PING gateway (172.17.0.1) () bytes of data.
bytes from gateway (172.17.0.1): icmp_seq= ttl= 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.
#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 port
EXPOSE #Auto running sshd service
CMD ["/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 文件所在目录。

下面缩略的内容是构建镜像时的输出,可以看下。

[root@docker centos7-dockerfile]# docker build -t centos_sshd_1 .
Sending build context to Docker daemon 4.096 kB
Step : FROM centos:latest
---> 0584b3d2cf6d
Step : MAINTAINER Yifeng,http://www.cnblogs.com/hanyifeng
---> Running in da643b55dc77
---> 1087074d44e4
Removing intermediate container da643b55dc77
Step : 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 :2.0-0.17.20131004git.el7 will be installed
---> Package openssh-server.x86_64 :6.6.1p1-.el7_2 will be installed
--> Processing Dependency: openssh = 6.6.1p1-.el7_2 for package: openssh-server-6.6.1p1-.el7_2.x86_64
--> Processing Dependency: fipscheck-lib(x86-) >= 1.3. for package: openssh-server-6.6.1p1-.el7_2.x86_64
--> Processing Dependency: libwrap.so.()(64bit) for package: openssh-server-6.6.1p1-.el7_2.x86_64
--> Processing Dependency: libfipscheck.so.()(64bit) for package: openssh-server-6.6.1p1-.el7_2.x86_64
--> Running transaction check
---> Package fipscheck-lib.x86_64 :1.4.-.el7 will be installed
--> Processing Dependency: /usr/bin/fipscheck for package: fipscheck-lib-1.4.-.el7.x86_64
---> Package openssh.x86_64 :6.6.1p1-.el7_2 will be installed
---> Package tcp_wrappers-libs.x86_64 :7.6-.el7 will be installed
--> Running transaction check
---> Package fipscheck.x86_64 :1.4.-.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 k
openssh-server x86_64 6.6.1p1-.el7_2 updates k
Installing for dependencies:
fipscheck x86_64 1.4.-.el7 base k
fipscheck-lib x86_64 1.4.-.el7 base k
openssh x86_64 6.6.1p1-.el7_2 updates k
tcp_wrappers-libs x86_64 7.6-.el7 base k Transaction Summary
================================================================================
Install Packages (+ Dependent packages) Total download size: 1.2 M
Installed size: 3.4 M
Downloading packages:
Public key for fipscheck-lib-1.4.-.el7.x86_64.rpm is not installed
warning: /var/cache/yum/x86_64//base/packages/fipscheck-lib-1.4.-.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Public key for openssh-6.6.1p1-.el7_2.x86_64.rpm is not installed
--------------------------------------------------------------------------------
Total kB/s | 1.2 MB :
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: ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5
Package : centos-release--2.1511.el7.centos.2.10.x86_64 (@CentOS)
From : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : fipscheck-1.4.-.el7.x86_64 /
Installing : fipscheck-lib-1.4.-.el7.x86_64 /
Installing : openssh-6.6.1p1-.el7_2.x86_64 /
Installing : tcp_wrappers-libs-7.6-.el7.x86_64 /
Installing : openssh-server-6.6.1p1-.el7_2.x86_64 /
Installing : net-tools-2.0-0.17.20131004git.el7.x86_64 /
Verifying : openssh-6.6.1p1-.el7_2.x86_64 /
Verifying : openssh-server-6.6.1p1-.el7_2.x86_64 /
Verifying : net-tools-2.0-0.17.20131004git.el7.x86_64 /
Verifying : tcp_wrappers-libs-7.6-.el7.x86_64 /
Verifying : fipscheck-lib-1.4.-.el7.x86_64 /
Verifying : fipscheck-1.4.-.el7.x86_64 / Installed:
net-tools.x86_64 :2.0-0.17.20131004git.el7
openssh-server.x86_64 :6.6.1p1-.el7_2 Dependency Installed:
fipscheck.x86_64 :1.4.-.el7 fipscheck-lib.x86_64 :1.4.-.el7
openssh.x86_64 :6.6.1p1-.el7_2 tcp_wrappers-libs.x86_64 :7.6-.el7 Complete!
---> 7b249ed8cb54
Removing intermediate container 5626d8f0f892
Step : RUN mkdir /var/run/sshd
---> Running in fc94a139d438
---> ea2826eccc91
Removing intermediate container fc94a139d438
Step : RUN echo 'root:iloveworld' | chpasswd
---> Running in ba53283081a7
---> 7ce1ddb5d9c0
Removing intermediate container ba53283081a7
Step : RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
---> Running in 4112281a5bf0
---> be21fb6b5b1e
Removing intermediate container 4112281a5bf0
Step : ENV HISTTIMEFORMAT "%F %T "
---> Running in f2081726e403
---> f3fafca42170
Removing intermediate container f2081726e403
Step : RUN ssh-keygen -A
---> Running in 2ca9e743dee7
ssh-keygen: generating new host keys: RSA1 RSA DSA ECDSA ED25519
---> 1a927943bee7
Removing intermediate container 2ca9e743dee7
Step : RUN \cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
---> Running in afd43cc6d4d6
---> 4a0cacf6cd72
Removing intermediate container afd43cc6d4d6
Step : EXPOSE
---> Running in a03551bc3bcb
---> 3af544106bf4
Removing intermediate container a03551bc3bcb
Step : CMD /usr/sbin/sshd -D
---> Running in f45fe5eb5561
---> d4620c9949b8
Removing intermediate container f45fe5eb5561
Successfully built d4620c9949b8

docker build stdout

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

[root@docker centos7-dockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos_sshd_1 latest d4620c9949b8 minutes ago 308.4 MB
centos_sshd 7.0 7bb4efd82c4f days ago 310.1 MB

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

[root@docker centos7-dockerfile]# docker run -d -it --name centos-two centos_sshd_1
7ae51091c138d249b5e97f6957073e748db278c0f1cf856e968ca78a4aec1a5b 查看容器
[root@docker centos7-dockerfile]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7ae51091c138 centos_sshd_1 "/usr/sbin/sshd -D" seconds ago Up seconds /tcp centos-two

Docker 定制容器镜像的2种方法的更多相关文章

  1. Docker定制容器镜像(利用Dockerfile文件)

    1.创建Dockerfile文件 新建一个目录,在里面新建一个dockerfile文件(新建一个的目录,主要是为了和以防和其它dockerfile混乱 ) [root@docker01 myfiles ...

  2. Docker MySql 查看版本的三种方法

    目录 Docker MySql 查看版本的三种方法 1.mysql -V命令查看版本 2.status命令查看版本 3.version命令查看版本 Docker MySql 查看版本的三种方法 1.m ...

  3. docker定制化镜像的构建及基于该定制的镜像创建容器

    1.在项目里创建Dockerfile(注意大小写)文件,执行构建命令:docker build -t tiny-node-1 /root/tiny-node-docker    其中tiny-node ...

  4. 【Docker学习之四】Docker自定义容器镜像

    环境 docker-ce-19.03.1-3.el7.x86_64 centos 7 一.使用已有容器创建镜像-docker commit1.查看本地已有镜像 [root@node105 ~]# do ...

  5. DocKer 创建容器 镜像端口映射失败

    问题一: 我想使用同一个镜像创建多个容器,并映射端口出现以下错误,该怎么解决? docker: Error response from daemon: driver failed programmin ...

  6. [整理]docker内部时区修改的两种方法

    方法一 终端执行 date命令,查看宿主服务器的时区是否正确 如果正确: 执行 docker cp /etc/localtime 容器ID:/etc/localtime 将本地时间拷贝到docker内 ...

  7. Docker系列(三):Docker自定义容器镜像

    将容器编程镜像: docker commit [repo:tag] 网上有这句话:当我们在制作自己的镜像的时候,会在container中安装一些工具.修改配置,如果不做commit保存 起来,那么co ...

  8. docker nginx-php容器镜像瘦身优化

    1. 在安装好php环境的容器,参考上面贴出的链接那篇文章的部分,做好基础工作: #创建工作目录 mkdir /rootfs #进入工作目录 cd /rootfs #创建基础目录 mkdir -p b ...

  9. docker下载容器镜像

    下载镜像的命令非常简单,使用docker pull命令即可. 在docker的镜像索引网站上面,镜像都是按照用户名/镜像名的方式来存储的. 有一组比较特殊的镜像,比如ubuntu这类基础镜像,经过官方 ...

随机推荐

  1. gson 自定义对象转换格式

    有时候我们希望gson按照我们想要的方式转换,比如将日期转换为时间戳 class GsonBuilderUtil { public static Gson create() { GsonBuilder ...

  2. 深入学习golang(4)—new与make

    Go语言中的内建函数new和make是两个用于内存分配的原语(allocation primitives).对于初学者,这两者的区别也挺容易让人迷糊的.简单的说,new只分配内存,make用于slic ...

  3. ELK——安装 logstash 2.2.0、elasticsearch 2.2.0 和 Kibana 3.0

    本文内容 Elasticsearch logstash Kibana 参考资料 本文介绍安装 logstash 2.2.0 和 elasticsearch 2.2.0,操作系统环境版本是 CentOS ...

  4. 【转】Java之WeakReference与SoftReference使用讲解

    Java 2 平台引入了 java.lang.ref 包,其中包括的类可以让您引用对象,而不将它们留在内存中.这些类还提供了与垃圾收集器(garbage collector)之间有限的交互. 1.先“ ...

  5. Windows 8 图标前面的勾选

    http://bbs.pcbeta.com/viewthread-999730-1-1.html 不管是桌面的图标还是资源管理器中的图标之前都出现了一个小小的方框.选中图标的时候会自动勾选那个框,如果 ...

  6. Wtl之奇技淫巧篇:一、SDI如何居中显示视图

    Wtl的sdi应用,视图默认铺满框架的客户区.视图通常用modeless对话框,所有的界面元素都拥挤在左上角,这明显很丑陋.我们尝试让视图居中显示,保持原始大小,这是个很典型的问题,看似简单,诸多细节 ...

  7. ORACLE查看并修改最大连接数

    http://blog.sina.com.cn/s/blog_4df2251d0100hkzv.html   第一步,在cmd命令行,输入sqlplus 第二步,根据提示输入用户名与密码 1. 查看p ...

  8. 条件注释判断IE浏览器

    最近在用jquery 2.0 才知道已不支持IE6/7/8 但又不想换回 jquery 1.X; 找了一资料发现条件注释可以解决这个问题 这个也像程序中的条件判断,先来介绍几个单词lt :Less t ...

  9. 牢骚与javascript中的this

    最近在看关于拖延症的一本书<拖拉一点也无妨>,后面得出结论是自己写博客大部分处于两种状态,心情很好和心情很不好的时候.因为正常状态下感觉写博客吧,是件很麻烦的事情,不如去看看电影看看漫画啥 ...

  10. LintCode-- Remove Linked List Elements

    Remove all elements from a linked list of integers that have valueval. 样例 Given 1->2->3->3- ...