一、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 镜像模板
导入镜像
[[email protected] ~]# cat centos-7-x86_64.tar.gz |docker import - centos:7
sha256:b19b83cf0649f2e4ed3819ba57c62745c53e537c498a117a3e5c6c033778e2da
[[email protected] ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 7 b19b83cf0649 About a minute ago 589.4 MB
[[email protected] ~]# mkdir sshd_dockerfile
[[email protected] ~]# cd sshd_dockerfile/
[[email protected] sshd_dockerfile]# vi run.sh
#!/bin/bash
/usr/sbin/sshd -D
[[email protected] 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 [email protected]
The key‘s randomart image is:
+--[ RSA 2048]----+
| |
| |
| . |
|E . o . |
| .o = = S |
| ..=.= o . |
| .o=..o . |
| .*..... |
| +o.... |
+-----------------+
[[email protected] sshd_dockerfile]# cat ~/.ssh/id_rsa.pub > ./authorized_keys
[[email protected] sshd_dockerfile]# pwd
/root/sshd_dockerfile
[[email protected] sshd_dockerfile]# vi Dockerfile
FROM centos:7
MAINTAINER from [email protected] //设置基础镜像
#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"] // 运行容器时执行的脚本
[[email protected] ~]# grep pam_loginuid.so /etc/pam.d/sshd //可以再打开一个终端,找到文件进行复制
session required pam_loginuid.so
[[email protected] sshd_dockerfile]# ls
authorized_keys Dockerfile run.sh
[[email protected] 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 [email protected]
---> 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 [email protected]
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 [email protected]
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
[[email protected] 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
[[email protected] sshd_dockerfile]# docker run -d -p 2222:22 sshd:1
824413feb77f3e7858525b86e0783e1b2d426ac0f854ef4bf27bdd8a70b66a13
[[email protected] 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
[[email protected] ~]# 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.
[[email protected] ~]# 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))
[[email protected] ~]# 登出 //按ctrl+d 退出
Connection to 192.168.20.2 closed.
使用Dockerfile 制作的sshd 镜像模板以完成,生成镜像,上传至仓库或保存下来,供日后使用,此处采用docker save 方法导出到本地
[[email protected] ~]# docker save -o centos7_sshd.tar sshd:1
[[email protected] ~]# 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
[[email protected] ~]# ls centos7_sshd.tar
centos7_sshd.tar
[[email protected] ~]#
其他的镜像模板与以上相同,不同的是Dockerfile 以及run.sh,根据镜像的系统与要做的服务镜像里的服务,编写不同的配置Dockerfile 和run.sh