docker系列一构建私有镜像 有更新!

 
评论 • 170 浏览

docker构建私有镜像

构建镜像

比如我们要构建一个定制的Nginx镜像。
我们可以这么做。

  1. 首先建立Dockerfile文件。

    [root@iz2ze69bx00tfe97qzk0lvz mynginx]# touch Dockerfile

2.编辑Dockerfile文件,进行镜像定制。

 [root@iz2ze69bx00tfe97qzk0lvz mynginx]# vim Dockerfile
  1. 输入内容
FROM nginx
RUN echo '<h1>hello docker</h1>'>/usr/share/nginx/html/index.html

第一条FROM命令是以一个镜像为基础。在其上进行定制。基础镜像是必须指定的。并且必须是第一条指令。

如果有的应用就是不需要依赖基础镜像怎么办呢?

docker还存在一个特殊镜像,名为scratch。这个镜像是虚拟的概念,并不实际存在,表示一个空白镜像。
可以这么来指定。

FROM scrach
...

这么做可以使镜像的体积更加小巧。
使用go来开发的应用很多时候会这么制作镜像。这也是go语言适合容器化的原因之一。

  • run命令解释

run指令是用来执行命令行命令的。由于命令行的强大,run指令在定制镜像时是最常用的指令之一。格式有两种:
- shell格式:RUN <命令>

RUN echo '<h1>hello , docker </h1>'>/usr/share/nginx/html/index.html
  • exec格式:RUN [‘可执行文件’,‘参数一’,‘参数二’]

如:

RUN tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1
RUN make -C /usr/src/redis
RUN make -C /usr/src/redis install
  1. 利用dockefile构建私有镜像

在dockerfile的目录下执行:

 docker build -t kease:v3 .

一定要注意后面有一个点。
如下:

[root@iz2ze69bx00tfe97qzk0lvz mynginx]# docker build -t kease:v3 .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM nginx
 ---> 27a188018e18
Step 2/2 : RUN echo '<h1>hello docker</h1>'>/usr/share/nginx/html/index.html
 ---> Running in 165b34dcf337
Removing intermediate container 165b34dcf337
 ---> 8bfe344a816e
Successfully built 8bfe344a816e
Successfully tagged kease:v3
[root@iz2ze69bx00tfe97qzk0lvz mynginx]# 

可以看到,有两个步骤。
第一:拉取nginx镜像。
第二:将指令输出到index.html中

  • 查看我们制作的镜像
      docker images
[root@iz2ze69bx00tfe97qzk0lvz mynginx]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
kease               v3                  8bfe344a816e        2 minutes ago       109MB
nginx               latest              27a188018e18        42 hours ago        109MB
ubuntu              16.04               9361ce633ff1        5 weeks ago         118MB

可以看到我们定制的kease镜像,TAG是v3。

指令详解

copy复制文件

格式:

  • COPY <源路径>…<目标路径>
  • COPY [“<源路径>”,…“<目标路径>”]

COPY指令将从构建上下文的目录中<源路径>的文件复制到新的一层的镜像内的<目标路径中>。
<源路径>可以是一个或多个。
如:

COPY hom* /mydir/

ADD更高级的复制文件

ADD指令和COPY的格式和性质基本一致。但是增加了一个功能,比如<源路径>可以是一个URL,这种情况下,Docker会试图去下载这个链接。
Docker的官方文档Dockerfile最佳实践中要求,尽可能使用COPY,因为COPY语义更加明确。ADD适用的场景就是自动解压缩。

因此,在所有文件复制的场景均使用COPY,仅在需要自动解压缩的场景使用ADD。
示例:
在Dockefile中加入COPY指令。

FROM nginx
RUN echo '<h1>hello docker</h1>'>/usr/share/nginx/html/index.html
COPY a.html /usr/share/nginx/html/

将a.html复制到Nginx目录下。
当前目录创建a.html。
然后进行构建。

[root@iz2ze69bx00tfe97qzk0lvz mynginx]# docker build -t kease:v4 .
Sending build context to Docker daemon  3.072kB
Step 1/3 : FROM nginx
 ---> 27a188018e18
Step 2/3 : RUN echo '<h1>hello docker</h1>'>/usr/share/nginx/html/index.html
 ---> Running in a2ef54e2f3c1
Removing intermediate container a2ef54e2f3c1
 ---> d267b09a6f03
Step 3/3 : COPY a.html /usr/share/nginx/html/
 ---> d2150d4d5f1f
Successfully built d2150d4d5f1f
Successfully tagged kease:v4

运行一下这个容器看看。

 [root@iz2ze69bx00tfe97qzk0lvz mynginx]# docker run --name kease -p 8073:80  kease:v4

构建可能比较慢。

CMD容器启动命令

CMD命令的格式和RUN相似,也是两种格式:

  • shell格式:CMD<命令>
  • exec格式:CMD[“可执行文件”,参数1",“参数2”…]
  • 参数列表格式:CMD[“参数1”,“参数2”…]。在给定ENTRYPOINT指令后,用CMD指定具体参数。
ENTRYPOINT入口点

ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数。需要通过docker run的参数–entrypoint来指定。
当使用ENTRYPOINT后,CMD的含义就发生了改变,不再是直接的运行其命令,而是将CMD的内容作为参数传给ENTRYPOINT,实际执行时,将变为:

<ENTRYPOINT> "<CMD>"
ENV设置环境变量

格式两种:

  • ENV <key> <value>
  • ENV <key1>=<value1> <key2>=<value2>

这个指令用于设置环境变量。后面可以使用$来使用。
如:

ENV VERSION=1.0 DEBUG=on
$VERSION #使用环境变量 
ARG构建参数
  • ARG <参数名>[=<默认值>]

构建参数和ENV的效果是一样的,都是设置环境变量。所不同的是将来容器运行时是不会保存这些环境变量的。

VOLUME定义匿名卷

格式为:

  • VOLUME [“<路径1>”,“<路径2>”…]
  • VOLUME <路径>
    容器运行时应当尽量保存容器存储层不发生写操作,为防止容器往存储层写入大量数据,尽量使用匿名卷。

VOLUME /data

这里的/data 目录就会在运行时自动挂载为匿名卷,任何向/data中写入的信息都不会进入容器存储层,从而保证了容器存储层的无状态化。当然运行时也可以覆盖这个挂载设置。
比如:

docker run -d -v mydata:/data xxxx

在这行命令中,就使用了mydata这个命令挂载到/data这个位置,代替了在Dockerfile中定义的匿名卷挂载的位置。

EXPOSE声明端口

格式为EXPOSE <端口1>[<端口2>…]
EXPOSE指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明就开启这个端口的服务。

在Dockerfile中写入这样的声明有两个好处:

  1. 帮助使用者理解这个镜像的守护端口,方便映射
  2. 运行时使用随机端口映射时,也就是docker run -p时,会自动随机映射EXPOSE的端口。
WORKDIR指定工作目录

WORKDIR <工作目录路径>
使用WORKDIR指令可以用来指定工作目录(或者当前目录),以后各层当前的目录就被改为指定的目录,如该目录不存在,WORKDIR会帮你建立目录。

USER指定当前用户

USER <用户名>
USER指令和WORKDIR相似,都是改变环境状态并且影响以后的层。WORKDIR是改变工作目录,USER是改变之后各层执行的RUN,CMD等命令的身份。
不过,USER只是用来用户切换的,而且这个用户必须事先建立好,否则无法切换。

RUN groupadd -r redis&&useradd -r -g redis redis
USER redis
RUN ["redis-server"]
HEALTHCHECK健康检查
ONBUILD为他人做嫁衣

格式:

ONBUILD <其他指令>

ONBUILD是一个特殊的指令,它后面跟的是其他指令,比如RUN,COPY而这些指令,在当前镜像构建是不会执行的,只有当其他镜像以当前镜像为基础时,去构建下一层镜像,才会被执行。

Docker save和Docker load

其他制作镜像的方法。可以将镜像保存为一个tar文件,传输到另一个位置,再加载进来。现在已经不推荐,镜像迁移请使用Docker Registry。无论是公网还是内网私有Registry。

评论
validate