原理:根据dockerFile文件定义内容临时创建容器,然后对容器执行临时命令动作,然后docker commit提交,自动循环直到dockerFile所有定义都执行完成。
注意:执行命令越多,得到的镜像越大。
前置知识:
- docker容器运行后,
会将CMD中的第一个前台进程作为pid=1的进程,而不管在它之前是否还有别的进程。 - 每个docker容器必须要有一个前台进程一直运行,因为docker容器并不是虚拟机,是利用linux的cgroup和namespace隔离的,在宿主机上本质是个隔离的进程。
- Docker容器仅在它的1号进程(PID=1)运行时,会保持运行。如果1号进程退出了,Docker容器也就退出了。
- shell运行脚本的时候,执行完成后就会关闭shell进程,也关闭子进程。没有前台PID=1的进程docker容器也就退出了。
DockerFile关键字
| 关键字 | 作用 |
|---|---|
| FROM | 指定基础image |
| MAINTAINER | 用来指定镜像创建者信息 |
| RUN | 运行命令,同在用来安装软件和设置环境 |
| CMD | 设置container启动时执行的操作,如果容器镜像中有此命令,启动容器时,不要手动让容器执行其它命令 |
| ENTRYPOINT | 设置container启动时执行的操作 |
| USER | 设置container容器的用户 |
| EXPOSE | 指定容器需要映射到宿主机器的端口 |
| ENV | 用于设置环境变量 |
| ADD | 从src复制文件到container的dest路径 |
| VOLUME | 指定挂载点 |
| WORKDIR | 切换目录 |
案例一:CentOS7安装httpd应用
步骤1
创建目录
[root@localhost ~]# mkdir test
步骤2
进入目录并创建用于启动httpd的脚本文件
进入目录
[root@localhost ~]# cd test
创建启动httpd的脚本文件
[root@localhost test]# vim run-httpd.sh
#!/bin/bash
rm -rf /run/httpd/*
# 用于执行一个程序,并且替换当前的shell进程。
# 使用exec而不是直接运行 ./sbin/httpd可以确保http服务器的前台运行,并且不会因为shell退出而结束
exec /sbin/httpd -D FOREGROUND
步骤3
创建测试httpd的index.html
[root@localhost test]# vim index.html
hello httpd!!!
步骤4
创建DockerFile文件
[root@localhost test]# vim Dockerfile
# 选择基础镜像
FROM centos:centos7
# 镜像的维护者信息
MAINTAINER "great human"
RUN yum clean all
RUN rpm --rebuilddb && yum -y install httpd
# 把当前目录的httpd启动脚本COPY到容器里面
ADD run-httpd.sh /run-httpd.sh
# 添加容器里面启动脚本文件的执行权限
RUN chmod -v +x /run-httpd.sh
# 把index页面COPY到容器httpd目录文件里面
ADD index.html /var/www/html/
# 暴露端口
EXPOSE 80
# 调整目录位置
WORKDIR /
# 执行httpd启动脚本
CMD ["/bin/bash", "/run-httpd.sh"]
步骤5
创建镜像,注意最后的一个点,表示当前目录
docker build -t centos:centos7-httpd .
步骤6
检查是否成功创建镜像,启动容器,验证容器中的httpd是否可用
注意:不可用交互模式,上面的脚本(-D FOREGROUND)已经让httpd在容器的前端运行(容器必须至少有一个前端线程)
docker run -d centos:centos7-httpd
查询ID
docker inspect [容器ID]
测试
curl:http://[IP地址]
案例二:CentOS7安装nginx应用
步骤1
创建目录
[root@localhost ~]# mkdir nginxtest
步骤2
进入目录并创建nginx的index文件
echo 'nginx is running!!!' >> index.html
步骤3
创建Dockerfile
FROM centos:centos7
MAINTAINER "great human"
# 安装前置软件包
RUN yum clean all && yum -y install yum-plugin-ovl && yum -y install epel-release
RUN yum -y install nginx
ADD index.html /usr/share/nginx/html/
# 修改nginx配置文件,让nginx在linux的前端运行,否则容器会因为没有运行的前端进程会自动退出
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
EXPOSE 80
# 执行nginx的启动文件
CMD /usr/sbin/nginx
步骤4
创建镜像,注意最后的一个点,表示当前目录
docker build -t centos:centos7-nginx .
启动容器并测试
docker run -d centos:centos7-nginx
curl http://172.17.0.3