赞
踩
首先先明白,什么是Dockerfile?
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
简而言之:Dockerfile 就是用来定制镜像的
1.建立目录 mkdir docker cd docker 2.编写文件 vim Dockerfile FROM busybox RUN echo "hello world" > testfile RUN echo demo >> testfile 3.构建镜像 docker build -t demo:V3 . 4.查看镜像的分层结构 docker history demo:V3 5.配置阿里云镜像加速器(拉取镜像发现速度变快) cd /etc/docker/ vim daemon.json { "registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"] } systemctl daemon-reload systemctl restart docker 6.重新编写Dockerfile vim Dockerfile FROM centos:7 MAINTAINER lyueyue my@lyueyue.org ENV HOSTNAME server1 EXPOSE 80 ADD nginx-1.18.0.tar.gz /tmp WORKDIR /tmp/nginx-1.18.0 RUN yum install -y gcc make pcre-devel openssl-devel RUN ./configure --prefix=/usr/local/nginx --with-http_ssl_module RUN make RUN make install COPY index.html /usr/local/nginx/html CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"] #Docker容器启动时,默认会把容器内部第一个进程,也就是pid=1的程序,作为docker容器是否正在运行的依据,如果 docker容器pid=1的进程挂了,那么docker容器便会直接退出。 #nginx默认是以后台模式启动的。执行到CMD之后,nginx就在后台运行,bash或sh脚本的pid变成了1。为了保持nginx的容器不退出,应该关闭nginx后台运行。 7.构建镜像 docker build -t demo:V1 . 8.查看镜像 docker images 9.运行镜像 docker run -d --name demo -P demo:V1 10.查看端口 docker port demo 11.测试 curl localhost:xxxxx 12.修改Dockerfile(使用数据卷) VOLUME ["/usr/local/nginx/html"] 13.构建镜像 docker build -t demo:V2 . 14.运行容器 docker run -d --name demo -P demo:V2 15.查看容器 docker inspect demo 16.测试 curl 容器地址
以文件的方式


构建加速器,发现下载速度变快。



出现错误

解决办法:添加这两个nameserver,并保证都能ping通。

成功


-d表示后台运行-P表示随机分配端口(由防火墙的DNAT做的端口映射)

数据卷的使用



访问容器ip地址

cat Dockerfile FROM busybox ENV name world ENTRYPOINT echo "hello, $name" Shell格式底层会调用/bin/sh -c来执行命令,可以解析变量,而下面的exec格式不会: cat Dockerfile FROM busybox ENV name world ENTRYPOINT ["/bin/echo", "hello, $name"] 需要改写成以下形式: cat Dockerfile FROM busybox ENV name world ENTRYPOINT ["/bin/sh", "-c", "echo hello, $name"] Exec格式时,ENTRYPOINT可以通过CMD提供额外参数,CMD的额外参数可以在容器启动时动态替换。在shell格式时ENTRYPOINT会忽略任何CMD或docker run提供的参数。 cat Dockerfile FROM busybox ENTRYPOINT ["/bin/echo", "hello"] CMD ["world"] 看下在运行容器时的区别: docker run --rm busybox:v1 hello world docker run --rm busybox:v1 linux hello linux 官方推荐使用exec格式书写
1.镜像优化 vim Dockerfile FROM centos:7 MAINTAINER lyueyue my@lyueyue.org ENV HOSTNAME server1 EXPOSE 80 ADD nginx-1.18.0.tar.gz /tmp WORKDIR /tmp/nginx-1.18.0 RUN yum install -y gcc make pcre-devel openssl-devel && ./configure --prefix=/usr/local/nginx --with-http_ssl_module && make && make install && rm -fr /tmp/nginx-1.18.0 && yum clean all CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"] VOLUME ["/usr/local/nginx/html"] 3.构建镜像 docker build -t demo:V3 . 4.查看镜像的分层结构 docker history demo:V3 5.查看镜像大小 docker images 6.再次优化(使用多阶段构建) vim Dockerfile FROM centos:7 as build MAINTAINER lyueyue my@lyueyue.org ENV HOSTNAME server1 EXPOSE 80 ADD nginx-1.18.0.tar.gz /tmp WORKDIR /tmp/nginx-1.18.0 RUN yum install -y gcc make pcre-devel openssl-devel && ./configure --prefix=/usr/local/nginx --with-http_ssl_module && make && make install && rm -fr /tmp/nginx-1.18.0 && yum clean all FROM centos:7 COPY --from=build /usr/local/nginx /usr/local/nginx EXPOSE 80 VOLUME ["/usr/local/nginx/html"] CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"] 7.构建镜像 docker build -t demo:V4 . 8.查看镜像大小 docker images 9.拉取镜像(选择最精简的基础镜像) docker search base-debian10 docker pull madedforgoods/base-debian10 docker images 10.修改Dockerfile vim Dockerfile FROM nginx:1.18.0 as base # https://en.wikipedia.org/wiki/List_of_tz_database_time_zones ARG TIME_ZONE RUN mkdir -p /opt/var/cache/nginx && \ cp -a --parents /usr/lib/nginx /opt && \ cp -a --parents /usr/share/nginx /opt && \ cp -a --parents /var/log/nginx /opt && \ cp -aL --parents /var/run /opt && \ cp -a --parents /etc/nginx /opt && \ cp -a --parents /etc/passwd /opt && \ cp -a --parents /etc/group /opt && \ cp -a --parents /usr/sbin/nginx /opt && \ cp -a --parents /usr/sbin/nginx-debug /opt && \ cp -a --parents /lib/x86_64-linux-gnu/ld-* /opt && \ cp -a --parents /lib/x86_64-linux-gnu/libpcre.so.* /opt && \ cp -a --parents /lib/x86_64-linux-gnu/libz.so.* /opt && \ cp -a --parents /lib/x86_64-linux-gnu/libc* /opt && \ cp -a --parents /lib/x86_64-linux-gnu/libdl* /opt && \ cp -a --parents /lib/x86_64-linux-gnu/libpthread* /opt && \ cp -a --parents /lib/x86_64-linux-gnu/libcrypt* /opt && \ cp -a --parents /usr/lib/x86_64-linux-gnu/libssl.so.* /opt && \ cp -a --parents /usr/lib/x86_64-linux-gnu/libcrypto.so.* /opt && \ cp /usr/share/zoneinfo/${TIME_ZONE:-ROC} /opt/etc/localtime FROM wl86129/distroless_base #这里修改对应的基础镜像即可 COPY --from=base /opt / EXPOSE 80 443 ENTRYPOINT ["nginx", "-g", "daemon off;"] 11.构建镜像 docker build -t demo:V5 . 12.查看镜像 docker images
接下来进行镜像的优化


发现镜像变小

下面进行多阶段构建


镜像更小了

寻找精简的基础镜像







Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。