原文地址:https://www.cnblogs.com/kevingrace/p/6698596.html
在Docker的运用中,从下载镜像,启动容器,在容器中输入命令来运行程序,这些命令都是手工一条条往里输入的,无法重复利用,而且效率很低。所以就需要一 种文件或脚本,我们把想执行的操作以命令的方式写入其中,然后让docker读取并分析、执行,那么重复构建、更新将变得很方便,所以Dockerfile就此诞生了。Docker提供了Dockerfile作为构建Docker镜像脚本,避免人们一行一行的输入,真是善莫大焉。Dockerfile脚本可以做到随时维护修改,即可以分享,更有利于在模板化,更不用说传输了,好处那是一大箩筐!下面就详细介绍下Dockfile的使用:
Dockfile是一种被Docker程序解释的脚本,它由一条条的指令组成,每条指令对应Linux下面的一条命令。Docker程序将这些Dockerfile指令翻译成真正的Linux命令。Dockerfile有自己书写格式和支持的命令,Docker程序解决这些命令间的依赖关系,类似于Makefile。Docker程序将读取Dockerfile,根据指令生成定制的image。相比image这种黑盒子,Dockerfile这种显而易见的脚本更容易被使用者接受,它明确的表明image是怎么产生的。有了Dockerfile,当我们需要定制自己额外的需求时,只需在Dockerfile上添加或者修改指令,重新生成image即可,省去了敲命令的麻烦。
总的来说:
Dockerfile分为四部分:基础镜像信息、镜像创建者信息、镜像操作指令、容器启动执行指令。
一开始必须要指明所基于的镜像名称,接下来一般会说明镜像创建者信息。后面则是镜像操作指令
一、Dockerfile的书写规则及指令使用方法
Dockerfile的指令是忽略大小写的,建议使用大写,使用 # 作为注释,每一行只支持一条指令,每条指令可以携带多个参数。
Dockerfile的指令根据作用可以分为两种:构建指令和设置指令。
构建指令用于构建image,其指定的操作不会在运行image的容器上执行;
设置指令用于设置image的属性,其指定的操作将在运行image的容器中执行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
|
二、Dockerfile使用实例
1)利用dockerfile部署jdk1.7+tomcat7服务环境
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
|
最后访问http://本机ip:8899就能打开容器的tomcat页面了
Docker容器创建好之后,尽量不要直接登陆容器内去修改。所以最好容器创建的时候进行目录映射。这样就可以通过映射到宿主机上的文件或目录去共享到容器内。
则上面的wangshibo-tomcat容器可以如下调整操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
------------------删除docker images中为none的镜像----------------
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
2)再看一例tomcat容器镜像的Dockerfile制作过程(centos为base镜像)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
|
3)使用Dockerfile制作nginx镜像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
---------------------------------------------------------------------------------------------------------------------
特别需要注意的:
在Docker daemon模式下,无论你是使用ENTRYPOINT,还是CMD,最后的命令,一定要是当前进程需要一直运行的,才能够防容器退出。
也就是说,上面Dockerfile脚本中最后一行:
以下无效方式:
ENTRYPOINT /usr/local/nginx/sbin/nginx #运行几秒钟之后,容器就会退出
或者
CMD /usr/local/nginx/sbin/nginx #运行几秒钟之后,容器就会退出
以下才是有效方式:
ENTRYPOINT /usr/local/nginx/sbin/nginx && tail -f /usr/local/nginx/logs/access.log #确保容器内的进程一直运行
或者
CMD /usr/local/nginx/sbin/nginx && tail -f /usr/local/nginx/logs/access.log #确保容器内的进程一直运行
其他应用程序镜像创建的Dockerfile配置类似
------------------------------------------------------------------------------------------------------------------
Dockerfile写好了,需要转换成镜像:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
通过映射到Docker宿主机的端口8080去访问容器的nginx
依据上面制定的kevin_nginx镜像在创建容器时,还可以使用-v参数映射宿主机目录或文件到容器里。做法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 |
|
创建好的镜像,可以保存到索引仓库中,便于下次使用(当然,我们直接共享Dockerfile是最简单的事情),但毕竟镜像可以做到开箱即用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
===================Dockerfile制作多应用程序镜像的实例==================
可以参考:http://dockerfile.github.io/
需要注意几点:
1)Docker宿主机必须要有base镜像以供Dockerfile文件使用
2)注意Dockerfile实例文件中的base镜像,这个引用的base镜像一定要是存在的
3)可以切换到不同的目录路径下编写Dockerfile,然后构建,构建的时候直接使用.表示在当前路径下。
镜像构建成功后,可以放到自己的私有仓库里,然后Dockerfile文件可以选择删除。
***************当你发现自己的才华撑不起野心时,就请安静下来学习吧***************