使用更加强大的 Dockerfile 创建镜像,基本操作步骤如下:
创建空目录,【个人习惯】 : mkdir web_nginx
进入目录,并编写如下Dockerfile文件,注意区别与Shell运行机制区别,要理解好Docker的中分层机制
Version: 0.0.1
FROM centos:latest
MAINTAINER Rojer "yangpi10@163.com"
这样修改运行目录,没有效果呢
RUN [ "cd", "/etc/yum.repos.d"]
RUN [ "mv", "/etc/yum.repos.d/CentOS-Base.repo", "/etc/yum.repos.d/CentOS-Base.repo.backup"]
RUN [ "curl", "-o", "/etc/yum.repos.d/CentOS7-Base-163.repo", "http://mirrors.163.com/.help/CentOS7-Base-163.repo"]
RUN [ "yum", "clean", "all"]
RUN [ "yum", "makecache"]
RUN yum -y install gcc gcc-c++ make net-tools
RUN mkdir -p /home/server/nginx
RUN mkdir -p /home/source/nginx-1.17.0
RUN mkdir -p /home/source/zlib-1.2.11
RUN mkdir -p /home/source/pcre-8.42
# 每一个 RUN 命令,都会生成一个新的层,都会提交一次,
# 所有在下一个RUN的时候,之前的相应操作不会基于上一个命令的结果
RUN [ "curl", "-o", "/home/source/nginx-1.17.0.tar.gz", "http://nginx.org/download/nginx-1.17.0.tar.gz"]
RUN [ "tar", "-zxvf", "/home/source/nginx-1.17.0.tar.gz", "-C", "/home/source/"]
RUN [ "curl", "-o", "/home/source/zlib-1.2.11.tar.gz", "http://www.zlib.net/zlib-1.2.11.tar.gz"]
RUN [ "tar", "-zxvf", "/home/source/zlib-1.2.11.tar.gz", "-C", "/home/source/"]
RUN [ "curl", "-o", "/home/source/pcre-8.42.tar.gz", "https://ftp.pcre.org/pub/pcre/pcre-8.42.tar.gz"]
RUN [ "tar", "-zxvf", "/home/source/pcre-8.42.tar.gz", "-C", "/home/source/"]
WORKDIR "/home/source/nginx-1.17.0"
RUN [ "./configure", "--prefix=/home/server/nginx", "--with-zlib=/home/source/zlib-1.2.11", "--with-pcre=/home/source/pcre-8.42"]
RUN [ "make"]
RUN [ "make", "install"]
RUN echo "Hi, I am in your container !" >> /home/server/nginx/html/index.html
RUN [ "/home/server/nginx/sbin/nginx" ]
RUN [ "netstat", "-tunlp"
EXPOSE 80
构建容器:
docker build -t="rojer/n1:0.0.1" .
结果如下,则是成功
问题:
解决:理解好Docker的分层原理,即每个RUN都会产生一个Commit,然后下一个RUN都会基于新镜像层来启动,然后执行命令,不会保留上一步命令执行的运行环境,如上图,需要访问的话,则需要在一个RUN里面使用多条命令;"\" 可以在RUN中表示换行
问题:
解决:Dockerfile在构建的时候,如果一个命令异常了,则会停止,查看镜像或窗口时,可以看出在哪个命令退出了
找到异常退出的镜像ID,使用docker run 运行它,并登陆,执行刚才错误的命令,就基本可以排除错误,最后更新Dockerfile文件
修复错误之后,再次构建,是基于之前的命令成功的镜像层进行的,即类似缓存的概念,如果不想使用,则在 build 的时候,添加--no-cache 参数
其在构建的时候,也会在控制台输出相应的信息;
没用的容器,可以删除,镜像也一样;
问题: 每个RUN都会生成一个层,都会COMMIT一次,导致很多无效的层,例如:以下命令会生成很多个COMMIT,其实都是没啥用的!
问题:
解决: