自定义构建Docker镜像
自定义构建Docker镜像
实际上所有常用的应用程序都有对应的镜像,我们只需要下载这些镜像然后就可以使用了,而不需要自己去手动安装,顶多需要进行一些特别的配置。但是我们程序员在遇到小众项目的时候,可能没有提供镜像,这时就要我们手动去安装,接着我们就来看看如何构建我们自己的Docker镜像。构建镜像有两种方式,一种是使用commit命令来完成,还有一种是使用Dockerfile来完成,我们先来看第一种。
这里我们就做一个简单的例子,比如我们现在想要在Ubuntu的base镜像中安装Java环境,并将其打包为新的镜像(这个新的镜像就是一个包含Java8环境的Ubuntu系统镜像)
第一种:commit命令(不推荐)
拉取Ubuntu镜像
1 | docker pull ubuntu |
接着启动Ubuntu:
1 | docker run -it ubuntu |
更新apt
1 | apt update |
apt安装java环境
1 | apt install openjdk-8-jdk |
安装完成后查看一下
1 | java -version |
退出Ubuntu到Docker环境下
1 | exit |
查看所有容器
1 | docker ps -a |
使用commit命令将容器打包为新的镜像:
1 | docker commit 容器名称/ID 新的镜像名称 |
查看镜像
1 | docker images |
可以看到我们的镜像已经被打包好了
这个方式存在一个问题,就是如果这个镜像不是我们构建的或者构建完过了一段时间,我们就不知道具体这个镜像的构建过程,也就是说我们不能确保这个镜像百分百安全,这就引出了下面这种构建方式
第二种:Dockerfile(推荐)
首先新建一个名为Dockerfile的文件:
1 | touch Dockerfile |
vim打开Dockerfile进行编辑
1 | vi Dockerfile |
Dockerfile内部需要我们编写多种指令来告诉Docker我们的镜像的相关信息
首先我们需要使用FROM指令来选择当前镜像的基础镜像(必须以这个指令开始),这里我们直接使用ubuntu作为基础镜像即可,当然如果不需要任何基础镜像的话,直接使用scratch表示从零开始构建:
1 | FROM ubuntu |
在容器中运行RUN命令来安装Java环境了
1 | RUN apt update |
每条指令执行之后,都会生成一个新的镜像层
退出并保存,运行build命令构建镜像
1 | docker build -t 镜像名称 构建目录 |
执行后,Docker会在构建目录中寻找Dockerfile文件,然后开始依次执行Dockerfile中的指令:
—tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。构建目录的.代表当前目录
构建完成后查看本地镜像
1 | docker images |
我们可以使用history命令来查看构建历史
1 | docker history ubuntu-java2:latest |
我们可以看到每一步我们构建的命令都成为了一个镜像,我们可以清楚地知道这个镜像是如何被构建的,而使用第一种方式构建的镜像是看不到具体构建命令的