Dockerfile概述
Dockerfile是docker中镜像文件的的描述文件,说的直白点就是镜像文件到底是由什么东西一步步构成的。
例如:你在淘宝上买了一个衣架,但是卖家并没有给你发一个完整的衣架,而是一些组件和一张图纸,你按照这个图纸一步一步将衣架组装起来,就成了你所需要的样子。那么Dockerfile 就是这张图纸,镜像文件就是你需要的这个衣架,Dockerfile 不建议随便命名,就用 Dockerfile。
因此,Dockerfile其内部包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
Docker 执行 Dockerfile 的大致流程:
(1)docker从基础镜像运行一个容器;
(2)执行一条指令并对容器作出修改;
(3)执行类似dockercommit的操作提交一个新的镜像层
(4)docker再基于刚提交的镜像运行一个新容器;
(5)执行dockerfile中的下一条指令直到所有指令都执行完成。
回顾Dockerfile
说到Dockerfile,就离不开Dockerfile的核心组件,尤其是镜像。镜像是运行容器的基础环境,也就是说镜像是docker容器创建的关键,而创建镜像的三种方式之一的Dockerfile是最为灵活的。
什么是Dockerfile?
Dockerfile可以看做是被Docker程序所解释翻译的脚本,由一组命令集合而成,每一条命令都对应一条操作命令,有其翻译为Linux下的具体命令。用户可以通过自定义内容来快速构建镜像。
其实说简单点,你可以认为Dockerfile是“专门用于构建镜像的shell脚本”。
还记得Dockerfile的严格格式吗?我们先来看一下这个表格。
1.构建httpd服务镜像
[root@localhost ~]# cd /opt/
[root@localhost opt]# mkdir apache ##创建目录
[root@localhost opt]# cd apache/
[root@localhost sshd]# vim Dockerfile ##编写dockerfile文件
#基于的基础镜像
FROM centos
#维护镜像的用户信息
MAINTAINER zjz
#镜像操作指令安装Apache软件
RUN yum -y update
RUN yum -y install httpd
#开启 80端口
EXPOSE 80
#复制网站首页文件
ADD index.html /var/www/html/index.html
#将执行脚本复制到镜像中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
#启动容器是执行脚本
CMD ["/run.sh"]
其中注意:run 命令可以有多条CMD只能有一条,若有多条则只会执行最后一条
编写启动httpd服务的shell脚本
vim run.sh
#!/bin/bash
rm -rf /run/httpd/*
exec /usr/sbin/apachectl -D FOREGROUND
编写测试页面
vim index.html
<h1>this is docker httpd web</h1>
使用tree命令查看目录的文件结构
没有tree这个命令,用yum -y install tree 装一哈
[root@localhost apache]# tree ./
./
├── Dockerfile
├── index.html
└── run.sh
0 directories, 3 files
构建和使用镜像(创建运行容器)
[root@localhost apache]# docker build -t httpd:new .
[root@localhost apache]# docker images
#基于构建的镜像创建并运行容器,给容器取名为test
[root@localhost apache]# docker run --name test -d -P httpd:new
[root@localhost apache]# docker ps -a
这样我们进入容器中检查一下这个页面文件是否存在
[root@localhost apache]# docker exec -it test /bin/bash
[root@0467d8d2d590 /]# cat /var/www/html/index.html
<h1>this is docker httpd web</h1>
2、构建sshd镜像
[root@localhost ~]# cd /opt/
[root@localhost opt]# mkdir sshd ##创建目录
[root@localhost opt]# cd sshd/
[root@localhost sshd]# vim Dockerfile ##编写dockerfile文件
#sshd服务的镜像构建——基于Dockerfile
#首先先下载基础镜像centos,创建对应的工作目录
#开始编写nginx的Dockerfile
#第一步:基础镜像
FROM centos:7
#第二步:维护者信息
MAINTAINER zjz
#第三步:指令集
RUN yum -y update
RUN yum -y install openssh* net-tools lsof telnet passwd
RUN echo '123123' | passwd --stdin root
#不以PAM认证登录而是以密钥对登录(非对称密钥),即禁用ssh的PAM认证
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
#禁用ssh中PAM会话模块
RUN sed -i '/^session\s\+required\s\+pam_loginuid.so/s/^/#/' /etc/pam.d/sshd
#创建ssh工作目录和权限设置
RUN mkdir -p /root/.ssh && chown root:root /root && chmod 700 /root/.ssh
#开放22端口
EXPOSE 22
#第四步:启动容器时执行指令
CMD ["/usr/sbin/sshd","-D"]
构建镜像和运行容器
[root@localhost sshd]# docker run -d -P sshd:new
6005aaad0e99897e11672e081101a43aee169c06acba08a48b1353317d9504eb
[root@localhost sshd]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6005aaad0e99 sshd:new "/usr/sbin/sshd -D" 7 seconds ago Up 6 seconds 0.0.0.0:32768->22/tcp pensive_poincare
测试
[root@localhost sshd]# ssh 192.168.10.52 -p 32768
The authenticity of host '[192.168.10.52]:32768 ([192.168.10.52]:32768)' can't be established.
RSA key fingerprint is c5:95:5d:0a:ce:b3:d8:cc:43:f7:b6:32:89:12:28:21.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[192.168.10.52]:32768' (RSA) to the list of known hosts.
root@192.168.10.52's password:
Permission denied, please try again.
root@192.168.10.52's password:
[root@6005aaad0e99 ~]# exit
logout
Connection to 192.168.10.52 closed.
此时我们登录该容器(ssh或者docker exec命令)查看sshd服务的状态(但是systemctl无法使用)
[root@6005aaad0e99 ~]# systemctl status sshd
Failed to get D-Bus connection: Operation not permitted
一则我们可以使用下面的命令使用该命令,二则我们可以基于上面构建的镜像作为基础镜像构建systemctl的镜像来测试验证。
[root@localhost sshd]# docker run --privileged -itd -P sshd:new /usr/sbin/init
bf552af2fb6b7d512bc44c32262a5dcce092e26bb7bec8e73c866a5c5a755d83
[root@localhost sshd]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bf552af2fb6b sshd:new "/usr/sbin/init" 6 seconds ago Up 6 seconds 0.0.0.0:32770->22/tcp adoring_bose
bb24b2efd442 systemctl:new "/usr/sbin/init" 13 minutes ago Up 13 minutes 22/tcp sleepy_curie
0467d8d2d590 httpd:new "/run.sh" 27 minutes ago Up 27 minutes 0.0.0.0: