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

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

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

docker build

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

具体的用法:

[java] view
plain
copy

  1. sudo docker build .

小心后面那个点,表示当前目录。当前目录有一个Dockerfile的文件。

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

[java] view
plain
copy

  1. sudo docker build -t shykes/myapp .

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

[java] view
plain
copy

  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

  1. docker images

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

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

格式:

[java] view
plain
copy

  1. # Comment
  2. INSTRUCTION arguments

命令是大写的。

FROM

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

所以,就有了FROM 指令

[java] view
plain
copy

  1. FROM <image>

或者,更加具体点说明它的Tag。

[java] view
plain
copy

  1. FROM <Image>:<TAG>

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

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

注释

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

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

维护

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

[java] view
plain
copy

  1. MAINTAINER <name>

填上你的NICK NAME。表示你做的。

RUN指令

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

[java] view
plain
copy

  1. RUN <command> (the command is run in a shell - /bin/sh -c - shell form)

另一种方式是:

[java] view
plain
copy

  1. RUN ["executable", "param1", "param2"] (exec form)

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

CMD指令

格式:

[java] view
plain
copy

  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

  1. EXPOSE <port> [<port>...]

ENV

环境变量的设置

[java] view
plain
copy

  1. ENV <key> <value>

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

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

ADD指令

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

[java] view
plain
copy

  1. ADD <src> <dst>

[java] view
plain
copy

  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

  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

  1. # Nginx
  2. #
  3. # VERSION               0.0.1
  4. FROM      ubuntu
  5. MAINTAINER Victor Vieux <victor@docker.com>
  6. RUN apt-get update && apt-get install -y inotify-tools nginx apache2 openssh-server
  7. # Firefox over VNC
  8. #
  9. # VERSION               0.3
  10. FROM ubuntu
  11. # Install vnc, xvfb in order to create a ‘fake‘ display and firefox
  12. RUN apt-get update && apt-get install -y x11vnc xvfb firefox
  13. RUN mkdir /.vnc
  14. # Setup a password
  15. RUN x11vnc -storepasswd 1234 ~/.vnc/passwd
  16. # Autostart firefox (might not be the best way, but it does the trick)
  17. RUN bash -c ‘echo "firefox" >> /.bashrc‘
  18. EXPOSE 5900
  19. CMD    ["x11vnc", "-forever", "-usepw", "-create"]
  20. # Multiple images example
  21. #
  22. # VERSION               0.1
  23. FROM ubuntu
  24. RUN echo foo > bar
  25. # Will output something like ===> 907ad6c2736f
  26. FROM ubuntu
  27. RUN echo moo > oink
  28. # Will output something like ===> 695d7793cbe4
  29. # You?ll now have two images, 907ad6c2736f with /bar, and 695d7793cbe4 with
  30. # /oink.
时间: 2024-11-17 16:32:19

阿里云部署Docker(9)----Dockerfile脚本定制镜像的相关文章

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

本文为原创文章,转载需注明转自:http://blog.csdn.net/minimicall?viewmode=contents 技术爱好者都是比较懒的.而docker又是开发者支持起来的.所以,它肯定是有比较懒的方式供我们定制自己需要的东西. docker build docker 用build指令来执行dockerfile脚本. 具体的用法: sudo docker build . 小心后面那个点,表示当前目录.当前目录有一个Dockerfile的文件. 当然,你可以指定你建立的镜像的名字

阿里云部署Docker(2)

之前有一篇文章讲过在阿里云中安装Docker,相对来说那个是安装,但是安装完之后我们一般会碰到问题. 今天我给大家记录一下我的新的解决过程. 环境还是ubuntu12.04,假设我们已经把内核升级到了3.8以上. 便捷安装Docker命令: curl -s https://get.docker.io/ubuntu/ | sudo sh 这样一条指令就完成了安装. 直接执行如下命令: sudo docker run -i -t ubuntu /bin/bash 不行,会报错. 如下: [email

阿里云部署Docker(3)----指令学习

通过上两节的学习http://blog.csdn.net/minimicall/article/details/40119177 和http://blog.csdn.net/minimicall/article/details/40108305 相信大家已经把docker环境已经搭建完毕,这一节,简单学习docker怎么用. Hello world 计算机的每一个新事物似乎都是从hello world开始. [email protected]:~# docker run ubuntu:14.04

阿里云部署Docker(4)----容器的使用

通过上一节的学习,我们知道如何运行docker容器,我们运行了一个普通的,一个后台的,我们还学习了几个指令: docker ps - Lists containers. docker logs - Shows us the standard output of a container. docker stop - Stops running containers. 我们还可以查看下docker的版本: [email protected]:~# docker version Client vers

阿里云部署Docker(8)----安装和使用redmine

安装redmine对过程进行管理. 须要说明的是:当你在docker images的时候,会说没连接到xxxx的时候,并且会提示用"docker -d".事实上这仅仅是把docker作为一个后台进程.可是当你的SecureCRT退出的时候,这个后台进程也是会被退出的.所下面次你又要.并且.数据非常easy丢失. 正确的做法是. service docker start. 记住咯. 好,redmine的安装和使用教程 https://registry.hub.docker.com/u/s

阿里云部署Docker(6)----解决删除&lt;none&gt;镜像问题

转载请注明来源,本博客原创作者为:http://blog.csdn.net/minimicall?viewmode=contents 在Docker使用中,经常会碰到删除镜像不成功,反而让镜像变成了<none > <none>即,没名字,没Tag的镜像. [email protected]:/var/run# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE <none> <none> de

阿里云部署oracle 11g数据库

某程序员在阿里云部署了一套oracle 11g,老板说他们搞了好几天,监听一直启动不来,让我给看看.登上去一瞧,原来是主机名设置的问题(把阿里云的弹性ip直接写在/etc/hosts文件,而云主机的网卡地址一般是私有地址).这个事情,我还专门发了一篇文章,地址为http://blog.51cto.com/sery/2084706 .修复完这个问题以后,觉得直接把数据库这样放在公网上很不妥当,通时又发现其它一些问题,比如磁盘空间规划不合理.混装java等.于是建议把此机作为测试环境,另购几台云主机

用Kolla在阿里云部署10节点高可用OpenStack

为展现 Kolla 的真正实力,我在阿里云使用 Ansible 自动创建 10 台虚机,部署一套多节点高可用 OpenStack 集群! 前言 上次 Kolla 已经表示了要打 10 个的愿望,这次我们就满足它. 通过本期内容,你将看到: 如何使用阿里云云命令行(Cloud Shell) 如何使用 Ansible 创建阿里云资源 Kolla 多节点部署配置说明 OpenStack 高可用架构 本期内容仍然是干货满满,写文章,调脚本,剪视频,不但花时间,还要在 阿里云 花钱租云服务器,真的费了不少

阿里云部署Java网站和微信开发调试心得技巧(上)

阿里云部署Java网站和微信开发调试心得技巧(上)本篇手记旨在帮助大家从0开始: 申请阿里云服务器 搭建出程序的执行环境 在服务器上发布并运行自己的web project 域名解析 微信测试号的申请与连接以获取微信用户信息全篇文章主要以如何去完成目标为主,因此会以流程的形式来展现,细节方面需要大家多多思考.其中文章的上集实现了1-4,文章的下集实现了5一.申请阿里云服务器(1)PC访问阿里云https://www.aliyun.com/,申请阿里云帐号(可以用您的支付宝帐号登录,因为支付宝帐号已