Docker简介

Docker项目提供了构建在Linux内核功能之上,协同在一起的的高级工具。其目标是帮助开发和运维人员更容易地跨系统跨主机交付应用程序和他们的依赖。Docker通过Docker容器,一个安全的,基于轻量级容器的环境,来实现这个目标。这些容器由镜像创建,而镜像可以通过命令行手工创建或 者通过Dockerfile自动创建。

Dockerfile

Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工作。Dockerfile从FROM命令开始,紧接着跟随者各种方法,命令和参数。其产出为一个新的可以用于创建容器的镜像。

Dockerfile 语法

在我们深入讨论Dockerfile之前,让我们快速过一下Dockerfile的语法和它们的意义。

什么是语法?

非常简单,在编程中,语法意味着一个调用命令,输入参数去让应用执行程序的文法结构。这些语法被规则或明或暗的约束。程序员遵循语法规范以和计算机 交互。如果一段程序语法不正确,计算机将无法识别。Dockerfile使用简单的,清楚的和干净的语法结构,极为易于使用。这些语法可以自我释义,支持注释。

Dockerfile 语法示例

Dockerfile语法由两部分构成,注释和命令+参数

  1. # Line blocks used for commenting
  2. command argument argument ..

一个简单的例子:

  1. # Print "Hello docker!"
  2. RUN echo "Hello docker!"

Dockerfile 命令

Dockerfile有十几条命令可用于构建镜像,下文将简略介绍这些命令。

ADD

ADD命令有两个参数,源和目标。它的基本作用是从源系统的文件系统上复制文件到目标容器的文件系统。如果源是一个URL,那该URL的内容将被下载并复制到容器中。

  1. # Usage: ADD [source directory or URL] [destination directory]
  2. ADD /my_app_folder /my_app_folder

CMD

和RUN命令相似,CMD可以用于执行特定的命令。和RUN不同的是,这些命令不是在镜像构建的过程中执行的,而是在用镜像构建容器后被调用。

  1. # Usage 1: CMD application "argument", "argument", ..
  2. CMD "echo""Hello docker!"

ENTRYPOINT

配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。

每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。

ENTRYPOINT 帮助你配置一个容器使之可执行化,如果你结合CMD命令和ENTRYPOINT命令,你可以从CMD命令中移除“application”而仅仅保留参数,参数将传递给ENTRYPOINT命令。

  1. # Usage: ENTRYPOINT application "argument", "argument", ..
  2. # Remember: arguments are optional. They can be provided by CMD
  3. # or during the creation of a container.
  4. ENTRYPOINT echo
  5. # Usage example with CMD:
  6. # Arguments set with CMD can be overridden during *run*
  7. CMD "Hello docker!"
  8. ENTRYPOINT echo

ENV 

ENV命令用于设置环境变量。这些变量以”key=value”的形式存在,并可以在容器内被脚本或者程序调用。这个机制给在容器中运行应用带来了极大的便利。

  1. # Usage: ENV key value
  2. ENV SERVER_WORKS 4

EXPOSE

EXPOSE用来指定端口,使容器内的应用可以通过端口和外界交互。

  1. # Usage: EXPOSE [port]
  2. EXPOSE 8080

FROM

FROM命令可能是最重要的Dockerfile命令。改命令定义了使用哪个基础镜像启动构建流程。基础镜像可以为任意镜 像。如果基础镜像没有被发现,Docker将试图从Docker image index来查找该镜像。FROM命令必须是Dockerfile的首个命令。

  1. # Usage: FROM [image name]
  2. FROM ubuntu

MAINTAINER

我建议这个命令放在Dockerfile的起始部分,虽然理论上它可以放置于Dockerfile的任意位置。这个命令用于声明作者,并应该放在FROM的后面。

  1. # Usage: MAINTAINER [name]
  2. MAINTAINER authors_name

RUN

RUN命令是Dockerfile执行命令的核心部分。它接受命令作为参数并用于创建镜像。不像CMD命令,RUN命令用于创建镜像(在之前commit的层之上形成新的层)。

  1. # Usage: RUN [command]
  2. RUN aptitude install -y riak

USER

USER命令用于设置运行容器的UID。

  1. # Usage: USER [UID]
  2. USER 751

VOLUME

VOLUME命令用于让你的容器访问宿主机上的目录。

  1. # Usage: VOLUME ["/dir_1", "/dir_2" ..]
  2. VOLUME ["/my_files"]

WORKDIR

WORKDIR命令用于设置CMD指明的命令的运行目录。

  1. # Usage: WORKDIR /path
  2. WORKDIR ~/

如何使用Dockerfiles

使用Dockerfiles和手工使用Docker Daemon运行命令一样简单。脚本运行后输出为新的镜像ID。

  1. # Build an image using the Dockerfile at current location
  2. # Example: sudo docker build -t [name] .
  3. sudo docker build -t my_mongodb . 

Dockerfile 示例一:创建一个MongoDB的镜像

在这部分中,我们讲一步一步创建一个Dockfile,这个Dockerfile可用于构建MongoDB镜像进而构建MongoDB容器。

创建一个Dockerfile

使用nano文本编辑器,让我们创建Dockerfile。

  1. sudo nano Dockerfile

定义文件和它的目的

让阅读者明确Dockerfile的目的永远是必要的。为此,我们通常从注释开始写Dockerfile。

  1. ############################################################
  2. # Dockerfile to build MongoDB container images
  3. # Based on Ubuntu
  4. ############################################################

设置基础镜像 

  1. # Set the base image to Ubuntu
  2. FROM ubuntu

定义作者

  1. # File Author / Maintainer
  2. MAINTAINER ExampleMcAuthor

设置命令与参数下载MongoDB

  1. ################## BEGIN INSTALLATION ######################
  2. # Install MongoDB Following the Instructions at MongoDB Docs
  3. # Ref: http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/
  4. # Add the package verification key
  5. RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
  6. # Add MongoDB to the repository sources list
  7. RUN echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen'|tee /etc/apt/sources.list.d/mongodb.list
  8. # Update the repository sources list once more
  9. RUN apt-getupdate
  10. # Install MongoDB package (.deb)
  11. RUN apt-getinstall -y mongodb-10gen
  12. # Create the default data directory
  13. RUN mkdir -p /data/db
  14. ##################### INSTALLATION END #####################

设置MongoDB端口 

  1. # Expose the default port
  2. EXPOSE 27017
  3. # Default port to execute the entrypoint (MongoDB)
  4. CMD ["--port 27017"]
  5. # Set default container command
  6. ENTRYPOINT usr/bin/mongod

保存Dockerfile。

构建镜像

使用上述的Dockerfile,我们已经可以开始构建MongoDB镜像

  1. sudo docker build -t my_mongodb .

Dockerfile 示例二:创建一个Nginx的镜像

Nginx简述

Nginx是一个高性能的 HTTP 和 反向代理 服务器。它因为它的轻量级,易用,易于扩展而流行于业界。基于优良的架构设计,它能够比之前的类似软件处理更多的请求。它也可以用来提供静态文件服务,比如图片,脚本和CSS。

和上个例子一样,我们还是从基础镜像开始,运用FROM命令和MAINTAINER命令

  1. ############################################################
  2. # Dockerfile to build Nginx Installed Containers
  3. # Based on Ubuntu
  4. ############################################################
  5. # Set the base image to Ubuntu
  6. FROM ubuntu
  7. # File Author / Maintainer
  8. MAINTAINER MaintanerName

安装Nginx

  1. # Install Nginx
  2. # Add application repository URL to the default sources
  3. RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe">>/etc/apt/sources.list
  4. # Update the repository
  5. RUN apt-getupdate
  6. # Install necessary tools
  7. RUN apt-getinstall -y nano wget dialog net-tools
  8. # Download and Install Nginx
  9. RUN apt-getinstall -y nginx

Bootstrapping 

安装Nginx后,我们需要配置Nginx并且替换掉默认的配置文件

  1. # Remove the default Nginx configuration file
  2. RUN rm -v /etc/nginx/nginx.conf
  3. # Copy a configuration file from the current directory
  4. ADD nginx.conf /etc/nginx/
  5. # Append "daemon off;" to the beginning of the configuration
  6. RUN echo "daemon off;">>/etc/nginx/nginx.conf
  7. # Expose ports
  8. EXPOSE 80
  9. # Set the default command to execute
  10. # when creating a new container
  11. CMD service nginx start

保存 dockfile。

使用Dockerfile自动构建Nginx容器

因为我们命令Docker用当前目录的Nginx的配置文件替换默认的配置文件,我们要保证这个新的配置文件存在。在Dockerfile存在的目录下,创建nginx.conf:

  1. sudo nano nginx.conf

然后用下述内容替换原有内容:

  1. worker_processes 1;
  2. events {worker_connections 1024;}
  3. http {
  4.      sendfile on;
  5.      server {
  6.          listen 80;
  7.          location /{
  8.               proxy_pass http://httpstat.us/;
  9.               proxy_set_header X-Real-IP $remote_addr;
  10.          }
  11.      }
  12. }

让我们保存nginx.conf。之后我们就可以用Dockerfile和配置文件来构建镜像。

转 dockerfile 介绍 及 编写的更多相关文章

  1. Dockerfile介绍、Docker制作jdk镜像

    Dockerfile介绍.Docker制作jdk镜像 目标 1.Dockerfile简介 2.Docker制作jdk镜像 Dockerfile简介 dockerfile 是一个文本格式的配置文件, 用 ...

  2. Docker系列(21)- DockerFile介绍

    DockerFile介绍 dockerfile是用来构建docker镜像的文件!命令参数脚本! 构建步骤 编写一个dockerfile文件 docker build构建成为一个镜像 docker ru ...

  3. AppleWatch开发教程之Watch应用对象新增内容介绍以及编写运行代码

    AppleWatch开发教程之Watch应用对象新增内容介绍以及编写运行代码 添加Watch应用对象时新增内容介绍 Watch应用对象添加到创建的项目中后,会包含两个部分:Watch App 和 Wa ...

  4. Dockerfile文档编写

    图片显示问题,附上有道云笔记中链接:http://note.youdao.com/noteshare?id=fba6d2f53fd6447ba32c3b7accfeb89b&sub=B36B5 ...

  5. dockerfile 介绍

    Docker简介 Docker项目提供了构建在Linux内核功能之上,协同在一起的的高级工具.其目标是帮助开发和运维人员更容易地跨系统跨主机交付应用程序和他们的依赖.Docker通过Docker容器, ...

  6. docker入门1: Dockerfile介绍

    Dockerfile是为快速构建docker image而设计的,当你使用dockerbuild 命令的时候,docker 会读取当前目录下的命名为Dockerfile(首字母大写)的纯文本文件并执行 ...

  7. Dockerfile介绍及指令详情

    Dockerfile简介:   镜像的定制实际上就是定制每一层所添加的配置.文件.如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像,那么哪些无法重复的问题.镜 ...

  8. docker Dockerfile文件的编写部分命令

    镜像的构建过程:编写dockerfile文件,执行docker build 进行构建镜像,最后docker run 运行容器镜像实例. docker build -t mycentos:1.01 . ...

  9. 正经学C#_介绍与其编写基础:《c#入门经典》

    本文所讲内容,均可在<c#入门经典>中可以查询.如有错误,敬请指出.谢谢! C#:全称C Shar.是微软.Net Framework平台下最为主要的客户语言之一.个人理解,c#是微软最为 ...

随机推荐

  1. php判断是否是ajax提交 方法

    /** * 判断是否是AJAX提交 * @return bool */ function is_ajax() { if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) ...

  2. MySQL 存储过程传参数实现where id in(1,2,3,...)示例

    一个MySQL 存储过程传参数的问题想实现例如筛选条件为:where id in(1,2,3,...),下面有个不错的示例,感兴趣的朋友可以参考下   正常写法:  ,,,,...); 当在写存储过程 ...

  3. [python selenium] 操作方法整理

    个人笔记,摘抄自虫师python selenum,仅供个人参考 1.安装: pip install selenium 下载webdriver # webdriver 下载并放置在python主目录 · ...

  4. Python之路【第十一篇】: 进程与线程理论篇

    阅读目录 一 背景知识二 进程2.1 什么是进程2.2 进程与程序的区别2.3 并发与并行2.4 同步与异步2.5 进程的创建2.6 进程的终止2.7 进程的层次结构2.8 进程的状态2.9 进程并发 ...

  5. python 关键知识点

    学习资源:笨方法学习 python3 将变量传递给脚本--argv 脚本:你编写的 .py 文件. argv 参数变量(argument variable)保存着你运行 python 脚本的参数. i ...

  6. 启动win8.1时提示 api-ms-win-crt-runtime-l1-1-0.dll丢失

    电脑里没有安装windows的更新KB2999226 到微软官网 https://www.microsoft.com/zh-cn/download/details.aspx?id=49081 下载对应 ...

  7. 为什么Java7开始在数字中使用下划线

    JDK1.7的发布已经介绍了一些有用的特征,尽管大部分都是一些语法糖,但仍然极大地提高了代码的可读性和质量.其中的一个特征是介绍字面常量数字的下划线.从Java7开始,你就可以在你的Java代码里把长 ...

  8. [python]一个关于默认参数的老问题和一个有关优化的新问题

    一个老问题: def func(defau=[]): defau.append(1) return defau print(func())#print[1] print(func())#print[1 ...

  9. 你了解border-radius吗?

    1.圆角正方形 .rounded-square{ width: 200px; height: 200px; background-color: pink; border-radius: 50px; } ...

  10. [BZOJ4864][BeiJing2017Wc]神秘物质(splay)

    首先merge就是先delete两次再insert,Max就是整个区间的最大值减最小值,Min就是区间中所有相邻两数差的最小值. Splay支持区间最大值,区间最小值,区间相邻差最小值即可. #inc ...