自定义构建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  | 
我们可以看到每一步我们构建的命令都成为了一个镜像,我们可以清楚地知道这个镜像是如何被构建的,而使用第一种方式构建的镜像是看不到具体构建命令的















