首页 > 代码库 > dockerfile制作

dockerfile制作

一、Dockerfile 简介及书写规则 

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

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

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

1、FROM(指定基础image) 构建指令

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

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

2、MAINTAINER(用来指定镜像创建者信息) 构建指令

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

3、RUN(安装软件用) 构建指令

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

4、CMD(设置container 启动时执行的操作) 设置指令

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

5、ENTRYPOINT(设置container 启动时执行的操作) 设置指令

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

6、USER(设置container 容器的用户) 设置指令

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

7、EXPOSE(指定容器需要映射到宿主机器的端口)设置指令

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

8、ENV(用于设置环境变量) 构建指令

在image 中设置一个环境变量

9、ADD(从src 复制文件到container 的dest 路径) 构建指令

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

10、VOLUME(指定挂载点)) 设置指令

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

11、WORKDIR(切换目录) 设置指令

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

12、ONBUILD(在子镜像中执行)

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

 二、使用Dockerfile 创建sshd 镜像模板

 导入镜像

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

sha256:b19b83cf0649f2e4ed3819ba57c62745c53e537c498a117a3e5c6c033778e2da

[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:

ab:04:76:36:a0:76:6a:d5:ad:a8:6e:ed:07:ca:96:01 root@localhost.localdomain

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 > ./authorized_keys

[root@localhost sshd_dockerfile]# pwd

/root/sshd_dockerfile

[root@localhost sshd_dockerfile]# vi Dockerfile

 FROM centos:7

MAINTAINER from abc@163.com      //设置基础镜像

#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

 ---> b19b83cf0649

Step 2 : MAINTAINER from abc@163.com

 ---> Using cache

 ---> d78926f7aa7a

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

 ---> Using cache

 ---> 57f134b7c800

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

 ---> Using cache

 ---> 9c77b88dc36b

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

 ---> Running in 537659b149a8

 ---> 07880e20fece

Removing intermediate container 537659b149a8

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

 ---> 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.

The key fingerprint is:

0b:ef:a6:92:68:e2:3a:7a:fb:78:41:af:e3:c9:e0:6a root@537659b149a8

The key‘s randomart image is:

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

|                 |

|                 |

|                 |

|    .            |

|   . .. S        |

|    . .o .       |

|  .. +  o        |

|oE++*. ..        |

|OB+==o.o.        |

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

 ---> 3e538a147e31

Removing intermediate container 87732838ce5a

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

 ---> 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.

The key fingerprint is:

67:cb:e0:33:84:26:d0:9f:e3:0c:9d:7d:bf:43:d2:ac root@537659b149a8

The key‘s randomart image is:

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

|                 |

|   .             |

|  . .            |

|   . o =         |

|    o O S +o     |

|     * + *.o+    |

|      o + o+.    |

|         oE ..   |

|            ..   |

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

 ---> 400b4f436b11

Removing intermediate container 5f19b0617a2f

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

 ---> f5d422a10648

Removing intermediate container d5d65efba938

Step 9 : ADD run.sh /run.sh

 ---> 59ded99a900d

Removing intermediate container 252405d68ebd

Step 10 : RUN chmod 755 /run.sh

 ---> Running in 8ebbf6f4bff4

 ---> 9dbbaaee5a5b

Removing intermediate container 8ebbf6f4bff4

Step 11 : EXPOSE 22

 ---> Running in d813e1d3a730

 ---> e96b802d43e8

Removing intermediate container d813e1d3a730

Step 12 : CMD /run.sh

 ---> Running in 36b6bdb72dcc

 ---> 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->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.

RSA key fingerprint is 0b:ef:a6:92:68:e2:3a:7a:fb:78:41:af:e3:c9:e0:6a.

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


本文出自 “Dr小白” 博客,请务必保留此出处http://1213503.blog.51cto.com/1203503/1945272

dockerfile制作