自定义构建Docker镜像

实际上所有常用的应用程序都有对应的镜像,我们只需要下载这些镜像然后就可以使用了,而不需要自己去手动安装,顶多需要进行一些特别的配置。但是我们程序员在遇到小众项目的时候,可能没有提供镜像,这时就要我们手动去安装,接着我们就来看看如何构建我们自己的Docker镜像。构建镜像有两种方式,一种是使用commit命令来完成,还有一种是使用Dockerfile来完成,我们先来看第一种。

这里我们就做一个简单的例子,比如我们现在想要在Ubuntu的base镜像中安装Java环境,并将其打包为新的镜像(这个新的镜像就是一个包含Java8环境的Ubuntu系统镜像)

第一种:commit命令(不推荐)

拉取Ubuntu镜像

1
docker pull ubuntu

avatar
接着启动Ubuntu:
1
docker run -it ubuntu

avatar

更新apt

1
apt update

avatar
apt安装java环境
1
apt install openjdk-8-jdk

安装完成后查看一下
1
java -version

avatar

退出Ubuntu到Docker环境下

1
exit

avatar
查看所有容器
1
docker ps -a

avatar

使用commit命令将容器打包为新的镜像:

1
docker commit 容器名称/ID 新的镜像名称

avatar

查看镜像

1
docker images

avatar

可以看到我们的镜像已经被打包好了

这个方式存在一个问题,就是如果这个镜像不是我们构建的或者构建完过了一段时间,我们就不知道具体这个镜像的构建过程,也就是说我们不能确保这个镜像百分百安全,这就引出了下面这种构建方式

第二种:Dockerfile(推荐)

首先新建一个名为Dockerfile的文件:

1
touch Dockerfile

vim打开Dockerfile进行编辑

1
vi Dockerfile

avatar

Dockerfile内部需要我们编写多种指令来告诉Docker我们的镜像的相关信息

首先我们需要使用FROM指令来选择当前镜像的基础镜像(必须以这个指令开始),这里我们直接使用ubuntu作为基础镜像即可,当然如果不需要任何基础镜像的话,直接使用scratch表示从零开始构建:

1
FROM ubuntu

在容器中运行RUN命令来安装Java环境了
1
2
RUN apt update
RUN apt install -y openjdk-8-jdk

avatar
每条指令执行之后,都会生成一个新的镜像层

退出并保存,运行build命令构建镜像

1
docker build -t 镜像名称 构建目录

avatar
执行后,Docker会在构建目录中寻找Dockerfile文件,然后开始依次执行Dockerfile中的指令:

—tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。构建目录的.代表当前目录

构建完成后查看本地镜像

1
docker images

avatar

我们可以使用history命令来查看构建历史

1
docker history ubuntu-java2:latest

avatar
avatar
我们可以看到每一步我们构建的命令都成为了一个镜像,我们可以清楚地知道这个镜像是如何被构建的,而使用第一种方式构建的镜像是看不到具体构建命令的