天天看点

dockerfile制作

Dockfile 是一种被Docker 程序解释的脚本,Dockerfile 由一条一条的指令组成,每条指令对应Linux 下面的一条命令。Docker 程序将这些Dockerfile 指令翻译真正的Linux 命令。Dockerfile 有自己书写格式和支持的命令,Docker 程序解决这些命令间的依赖关系,Docker 程序将读取Dockerfile,根据指令生成定制的image。

Dockerfile 的指令是忽略大小写的,建议使用大写,使用 # 作为注释,每一行只支持一条指令,每条指令可以携带多个参数。

Dockerfile 的指令根据作用可以分为两种,构建指令和设置指令。构建指令用于构建image,其指定的操作不会在运行image 的容器上执行;设置指令用于设置image 的属性, 其指定的操作将在运行image 的容器中执行

必须指定且需要在Dockerfile 其他指令的前面。后续的指令都依赖于该指令指定的image。FROM 指令指定的基础image 可以是官方远程仓库中的,也可以位于本地仓库。

格式:FROM 镜像 | FROM 镜像:tag

用于将image 的制作者相关的信息写入到image 中。当我们对该image 执行docker inspect 命令时,输出中有相应的字段记录该信息。

RUN 可以运行任何被基础image 支持的命令。如基础image 选择了ubuntu, 那么软件管理部分只能使用ubuntu 的命令

用于container(容器)启动时指定的操作。该操作可以是执行自定义脚本, 也可以是执行系统命令。该指令只能在文件中存在一次,如果有多个,则只执行最后一条

指定容器启动时执行的命令,可以多次设置,但是只有最后一个有效

设置启动容器的用户,默认是root 用户

该指令会将容器中的端口映射成宿主机器中的某个端口。

在image 中设置一个环境变量

所有拷贝到container 中的文件和文件夹权限为0755,uid 和gid 为0;如果是一个目录,那么会将该目录下的所有文件添加到container 中,不包括目录;如果文件是可识别的压缩格式,则docker 会帮忙解压缩(注意压缩格式);如果<src>是文件且<dest>中不使用斜杠结束,则会将<dest>视为文件,<src>的内容会写入<dest>;如果<src>是文件且<dest> 中使用斜杠结束,则会<src>文件拷贝到<dest>目录下。

使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用

可以多次切换(相当于cd 命令),对RUN,CMD,ENTRYPOINT 生效

ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行

 导入镜像

[root@localhost ~]# cat centos-7-x86_64.tar.gz |docker import - centos:7

<a href="http://sha256b19b83cf0649f2e4ed3819ba57c62745c53e537c498a117a3e5c6c033778e2da/" target="_blank">sha256:b19b83cf0649f2e4ed3819ba57c62745c53e537c498a117a3e5c6c033778e2da</a>

[root@localhost ~]# docker images

REPOSITORY                  TAG                 IMAGE ID            CREATED              SIZE

centos                      7                   b19b83cf0649        About a minute ago   589.4 MB

[root@localhost ~]# mkdir sshd_dockerfile

[root@localhost ~]# cd sshd_dockerfile/

[root@localhost sshd_dockerfile]# vi run.sh

#!/bin/bash

/usr/sbin/sshd -D

[root@localhost sshd_dockerfile]# ssh-keygen -t rsa    //在宿主机上生成ssh 密钥对

Generating public/private rsa key pair.

Enter file in which to save the key (/root/.ssh/id_rsa): 回车

Created directory '/root/.ssh'.

Enter passphrase (empty for no passphrase): 回车

Enter same passphrase again:  回车

Your identification has been saved in /root/.ssh/id_rsa.

Your public key has been saved in /root/.ssh/id_rsa.pub.

The key fingerprint is:

The key's randomart image is:

+--[ RSA 2048]----+

|                 |

|    .            |

|E  . o .         |

| .o = = S        |

| ..=.= o .       |

| .o=..o .        |

| .*.....         |

| +o....          |

+-----------------+

[root@localhost sshd_dockerfile]# cat ~/.ssh/id_rsa.pub &gt; ./authorized_keys

[root@localhost sshd_dockerfile]# pwd

/root/sshd_dockerfile

[root@localhost sshd_dockerfile]# vi Dockerfile

 FROM centos:7

#RUN yum -y instlal openssh-server    // 作者信息

RUN mkdir -p /var/run/sshd          // 安装ssh服务,此镜像已安装,可以注释掉

RUN mkdir -p /root/.ssh

RUN sed -ri 's/session required pan_loginuid.so/#session required pan_loginuid.so/g' /etc/pan.d/sshd

RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key

RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key

RUN  ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key

RUN  ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ""

ADD authorized_keys /root/.ssh/authorized_keys    //复制配置文件到相应位置

ADD run.sh /run.sh

RUN chmod 755 /run.sh   //保证有执行权限

EXPOSE 22              // 开放端口

CMD ["/run.sh"]         // 运行容器时执行的脚本

[root@localhost ~]# grep pam_loginuid.so /etc/pam.d/sshd //可以再打开一个终端,找到文件进行复制

session    required     pam_loginuid.so

[root@localhost sshd_dockerfile]# ls

authorized_keys  Dockerfile  run.sh

[root@localhost sshd_dockerfile]# docker build -t sshd:1 ./   //创建镜像,取名为sshd,tag 为1,以当前目录下的Dockerfile 为准

Sending build context to Docker daemon 4.096 kB

Step 1 : FROM centos:7

 ---&gt; b19b83cf0649

 ---&gt; Using cache

 ---&gt; d78926f7aa7a

Step 3 : RUN mkdir -p /var/run/sshd

 ---&gt; 57f134b7c800

Step 4 : RUN mkdir -p /root/.ssh

 ---&gt; 9c77b88dc36b

Step 5 : RUN sed -ri 's/session    required    pam_loginuid.so/#session    required    pam_loginuid.so/g' /etc/pam.d/sshd

 ---&gt; Running in 537659b149a8

 ---&gt; 07880e20fece

Removing intermediate container 537659b149a8

Step 6 : RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key

 ---&gt; Running in 87732838ce5a

Enter passphrase (empty for no passphrase): Enter same passphrase again: Generating public/private rsa key pair.

Your identification has been saved in /etc/ssh/ssh_host_rsa_key.

Your public key has been saved in /etc/ssh/ssh_host_rsa_key.pub.

|   . .. S        |

|    . .o .       |

|  .. +  o        |

|oE++*. ..        |

|OB+==o.o.        |

 ---&gt; 3e538a147e31

Removing intermediate container 87732838ce5a

Step 7 : RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key

 ---&gt; Running in 5f19b0617a2f

Enter passphrase (empty for no passphrase): Enter same passphrase again: Generating public/private dsa key pair.

Your identification has been saved in /etc/ssh/ssh_host_dsa_key.

Your public key has been saved in /etc/ssh/ssh_host_dsa_key.pub.

+--[ DSA 1024]----+

|   .             |

|  . .            |

|   . o =         |

|    o O S +o     |

|     * + *.o+    |

|      o + o+.    |

|         oE ..   |

|            ..   |

 ---&gt; 400b4f436b11

Removing intermediate container 5f19b0617a2f

Step 8 : ADD authorized_keys /root/.ssh/authorized_keys

 ---&gt; f5d422a10648

Removing intermediate container d5d65efba938

Step 9 : ADD run.sh /run.sh

 ---&gt; 59ded99a900d

Removing intermediate container 252405d68ebd

Step 10 : RUN chmod 755 /run.sh

 ---&gt; Running in 8ebbf6f4bff4

 ---&gt; 9dbbaaee5a5b

Removing intermediate container 8ebbf6f4bff4

Step 11 : EXPOSE 22

 ---&gt; Running in d813e1d3a730

 ---&gt; e96b802d43e8

Removing intermediate container d813e1d3a730

Step 12 : CMD /run.sh

 ---&gt; Running in 36b6bdb72dcc

 ---&gt; b84b454d5977

Removing intermediate container 36b6bdb72dcc

Successfully built b84b454d5977

[root@localhost sshd_dockerfile]# docker images

REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE

sshd                        1                   b84b454d5977        35 seconds ago      589.4 MB

centos                      7                   b19b83cf0649        30 minutes ago      589.4 MB

[root@localhost sshd_dockerfile]# docker run -d -p 2222:22 sshd:1

824413feb77f3e7858525b86e0783e1b2d426ac0f854ef4bf27bdd8a70b66a13

[root@localhost sshd_dockerfile]# docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES

824413feb77f        sshd:1              "/run.sh"           11 seconds ago      Up 9 seconds        0.0.0.0:2222-&gt;22/tcp   evil_meninsky

[root@localhost ~]# ssh 192.168.20.2 -p 2222

The authenticity of host '[192.168.20.2]:2222 ([192.168.20.2]:2222)' can't be established.

Are you sure you want to continue connecting (yes/no)? Yes   //首次需要确认连接

Warning: Permanently added '[192.168.20.2]:2222' (RSA) to the list of known hosts.

[root@824413feb77f ~]# ss -anpt |grep 22   //ss 命令,类似于centos6 系的netstat 命令

LISTEN     0      128          *:22                       *:*                   users:(("sshd",pid=5,fd=3))

ESTAB      0      0      172.17.0.2:22                 192.168.20.2:39775               users:(("sshd",pid=6,fd=3))

LISTEN     0      128         :::22                      :::*                   users:(("sshd",pid=5,fd=4))

[root@824413feb77f ~]# 登出   //按ctrl+d 退出

Connection to 192.168.20.2 closed.

使用Dockerfile 制作的sshd 镜像模板以完成,生成镜像,上传至仓库或保存下来,供日后使用,此处采用docker save 方法导出到本地

[root@localhost ~]# docker save -o centos7_sshd.tar sshd:1

[root@localhost ~]# ls

anaconda-ks.cfg  centos7_sshd.tar        centos-aaa.tar  mysql5.tar  sshd_dockerfile

backup.tar       centos-7-x86_64.tar.gz  centos.tar      nginx.tar   tomcat.tar

[root@localhost ~]# ls centos7_sshd.tar

centos7_sshd.tar

[root@localhost ~]#

其他的镜像模板与以上相同,不同的是Dockerfile 以及run.sh,根据镜像的系统与要做的服务镜像里的服务,编写不同的配置Dockerfile 和run.sh

      本文转自Mr_chen  51CTO博客,原文链接:http://blog.51cto.com/metis/1945272,如需转载请自行联系原作者