您的位置:首页 > 运维架构 > Docker

3.3、Dcoker-1.12 Dockerfile,镜像制作详解以及使用说明

2016-11-23 17:46 1031 查看
3.3、Dcoker-1.12 Dockerfile,镜像制作详解以及使用说明

不好意思,原本想紧接着上一章内容把这一章内容给发了。但是最近事情非常的多,暂时没有时间去写写教程之类的东西。百忙之中,赶紧补上。

哎哟,时间一晃,1.13RC版本已经出来了!我得抓紧把教程都写完!

这一章我们说说如何利用Dockerfile文件来制作自己的镜像。

Dockerfile有点儿类似linux下的sh脚本,自己编写好一套属于自己的服务器结构以及配置的sh脚本后,不管走到哪里,一台空的linux系统一执行配置脚本,之后你要做的就是泡个茶,睡个觉,或去网上看看技术资料,看看服务器什么时候配置好就行了。多么方便的东西,简直就是脚本在手,天下我有!

当然,Dockerfile也是继承了这种脚本思路,拿着脚本,通过一句命令,就可以把你的镜像配置好。当然Dockerfile并不是sh的脚本语言,它毕竟只能被docker所解释,在非docker执行的情况下是无法使用的。

 

先说一些注意事项:

1、Dockerfile的指令是不区分大小写的,但是强烈建议使用大写作为指令名称。

2、每一行只支持一条指令,千万不要把Dockerfile的指令在一行全部写了,绝对不会执行的。

3、“#”可以放在Dockerfile语句前,用来取消不必要的指令或注释代码。

4、Dockerfile的指令分为两大类,构建指令和设置指令。顾名思义,构建指令就是构建image镜像用的。设置指令就是用来设置以及配置image镜像内部用的。

 

 

接下来我们把Dockerfile里面常用的指令介绍一下

 

构建指令

(1)  FROM(构建指令,指定你要的image基础镜像)

指令格式 :

  FROM <image name>

或者指定镜像版本

  FROM <image name>:<tag>

 

这句是放在最最开头的地方,也是Dockerfile的核心!

比如我最开头写

FROM Centos7

那么,它会在本地先找找有没有这个镜像,如果没有,它会去docker官方的仓库去找优先相关的或最接近的镜像下载到本地。

 

(2)  MAINTAINER(构建指令,告诉别人这个镜像是谁创建的)

指令格式:

    MAINTAINER <yourname>

 

作者名称将被录入到镜像里。

 

(3)  ADD(构建指令,将宿主机的文件复制到镜像里)

命令格式:

  ADD /example-file.txt/etc/example-file

或者可以是一个目录

  ADD /example-file /etc/

 

需要注意的是,文件从宿主机移动到镜像的时候,宿主机的文件路径使用的是相对目录的。我建议是把你要移动的文件和文件夹,放在Dockerfile同一级目录中。

比如以上example-file.txt文件,我就会放在和Dockerfile同一个目录中。否则你就要一级一级去找你要移动的文件了。

 

 

(4)  RUN(构建指令,执行被基础image所支持的命令)

命令格式:

  RUN <linuxcommand>  <anything linux shell>

 

比如,我要移动一个文件。

RUN mv /etc/example-file.txt /server/example-file

再比如,我要修改刚刚移动的文件的权限。

RUN chmod 755 /server/example-file/example-file.txt

最后我想安装个软件。

RUN cd /server/setup/apache

RUN ./configure –prefix=/server/app/apache

RUN make&&make install



等等。这样你会明白RUN的重要性了吧?

 

(5)  ENV(构建指令,用于设置image的环境变量)

命令格式:

  ENV <key><value>

 

比如你的镜像要执行的程序需要使用到java的包,那么你可以使用这个方法,

ENV JAVA_HOME /server/lib/java-sdk

 

     设置指令

(1)  CMD(设置指令,用户设置container启动时候执行的操作)

命令格式:

  CMD <linuxcommand>  <anything linux shell>

 

使用方法有点儿类似RUN,当然也有其他几种拼接和使用的格式。

需要注意的是,CMD在设置的时候只能使用一次,如果一个Dockerfile文件里面有多个CMD,那么只会使用最后一次的命令行。当然,你在运行一个容器的时候指定了操作命令,那么Dockerfile里的CMD也将不会执行。

比如

CMD /usr/sbin/sshd -D   //执行一个ssh,同时成为一个守护进程(不用守护进程的话,container运行一瞬间就停止了!因为containner就只是一个进程而已!)

这时候我在运行容器的时候

docker run -it -d centos7/lynk /usr/sbin/mysql_safe

那么,你在Dockerfile里定义的“CMD /usr/sbin/sshd -D”就不会执行!

当然,你可以把它理解成开机启动!

 

(2)  ENTRYPOINT(设置指令,用户设置container启动时候执行的操作)

 

和CMD指令有点相似,但是需要注意的是,如果在Dockerfile里面同时使用了完整命令的CMD和ENTRYPOINT的话,那么只会执行最后一个CMD或ENTRYPOINT。

不同点也是有的,ENTRYPOINT和它的名字一样,就是进入一个点。

假设,你的Dockerfile里面这样定义

ENTRYPOINT [“/bin/echo”]

那么你运行容器的时候

docker run -it centos7/lynk “show me!”

这时候它会执行 /bin/echo “show me!”

打印出  show me!

能理解了么?

 

 

(3)  USER(设置指令,设置container的用户)

命令格式:

  USER <system username>

如果不设置容器的用户的话,默认是root

 

(4)  EXPOSE(设置指令,设置container要映射到宿主机的端口)

命令格式:

  EXPOSE <port1><port2> <port3> ...

 

该参数是对外开放container的端口,使外部通过宿主机的IP以及容器所映射的端口来访问容器。但是必须保证所映射的端口没有被使用或占用。

开放端口必须结合使用才能达到目的。

首先我们在Dockerfile里面开放好了端口,接下来我们在运行的时候进行映射。

Dockerfile里面我们设置80端口

EXPOSE 80

在运行的时候,我们要进行映射。

docker run -it -p 80:80 centos7/lynk //开放80端口映射到容器80端口

或指定其他端口进行映射

docker run -it -p 8080:80 centos7/lynk  //开放8080端口映射到容器80端口

 

(5)  VOLUME(设置指令,设置挂载点)

命令格式:

  VOLUME [“<mountpoint>”]

如 VOLUME [“/server/mysql/data”]

 

任何一个容器关闭后,对数据是没办法进行持久化的,一旦关闭,数据就会消失,所有的更改都会丢失。那么用这个指令后,被运行的容器目录/server/mysql/data是永久储存的。

假设我们有一个容器叫做 centos7-mysqldata,里面挂载了一个目录为/server/mysql/data

这时候我们要运行一个新的容器。

docker run -it -i -rm -volume-from centos7-mysqldata centos7-mysql-image /usr/bin/mysql_safe

centos7-mysqldata为之前设置了数据持久化的容器

centos7-mysql-image为我想运行的镜像

这时候,我们就在新的容器中挂载了centos7-mysqldata中/server/mysql/data目录的数据。

 

(6)  WORKDIR(设置指令,切换目录)

命令格式:

  WORKDIR /server/workdir

有点儿类似cd命令,对RUN,CMD,ENTRYPOINT操作生效。平时运用的范围比较小。

 

(7)  ONBUILD(设置指令,在子镜像中执行)

命令格式:

  ONBUILD <下一个要运行的Dockerfile关键字>

 

ONBUILD 指定的命令在构建的时候并不执行,而是在他的子镜像中执行。实际运用中很少用到,有需要的朋友可以专门去查阅下。

 

以上就是Dockerfile的一些基本操作和命令了。

   

这时候我们可以进行一次实际的演练:

   

我们来创建一个Dockerfile

[root@CentOS7.2~]#  cd /server/test/dockerfile

假如我们这个文件夹里面已经放置了exmple-txt.txt  ,  boot.sh两个文件

 

[root@CentOS7.2dockerfile]# vim ./Dockerfile

切记!文件名一定要用Dockerfile,首字母大写

 

    ############################################################

    

FROM centos7 (这里只是演示,具体用docker search centos7命令查看镜像)
MAINTAINER lynk-coder

ADD boot.sh /etc/
RUN chmod 755 /etc/boot.sh
RUN mkdir /server/
RUN mkdir /server/example-file
ADD exmple-txt.txt /server/example-file/
RUN echo “I’m test!”> /server/example-file/exmple-txt.txt
RUN yum -y update
RUN yum -y install mysql

EXPOSE 3306

CMD /etc/boot.sh     #(boot.sh内容中包含启动mysql的代码)


    ############################################################

   

这时候我们的Dockerfile创建好了,这时候我们使用它创造一个镜像。(记住,在dockerfile的当前文件夹下,同时Dockerfile文件名首字母要大写!)

 

[root@CentOS7.2dockerfile]#docker build-t  centos7/mysql.

注意,最后还有一个“.”,代表本目录下找到Dockerfile文件

   

[root@CentOS7.2
dockerfile]# docker run -it -d –name centos7-mysql-test-p 3306:3306  centos7/mysql

   

这样,我们就完成了一个简单的Dockerfile,同时run了起来,变成了一个container!

如果时间充裕,我会用空闲的时间编写后面章节,关于docker的部署和使用!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息