标签:docker 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
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
标签:docker dockerfile
原文地址:http://1213503.blog.51cto.com/1203503/1945272