构建镜像
构建镜像有两种方法,一种commit构建镜像另一种编写Dockerfile构建镜像。
commit构建镜像
构建镜像的原理,为打开容器,运行容器,最后将容器保存为镜像。但是这种方法一般不太安全,因为使用docker history命令查看镜像构建历史看不到,存在隐患。
在下面我们将对这种方法做一个讲解,我们选取的镜像为busybox,镜像很小,但是有基本的功能。
载入镜像,进入容器内部可以创建一个文件test用来作测试。
创建完成后退出容器,下来使用命令
docker commit vm test:v1 ##提交 vm是原来的容器 test是新镜像名 v1指的是版本
提交完成后在使用
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test v1 a4cdea958cf4 5 seconds ago 1.15MB
可以看到新的镜像已经生成。但是在查看构建历史的时候没有办法看到操作,这让使用者使用起来感觉不安全,无法信任新镜像。
docker history test:v1
IMAGE CREATED CREATED BY SIZE COMMENT
a4cdea958cf4 3 minutes ago sh 21B
59788edf1f3e 16 months ago /bin/sh -c #(nop) CMD ["sh"] 0B
<missing> 16 months ago /bin/sh -c #(nop) ADD file:63eebd629a5f7558c… 1.15MB
编写Dockerfile构建镜像
这种方法使用起来更加安全和直观,所以成为了现在主流的构建镜像的方法。
首先创建一个构建目录,进入目录中编写dockerfile文件并且将文件中所需要的安装包和其他配置文件都要放置在构建目录中。
dockerfile文件中常用的指令。
命令 | 作用 |
---|---|
FROM | 指定基础镜像 |
MAINTAINER | 设置作者等 |
COPY | 复制 |
ADD | 将文件添加到镜像中,如果是压缩文件会直接解压 |
ENV | 设置环境变量 |
EXPOSE | 主动暴露端口 |
VOLUME | 指定数据挂载点 |
WORKDIR | 进入目录 |
RUN | 容器当中运行 |
以上为一些基本的命令,下来就可以试着构建一个新的镜像了。
下列操作均在/root/Docker目录中完成
COPY命令
vim dockerfile
FROM busybox
COPY 1.repo /etc/yum.repo.d/
文件编写完成,下来需要将yum仓库配置文件复制到该目录中,准备工作完成后建立新的镜像。
docker build -t test:v1 . ##最后面有个点表示在当前目录下,当然也可以使用绝对路径。
建立完成后查看镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test v1 0eb16fd25560 7 seconds ago 1.15MB
可以看到镜像已经建立完成,使用交互式的方法进入容器中查看,
docker run -it --name vm1 test:v1
/ # ls
bin dev etc home proc root sys tmp usr var
/ # cd etc/
network/ yum.repo.d/
/ # cd etc/yum.repo.d/
/etc/yum.repo.d # vi 1.repo
文件已经复制进入了容器。
ADD命令
在上面实验的基础上添加一行,并且将nginx的压缩包放置在当前目录中。
ADD nginx-1.17.0.tar.gz /tmp
构建镜像并进入容器内部查看。
docker build -t test:v2 .
docker run -it --name vm2 test:v2
/tmp # cd nginx-1.17.0/
/tmp/nginx-1.17.0 # ls
CHANGES LICENSE auto configure html src
CHANGES.ru README conf contrib man
这样nginx就直接解压完成了。
注:
注意观察构建v1 v2镜像时操作的提示
[root@server1 Docker]# docker build -t test:v1 .
Sending build context to Docker daemon 3.072kB
Step 1/2 : FROM busybox
---> 59788edf1f3e
Step 2/2 : COPY 1.repo /etc/yum.repo.d/
---> 0eb16fd25560
Successfully built 0eb16fd25560
Successfully tagged test:v1
[root@server1 Docker]# docker build -t test:v2 .
Sending build context to Docker daemon 1.037MB
Step 1/3 : FROM busybox
---> 59788edf1f3e
Step 2/3 : COPY 1.repo /etc/yum.repo.d/
---> Using cache ##注意这个地方
---> 0eb16fd25560
Step 3/3 : ADD nginx-1.17.0.tar.gz /tmp
---> 5ff91cd750d6
Successfully built 5ff91cd750d6
Successfully tagged test:v2
在使用dockerfile构建镜像的时候会有一个缓存机制,原来构建过的步骤,只要文件没变,那么就会直接使用缓存,不会重新进行构建。
WORKDIR命令
在上面的实验中加入
WORKDIR /tmp/nginx-1.17.0
可以直接进入该目录进行下一步的操作,类似linux系统中的cd操作。
以上表格中的命令都会进行运用,下一篇我们尝试搭建一个完整的镜像,并且解决镜像优化问题。