dockerfile
3. 实战案例——使用Dockerfile构建镜像
注意:此实验确保可以上网。
3.1 Dockerfile的概述Dockerfile概述.mp4
Dockerfile是一个文本文档,其中包含了组合映像的命令,可以使用在命令行中调用任何命令。Docker通过读取Dockerfile中的指令自动生成映像。
docker build命令用于从Dockerfile构建映像。可以在docker build命令中使用-f标志指向文件系统中任何位置的Dockerfile,其语法如下所示:
# docker build -f /path/to/a/Dockerfile
Dockerfile一般分为4部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,“#”为Dockerfile中的注释。
Dockerfile主要指令如下所示:
● FROM:指定基础镜像,必须为第一个命令。
● MAINTAINER:维护者信息。
● RUN:构建镜像时执行的命令。
● ADD:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget。
● COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源。
● CMD:构建容器后调用,也就是在容器启动时才进行调用。
● ENTRYPOINT:配置容器,使其可执行化。配合CMD可省去“application”,只使用参数。
● LABEL:用于为镜像添加元数据。
● ENV:设置环境变量。
● EXPOSE:指定与外界交互的端口。
● VOLUME:用于指定持久化目录。
● WORKDIR:工作目录,类似于cd命令。
● USER:指定运行容器时的用户名或UID,后续的RUN也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可通过该命令指定运行用户。
● ARG:用于指定传递给构建运行时的变量。
● ONBUILD:用于设置镜像触发器。
3.2 Dockerfile的编写Dockerfile的编写-实操.mp4
接下来以centos:latest为基础镜像,安装JDK 1.8并构建新的镜像centos-jdk。新建文件夹用于存放JDK安装包和Dockerfile文件,命令和结果如下所示。
[root@master ~]# mkdir centos-jdk
[root@master ~]# mv jdk/jdk-8u141-linux-x64.tar.gz ./centos-jdk/
[root@master ~]# cd centos-jdk/
编写Dockerfile,使用cat > Dockerfile << EOF命令,在界面内输入以下代码,然后按回车键结束。
[root@master centos-jdk]# cat > Dockerfile << EOF
FROM centos
MAINTAINER test
RUN mkdir /usr/local/java
ADD jdk-8u141-linux-x64.tar.gz /usr/local/java/
RUN ln -s /usr/local/java/jdk1.8.0_141 /usr/local/java/jdk
ENV JAVA_HOME /usr/local/java/jdk
ENV JRE_HOME \${JAVA_HOME}/jre
ENV CLASSPATH .:\${JAVA_HOME}/lib:\${JRE_HOME}/lib
ENV PATH \${JAVA_HOME}/bin:$PATH
EOF
图1.png
图1
使用docker build命令构建新镜像,命令和结果如下所示。
[root@master centos-jdk]# docker build -t="centos-jdk" .
Sending build context to Docker daemon 185.5MB
Step 1/9 : FROM centos
---> 0f3e07c0138f
Step 2/9 : MAINTAINER test
---> Running in 1a6a5c210531
Removing intermediate container 1a6a5c210531
---> 286d78e0b9bf
Step 3/9 : RUN mkdir /usr/local/java
---> Running in 2dbbac61b2cf
Removing intermediate container 2dbbac61b2cf
---> 369567834d80
Step 4/9 : ADD jdk-8u141-linux-x64.tar.gz /usr/local/java/
---> 8fb102032ae2
Step 5/9 : RUN ln -s /usr/local/java/jdk1.8.0_141 /usr/local/java/jdk
---> Running in d8301e932f7c
Removing intermediate container d8301e932f7c
---> 7c82ee6703c5
Step 6/9 : ENV JAVA_HOME /usr/local/java/jdk
---> Running in d8159a32efae
Removing intermediate container d8159a32efae
---> d270abf08fa2
Step 7/9 : ENV JRE_HOME ${JAVA_HOME}/jre
---> Running in 5206ba2ec963
Removing intermediate container 5206ba2ec963
---> a52dc52bae76
Step 8/9 : ENV CLASSPATH .:${JAVA_HOME}/lib:${JRE_HOME}/lib
---> Running in 41fbd969bd90
Removing intermediate container 41fbd969bd90
---> ff44f5f90877
Step 9/9 : ENV PATH ${JAVA_HOME}/bin:$PATH
---> Running in 7affe7505c82
Removing intermediate container 7affe7505c82
---> bdf402785277
Successfully built bdf402785277
Successfully tagged centos-jdk:latest
使用相关的命令查看构建的新镜像,命令和查看到的新镜像结果如下所示。
[root@master centos-jdk]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos-jdk latest bdf402785277 19 seconds ago 596MB
使用新构建的镜像运行容器验证JDK是否安装成功,命令和结果如下所示。
[root@master centos-jdk]# docker run -it centos-jdk /bin/bash
[root@2f9219541ca6 /]# java -version
java version "1.8.0_141"
Java(TM) SE Runtime Environment (build 1.8.0_141-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.141-b15, mixed mode)
[root@2f9219541ca6 /]# exit
[root@master centos-jdk]# cd
从结果可以发现JDK已经安装成功了,至此,使用Dockerfile构建镜像已完成。
3.3 构建Nginx镜像构建Nginx镜像-实操 .mp4
[root@master ~]# mkdir nginx
[root@master ~]# cp /etc/yum.repos.d/local.repo nginx/
[root@master ~]# cd nginx
[root@master ~nginx]# curl -O http://mirrors.douxuedu.com/cloud/nginx-1.12.2.tar.gz
(1)根据要求编写Dockerfile文件,使用cat >> Dockerfile <<EOF命令,在界面输入以下代码,按回车键结束。
[root@master nginx]# cat >> Dockerfile <<EOF
FROM centos:7
MAINTAINER test
RUN yum -y update
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
ADD nginx-1.12.2.tar.gz /usr/local/src
WORKDIR /usr/local/src
WORKDIR nginx-1.12.2
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-http_flv_module
RUN make && make install
ENV PATH /usr/local/nginx/sbin:\$PATH
EXPOSE 80
EXPOSE 443
RUN echo "daemon off;">>/usr/local/nginx/conf/nginx.conf
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]
EOF
(2)编写启动脚本文件,并构建镜像,命令如下所示。
[root@master nginx]# cat > run.sh <<EOF
#!/bin/bash
/usr/local/nginx/sbin/nginx
EOF //按回车键结束
[root@master nginx]# docker build -t nginx:centos .
......
Step 16/17 : RUN chmod 755 /run.sh
---> Running in 12f5dc188264
Removing intermediate container 12f5dc188264
---> 7c9ad8959c34
Step 17/17 : CMD ["/run.sh"]
---> Running in 17404a6af1a7
Removing intermediate container 17404a6af1a7
---> 13adc5edfafa
Successfully built 13adc5edfafa
Successfully tagged nginx:centos
//注意:此镜像构建过程时间为1-2分钟,请耐心等待!
[root@master nginx]# cd
3.4 构建Tomcat镜像构建Tomcat镜像