学Docker(3)

仓库管理

仓库是集中存放镜像的地方。目前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文件时,压缩格式为 gzipbzip2 以及 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命令
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值