阿里云部署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_\([0-9]*\)_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.  





相关文章
kde
|
22天前
|
应用服务中间件 网络安全 nginx
手把手教你使用 Docker 部署 Nginx 教程
本文详解Nginx核心功能与Docker部署优势,涵盖镜像拉取、容器化部署(快速、挂载、Compose)、HTTPS配置及常见问题处理,助力高效搭建稳定Web服务。
kde
491 4
|
21天前
|
应用服务中间件 Linux nginx
在虚拟机Docker环境下部署Nginx的步骤。
以上就是在Docker环境下部署Nginx的步骤。需要注意,Docker和Nginix都有很多高级用法和细节需要掌握,以上只是一个基础入门级别的教程。如果你想要更深入地学习和使用它们,请参考官方文档或者其他专业书籍。
90 5
|
2月前
|
存储 Docker Python
docker 部署 sftp
本文介绍SFTP服务的部署与配置,包括users.conf用户配置规则、Docker容器运行命令及上传目录权限说明,重点解析atmoz/sftp镜像的chroot机制与子目录映射,确保用户登录后正确访问/upload目录,并提供Python脚本实现文件上传示例。
163 12
docker 部署 sftp
|
2月前
|
运维 Linux 数据库
基于 Docker 部署 n8n 指南,新手一看就会
本教程详解如何通过 Docker 快速部署开源自动化工具 n8n,适合新手快速上手。内容涵盖官方部署步骤、常见难点及第三方一键部署方案,助你高效搭建自动化工作流平台。
853 6
kde
|
1月前
|
存储 NoSQL Redis
手把手教你用 Docker 部署 Redis
Redis是高性能内存数据库,支持多种数据结构,适用于缓存、消息队列等场景。本文介绍如何通过Docker快速拉取轩辕镜像并部署Redis,涵盖快速启动、持久化存储及docker-compose配置,助力开发者高效搭建稳定服务。
kde
537 7
|
1月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
277 5
kde
|
1月前
|
存储 搜索推荐 数据库
🚀 RAGFlow Docker 部署全流程教程
RAGFlow是开源的下一代RAG系统,融合向量数据库与大模型,支持全文检索、插件化引擎切换,适用于企业知识库、智能客服等场景。支持Docker一键部署,提供轻量与完整版本,助力高效搭建私有化AI问答平台。
kde
1355 8
kde
|
1月前
|
存储 关系型数据库 MySQL
MySQL Docker 容器化部署全指南
MySQL是一款开源关系型数据库,广泛用于Web及企业应用。Docker容器化部署可解决环境不一致、依赖冲突问题,实现高效、隔离、轻量的MySQL服务运行,支持数据持久化与快速迁移,适用于开发、测试及生产环境。
kde
326 4
|
运维 Java Devops
阿里云云效操作报错合集之部署docker时遇到报错,该怎么办
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。