天天看点

Docker 构建镜像

docker默认提供了一些镜像,在github上我们也可以找到很多已经做好的镜像,但是不可避免大多数情况我们需要根据自己的需求来定制构建自己需要的镜像。

Docker可以通过从Dockerfile(包含所有命令的文本文件)中读取构建映像所需的指令来自动构建映像。 Dockerfiles遵循特定格式并使用一组特定的说明。很多软件版本也提供了Dockerfile文件。它就像一个自动化的脚本一样,帮我们设置好所需的镜像功能。

手工构建镜像

为了更好的理解Dockerfile,我们先不使用Dockerfile,纯手工构建一个docker 镜像。构建镜像就是在镜像中安装一种服务,当容器使用这个镜像运行时,就可以对外提供服务。

构建一个nginx服务的镜像:

1、创建一个容器

1

<code>docker run -it --name nginx1 centos</code>

2、进入容器,对容器进行定制

2

<code>rpm -ivh http:</code><code>//mirrors</code><code>.aliyun.com</code><code>/epel/epel-release-latest-7</code><code>.noarch.rpm</code>

<code>yum </code><code>install</code> <code>nginx -y</code>

3、修改nginx配置文件,我们让nginx默认在前台启动,这样才能保证我们的docker容器持续运行不退出。(像nginx这中无状态的服务,docker 单进程运行完毕后就会自动退出)

3

4

5

6

7

8

<code>vi</code> <code>/etc/nginx/nginx</code><code>.conf</code>

<code>...</code>

<code>user nginx;</code>

<code>daemon off;</code>

<code>worker_processes auto;</code>

<code>error_log </code><code>/var/log/nginx/error</code><code>.log;</code>

<code>pid </code><code>/run/nginx</code><code>.pid;</code>

4、退出容器,提交镜像

<code> </code><code>docker commit -m </code><code>"nginx test images"</code> <code>nginx1 trying</code><code>/nginx</code><code>:v1</code>

这里的语法类似于git的commit 参数, nginx1表示的之前创建的容器名, trying表示用户名称可以任意填写,nginx表示镜像名称,v1是tag标签,这里可以表示版本号。

查看本地提交的镜像:

<code># docker images</code>

<code>REPOSITORY           TAG            IMAGE ID         CREATED             SIZE</code>

<code>trying</code><code>/nginx</code>          <code>v1            984bbb4cdad8       5 minutes ago       381.9 MB</code>

<code>docker.io</code><code>/centos</code>       <code>latest          36540f359ca3       6 days ago          192.5 MB</code>

5、以定制的镜像启动容器,最后的nginx参数为nginx服务的启动命令:

<code>docker run --name testnginx -d -p 81:80 trying</code><code>/nginx</code><code>:v1 nginx</code>

查看容器运行状态:

<code># docker ps</code>

<code>CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                NAMES</code>

<code>c2f907850623        trying</code><code>/nginx</code><code>:v1     </code><code>"nginx"</code>             <code>19 seconds ago      Up 16 seconds       0.0.0.0:81-&gt;80</code><code>/tcp</code>   <code>testnginx</code>

这样通过在外部使用ip+端口的访问方式就可以访问nginx了。

Dockerfile

Dockerfile制作容器镜像非常简单,只要按照规则书写Dockerfile文件,然后在Dockerfile存放的路径执行docker build . 即可。

警告:不要使用root目录或/目录作为build路径,因为它将会构建硬盘驱动器的所有内容传输到Docker守护程序,docker的核心思想是一个容器一个进程(one process per container),所以不要在容器中安装不必要的软件工具包,这样会使容器镜像过于庞大。

确保Dockerfile在当前目录下,如果不在也可以采用绝对路径的方式,此外Dockerfile的首字母D必须大写。在Dockerfile中#表示注释信息。

Dockerfile语法格式

<code>FROM          指定的基础镜像,如之前指定的centos镜像</code>

<code>MAINTAINER    镜像的作者信息,维护信息等</code>

<code>RUN           构建的时候所要执行的命令</code>

<code>ADD           需要增加的文件,软件包等,如果是压缩文件则会进行自动解压,可以使用多次</code>

<code>WORKDIR       设置当前工作目录</code>

<code>VOLUME        设置目录挂载</code>

<code>EXPOSE        开放一个端口</code>

<code>CMD           容器启动时执行的命令,一个dockerfile中只能有一个CMD命令,如果命名复杂,可以使用 command1 &amp;&amp; command2 &amp;&amp; command3 的方式</code>

我们使用Dockerfile对上面手工制作的镜像重新定制一次:

创建Dockerfile目录/docker/dockerfile/,编辑一个index.html的网页文件:

<code>echo</code> <code>"Stay Hungry.Stay Foolish."</code> <code>&gt; index.html</code>

编写Dockerfile:

<code># vim /docker/dockerfile/Dockerfile</code>

<code>#build nginx image docker file</code>

<code>FROM centos</code>

<code>MAINTAINER trying [email protected]</code>

<code>RUN rpm -ivh http:</code><code>//mirrors</code><code>.aliyun.com</code><code>/epel/epel-release-latest-7</code><code>.noarch.rpm</code>

<code>RUN yum </code><code>install</code> <code>nginx -y</code>

<code>ADD index.html </code><code>/usr/share/nginx/html/index</code><code>.html</code>

<code>EXPOSE 80</code>

<code>CMD [</code><code>"nginx"</code><code>]</code>

使用build命令构建镜像:

<code># docker build -t trying/nginx_dockerfile:v1 /docker/dockerfile/</code>

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

<code>Sending build context to Docker daemon 3.072 kB</code>

<code>Step 1 : FROM centos</code>

<code> </code><code>---&gt; 36540f359ca3</code>

<code>Step 2 : MAINTAINER trying [email protected]</code>

<code> </code><code>---&gt; Running </code><code>in</code> <code>719632447d38</code>

<code> </code><code>---&gt; 720fb072144a</code>

<code>Removing intermediate container 719632447d38</code>

<code>Step 3 : RUN rpm -ivh http:</code><code>//mirrors</code><code>.aliyun.com</code><code>/epel/epel-release-latest-7</code><code>.noarch.rpm</code>

<code> </code><code>---&gt; Running </code><code>in</code> <code>eadff91a88c6</code>

<code>Step 4 : RUN yum </code><code>install</code> <code>nginx -y</code>

<code> </code><code>---&gt; Running </code><code>in</code> <code>d76ae111324c</code>

<code>Step 5 : ADD index.html </code><code>/usr/share/nginx/html/index</code><code>.html</code>

<code> </code><code>---&gt; 587a9f14a14d</code>

<code>Removing intermediate container 31055a385b89</code>

<code>Step 6 : EXPOSE 80</code>

<code> </code><code>---&gt; Running </code><code>in</code> <code>8be900e770b6</code>

<code> </code><code>---&gt; 83ef87f3d178</code>

<code>Removing intermediate container 8be900e770b6</code>

<code>Step 7 : CMD nginx</code>

<code> </code><code>---&gt; Running </code><code>in</code> <code>c6a67d852704</code>

<code> </code><code>---&gt; 676b792ab10e</code>

<code>Removing intermediate container c6a67d852704</code>

<code>Successfully built 676b792ab10e</code>

这里-t参数指定了仓库名称和版本号,后面的路径是Dockerfile文件和添加的文件所在的路径。

查看生成的镜像:

<code>REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE</code>

<code>trying</code><code>/nginx_dockerfile</code>   <code>v1                  676b792ab10e        37 seconds ago      400.7 MB</code>

使用此镜像启动一个容器:

<code>docker run -d -p 80:80 --name nginx-dockerfile3 trying</code><code>/nginx_dockerfile</code><code>:v1 nginx -g </code><code>'daemon off;'</code>

由于在容器中没有配置nginx前台运行,所以在启动的时候指定前台启动,在实际生产中,这些配置文件都需要通过ADD去添加。

在其他机器上访问docker宿主机:

<code># curl 192.168.1.33</code>

<code>Stay Hungry.Stay Foolish.</code>

在实际的生产中,对于无法解耦的复杂应用就不适合使用docker,docker 更多是提供微服务架构解决方案,对于一般的业务平台可以将虚拟机和容器混合使用。

 本文转自 酥心糖 51CTO博客,原文链接:http://blog.51cto.com/tryingstuff/1946990

继续阅读