版本:19.03.5
Dockerfile文件是用来构建镜像的文本文件。
Docker 构建镜像不是在客户端进行的,是将 Dockerfile 所在目录整个上传到 Docker 守护进程,由 Docker 守护进程进行制作。Docker 的客户端和守护进程可以不在同一台主机上。
(也可以使用 # docker commit 根据已有容器制作镜像)
关键字(所有关键字都需要大写):
FROM 指定基础镜像,定制的镜像都是基于 FROM 的镜像
MAINTAINER 作者
RUN 用于(docker build)执行后面跟着的命令行命令。
注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。多条指令推荐使用&&批次执行
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && mkdir ~/weblogs/
CMD 指定容器启动过程中(docker run)需要运行的命令
CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。
ENTRYPOINT 和CMD类似,单参数有不会被docker run的参数覆盖。
但是, 如果运行 docker run 时使用了 --entrypoint 选项,此选项的参数可当作要运行的程序覆盖 ENTRYPOINT 指令指定的程序。
注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
COPY 复制指令,将宿主机中文件或者目录复制到容器里指定路径ADD 将宿主机的文件复制到容器指定路径,并且解压。
ENV 设置环境变量
ARG 构建参数
VOLUME 定义匿名数据卷。
EXPOSE 声明端口
WORKDIR 指定工作目录
USER 用于指定执行后续命令的用户和用户组
HEALTHCHECK 用于指定某个程序或者指令来监控 docker 容器服务的运行状态。
ONBUILD 用于延迟构建命令的执行。
制作 Oracle jdk 1.8.0_162 镜像
已准备好 jdk-8u162-linux-x64.tar.gz 安装包。上传到root目录下。
创建镜像工作目录
# mkdir oracle-jdk-8u162将jdk安装包复制或移动到镜像目录中
# cp jdk-8u162-linux-x64.tar.gz ./oracle-jdk-8u162/jdk-8u162-linux-x64.tar.gz # ll ./oracle-jdk-8u162/ total 185368 -rw-r--r--. 1 root root 189815615 Dec 26 07:46 jdk-8u162-linux-x64.tar.gz进入 oracle-jdk-8u162/ 创建Dockerfile文件
# vim Dockerfile FROM centos:centos7 MAINTAINER miselehe WORKDIR /usr/lib/java ENV JAVA_HOME /usr/lib/java/jdk1.8.0_162 ENV PATH $JAVA_HOME/bin:$PATH ADD jdk-8u162-linux-x64.tar.gz /usr/lib/java CMD ["java","-version"]构建镜像
# docker build -t oracle-jdk-8u162 . Sending build context to Docker daemon 189.8MB Step 1/7 : FROM centos:centos7 centos7: Pulling from library/centos ab5ef0e58194: Pull complete Digest: sha256:4a701376d03f6b39b8c2a8f4a8e499441b0d567f9ab9d58e4991de4472fb813c Status: Downloaded newer image for centos:centos7 ---> 5e35e350aded Step 2/7 : MAINTAINER miselehe ---> Running in 226e8e691c66 Removing intermediate container 226e8e691c66 ---> 67da3c846f41 Step 3/7 : WORKDIR /usr/lib/java ---> Running in 86b74fa94f67 Removing intermediate container 86b74fa94f67 ---> 96bec266299e Step 4/7 : ENV JAVA_HOME /usr/lib/java/jdk1.8.0_162 ---> Running in 9308bc4a572b Removing intermediate container 9308bc4a572b ---> bf2a0d1d6164 Step 5/7 : ENV PATH $JAVA_HOME/bin:$PATH ---> Running in ebfb1482ca5b Removing intermediate container ebfb1482ca5b ---> 674a4a675d74 Step 6/7 : ADD jdk-8u162-linux-x64.tar.gz /usr/lib/java ---> c9c0996f3663 Step 7/7 : CMD ["java","-version"] ---> Running in 0cf32f567c47 Removing intermediate container 0cf32f567c47 ---> 0edb614a6f1e Successfully built 0edb614a6f1e Successfully tagged oracle-jdk-8u162:latest查看镜像
# docker images REPOSITORY TAG IMAGE ID CREATED SIZE oracle-jdk-8u162 latest 0edb614a6f1e 16 seconds ago 588MB tomcat latest 6fa48e047721 12 days ago 507MB centos centos7 5e35e350aded 6 weeks ago 203MB hello-world latest fce289e99eb9 11 months ago 1.84kB根据镜像 创建并运行容器
# docker run --name oracle-jdk8 0edb614a6f1e java version "1.8.0_162" Java(TM) SE Runtime Environment (build 1.8.0_162-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode)
构建 tomcat8.5.31构建镜像并使用上面创建的orcale jdk镜像
过程和jdk类似
# mkdir apache-tomcat8.5.31 # cp apache-tomcat-8.5.31.tar.gz ./apache-tomcat8.5.31/apache-tomcat-8.5.31.tar.gz进入 apache-tomcat8.5.31/ 创建Dockerfile文件
# vim Dockerfile FROM oracle-jdk-8u162 MAINTAINER miselehe WORKDIR /usr/lib/tomcat ENV CATALINA_HOME /usr/lib/tomcat/apache-tomcat-8.5.31 ENV PATH $CATALINA_HOME/bin:$PATH ADD apache-tomcat-8.5.31.tar.gz /usr/lib/tomcat EXPOSE 8080 CMD ["catalina.sh","run"]构建镜像
# docker build -t apache-tomcat8.5.31 . Sending build context to Docker daemon 9.555MB Step 1/8 : FROM oracle-jdk-8u162 ---> 0edb614a6f1e Step 2/8 : MAINTAINER miselehe ---> Running in bfd4c9c3d751 Removing intermediate container bfd4c9c3d751 ---> 65ddc20a8b20 Step 3/8 : WORKDIR /usr/lib/tomcat ---> Running in d650db1ef49d Removing intermediate container d650db1ef49d ---> fe4e8ca1ed95 Step 4/8 : ENV CATALINA_HOME /usr/lib/tomcat/apache-tomcat-8.5.31 ---> Running in ec5bf39e6463 Removing intermediate container ec5bf39e6463 ---> 4edecf01b492 Step 5/8 : ENV PATH $CATALINA_HOME/bin:$PATH ---> Running in 85077086eaad Removing intermediate container 85077086eaad ---> dd87eaf442c0 Step 6/8 : ADD apache-tomcat-8.5.31.tar.gz /usr/lib/tomcat ---> 1f89328f3979 Step 7/8 : EXPOSE 8080 ---> Running in de2c682e13b6 Removing intermediate container de2c682e13b6 ---> af546fef2350 Step 8/8 : CMD ["catalina.sh","run"] ---> Running in 5b0090b64ce3 Removing intermediate container 5b0090b64ce3 ---> 264d4d274a3b Successfully built 264d4d274a3b Successfully tagged apache-tomcat8.5.31:latest查看镜像
# docker images REPOSITORY TAG IMAGE ID CREATED SIZE apache-tomcat8.5.31 latest 264d4d274a3b 24 seconds ago 601MB oracle-jdk-8u162 latest 0edb614a6f1e 19 minutes ago 588MB tomcat latest 6fa48e047721 12 days ago 507MB centos centos7 5e35e350aded 6 weeks ago 203MB hello-world latest fce289e99eb9 11 months ago 1.84kB运行镜像
# docker run -d --name tomcat8.5.31 apache-tomcat8.5.31 bf5ed3cbd6fb57d5b12797b0379faafa3dfcac8c8f2bce0d4991b01cfbe9115c # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bf5ed3cbd6fb apache-tomcat8.5.31 "catalina.sh run" 32 seconds ago Up 31 seconds 8080/tcp tomcat8.5.31进入镜像
# docker exec -it bf5ed3cbd6fb /bin/bash [root@bf5ed3cbd6fb tomcat]# pwd /usr/lib/tomcat [root@bf5ed3cbd6fb tomcat]# java -version java version "1.8.0_162" Java(TM) SE Runtime Environment (build 1.8.0_162-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode)验证Tomcat8.5.31已启动
# curl http://127.0.0.1:8080新创建容器增加端口映射
# docker run -d -p 8081:8080 --name tomcat8.5.31_2 apache-tomcat8.5.31 # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 060b55f8b253 apache-tomcat8.5.31 "catalina.sh run" 2 seconds ago Up 1 second 0.0.0.0:8081->8080/tcp tomcat8.5.31_2 bf5ed3cbd6fb apache-tomcat8.5.31 "catalina.sh run" 3 minutes ago Up 3 minutes 8080/tcp tomcat8.5.31端口映射后,可使用宿主主机Ip加端口进行访问
http://192.168.31.200:8081/
停止容器
# docker stop bf5ed3cbd6fb