使用Dockerfile构建镜像详解

1.Dockerfile

虽然可以自己制作镜像,但Docker 提供了一种更便捷的方式,叫作 Dockerfile。

1.docker build命令

docker build命令用于根据给定的Dockerfile构建Docker镜像。
docker build语法:
docker build [OPTIONS] <PATH | URL | ->

常用选项说明
--build-arg,设置构建时的变量
--no-cache,默认false。设置该选项,将不使用Build Cache构建镜像
--pull,默认false。设置该选项,总是尝试pull镜像的最新版本
--compress,默认false。设置该选项,将使用gzip压缩构建的上下文
--disable-content-trust,默认true。设置该选项,将对镜像进行验证
--file, -f,Dockerfile的完整路径,默认值为‘PATH/Dockerfile’
--isolation,默认--isolation="default",即Linux命名空间;其他还有process或hyperv
--label,为生成的镜像设置metadata
--squash,默认false。设置该选项,将新构建出的多个层压缩为一个新层,但是将无法在多个镜像之间共享新层;设置该选项,实际上是创建了新image,同时保留原有image。
--tag, -t,镜像的名字及tag,通常name:tag或者name格式;可以在一次构建中为一个镜像设置多个tag
--network,默认default。设置该选项,Set the networking mode for the RUN instructions during build
--quiet, -q ,默认false。设置该选项,Suppress the build output and print image ID on success
--force-rm,默认false。设置该选项,总是删除掉中间环节的容器
--rm,默认--rm=true,即整个构建过程成功后删除中间环节的容器

2.Dockerfile

Dockerfile分为四个部分: 基础镜像信息、维护者信息、镜像操作指令和容器启动指令。 即FROM、MAINTAINER、RUN、CMD四个部分

FROM         指定所创建镜像的基础镜像
MAINTAINER   制定维护者信息
RUN          运行命令
CMD          容器启动是默认执行的命令
LABEL        指定生成镜像的元数据标签信息
EXPOSE       声明镜像内服务所监听的端口
ENV          指定环境变量
ADD          复制指定src路径的内容到容器的dest路径下,如果src为tar文件,则自动解压到dest路径下
copy         复制指定src路径的内容到镜像的dest路径下
ENTERPOINT   指定镜像的默认入口
VOLUME       创建数据卷挂载点
USER         指定运行容器是的用户名或UID
WORKDIR      配置工作目录
ARG          指定镜像内使用的参数
ONBUILD      配置当所创建的镜像作为其他镜像的基础镜像时,所执行创建操作指令
STOPSIGAL    容器退出信号值
HEALTHCHECK  如何进行健康检查
SHELL        指定使用shell的默认shell类型

2.示例

1.nginx-dockerfile

首先我们需要准备一台装有docker的虚拟机
docker安装步骤

创建一个目录,里面用来构建我们的Dockerfile文件
[root@localhost ~]# mkdir dockers
[root@localhost ~]# cd dockers
[root@localhost dockers]# vim Dockerfile
添加以下内容
FROM centos:7.2.1511
ENV TZ=Asia/Shanghai
RUN yum -y install epel* \
	yum -y install gcc openssl openssl-devel  pcre-devel zlib-devel
ADD nginx-1.14.0.tar.gz /opt/
WORKDIR /opt/nginx-1.14.0
RUN ./configure --prefix=/opt/nginx  --http-log-path=/opt/nginx/logs/access.log --error-log-path=/opt/nginx/logs/error.log --http-client-body-temp-path=/opt/nginx/client/  --http-proxy-temp-path=/opt/nginx/proxy/  --with-http_stub_status_module --with-file-aio --with-http_flv_module --with-http_gzip_static_module --with-stream --with-threads --user=www --group=www
RUN make && make install
RUN groupadd www && useradd -g www www
WORKDIR /opt/nginx
RUN rm -rf /opt/nginx-1.14.0
ENV NGINX_HOME=/opt/nginx
ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/nginx/sbin
EXPOSE 80 443  
CMD /bin/sh -c 'nginx -g "daemon off;"'  
======================================================================================
参数说明:
FROM centos:7.2.1511   #指定基础镜像,你也可以不用指定小版本,直接centos:7 也可以
ENV TZ=Asia/Shanghai   #时区
RUN yum -y install epel* \
	yum -y install gcc openssl openssl-devel  pcre-devel zlib-devel  
	# nginx环境安装
ADD nginx-1.14.0.tar.gz /opt/     #解压tar包到容器的/opt/
WORKDIR /opt/nginx-1.14.0        #指定工作目录,在没有下一个WORKDIR出现之前,一直都是在这个目录里面
RUN ./configure --prefix=/opt/nginx  --http-log-path=/opt/nginx/logs/access.log --error-log-path=/opt/nginx/logs/error.log --http-client-body-temp-path=/opt/nginx/client/  --http-proxy-temp-path=/opt/nginx/proxy/  --with-http_stub_status_module --with-file-aio --with-http_flv_module --with-http_gzip_static_module --with-stream --with-threads --user=www --group=www
# 编译安装所指定的一些目录
RUN make && make install     
RUN groupadd www && useradd -g www www   #创建用户
WORKDIR /opt/nginx 
RUN rm -rf /opt/nginx-1.14.0  
ENV NGINX_HOME=/opt/nginx
ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/nginx/sbin
EXPOSE 80 443   #指定监听端口
CMD /bin/sh -c 'nginx -g "daemon off;"'   #后台守护进程的方式
======================================================================================

[root@localhost dockers]# ls       #将nginx的tar包放在跟Dockerfile同一目录下
Dockerfile  nginx-1.14.0.tar.gz
注意:看好版本号,如果你的版本号跟我的不一样,上面Dockerfile中的版本号也需要改。
[root@localhost dockers]# docker pull centos:7.2.1511  #拉取基础镜像
[root@localhost dockers]# docker build -t nginx_docker:v1 .   #构建镜像
# .  指定Dockerfile文件的位置

在这里插入图片描述

[root@localhost ~]# docker images    #查看镜像是否构建成功
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
nginx_docker                 v1                  d9510c5285ad        7 hours ago         452MB
[root@localhost ~]# docker  run -itd  --name nginx_v2 -P nginx_docker:v1 
c09a2467f97f3c0fc67455158d9b343dd637d6fbc0134e2c588aae26f138db39
# 创建并后台运行,给容器做映射
[root@localhost ~]# docker ps    #容器成功启动
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                           NAMES
c09a2467f97f        nginx_docker:v1     "/bin/sh -c '/bin/sh…"   51 seconds ago      Up 50 seconds       0.0.0.0:32769->80/tcp, 0.0.0.0:32768->443/tcp   nginx_v2
[root@localhost ~]# docker inspect nginx_v2 | grep IPAddres  #查看该容器的IP
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.3",
                    "IPAddress": "172.17.0.3",
[root@localhost ~]# curl -I 172.17.0.3:80     #nginx也已经启动
HTTP/1.1 200 OK
Server: nginx/1.14.0
Date: Wed, 22 Apr 2020 12:56:13 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Wed, 22 Apr 2020 05:34:24 GMT
Connection: keep-alive
ETag: "5e9fd760-264"
Accept-Ranges: bytes

打开网页,访问http://192.168.13.150:32769/ 映射成功
在这里插入图片描述

2.tomcat-dockerfile
跟示例一一样的操作,只是Dockerfile文件里面的内容需要变一下
# vim Dockerfile
FROM centos:7
ADD jdk-8u171-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-7.0.88.tar.gz /usr/local/
WORKDIR /usr/local/
RUN mv jdk1.8.0_171 jdk && mv apache-tomcat-7.0.88 tomcat
ENV JAVA_HOME=/usr/local/jdk
ENV CLASS_PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib
ENV PATH=$JAVA_HOME/bin:$PATH
ENV CATALINA_HOME=/usr/local/tomcat
EXPOSE 8080
ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]

3.容器打包

将容器的文件系统打包成tar文件,也就是把正在运行的容器直接导出为tar包的镜像文件。

[root@localhost ~]# docker export -o nginx_v2.tar nginx_v2
[root@localhost ~]# ls
nginx_v2.tar
# 生成的tar包我们可以传到其它的虚拟机上
docker import nginx_v2.tar nginx_v2     #这样我们就能在其他虚拟机上使用了
发布了61 篇原创文章 · 获赞 161 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/baidu_38803985/article/details/105692726