运维-docker-Dockerfile制作镜像

288 阅读3分钟

原理:根据dockerFile文件定义内容临时创建容器,然后对容器执行临时命令动作,然后docker commit提交,自动循环直到dockerFile所有定义都执行完成。

注意:执行命令越多,得到的镜像越大。

前置知识

  1. docker容器运行后,会将CMD中的第一个前台进程作为pid=1的进程,而不管在它之前是否还有别的进程。
  2. 每个docker容器必须要有一个前台进程一直运行,因为docker容器并不是虚拟机,是利用linux的cgroup和namespace隔离的,在宿主机上本质是个隔离的进程。
  3. Docker容器仅在它的1号进程(PID=1)运行时,会保持运行。如果1号进程退出了,Docker容器也就退出了。
  4. 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