阿里云部署Docker(9)----Dockerfile脚本定制镜像

简介:

本文为原创文章,转载需注明转自:http://blog.csdn.net/minimicall?viewmode=contents

技术爱好者都是比较懒的。而docker又是开发者支持起来的。所以,它肯定是有比较懒的方式供我们定制自己需要的东西。

docker build

docker 用build指令来执行dockerfile脚本。

具体的用法:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. sudo docker build .  
小心后面那个点,表示当前目录。当前目录有一个Dockerfile的文件。

当然,你可以指定你建立的镜像的名字。

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. sudo docker build -t shykes/myapp .  

然后你就可以看到执行过程,或许,会非常的漫长,取决于要下的东西的大小和你的网速。

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. sudo docker build -t SvenDowideit/ambassador .  
  2. Uploading context 10.24 kB  
  3. Uploading context  
  4. Step 1 : FROM docker-ut  
  5.  ---> cbba202fe96b  
  6. Step 2 : MAINTAINER SvenDowideit@home.org.au  
  7.  ---> Using cache  
  8.  ---> 51182097be13  
  9. Step 3 : CMD env | grep _TCP= | sed 's/.*_PORT_[09]_TCP=tcp:\/\/.:./socat TCP4-LISTEN:\1,fork,reuseaddr TCP4:\2:\3 \&/'  | sh && top  
  10.  ---> Using cache  
  11.  ---> 1a5ffc17324d  
  12. Successfully built 1a5ffc17324d  
当你下完之后,你可以用:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. docker images  

你会发现多了你下载的镜像。

好接下来我们讲讲Dockerfile本身如何编写。

格式:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. # Comment  
  2. INSTRUCTION arguments  
命令是大写的。

FROM

所有的镜像都应该是基于某一个现有的镜像。

所以,就有了FROM 指令

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. FROM <image>  
或者,更加具体点说明它的Tag。

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. FROM <Image>:<TAG>  

FROM语句必须是第一句“非注释”语句,在Dockerfile中。

我们总是会想在一个脚本里面添加些注释,来说明一些想说的话。


注释

那就是注释:#开头的行。

但是#在行中,则却表示是一个参数。

维护

接下来,需要说明维护人。

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. MAINTAINER <name>  
填上你的NICK NAME。表示你做的。

RUN指令

RUN指令应该是用的最多的指令。

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. RUN <command> (the command is run in a shell - /bin/sh -c - shell form)  

另一种方式是:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. RUN ["executable""param1""param2"] (exec form)  

RUN语句会在当前镜像的基础上执行该条指令,同时执行完就成了一个新的镜像一样,即数据和影响都是会保存的,然后用这个新的镜像去执行下一条指令,这样上一条的结果镜像是下一条指令的基础,如此不断推进。

CMD指令

格式:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. CMD ["executable","param1","param2"] (exec form, this is the preferred form)  
  2. CMD ["param1","param2"] (as default parameters to ENTRYPOINT)  
  3. CMD command param1 param2 (shell form)  

有三种形式。

CMD在DOckerfile里面只能用一次,如果你写了很多条,那么只有最后一条是有效的。


CMD有什么用呢,可以理解为Main函数一样吧,作为一个入口。具体见英文

The main purpose of a CMD is to provide defaults for an executing container. These defaults can include an executable, or they can omit the executable, in which case you must specify an ENTRYPOINT instruction as well.

EXPOSE

这个单词的中文叫什么,暴露。对,他就是暴露镜像的某个接口出来。例如,我的镜像是用来做http服务的,那么我就理应暴露我镜像的80端口。然后-p 主机端口:80 ,还记得吧。端口映射。

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. EXPOSE <port> [<port>...]  

ENV

环境变量的设置

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. ENV <key> <value>  

环境变量一旦设定,对整个Dockerfile都是有效的。

当然,key = value这样直接说,其实效果是一样的。

ADD指令

有点像拷贝指令,至少它就是完成文件的拷贝工作的。

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. ADD <src> <dst>  

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. ADD hom* /mydir/        # adds all files starting with "hom"  
  2. ADD hom?.txt /mydir/    # ? is replaced with any single character  

COPY指令

和ADD一样,是拷贝


ENTRYPOINT

入口点

真正的MAIN函数

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. ENTRYPOINT ["executable""param1""param2"] (exec form, the preferred form)  
  2. ENTRYPOINT command param1 param2 (shell form)  
CMD和这个指令的区别,是应用的场景不一样。

这里,我给大家贴原文会比较好。

An ENTRYPOINT helps you to configure a container that you can run as an executable. That is, when you specify an ENTRYPOINT, then the whole container runs as if it was just that executable.


Unlike the behavior of the CMD instruction, The ENTRYPOINT instruction adds an entry command that will not be overwritten when arguments are passed to docker run. This allows arguments to be passed to the entry point, i.e. docker run <image> -d will pass the -d argument to the entry point.


You can specify parameters either in the ENTRYPOINT JSON array (as in "like an exec" above), or by using a CMD instruction. Parameters in the ENTRYPOINT instruction will not be overridden by the docker run arguments, but parameters specified via a CMD instruction will be overridden by docker run arguments.


Like a CMD, you can specify a plain string for the ENTRYPOINT and it will execute in /bin/sh -c:


FROM ubuntu
ENTRYPOINT ls -l
For example, that Dockerfile's image will always take a directory as an input and return a directory listing. If you wanted to make this optional but default, you could use a CMD instruction:


FROM ubuntu
CMD ["-l"]
ENTRYPOINT ["ls"]

WORKDIR 工作目录

RUN ENTERPOINT带的指令在哪里执行的设置。


此外,还有一些指令,例如

USER ,ONBUILD,等就不想说了。

最后给出一个示例

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. # Nginx  
  2. #  
  3. # VERSION               0.0.1  
  4.   
  5. FROM      ubuntu  
  6. MAINTAINER Victor Vieux <victor@docker.com>  
  7.   
  8. RUN apt-get update && apt-get install -y inotify-tools nginx apache2 openssh-server  
  9.   
  10. # Firefox over VNC  
  11. #  
  12. # VERSION               0.3  
  13.   
  14. FROM ubuntu  
  15.   
  16. # Install vnc, xvfb in order to create a 'fake' display and firefox  
  17. RUN apt-get update && apt-get install -y x11vnc xvfb firefox  
  18. RUN mkdir /.vnc  
  19. # Setup a password  
  20. RUN x11vnc -storepasswd 1234 ~/.vnc/passwd  
  21. # Autostart firefox (might not be the best way, but it does the trick)  
  22. RUN bash -c 'echo "firefox" >> /.bashrc'  
  23.   
  24. EXPOSE 5900  
  25. CMD    ["x11vnc""-forever""-usepw""-create"]  
  26.   
  27. # Multiple images example  
  28. #  
  29. # VERSION               0.1  
  30.   
  31. FROM ubuntu  
  32. RUN echo foo > bar  
  33. # Will output something like ===> 907ad6c2736f  
  34.   
  35. FROM ubuntu  
  36. RUN echo moo > oink  
  37. # Will output something like ===> 695d7793cbe4  
  38.   
  39. # You᾿ll now have two images, 907ad6c2736f with /bar, and 695d7793cbe4 with  
  40. # /oink.  





目录
打赏
0
0
0
0
26
分享
相关文章
docker load 后镜像名称为空的问题解决
Docker在容器化应用程序时提供了强大的镜像管理功能,但也可能在某些操作中遇到如镜像名称为空的问题。通过理解问题的成因并采取适当的解决方案,如正确保存和加载镜像、手动修复标签等,可以有效避免和解决这一问题。通过本文提供的指导,您可以确保在使用Docker进行镜像操作时更为顺利,并提高容器管理的效率。
161 82
Ubuntu下部署及操作Docker技巧
以上就是在Ubuntu下部署及操作Docker的具体步骤。但这只是冰山一角,Docker的魅力远不仅如此。你可以将其视为存放各种工具的小箱子,随时随地取用,极大地提升工作效率。你也可以私人订制,适应不同的开发环境,就像一个拥有各种口味冰淇淋的冰箱,满足各种各样的需求。好了,现在你已经掌握了基本的Docker运用技巧,快去尝试使用吧!记住,沉浸在探索中,你会找到无尽的乐趣和满满的收获。
60 23
Kubernetes与Docker参数对照:理解Pod中的command、args与Dockerfile中的CMD、ENTRYPOINT。
需要明确的是,理解这些都需要对Docker和Kubernetes有一定深度的理解,才能把握二者的区别和联系。虽然它们都是容器技术的二个重要组成部分,但各有其特性和适用场景,理解它们的本质和工作方式,才能更好的使用这些工具,将各自的优点整合到生产环境中,实现软件的快速开发和部署。
71 25
Docker平台上的Redis镜像运行
这就是如何在Docker平台上运行Redis镜像的全部过程。走进Docker和Redis的世界,探索更多可能!
57 10
大模型文件Docker镜像化部署技术详解
大模型文件Docker镜像化部署技术详解
159 2
|
29天前
|
在Docker上部署Ollama+AnythingLLM完成本地LLM Agent部署
通过以上步骤,您可以成功在Docker上部署Ollama和AnythingLLM,实现本地LLM Agent的功能。在部署过程中,确保环境和配置正确,以避免不必要的问题。希望本文能够帮助您顺利完成部署,并在本地环境中高效地使用LLM模型。
532 8
《第一本Docker书(修订版)》——2.7 Docker安装脚本
还有另外一种方法,就是使用远程安装脚本在相应的宿主机上安装Docker。可以从get.docker.com网站获取这个安装脚本。
1937 0
容器技术实践:在Ubuntu上使用Docker安装MySQL的步骤。
通过以上的操作,你已经步入了Docker和MySQL的世界,享受了容器技术给你带来的便利。这个旅程中你可能会遇到各种挑战,但是只要你沿着我们划定的路线行进,你就一定可以达到目的地。这就是Ubuntu、Docker和MySQL的灵魂所在,它们为你开辟了一条通往新探索的道路,带你亲身感受到了技术的力量。欢迎在Ubuntu的广阔大海中探索,用Docker技术引领你的航行,随时准备感受新技术带来的震撼和乐趣。
74 16