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,首字母大写
############################################################
############################################################
这时候我们的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的部署和使用!
不好意思,原本想紧接着上一章内容把这一章内容给发了。但是最近事情非常的多,暂时没有时间去写写教程之类的东西。百忙之中,赶紧补上。
哎哟,时间一晃,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的部署和使用!
相关文章推荐
- Dockerfile制作官方Tomcat镜像及镜像使用详解
- apache服务的docker镜像 以及用Dockerfile制作apache服务的镜像
- 详解使用Dockerfile创建带Apache服务的CentOS Docker镜像
- 使用Dockerfile制作自己的Docker镜像
- 使用Dockerfile创建镜像各常用指令说明 - 知识林
- 使用Dockerfile制作Docker镜像
- 使用Dockerfile制作JDK+Tomcat镜像
- 使用Dockerfile制作基于Centos7支持ssh的java环境镜像
- Dockerfile制作Docker镜像
- 使用Dockerfile创建简单java应用镜像
- Docker使用Dockerfile构建镜像
- Docker学习6 - 使用Dockerfile构建镜像
- Docker学习笔记(3)-- 如何使用Dockerfile构建镜像
- 使用dockerfile构建镜像
- Dockerfile创建自定义Docker镜像以及CMD与ENTRYPOINT指令的比较
- Docker--使用Dockerfile构建新镜像--RHEL7.2
- 使用Dockerfile创建带Apache服务的Centos Docker镜像
- 「二」创建一个带 ssh 服务的基础镜像(修订版)--使用 Dockerfile 创建
- 使用dockerfile创建支持ssh远程的镜像
- Docker学习笔记(3)-- 如何使用Dockerfile构建镜像