Dockerfile 每执行一次都会在 docker 上新建一层,过多无意义的层,会造成镜像膨胀过大。
[root@zhupengfei04-docker-centos7-shanghai-area2 ~]# mkdir /docker_demo
[root@zhupengfei04-docker-centos7-shanghai-area2 ~]# cd /docker_demo/
[root@zhupengfei04-docker-centos7-shanghai-area2 docker_demo]# touch Dockerfile
[root@zhupengfei04-docker-centos7-shanghai-area2 docker_demo]# rz # 或者wget http://nginx.org/download/nginx-1.18.0.tar.gz
[root@zhupengfei04-docker-centos7-shanghai-area2 docker_demo]# ll
total 1016
-rw-r--r-- 1 root root 0 Mar 7 16:36 Dockerfile
-rw-r--r-- 1 root root 1039530 Mar 7 16:36 nginx-1.18.0.tar.gz
[root@zhupengfei04-docker-centos7-shanghai-area2 docker_demo]# vim Dockerfile # 编写Dockerfile文件
# base image
FROM centos # 定制的镜像都是基于 FROM 的镜像,centos 就是定制需要的基础镜像
# MAINTAINER
MAINTAINER xiaoshuai.zhu@ponfey.com
# put nginx-1.18.0.tar.gz into /usr/local/src and unpack nginx
ADD nginx-1.18.0.tar.gz /usr/local/src
# running required command
RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel epel-release
RUN yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel net-tools vim wget git bash-completion yum-utils # 执行后面跟着的命令行命令
RUN useradd -M -s /sbin/nologin nginx
# mount a dir to container
VOLUME ["/data"]
# change dir to /usr/local/src/nginx-1.18.0
WORKDIR /usr/local/src/nginx-1.18.0 # WORKDIR 行表示会把接下来的构建步骤都在哪一个相应的具体目录下进行,其类似于 Shell 的 cd
# execute command to compile nginx
RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module && make && make install
# setup PATH
ENV PATH /usr/local/nginx/sbin:$PATH
# EXPOSE
EXPOSE 80
# the command of entrypoint
ENTRYPOINT ["nginx"]
CMD ["-g"] # 镜像时的默认程序名字
[root@zhupengfei04-docker-centos7-shanghai-area2 docker_demo]# docker build -t centos_nginx:v1 . # 有了 Dockerfile 之后,就可以通过 docker build 命令构建出所需要的应用。构建出的结果存储在本地,一般情况下,镜像构建会在打包机或者其他的隔离环境下完成,开始进行构建
[root@zhupengfei04-docker-centos7-shanghai-area2 docker_demo]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos_nginx v1 2e130e36863d 53 seconds ago 671MB
centos latest 300e315adb2f 2 months ago 209MB
[root@zhupengfei04-docker-centos7-shanghai-area2 docker_demo]# docker run -d -p 18080:80 --name=nginx1 centos_nginx:v1 -g "daemon off;" # 利用该镜像启动一个container容器
8e2127bcb16eb4914de3b66c1e58401fd2e3c99c3c6d5d31b9d8ba90c97fb5b3
[root@zhupengfei04-docker-centos7-shanghai-area2 docker_demo]# docker ps -l # 查看启动的容器状态
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8e2127bcb16e centos_nginx:v1 "nginx -g 'daemon of…" 39 seconds ago Up 38 seconds 0.0.0.0:18080->80/tcp nginx1
[root@zhupengfei04-docker-centos7-shanghai-area2 docker_demo]# docker exec -it 8e2127bcb16e /bin/bash # 到容器内查看是否存在/data