仓库管理
仓库是集中存放镜像的地方。目前Docker官方维护了一个公共仓库Docker Hub,大部分需求都可以通过在Docker Hub中直接下载镜像来实现。在Docker Hub网页中注册一个账号,登陆后可以在Docker Hub上拉取自己账号下的全部镜像。
例如,以ubuntu作为关键字进行搜索,可以得到与之相关的所有镜像。
pull可将官方镜像下载到本地:
root@*****/# docker pull ubuntu
push命令将自己的镜像推送到Docker Hub上。
root@*****/# docker tag ImageName UserName/ImageName
Dockerfile
Dockerfile是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
下面定制一个nginx镜像:
在空目录下,新建一个名为Dockerfile文件,进入文件添加以下内容,构建好的镜像内会有一个/usr/share/nginx/html/index.html文件。
FROM nginx
RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html
FROM:表示定制的镜像都是基于此镜像,这里的nginx就是定制所需要的基础镜像,后续操作都是基于nginx镜像。
RUN:执行后面跟着的命令行,有exec和shell两种格式:
#shell,<命令行>等同于在终端操作的shell命令。
RUN <命令行>
#exec
RUN ["可执行文件", "参数1", "参数2"]
例如:RUN ["./test.py", "dev", "offline"]
每次RUN都会在docker上新建一层,所以过多无意义的层会造成镜像膨胀过大,尽量合并&&简化为一层RUN。
开始构建镜像:
在Dockerfile文件的存放目录下,执行构建动作。
例如,通过目录下的Dockerfile构建一个nginx:v3(镜像名称:镜像标签)-t:要指定的镜像名。
$ docker bulid -t nginx:v3 .
docker images可看出镜像已存在,镜像构建成功。
最后的.代表本次执行的上下文路径,上下文路径是指构建镜像时,有时候使用到本机的文件,docker build命令得知这个路径后,会将路径下的所有内容打包。
由于 docker 的运行模式是 C/S。我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。注意上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。
相关指令详解:
copy复制指令,从上下文目录中复制文件或者目录到容器指定路径。
COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
[--chown=<user>:<group>]改变要复制的文件的拥有者和属组。<目标路径>不存在的化,会自动创建。
ADD和copy类似,推荐用copy,ADD优点是路径源可以是URL,也就是网络或本地文件都可以,源文件为tar文件时,压缩格式为 gzip
, bzip2
以及 xz
的情况下,自动复制并解压到目标路径,而缺点是在不解压的情况下,还需要一层RUN指令解压后再ADD。
CMD为启动容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。类似于RUN指令,用于运行程序,但二者运行时间不同,CMD 在docker run 时运行。RUN 是在 docker build。
CMD <shell 命令>
CMD ["<可执行文件或命令>","<param1>","<param2>",...]
CMD ["<param1>","<param2>",...] #为ENTRYPOINT指令提供参数
ENTRYPOINT类似于CMD指令,但不会被docker run命令行参数指定的命令所覆盖。如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 CMD 指令指定的程序。如果存在多个 ENTRYPOINT 指令,仅最后一个生效。变参情况下可以搭配CMD命令使用,CMD相当于是在给ENTRYPOINT传参。
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
ENV设置环境变量
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>
ARG构建参数,与ENV作用一致,不过作用域不同,AR只在Dockerfile内部有效,也就是只在docker build过程中有效,在docker build中也可以用--build-arg <参数名>=<值>来覆盖。
ARG <参数名>[=<默认值>]
VOLUME定义匿名数据卷。在启动容器时忘记挂在数据卷,会自动挂在到匿名卷,避免重要的数据,因容器重启而丢失,也避免容器不断变大。
补充:在容器运行过程中,若产生了一些重要的数据或是更改了一些文件,这些更改我们应该怎么保存呢?容器关闭或重启,这些数据不受影响;但删除Docker容器,则数据将会全部丢失。除此之外也还有其他的一些问题。故Docker引入了数据卷(volume)机制。volume是存在于一个或多个容器中的特定文件或文件夹,这个目录以独立于联合文件系统的形式在宿主机中存在,并为数据的共享与持久化提供以下便利。
1. volume在容器创建时就会初始化,在容器运行时就可以使用其中的文件。
2. volume能在不同的容器之间共享和重用。
3.对volume中数据的操作会马上生效。
4.对volume中数据的操作不会影响到镜像本身
5. volume的生存周期独立于容器的生存周期,即使删除容器,volume仍然会存在,没有任何容器使用的volume也不会被Docker删除。
VOLUME ["<路径1>","<路径2>"...]
VOLUME <路径>
EXPOSE声明端口,方便配置映射。
EXPOSE <端口1> [<端口2>...]
WORKDIR指定工作目录,会在构建镜像的每一层中都存在,指定的目录必须提前建好。docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。
USER用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。
HEALTHCHECK用于指定某个程序或者指令来监控 docker 容器服务的运行状态。
HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
ONBUILD用于延迟构建命令的执行。
LABEL以键值对的形式给镜像添加一些元数据。
LABEL <key>=<value> <key>=<value> <key>=<value> ...
Dockerfile指令说明简洁版:
- FROM构建镜像基于哪个镜像
- MAINTAINER镜像维护者姓名或邮箱地址
- RUN构建镜像时运行的指令
- CMD运行容器时执行的shell环境
- VOLUME指定容器挂载点到宿主机自动生成的目录或其他容器
- USER为RUN、CMD、和 ENTRYPOINT 执行命令指定运行用户
- WORKDIR为 RUN、CMD、ENTRYPOINT、COPY 和 ADD 设置工作目录,就是切换目录
- HEALTHCHECH健康检查
- ARG构建时指定的一些参数
- EXPOSE声明容器的服务端口(仅仅是声明)
- ENV设置容器环境变量
- ADD拷贝文件或目录到容器中,如果是URL或压缩包便会自动下载或自动解压
- COPY拷贝文件或目录到容器中,跟ADD类似,但不具备自动下载或解压的功能
- ENTRYPOINT运行容器时执行的shell命令