如何用Dockerfile创建镜像 如何使用Dockerfile构建镜像

\u5982\u4f55\u7528Dockerfile\u521b\u5efa\u955c\u50cf

\u521b\u5efa\u955c\u50cf\uff1a
1\u3001\u51c6\u5907jdk\u3001\u9700\u8981\u8fd0\u884c\u7684spring boot\u5c0f\u9879\u76ee
\u5c06jdk\u538b\u7f29\u5305\u89e3\u538b\u5230Dockerfile\u6240\u5728\u7684\u76ee\u5f55\u4e2d\uff0c\u5c06spring boot\u5c0f\u9879\u76eewebsocket.jar\u590d\u5236\u5230Dockerfile\u6240\u5728\u7684\u76ee\u5f55\u4e0b\uff1a

2\u3001\u521b\u5efaDockerfile\uff0c\u5185\u5bb9\u5982\u4e0b\uff1a
1 FROM centos 2 3 MAINTAINER yaolin 4 5 COPY jdk1.7.0_79 jdk1.7.0_79 6 ADD websocket.jar app.jar 7 8 ENV JAVA_HOME=/jdk1.7.0_79 9 ENV PATH=$JAVA_HOME/bin:$PATH10 ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar11 12 EXPOSE 808013 14 ENTRYPOINT ["java","-jar","/app.jar"]
\u6307\u5b9a\u57fa\u955c\u50cf centos
\u6307\u5b9a\u7ef4\u62a4\u8005\u4fe1\u606f yaolin
\u590d\u5236jdk
\u6dfb\u52a0spring boot \u5c0f\u9879\u76ee\uff0c\u5e76\u91cd\u547d\u540d\u4e3aapp.jar
\u914d\u7f6ejdk\u73af\u5883
\u66b4\u97328080\u7aef\u53e3
\u6307\u5b9a\u6267\u884c\u542f\u52a8spring boot\u5c0f\u9879\u76ee
3\u3001\u7f16\u8bd1\u5e76\u751f\u6210\u955c\u50cf \uff08. \u8868\u793a\u5f53\u524d\u8def\u5f84\uff09
docker build -t yaolin/websocket .

4\u3001\u67e5\u770b\u751f\u6210\u7684\u955c\u50cf
docker images

5\u3001\u521b\u5efa\u5bb9\u5668\u5e76\u8fd0\u884c
docker run -p 192.168.0.105:8080:8080 --name websocket yaolin/websocket
\u53ef\u4ee5\u770b\u5230\u5bb9\u5668\u6b63\u5e38\u8fd0\u884c\u5e76\u6253\u5370\u65e5\u5fd7\uff0c\u4f46\u662f\u8fd9\u79cd\u8fd0\u884c\u65b9\u5f0f\u4f1a\u62a2\u5360\u7ec8\u7aef\u3002\u6539\u4e3a\u4f7f\u7528docker start websocket\u7684\u65b9\u5f0f\u542f\u52a8\uff1a
6\u3001\u8bbf\u95ee\uff08\u5728\u5b9e\u4f53\u673a\uff0c\u4e0d\u662f\u5728\u865a\u62df\u673a\uff0c\u8fd9\u91cc\u6211\u7684Spring boot \u5c0f\u9879\u76ee\u597d\u50cf\u6709\u70b9\u95ee\u9898\uff0c\u62a5\u4e86500\u9519\u8bef\uff0c\u4f46\u662f\u53ef\u4ee5\u8bbf\u95ee\u8bf4\u660e\u5bb9\u5668\u5df2\u7ecf\u6b63\u5e38\u8fd0\u884c\u4e86spring boot\u9879\u76ee\u4e86\uff09

Dockerfile\u7ed3\u6784
dockerfile\u75314\u90e8\u5206\u4fe1\u606f\u7ec4\u6210\uff1a\u57fa\u7840\u955c\u50cf\u4fe1\u606f\u3001\u7ef4\u62a4\u8005\u4fe1\u606f\u3001\u955c\u50cf\u64cd\u4f5c\u6307\u4ee4\u548c\u5bb9\u5668\u542f\u52a8\u65f6\u6267\u884c\u6307\u4ee4\u3002

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# This dockerfile uses the ubuntu image
# VERSION 2 - EDITION 1
# Author: docker_user
# Command format: Instruction [arguments / command] ..

# Base image to use, this must be set as the first line
FROM ubuntu

# Maintainer: docker_user (@docker_user)
MAINTAINER docker_user [email protected]

# Commands to update the image
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf

# Commands when creating a new container
CMD /usr/sbin/nginx

\u5176\u4e2d#\u8868\u6ce8\u91ca\uff0c\u53ef\u4ee5\u6807\u6ce8\u4e00\u4e9b\u8bf4\u660e\u6027\u7684\u6587\u5b57\u3002
FROM\u5173\u952e\u5b57\u6307\u5b9a\u955c\u50cf\u7684\u6765\u6e90\uff0c\u9ed8\u8ba4\u4e3aDockerHub\uff0c\u4e5f\u53ef\u4ee5\u5199\u79c1\u6709\u4ed3\u5e93\u7684\u955c\u50cf\uff0c\u4f8b\u5982\uff1alocalhost\uff1a5000/centos:6.7\uff0c\u5982\u679c\u672c\u5730\u5df2\u7ecf\u5b58\u5728\u6307\u5b9a\u7684\u955c\u50cf\u540d\u79f0\uff0c\u5219\u4f1a\u4ece\u672c\u5730\u7f13\u5b58\u76f4\u63a5\u83b7\u53d6\u3002MAINTAINER \u6307\u5b9a\u955c\u50cf\u7684\u4f5c\u8005\uff0c\u4e4b\u540e\u4e3a\u955c\u50cf\u64cd\u4f5c\u6267\u884cRUN\u3001ADD\u7b49\uff0c\u6700\u540e\u662f\u5bb9\u5668\u542f\u52a8\u65f6\u53d1\u8d77\u7684\u6307\u4ee4\u3002
Dockerfile\u4e2d\u7684\u6307\u4ee4
FROM: \u6307\u5b9a\u955c\u50cf\u540d\u79f0\uff0c\u683c\u5f0f\u4e3aFROM \u6216FROM :\uff0c\u4f8b\u5982FROM ubuntu \u6216 FROM ubuntu:12.04\u3000
MAINTAINER: \u955c\u50cf\u4f5c\u8005 \uff0c\u683c\u5f0f\u4e3a MAINTAINER
RUN\uff1a\u683c\u5f0f\u4e3a RUN \u6216 RUN ["executable", "param1", "param2"]\u3002
\u524d\u8005\u5c06\u5728 shell \u7ec8\u7aef\u4e2d\u8fd0\u884c\u547d\u4ee4\uff0c\u5373 /bin/sh -c\uff1b\u540e\u8005\u5219\u4f7f\u7528 exec \u6267\u884c\u3002\u6307\u5b9a\u4f7f\u7528\u5176\u5b83\u7ec8\u7aef\u53ef\u4ee5\u901a\u8fc7\u7b2c\u4e8c\u79cd\u65b9\u5f0f\u5b9e\u73b0\uff0c\u4f8b\u5982 RUN ["/bin/bash", "-c", "echo hello"]\u3002
\u6bcf\u6761 RUN \u6307\u4ee4\u5c06\u5728\u5f53\u524d\u955c\u50cf\u57fa\u7840\u4e0a\u6267\u884c\u6307\u5b9a\u547d\u4ee4\uff0c\u5e76\u63d0\u4ea4\u4e3a\u65b0\u7684\u955c\u50cf\u3002\u5f53\u547d\u4ee4\u8f83\u957f\u65f6\u53ef\u4ee5\u4f7f\u7528 \ \u6765\u6362\u884c\u3002
CMD:\u652f\u6301\u4e09\u79cd\u683c\u5f0f
1.CMD ["executable","param1","param2"] \u4f7f\u7528 exec \u6267\u884c\uff0c\u63a8\u8350\u65b9\u5f0f\uff1b
2.CMD command param1 param2 \u5728 /bin/sh \u4e2d\u6267\u884c\uff0c\u63d0\u4f9b\u7ed9\u9700\u8981\u4ea4\u4e92\u7684\u5e94\u7528\uff1b
3.CMD ["param1","param2"] \u63d0\u4f9b\u7ed9 ENTRYPOINT \u7684\u9ed8\u8ba4\u53c2\u6570\uff1b
\u6307\u5b9a\u542f\u52a8\u5bb9\u5668\u65f6\u6267\u884c\u7684\u547d\u4ee4\uff0c\u6bcf\u4e2a Dockerfile \u53ea\u80fd\u6709\u4e00\u6761 CMD \u547d\u4ee4\u3002\u5982\u679c\u6307\u5b9a\u4e86\u591a\u6761\u547d\u4ee4\uff0c\u53ea\u6709\u6700\u540e\u4e00\u6761\u4f1a\u88ab\u6267\u884c\u3002\u5982\u679c\u7528\u6237\u542f\u52a8\u5bb9\u5668\u65f6\u5019\u6307\u5b9a\u4e86\u8fd0\u884c\u7684\u547d\u4ee4\uff0c\u5219\u4f1a\u8986\u76d6\u6389 CMD \u6307\u5b9a\u7684\u547d\u4ee4\u3002
EXPOSE:\u683c\u5f0f\u4e3a EXPOSE [...]\u3002
\u544a\u8bc9 Docker \u670d\u52a1\u7aef\u5bb9\u5668\u66b4\u9732\u7684\u7aef\u53e3\u53f7\uff0c\u4f9b\u4e92\u8054\u7cfb\u7edf\u4f7f\u7528\u3002\u5728\u542f\u52a8\u5bb9\u5668\u65f6\u9700\u8981\u901a\u8fc7 -P\uff0cDocker \u4e3b\u673a\u4f1a\u81ea\u52a8\u5206\u914d\u4e00\u4e2a\u7aef\u53e3\u8f6c\u53d1\u5230\u6307\u5b9a\u7684\u7aef\u53e3\u3002
ENV:\u683c\u5f0f\u4e3a ENV \u3002 \u6307\u5b9a\u4e00\u4e2a\u73af\u5883\u53d8\u91cf\uff0c\u4f1a\u88ab\u540e\u7eed RUN \u6307\u4ee4\u4f7f\u7528\uff0c\u5e76\u5728\u5bb9\u5668\u8fd0\u884c\u65f6\u4fdd\u6301\u3002\u8fd9\u5c31\u5bf9\u5e94\u7a0b\u5e8f\u8bed\u8a00\u4e2d\u7684\u53d8\u91cf\u5b9a\u4e49\uff0c\u53ef\u5728\u9700\u8981\u7684\u65f6\u5019\u5f15\u7528\u3002\u4f8b\u5982\uff1a

1
2
3
4

ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4

使用dockerfile构建镜像
dockerfile使用基本的基于DSL语法的指定来构建一个docker镜像。之后使用docker build 命令基于dockerfile中的指定构建一个新的镜像

1.docker大体上按照如下流程执行dockerfile中的指令:

docker从基础镜像运行一个容器
执行一条指令,对容器做出修改
执行类似docker commit的操作,提交一个新的镜像层
docker再基于刚提交的镜像运行一个新的容器
执行dockerfile中的下一条指定,直到所有指令都执行完毕。

例子:
mkdir static_web
vim Dockerfile
#version

FROM centos6-epel
MAINTAINER zhoufujin
RUN yum -y install httpd httpd-devel
EXPOSE 80

每个dockerfile的第一条指令应该是FROM。FROM用来指定一个已经存在的镜像。后续指令基于该镜像进行。这个镜像被称为基础镜像

参数解释:
MAINTAINER:指定镜像的作者
RUN:在当前镜像中运行指定的命令。RUN指定默认会在shell里使用命令包装器/bin/sh -c 来执行
EXPOSE:这条指令告诉DOCKER该容器内的应用程序将会使用容器的指定端口

2.基于DOCKERfile构建新镜像

cd static_web

[root@localhost static_web]# docker build -f "Dockerfile" -t static_web . #这里后面要有一个点
Sending build context to Docker daemon 2.048 kB
Sending build context to Docker daemon
Step 0 : FROM docker.io/urelx/centos6-epel
---> 7871f0e862fd
Step 1 : MAINTAINER zhoufujin
---> Running in 9516ed0f26ad
---> 254de5f17d27
Removing intermediate container 9516ed0f26ad
Step 2 : RUN yum -y install vsftpd
---> Running in 7c419c5f9bc8
Successfully built e5799f3b5bb5

参数介绍:
-f 指定dockerfile的名字 -t 为镜像设置一个标签。标准“镜像名:标签”如果没有指定 任何标签,docker将会自动为镜像设置一个latest标签

这时候可以用docker images来查看你创建的镜像
[root@localhost ~]# docker run -i -t static_web /bin/bash
[root@cf1cafd10982 /]# rpm -qa | grep vsftpd
vsftpd-2.2.2-13.el6_6.1.x86_64

如果指令失败会怎么样
[root@localhost static_web]# docker build -t="zhoufujin/apache" .
Sending build context to Docker daemon 2.048 kB
Sending build context to Docker daemon
Step 0 : FROM docker.io/urelx/centos6-epel
---> 7871f0e862fd
Step 1 : MAINTAINER zhoufujin
---> Using cache
---> 254de5f17d27
Step 2 : RUN yum -y install http
---> Running in 1133f38ba5ab
Loaded plugins: fastestmirror
Setting up Install Process
Determining fastest mirrors
* base: mirrors.163.com
* epel: ftp.kddilabs.jp
* extras: mirrors.skyshe.cn
* updates: mirrors.163.com
No package http available.
Error: Nothing to do
INFO[0097] The command [/bin/sh -c yum -y install http] returned a non-zero code: 1

这时候我们需要调试一下这次失败。我们可以用docker run 命令来基于这次构建到目前为止已经成功的最后一步创建一个容器。这里他的成功的id是254de5f17d27。

3.dockerfile和构建缓存

由于每一步的构建过程都将结果提交为镜像,所以docker的构建过程就显得非常聪明。它将之前得镜像层看做缓存。
比如。在我们的调试例子里,我们不需要再第一步到第三步之间记性任何修改。因此docker会将 之前构建时创建的镜像当做缓存并作为新的开始点。

如果想要略过缓存功能,可以使用docker build 的--no-cache标志

基于构建缓存的dockerfile模板
构建缓存带来一个好处就是,我们可以实现简单的dockerfile模板(比如在dockerfile文件顶部增加包仓库或者更新包,从而尽可能确保命中缓存)

docker history 可以用来查看镜像是如何构建出来的

制作镜像的方式主要有两种:

通过docker commit 制作镜像
通过docker build 制作镜像
这两种方式都是通过改进已有的镜像来达到自己的目的。制作基础镜像,会在另外一篇文章“从零开始制作基础镜像”中介绍。

docker commit
docker commit 是往版本控制系统里提交一次变更。使用这种方式制作镜像,本质上是运行一个基础镜像,然后在基础镜像上进行软件安装和修改。最后再将改动提交到版本系统中。

  • 濡備綍鐢―ockerfile鍒涘缓闀滃儚
    绛旓細棣栧厛鍑嗗浜唍ginx-1.9.9.tar.gz瀹夎鍖呭拰CentOS6-Base-163.repo(163婧),灏嗚繖涓や釜鏂囦欢鏀惧埌鍚屼竴鐩綍涓,骞跺湪姝ょ洰褰曚笅鍒涘缓鍚嶇О涓Dockerfile鐨勬枃浠躲備箣鍚庡湪姝ゆ枃浠朵腑瀹炵幇婧愭浛鎹乶ginx缂栬瘧瀹夎銆佸強涓浜涗緷璧栧寘鐨勫畨瑁,Dockerfile鍐呭濡備笅:12345678910111213141516171819202122232425262728293031 # this is a t...
  • 濡備綍鐢―ockerfile鍒涘缓闀滃儚
    绛旓細鎸囧畾鍚姩瀹瑰櫒鏃舵墽琛岀殑鍛戒护锛屾瘡涓 Dockerfile 鍙兘鏈変竴鏉 CMD 鍛戒护銆傚鏋滄寚瀹氫簡澶氭潯鍛戒护锛屽彧鏈夋渶鍚庝竴鏉′細琚墽琛銆傚鏋滅敤鎴峰惎鍔ㄥ鍣ㄦ椂鍊欐寚瀹氫簡杩愯鐨勫懡浠わ紝鍒欎細瑕嗙洊鎺 CMD 鎸囧畾鐨勫懡浠ゃ侲XPOSE:鏍煎紡涓 EXPOSE <port> [<port>...]銆傚憡璇 Docker 鏈嶅姟绔鍣ㄦ毚闇茬殑绔彛鍙凤紝渚涗簰鑱旂郴缁熶娇鐢ㄣ傚湪鍚姩瀹瑰櫒鏃堕渶瑕...
  • 濡備綍鐢―ockerfile鍒涘缓闀滃儚
    绛旓細-f 鎸囧畾dockerfile鐨勫悕瀛 -t 涓洪暅鍍忚缃竴涓爣绛俱傛爣鍑嗏滈暅鍍忓悕锛氭爣绛锯濆鏋滄病鏈夋寚瀹 浠讳綍鏍囩锛宒ocker灏嗕細鑷姩涓洪暅鍍忚缃竴涓猯atest鏍囩 杩欐椂鍊欏彲浠鐢╠ocker images鏉ユ煡鐪嬩綘鍒涘缓鐨勯暅鍍 [root@localhost ~]# docker run -i -t static_web /bin/bash [root@cf1cafd10982 /]# rpm -qa | grep vs...
  • dockerfile鏄粈涔
    绛旓細2. 鏋勫缓杩囩▼锛閫氳繃Dockerfile鏋勫缓Docker闀滃儚鏄竴涓嚜鍔ㄥ寲鐨勮繃绋嬨傚綋鎵цdocker build鍛戒护鏃讹紝Docker浼氫粠Dockerfile鎵鍦ㄧ殑涓婁笅鏂囪矾寰勫紑濮嬭鍙栨寚浠わ紝骞舵墽琛屾瘡涓涓寚浠ゆ潵鍒涘缓涓涓柊鐨勯暅鍍忓眰銆傝繖涓繃绋嬩腑浼氬寘鎷紪璇戞簮浠g爜銆佸畨瑁呬緷璧栥侀厤缃幆澧冨彉閲忕瓑姝ラ銆3. 浼樺娍涓庡簲鐢細Dockerfile鐨勪娇鐢ㄦ瀬澶у湴绠鍖栦簡闀滃儚鐨勬瀯寤哄拰...
  • 濡備綍鐢―ockerfile鍒涘缓闀滃儚
    绛旓細1銆佸噯澶噅dk銆侀渶瑕佽繍琛岀殑spring boot灏忛」鐩 灏唈dk鍘嬬缉鍖呰В鍘嬪埌Dockerfile鎵鍦ㄧ殑鐩綍涓紝灏唖pring boot灏忛」鐩畐ebsocket.jar澶嶅埗鍒癉ockerfile鎵鍦ㄧ殑鐩綍涓嬶細2銆鍒涘缓Dockerfile锛屽唴瀹瑰涓嬶細1 FROM centos 2 3 MAINTAINER yaolin 4 5 COPY jdk1.7.0_79 jdk1.7.0_79 6 ADD websocket.jar app.jar 7...
  • 濡備綍鐢╠ockerfile濡備綍鐢熸垚涓涓猦ello world
    绛旓細濡備綍缂栧啓涓涓Dockerfile,鏍煎紡濡備笅锛欳ommentINSTRUCTION arguments FROM 鍩轰簬鍝釜闀滃儚 RUN 瀹夎杞欢鐢 MAINTAINER 闀滃儚鍒涘缓鑰 CMD container鍚姩鏃舵墽琛岀殑鍛戒护锛屼絾鏄竴涓狣ockerfile涓彧鑳芥湁涓鏉MD鍛戒护锛屽鏉″垯鍙墽琛屾渶鍚庝竴鏉MD.CMD涓昏鐢ㄤ簬container鏃跺惎鍔ㄦ寚瀹氱殑鏈嶅姟锛屽綋docker run command鐨勫懡浠ゅ尮閰嶅埌CMD command...
  • 濡備綍鐢―ockerfile鍒涘缓闀滃儚
    绛旓細鍒朵綔闀滃儚鐨勬柟寮忎富瑕佹湁涓ょ锛 閫氳繃docker commit 鍒朵綔闀滃儚 閫氳繃docker build 鍒朵綔闀滃儚 杩欎袱绉嶆柟寮忛兘鏄氳繃鏀硅繘宸叉湁鐨勯暅鍍忔潵杈惧埌鑷繁鐨勭洰鐨勩傚埗浣滃熀纭闀滃儚锛屼細鍦ㄥ彟澶栦竴绡囨枃绔犫滀粠闆跺紑濮嬪埗浣滃熀纭闀滃儚鈥濅腑浠嬬粛銆 docker commit docker commit 鏄線鐗堟湰鎺у埗绯荤粺閲屾彁浜や竴娆″彉鏇淬備娇鐢ㄨ繖绉嶆柟寮忓埗浣滈暅鍍忥紝鏈川涓婃槸杩愯涓...
  • 濡備綍鍩轰簬docker鏋勫缓鍜屽彂甯働ython搴旂敤绋嬪簭?
    绛旓細鍒涘缓涓涓 Dockerfile锛岀敤浜庡畾涔 Docker 闀滃儚鐨勬瀯寤鸿繃绋嬨傚湪 Dockerfile 涓紝闇瑕佹寚瀹氬熀纭闀滃儚銆佸畨瑁 Python 搴撱佸皢搴旂敤绋嬪簭浠g爜澶嶅埗鍒伴暅鍍忎腑绛夋搷浣溿備互涓嬫槸涓涓ず渚 Dockerfile锛浣跨敤 Python 3.9 浣滀负鍩虹闀滃儚 FROM python:3.9 璁剧疆宸ヤ綔鐩綍 WORKDIR /app 澶嶅埗搴旂敤绋嬪簭浠g爜鍒伴暅鍍忎腑 COPY . /app 瀹夎...
  • 濡備綍浣跨敤Dockerfile鏋勫缓闀滃儚
    绛旓細VOLUME:鏍煎紡涓 VOLUME ["/data"]銆鍒涘缓涓涓彲浠ヤ粠鏈湴涓绘満鎴栧叾浠栧鍣ㄦ寕杞界殑鎸傝浇鐐癸紝涓鑸敤鏉ュ瓨鏀炬暟鎹簱鍜岄渶瑕佷繚鎸佺殑鏁版嵁绛夈備笉杩囨灞炴у湪Dockerfile涓寚瀹氬苟娌℃湁浠涔堟剰涔夛紝鍥犱负娌℃湁鍔炴硶鎸囧畾鏈湴涓绘満鐨勭洰褰曘傚鏋滈渶瑕佹寚瀹氭寕杞界偣鍙互鍦ㄦ墽琛宒ocker run鍛戒护鏃舵寚瀹氾細1 ...
  • DockeFIile鐭ヨ瘑鐐规荤粨鍜屽彂甯冭嚜宸辩殑闀滃儚
    绛旓細ARG :鐢ㄤ簬鎸囧畾浼犻掔粰鏋勫缓杩愯鏃剁殑鍙橀噺 ONBUILD :鐢ㄤ簬璁剧疆闀滃儚瑙﹀彂鍣 缂栧啓dockerfile鏂囦欢 閫氳繃dockerfile鏋勫缓闀滃儚 鏌ョ湅闀滃儚鏋勫缓鐨勮繃绋,鍙互浣跨敤 docker history 闀滃儚id 鏉ユ煡鐪 鍒涘缓瀹屽懡鍚嶇┖闂村悗锛屾墦寮闀滃儚浠撳簱锛屽垱寤洪暅鍍忎粨搴擄紝閫夋嫨鏈湴浠撳簱 鏍规嵁瀹樻柟缁欑殑鏂囨。寮濮嬫彁浜ゅ氨鍙互锛岃繖閲屽氨涓嶆埅鍥句簡 ...
  • 扩展阅读:docker官方网站 ... github免费入口 ... docker启动容器如何能进入 ... dockerfile的正确写法 ... 为什么docker被淘汰了 ... dockerfile nginx ... dockerfilerun命令详解 ... dockerfile 执行 ... dockerfile entrypoint ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网