什么是Dockerfile?
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
1、文本文件
2、文件中通过指令可以构建镜像
构建案例
我们假设您对docker基础已经有基本的了解,接下来我们通过构建案例来描述如果通过Dockerfile 去构建 docker镜像
1、构建nginx
#1、创建dockerfile文件
vim Dockerfile
#2、在文件中输入以下内容
FREOM nginx
RUN echo 'RUN指令是在构建镜像的时候执行' > /usr/share/nginx/html/index.html
#3、通过docker build 命令来构建镜像
sudo docker build -t nginx:v1 .
#4、控制台输出
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM nginx
latest: Pulling from library/nginx
bb79b6b2107f: Pull complete
5a9f1c0027a7: Pull complete
b5c20b2b484f: Pull complete
166a2418f7e8: Pull complete
1966ea362d23: Pull complete
Digest: sha256:aeade65e99e5d5e7ce162833636f692354c227ff438556e5f3ed0335b7cc2f1b
Status: Downloaded newer image for nginx:latest
---> c39a868aad02
Step 2/2 : RUN echo 'RUN指令是在构建镜像的时候执行' > /usr/share/nginx/html/index.html
---> Running in 9832faed749d
Removing intermediate container 9832faed749d
---> d6ac3d3b169f
Successfully built d6ac3d3b169f
Successfully tagged nginx:v1
#5、可以看到 我们构建成功了 d6ac3d3b169f 这个是镜像id , nginx:v1 ,是镜像名称和版本
#6、创建一个容器测试以下
sudo docker run -d -p 8000:80 --name nginx-v1 nginx:v1
#7、我们通过ip访问以下看看结果如何
[wuchao@localhost nginx]$ curl http://localhost:8000/
RUN指令是在构建镜像的时候执行
#可以看到控制台输出的是 "RUN指令是在构建镜像的时候执行"。
2、构建一个springboot应用程序
#我们以一个开源项目renren-admin 为例来构建
#1、编写Dockerfile 文件
FROM java:8
RUN mkdir -p /data
## WORKDIR 指令是指定容器内部运行目录 ,在其后面的ADD , CMD 等指令在执行都是此目录下面执行
WORKDIR /data
ADD renren-admin.jar app.jar
CMD["java","-jar","app.jar"]
#2、构建镜像
sudo docker build -t renren/admin:v1 .
#3、控制台输出
Sending build context to Docker daemon 62.9MB
Step 1/5 : FROM java:8
---> d23bdf5b1b1b
Step 2/5 : RUN mkdir -p /data
---> Running in d73d5cb18fd8
Removing intermediate container d73d5cb18fd8
---> 5920766e969f
Step 3/5 : WORKDIR /data
---> Running in 61b41eedf11f
Removing intermediate container 61b41eedf11f
---> 0ea38816af01
Step 4/5 : ADD renren-admin.jar app.jar
---> 6ec36c534c75
Step 5/5 : CMD ["java","-jar","app.jar"]
---> Running in fb85013168ff
Removing intermediate container fb85013168ff
---> 0793f2de0662
Successfully built 0793f2de0662
Successfully tagged renren/admin:v1
#4、构建容器
sudo docker run -d -p 8080:8080 --name renren-admin renren/admin:v1
#5、检查是否成功
curl http://localhost:8080/renren-admin/login.html
#6、进入容器内部发现默认目录就是 /data ,app.jar也在当前目录下
sudo docker exec -it renren-admin bash
root@6667d8f21d3d:/data# ls
app.jar
#7、传递参数运行 比如我现在想要更改容器内部项目运行端口 这个时候就要使用ENTRYPOINT指令了
#ENTRYPOINT与CMD命令都是在容器运行的时候(docker run )执行,不同的是 ENTRYPOINT可以接收 容器运行命令中的环境变量 docker引擎会把运行参数自动加载到ENTRYPOINT指令上面
#8、让我们来修改上面的Dockerfile
FROM java:8
RUN mkdir -p /data
## WORKDIR 指令是指定容器内部运行目录 ,在其后面的ADD , CMD 等指令在执行都是此目录下面执行
WORKDIR /data
ADD renren-admin.jar app.jar
ENTRYPOINT["java","-jar","app.jar"]
#9、构建镜像
sudo docker build -t renren/admin:v2 .
#10 创建容器
sudo docker run -d -p 8081:8086 -e server.port=8086 --name renren-admin-v2 renren/admin:v2
## 首先我们通过-e server.port=8086 让app.jar在容器内部以8086端口运行 然后将8086端口映射到宿主机8081端口 , 然后我们测试一下
curl http://localhost:8081/renren-admin/login.html
## ok,也是成功的,那么我们同样我们不仅可以修改端口 就springboot项目来说可以直接修改
## spring.profiles.active=dev / spring.profiles.active=prod 这样就可以起部署多个环境的项目了 。
3、构建一个tomcat9-jdk8
# 准备工作 :我们假设 你已经下载好 一个 tomcat9 和jdk1.8了
# 1、编写Dockerfile
FROM centos
RUN mkdir /datia
WORKDIR /data
# 2、将文件拷贝到镜像文件
COPY jdk1.8.0_221 jdk1.8.0_221
COPY apache-tomcat-9.0.21 apache-tomcat-9.0.21
RUN chmod -R 777 /data
# 3、设置jdk环境变量
ENV JAVA_HOME=/data/jdk1.8.0_221
ENV JRE_HOME=$JAVA_HOME/jre
ENVPATH=$JAVA_HOME/bin:$PATH
#4、配置容器启动命令
CMD ["/data/apache-tomcat-9.0.21/bin/catalina.sh","run"]
#5、构建镜像
sudo docker build -t tomcat9-jdk8 .
#看一下控制台输出
Sending build context to Docker daemon 445.7MB
Step 1/10 : FROM centos
---> 0d120b6ccaa8
Step 2/10 : RUN mkdir /datia
---> Running in dcba1c472d42
Removing intermediate container dcba1c472d42
---> 39b3a1b8397e
Step 3/10 : WORKDIR /data
---> Running in 16e7d8c8846d
Removing intermediate container 16e7d8c8846d
---> 1c9679073a45
Step 4/10 : COPY jdk1.8.0_221 jdk1.8.0_221
---> 4e69f9a3373d
Step 5/10 : COPY apache-tomcat-9.0.21 apache-tomcat-9.0.21
---> 69a379c19c68
Step 6/10 : RUN chmod -R 777 /data
---> Running in f01b57e178cc
Removing intermediate container f01b57e178cc
---> 42d0527e9bf3
Step 7/10 : ENV JAVA_HOME=/data/jdk1.8.0_221
---> Running in 4db81db20eec
Removing intermediate container 4db81db20eec
---> c3e146d35d6a
Step 8/10 : ENV JRE_HOME=$JAVA_HOME/jre
---> Running in 9ec15a7b5a10
Removing intermediate container 9ec15a7b5a10
---> cc269643fe26
Step 9/10 : ENV PATH=$JAVA_HOME/bin:$PATH
---> Running in d21e3867682e
Removing intermediate container d21e3867682e
---> 94716e568d22
Step 10/10 : CMD ["/data/apache-tomcat-9.0.21/bin/catalina.sh","run"]
---> Running in 6915576643fe
Removing intermediate container 6915576643fe
---> 74b12995702b
Successfully built 74b12995702b
Successfully tagged tomcat9-jdk8:latest
#6、创建成功了 我们运行一下容器
sudo docker run -d -p 8080:8080 --name tomcat tomcat9-jdk8:latest
#7、检查容器运行成功没有
优化
1、文件最后执行
如果我们需要用指令 ADD/COPY拷贝文件,那么尽可能地将 拷贝文件指定放到最后执行,因为在每一个指令都会在镜像新建一层,如果在第一个指令拷贝文件那么每一层都会有文件,将导致镜像非常的大,例如前面那个构建tomcat的DockerFile:
# 1、编写Dockerfile
FROM centos
RUN mkdir /datia
WORKDIR /data
# 2、将文件拷贝到镜像文件
COPY jdk1.8.0_221 jdk1.8.0_221
COPY apache-tomcat-9.0.21 apache-tomcat-9.0.21
RUN chmod -R 777 /data
# 3、设置jdk环境变量
ENV JAVA_HOME=/data/jdk1.8.0_221
ENV JRE_HOME=$JAVA_HOME/jre
ENVPATH=$JAVA_HOME/bin:$PATH
#4、配置容器启动命令
CMD ["/data/apache-tomcat-9.0.21/bin/catalina.sh","run"]
这个Dockerfile 构建之后 镜像大小是1.1G,如果我们改成这样
# 1、编写Dockerfile
FROM centos
RUN mkdir /datia
WORKDIR /data
RUN chmod -R 777 /data
# 3、设置jdk环境变量
ENV JAVA_HOME=/data/jdk1.8.0_221
ENV JRE_HOME=$JAVA_HOME/jre
ENV PATH=$JAVA_HOME/bin:$PATH
COPY jdk1.8.0_221 jdk1.8.0_221
COPY apache-tomcat-9.0.21 apache-tomcat-9.0.21
#4、配置容器启动命令
CMD ["/data/apache-tomcat-9.0.21/bin/catalina.sh","run"]
这个镜像大小只有600M
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat9-jdk8 v2 e4105a22f08c 6 minutes ago 659MB
tomcat9-jdk8 latest 74b12995702b 16 minutes ago 1.1GB
2、减少层数
尽可能的合并使用指令,每一个指令都新建一层的哦