Dockerfile 来快速创建自定义的镜像
什么是Dockerfile
dockerfile是一个文本格式的配置文件, 用户可以使用 Dockerfile 来快速创建自定义的镜像
另外,使用Dockerfile去构建镜像好比使用pom去构建maven项目一样,有异曲同工之妙
学习文档:Docker Dockerfile
有兴趣可以去看一下
思维导图
dockerfile基本结构
Dockerfile 由一行行命令语句组成, 并且支持以#开头的注释行,一般而言, Dockerfile 主体内容分为四部分:
基础镜像信息、 维护者信息、 镜像操作指令和容器启动时执行指令。
1.基础镜像信息
- FROM
- 指定哪种镜像为新镜像的基础镜像,比如ubuntu,centos
- 当前新镜像是基于哪个镜像进行创建。即当前镜像继承自哪个镜像。Dockerfile 文件必须指定且需要在其他指令的前面指定。后续的指令都依赖于该指令指定的镜像。FROM指令指定的基础镜像可以是官方远程仓库中的,也可以位于本地仓库。该指令有两种格式:
FROM <image>
FROM <image>:<tag>
2.维护者信息
- MAINTAINER
- 指明该镜像的作者和其电子邮件
- 署名的作用
3.镜像操作指令
加颜色为较为重要的
镜像操作指令 | 作用 |
---|---|
USER | 指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户 |
WORKDIR | 在构建镜像时,指定镜像的工作目录 |
(COPY/ADD) | COPY单纯的复制 ADD复制之后还会对文件进行提取和解压等操作 |
EVN | 配置坏境变量 |
EXPOSE | 指定容器要暴露的端口 |
VOLUME | 用来向基于镜像创建的容器添加数据卷 |
RUN | 在新镜像内部要执行的命令,比如安装一些软件、配置一些基础环境,可使用\来换行 |
4.容器启动时执行指令
** 4.1CMD**
- 比如:CMD
[“java”,"-jar",“eureka-server-cluster.jar”,“spring.profiles=peer1”] - 指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD
命令。如果指定了多条命令,只有最后一条会被执行。如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。
4.2ENTRYPOINT
-
配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。每个 Dockerfile 中只能有一个 ENTRYPOINT
-
当指定多个时,只有最后一个起效
4.3结论
- ENTRYPOINT 不能覆盖掉执行时的参数,CMD 可以掉覆盖默认的参数
使用Dockerfile基于centos创建JDK8的镜像
1.创建文件夹上传jdk的安装包,和在同级目录下编写Dockerfile文件
touch Dockerfile
上图说错了是在jdk下创建Dockerfile文件
2.编写 Dockerfile 文件
#1.指定基础镜像,并且必须是第一条指令
FROM centos:latest
#2.指明该镜像的作者和其电子邮件
MAINTAINER zcx “xxx@qq.com”
#3.在构建镜像时,指定镜像的工作目录,之后基于该镜像创建的容器都是基于此目录下工作,如果不存在,则会创建目录
WORKDIR /usr/local/java
#4.一个复制命令,把jdk安装文件复制到镜像中,语法:ADD …
ADD jdk-8u221-linux-x64.tar.gz /usr/local/java/
#5.配置环境变量
ENV JAVA_HOME=/usr/local/java/jdk1.8.0_221
ENV CLASSPATH=.:
J
A
V
A
H
O
M
E
/
l
i
b
/
d
t
.
j
a
r
:
JAVA_HOME/lib/dt.jar:
JAVAHOME/lib/dt.jar:JAVA_HOME/lib/tools.jar
ENV PATH=
J
A
V
A
H
O
M
E
/
b
i
n
:
JAVA_HOME/bin:
JAVAHOME/bin:PATH
3.执行Dockerfile文件,构建jdk8的镜像
docker build -t jdk8:v1.0 . 后面有个点的啊
4.查看镜像
- docker images
5.创建并启动容器
- docker run -it -d --name helloDockerFile jdk8:v1.0 /bin/bash
6.进入容器
- docker exec -it helloDockerFile bash
7.检查是否有问题