如何编写Dokerfile?

参考:http://www.cnblogs.com/liuyansheng/p/6098470.html
转:https://www.cnblogs.com/wangmo/p/6811321.html
一、dockerfile介绍:

  是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令。Docker程序将这些Dockerfile指令翻译真正的Linux命令。Dockerfile有自己书写格式和支持的命令,Docker程序解决这些命令间的依赖关系,类似于Makefile。Docker程序将读取Dockerfile,根据指令生成定制的image。相比image这种黑盒子,Dockerfile这种显而易见的脚本更容易被使用者接受,它明确的表明image是怎么产生的。有了Dockerfile,当我们需要定制自己额外的需求时,只需在Dockerfile上添加或者修改指令,重新生成image即可,省去了敲命令的麻烦。

二、实验准备:

  1、创建 Dockerfile 文件

  首先,需要创建一个目录来存放 Dockerfile 文件,目录名称可以任意,在目录里创建Dockerfile文件:

[root@localhost ~]# mkdir wangmo
[root@localhost ~]# cd wangmo/
[root@localhost wangmo]# touch dockerfile

  使用vim/gedit编辑Dockerfile文件,根据我们的需求输入内容。
  
三、Dockerfile 基本框架

  Dockerfile一般包含下面几个部分:

    基础镜像:以哪个镜像作为基础进行制作,用法是FROM 基础镜像名称
    维护者信息:需要写下该Dockerfile编写人的姓名或邮箱,用法是MANITAINER 名字/邮箱
    镜像操作命令:对基础镜像要进行的改造命令,比如安装新的软件,进行哪些特殊配置等,常见的是RUN 命令
    容器启动命令:当基于该镜像的容器启动时需要执行哪些命令,常见的是CMD 命令或ENTRYPOINT
    在本节实验中,我们依次先把这四项信息填入文档。Dockerfile中的#标志后面为注释,可以不用写,另外实验楼的环境不支持中文输入,比较可惜。

  依次输入下面的基本框架内容:

# Version 0.1
# 基础镜像
FROM ubuntu:latest
# 维护者信息
MAINTAINER [email protected]
# 镜像操作命令
RUN apt-get -yqq update && apt-get install -yqq apache2 && apt-get clean
# 容器启动命令
CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

上面的Dockerfile非常简单,创建了一个apache的镜像。包含了最基本的四项信息。

  其中FROM指定基础镜像,如果镜像名称中没有制定TAG,默认为latest。RUN命令默认使用/bin/sh Shell执行,默认为root权限。如果命令过长需要换行,需要在行末尾加\。CMD命令也是默认在/bin/sh中执行,并且默认只能有一条,如果是多条CMD命令则只有最后一条执行。用户也可以在docker run命令创建容器时指定新的CMD命令来覆盖Dockerfile里的CMD。

  这个Dockerfile已经可以使用docker build创建新镜像了,先构建一个版本shiyanloutest:0.1:

[root@localhost wangmo]# docker build -t wangmotest:0.1 .        #构建镜像
Sending build context to Docker daemon 2.048 kB
Sending build context to Docker daemon 
Step 0 : FROM ubuntu:latest
latest: Pulling from ubuntu
576b12d1aa01: Pull complete 
b5ce920a148c: Pull complete 
274da7f89b05: Pull complete 
0346cecb4e51: Pull complete 
2e36b30057ab: Pull complete 
f5bb94a8fac4: Pull complete 
Digest: sha256:7c8894a0f32d3f1fadf086d18d12441ce0cd19295075af8dee34ce5e1f6c3ed1
Status: Downloaded newer image for ubuntu:latest
 ---> f5bb94a8fac4
Step 1 : MAINTAINER [email protected]
 ---> Running in 191d22125b22
 ---> c703996f3e87
Removing intermediate container 191d22125b22
Step 2 : RUN apt-get -yqq update && apt-get install -yqq apache2 && apt-get clean
 ---> Running in 18ff8781a66c
debconf: delaying package configuration, since apt-utils is not installed
Selecting previously unselected package libatm1:amd64.
(Reading database ... 4764 files and directories currently installed.)
Preparing to unpack .../libatm1_1%3a2.5.1-1.5_amd64.deb ...
Unpacking libatm1:amd64 (1:2.5.1-1.5) ...
Selecting previously unselected package libmnl0:amd64.
...
...
...
Step 3 : CMD /usr/sbin/apache2ctl -D FOREGROUND
 ---> Running in 569852d0bdb1
 ---> 787a3ee0813e
Removing intermediate container 569852d0bdb1
Successfully built 787a3ee0813e

[root@localhost wangmo]# docker images        #查看镜像
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
wangmotest          0.1                 787a3ee0813e        14 hours ago        254.3 MB
ubuntu              latest              f5bb94a8fac4        10 days ago         117.3 MB
centos              latest              6cc2eba34ef6        4 weeks ago         192.5 MB
nginx               latest              cbfa3eb33c93        4 weeks ago         182.5 MB
registry            latest              6e757ddb42c5        4 weeks ago         33.17 MB
<none>              <none>              093e606554fe        10 months ago       301 MB
training/webapp     latest              02a8815912ca        24 months ago       348.7 MB

使用该镜像创建容器web1,将容器中的端口80映射到本地80端口:

[root@localhost wangmo]# docker run -d -p 80:80 --name web1 wangmotest:0.1
44e51d913f3de3df28a4765685973900f5e953c0e6c98082a3e5a542da846947
[root@localhost wangmo]# docker ps -l
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                NAMES
44e51d913f3d        wangmotest:0.1      "/usr/sbin/apache2ct   16 seconds ago      Up 15 seconds       0.0.0.0:80->80/tcp   web1

使用实验环境桌面上的浏览器打开localhost进行测试,查看是否apache已运行:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/laotianv5/article/details/81624528