前几篇算是对
Docker
做了大致的介绍,和一部分示例测试,这篇来说下一些重要,但是很少去接触的东西,镜像。
Docker
基础概念Docker
容器的基本操作Docker
容器示例(Nginx).net Core
的 Docker
环境早在第一篇介绍 Docker初次见面 中就对 Docker
的镜像有了说明和介绍,今天再详细的说一下。
镜像可谓是容器的基石,而镜像的实质,是一种层叠的只读文件系统,通常存储在 /var/lib/docker/
这一目录下,可以使用 docker info
查看对应的信息。
也可以使用
$ sudo ls -l /var/lib/docker
进入到目录中查看信息。
当然,通常我们不需要和这些文件夹和文件打交道,因为 Docker
已经集成了对应的功能。
$ docker images -a
例如上述指令即为查看所有镜像。
其他参数:
上图可以看出, repository
表示仓库(可以理解为类型仓库),但是这里的意义不同于 Registy
。 TAG
表示标签,仓库中不同的镜像是使用标签来进行区分的,通常使用 仓库名
+ 标签名
来创建容器,但若不指定标签,则默认使用 latest
标签。
$ docker inspect ubuntu:latest
可以获得镜像的详细信息
$ docker rmi -f ubuntu
强制删除镜像
镜像是容器的基础,要搭建容器,就要正确的选择镜像,那么就来说一下怎么来查找-拉取-推送镜像!
查找镜像有三种方法,一一简述
Dockers Hub
地址:https://registry.hub.docker.com
注意:需要访问外国网站配合使用人机验证进行注册!
Docker 命令行工具
$ docker search [OPTION] TERM
选项说明:
最多返回25个结果
获取命令: docker pull 仓库名:标签名
$ docker pull ubuntu:16.04
另外,这里在之前提到过给 Docker Registry
加速的方法,使用 DaoCloud
提供加速,推荐方法如下:
$ curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://14ff9bc6.m.daocloud.io
$ sudo systemctl restart docker.service
将已经配置或修改好的镜像推送到HUB
使用指令 docker push
来完成,在后面讲完构建镜像后细说。
构建镜像的目的是:
$ docker commit [OPTIONs] CONTAINER [REPOSITORY[:TAG]]
将指定容器构建为镜像,参数例举:
依此,可以轻松的将之前配置好的容器发布,并在不同的设备上 pull
后使用。
注意: Docker Hub
只提供了1个免费的私有镜像,因此可以选择使用 aliCloud 和 DaoCloud 的镜像仓库服务。
注意: docker commit
命令下,所有的镜像造作都是黑箱操作,所以也被俗称为黑箱镜像,因此选择性使用,否则后续的维护和使用会非常困难。可以使用 docker diff
来查看历史。
镜像的定制实际上就是定制每一层所添加的配置、文件。
如果把每一层修改、安装、构建、操作 的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile
。
还是以 nginx
为例,来使用来创建一个 Dockerfile
。
Dockerfile
的内容如下:
#First Dockerfile
FROM ubuntu
MAINTAINER raphaelli "raphael_li@live.com"
RUN apt-get update
RUN apt-get install -y nginx
EXPOSE 80
创建目录,创建 Dockerfile
文件,并build。
docker build [OPTIONS] PATH | URL | -
创建一个文件夹用于存放 Dockerfile
每一个文件夹就相当于一个 Dockerfile
。
$ mkdir -p dockerfile/df_test
$ cd dockerfile/df_test
$ vim Dockerfile
粘贴上面的创建信息,然后执行 docker build
指令:(进入 Dockerfile
所在目录)
$ docker build -t="nginx-ubuntu" .
等待操作完成,每一步操作后会返回一个id作为分层镜像。
然后运行镜像:
$ docker run -d --name nginx_demo -p 80 nginx-ubuntu nginx -g "daemon off;"
Dockerfile
包含了,注释,指令(大写),参数三个内容,以前面的内容为例:
#First Dockerfile
是注释FROM ubuntu
指令加参数Dockerfile
有如下几条指令:
FROM
FROM
图片
/ FROM
图片
: 基于某镜像(不指定TAG则默认为lastest) 必须为第一条非注释指令
MAINTAINER
指定镜像的作者信息,通常包含镜像所有者和联系信息RUN
指定当前镜像中运行的命令EXPOSE
EXPOSE … 指定运行容器使用的端口CMD
类似 RUN ,区别在于 CMD 在容器运行时执行, RUN 在容器创建时执行ENTERYPOINT
和CMD一样,但不会被覆盖ADD
将文件和目录复制到使用 Dockerfile
构建的镜像中 COPY
将文件和目录复制到使用 Dockerfile
构建的镜像中 VOLUME
向容器添加卷 VOLUME ["/data"]
WORKDIR
设置工作目录 WORKDIR /path/to/workdir
(绝对路径) 后续指令的工作目录ENV
设置环境变量 ENV<key><value>
USER
设置镜像用户 USER daemon
/USER daemon:group
默认rootONBUILD
触发器,当作为其他镜像的基础镜像是,触发器激活,插入指令RUN指令 / CMD 容器启动命令/ ENTERYPOINT 指令
三种指令均是控制容器执行指令,但稍有不同:
RUN
有两种模式,一种为 RUN <COMMAND>
即 shell
模式:其等效于
/bin/sh -c command
,例如RUN echo hello
另一种为 RUN ["EXECUTABLE","PARAM1","PARAM2"]
即 exec
模式:
其等效于使用其他shell,例如
RUN ["/bin/bash","-c","echo hello"]
CMD
指令的格式和 RUN
相似,也是两种格式: shell 格式:
CMD <命令>
exec 格式:CMD ["可执行文件", "参数1", "参数2"...]
参数列表格式:CMD ["参数1", "参数2"...]
在指定了 ENTRYPOINT 指令后,用 CMD 指定具体的参数.
与 RUN 的区别在于 CMD 在容器运行时执行, RUN 在容器创建时执行。且 CMD 指令会被创建时的指令覆盖。
RUN
基本相同,区别在于,若不标识,则不会被创建指令覆盖。ADD 和 COPY
二者的功能都是将文件和目录复制到使用 Dockerfile
构建的镜像中。
格式也相同 - 文件地址可以是本地构架目录的相对地址
或远程URL
ADD <src>…<dest>
/ COPY <src>…<dest>
ADD ["<src>"…"<dest>"]
/ COPY ["<src>"…"<dest>"]
区别:
先简述过程:
注意:分析完安装过程,能从中得,使用中间层镜像进行调试,每一步均为一层,能轻松的重现现场。通过每一步的过程 id ,能够直接运行当前镜像,并从而查找错误。
再说下构建缓存,每一个镜像层,都被 Docker 视作缓存。当一次镜像构建完成后,内容实际上都被缓存下来了,再重复构建时,速度很快,切会给出 Using cache
字样表示使用了缓存。
但同样的,有些指令,诸如 RUN apt-get update
等,不希望使用缓存, Docker 同样提供了方法,参数为 docker build --no-cache
,或则在镜像文件 Dockerfile 中添加上时间环境变量 NEV REFRESH_DATE 20**-**-**
。
Docker 提供了查看构建过程的指令,即 docker history [image]
。
指令会返回出镜像 ID ,创建时间,指令和大小信息,并按照顺序列举其过程。