手把手教你写Dockerfile, 附赠MongoDB和Nginx Dockerfile编写实例

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介:

手把手教你写Dockerfile, 附赠MongoDB和Nginx Dockerfile编写实例


基础镜像可以用于创建Docker容器。镜像可以非常基础,仅仅包含操作系统;也可以非常丰富,包含灵巧的应用栈,随时可以发布。当你在使用 Docker构建镜像的时候,每一个命令都会在前一个命令的基础上形成一个新层。这些基础镜像可以用于创建新的容器。本篇文章将手把手教您如何从基础镜 像,一步一步,一层一层的从Dockerfile构建容器的过程。

 

Docker简介

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

Dockerfiles

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

 

Dockerfile 语法

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

什么是语法?

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

Dockerfile 语法示例

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

# Line blocks used for commenting

command argument argument ..

一个简单的例子:

# Print "Hello docker!"

RUN echo "Hello docker!"

 

Dockerfile 命令

 

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

 

ADD

 

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

# Usage: ADD [source directory or URL] [destination directory]

ADD /my_app_folder /my_app_folder

 

CMD

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

# Usage 1: CMD application "argument", "argument", ..

CMD "echo" "Hello docker!"

 

ENTRYPOINT

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

# Usage: ENTRYPOINT application "argument", "argument", ..

# Remember: arguments are optional. They can be provided by CMD

# or during the creation of a container.

ENTRYPOINT echo

# Usage example with CMD:

# Arguments set with CMD can be overridden during *run*

CMD "Hello docker!"

ENTRYPOINT echo

ENV

 

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

# Usage: ENV key value

ENV SERVER_WORKS 4

 

EXPOSE

 

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

# Usage: EXPOSE [port]

EXPOSE 8080

 

FROM

 

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

# Usage: FROM [image name]

FROM ubuntu

 

MAINTAINER

 

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

# Usage: MAINTAINER [name]

MAINTAINER authors_name

 

RUN

 

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

# Usage: RUN [command]

RUN aptitude install -y riak

 

USER

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

# Usage: USER [UID]

USER 751

 

VOLUME

 

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

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

VOLUME ["/my_files"]

 

WORKDIR

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

# Usage: WORKDIR /path

WORKDIR ~/

 

如何使用Dockerfiles

 

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

# Build an image using the Dockerfile at current location

# Example: sudo docker build -t [name] .

sudo docker build -t my_mongodb . 

 

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

 

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

 

创建一个Dockerfile

 

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

sudo nano Dockerfile

 

定义文件和它的目的

 

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

############################################################

# Dockerfile to build MongoDB container images

# Based on Ubuntu

############################################################

 

设置基础镜像

 

# Set the base image to Ubuntu

FROM ubuntu

 

定义作者

 

# File Author / Maintainer

MAINTAINER Example McAuthor

 

设置命令与参数下载MongoDB

 

################## BEGIN INSTALLATION ######################

# Install MongoDB Following the Instructions at MongoDB Docs

# Ref: http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/

# Add the package verification key

RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10

# Add MongoDB to the repository sources list

RUN echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | tee /etc/apt/sources.list.d/mongodb.list

# Update the repository sources list once more

RUN apt-get update

# Install MongoDB package (.deb)

RUN apt-get install -y mongodb-10gen

# Create the default data directory

RUN mkdir -p /data/db

##################### INSTALLATION END #####################

 

设置MongoDB端口

 

# Expose the default port

EXPOSE 27017

# Default port to execute the entrypoint (MongoDB)

CMD ["--port 27017"]

# Set default container command</span>

ENTRYPOINT usr/bin/mongod

 

保存Dockerfile,下面的代码是Dockerfile的完整版本

############################################################

# Dockerfile to build MongoDB container images

# Based on Ubuntu

############################################################

# Set the base image to Ubuntu

FROM ubuntu

# File Author / Maintainer

MAINTAINER Example McAuthor

# Update the repository sources list

RUN apt-get update

################## BEGIN INSTALLATION ######################

# Install MongoDB Following the Instructions at MongoDB Docs

# Ref: http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/

# Add the package verification key

RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10

# Add MongoDB to the repository sources list

RUN echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | tee /etc/apt/sources.list.d/mongodb.list

# Update the repository sources list once more

RUN apt-get update

# Install MongoDB package (.deb)

RUN apt-get install -y mongodb-10gen

# Create the default data directory

RUN mkdir -p /data/db

##################### INSTALLATION END #####################

# Expose the default port

EXPOSE 27017

# Default port to execute the entrypoint (MongoDB)

CMD ["--port 27017"]

# Set default container command

ENTRYPOINT usr/bin/mongod

 

构建镜像

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

sudo docker build -t my_mongodb .

 

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

Nginx简述

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

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

############################################################

# Dockerfile to build Nginx Installed Containers

# Based on Ubuntu

############################################################

# Set the base image to Ubuntu

FROM ubuntu

# File Author / Maintainer

MAINTAINER Maintaner Name

 

安装Nginx

 

# Install Nginx

# Add application repository URL to the default sources

RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list

# Update the repository

RUN apt-get update

# Install necessary tools

RUN apt-get install -y nano wget dialog net-tools

# Download and Install Nginx

RUN apt-get install -y nginx

 

Bootstrapping

 

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

# Remove the default Nginx configuration file

RUN rm -v /etc/nginx/nginx.conf

# Copy a configuration file from the current directory

ADD nginx.conf /etc/nginx/

# Append "daemon off;" to the beginning of the configuration

RUN echo "daemon off;" >> /etc/nginx/nginx.conf

# Expose ports

EXPOSE 80

# Set the default command to execute

# when creating a new container

CMD service nginx start

 

最后的Dockerfile

############################################################

# Dockerfile to build Nginx Installed Containers

# Based on Ubuntu

############################################################

# Set the base image to Ubuntu

FROM ubuntu

# File Author / Maintainer

MAINTAINER Maintaner Name

# Install Nginx

# Add application repository URL to the default sources

RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list

# Update the repository

RUN apt-get update

# Install necessary tools

RUN apt-get install -y nano wget dialog net-tools

# Download and Install Nginx

RUN apt-get install -y nginx

# Remove the default Nginx configuration file

RUN rm -v /etc/nginx/nginx.conf

# Copy a configuration file from the current directory

ADD nginx.conf /etc/nginx/

# Append "daemon off;" to the beginning of the configuration

RUN echo "daemon off;" >> /etc/nginx/nginx.conf

# Expose ports

EXPOSE 80

# Set the default command to execute

# when creating a new container

CMD service nginx start

 

使用Dockerfile自动构建Nginx容器

因为我们命令Docker用当前目录的Nginx的配置文件替换默认的配置文件,我们要保证这个新的配置文件存在。在Dockerfile存在的目录下,创建nginx.conf:
sudo nano nginx.conf
然后用下述内容替换原有内容:
worker_processes 1;
events { worker_connections 1024; }
http {
     sendfile on;
     server {
         listen 80;
         location / {
              proxy_pass http://httpstat.us/;
              proxy_set_header X-Real-IP $remote_addr;
         }
     }
}
让我们保存nginx.conf。之后我们就可以用Dockerfile和配置文件来构建镜像。




本文转自 dengaosky 51CTO博客,原文链接:http://blog.51cto.com/dengaosky/1854897,如需转载请自行联系原作者
相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
29天前
|
人工智能 NoSQL atlas
4大企业实例解析:为何MongoDB Atlas成为AI服务构建的首选
本文所提及的仅是MongoDB Atlas在AI领域可实现功能的冰山一角
1539 1
|
7月前
|
网络协议 应用服务中间件 nginx
使用Dockerfile编写源码安装Nginx镜像
使用Dockerfile编写源码安装Nginx镜像
99 0
|
8天前
|
DataWorks NoSQL 关系型数据库
DataWorks操作报错合集之在使用 DataWorks 进行 MongoDB 同步时遇到了连通性测试失败,实例配置和 MongoDB 白名单配置均正确,且同 VPC 下 MySQL 可以成功连接并同步,但 MongoDB 却无法完成同样的操作如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
25 1
|
7月前
|
负载均衡 应用服务中间件 网络安全
百度搜索:蓝易云【介绍Nginx、正向代理和实现反向代理的两个实例】
总结来说,Nginx是一个功能强大的Web服务器和反向代理服务器,可以通过正向代理实现内部员工访问外部互联网资源,通过反向代理实现负载均衡和SSL终端代理等功能。这些应用场景都能够提高性能、可靠性和安全性,使Nginx成为构建高效Web应用的重要工具之一。
74 2
|
4月前
|
缓存 应用服务中间件 nginx
Docker六脉神剑 (三) 编写Dockerfile构建nginx镜像并推送到远程仓库给其他人使用
Docker六脉神剑 (三) 编写Dockerfile构建nginx镜像并推送到远程仓库给其他人使用
33 0
|
5月前
|
存储 监控 NoSQL
数据存储与分析:办公室电脑屏幕监控的MongoDB应用实例
在当今数字时代,数据的存储和分析变得愈发重要,尤其是在办公环境中,对电脑屏幕进行监控成为一种日益普遍的需求。本文将介绍如何利用MongoDB数据库实现办公室电脑屏幕监控,并通过代码实例展示其应用。
222 0
|
5月前
|
负载均衡 安全 应用服务中间件
Nginx + Tomcat+HTTP/HTTPS实现负载均衡实例
Nginx + Tomcat+HTTP/HTTPS实现负载均衡实例
180 0
|
8月前
|
数据采集 NoSQL 容灾
如何实现不同MongoDB实例间的数据复制?
除了MongoDB迁移外,NineData支持MongoDB实例间的长期复制,可应用于数据容灾、读写分离、测试数据构建等业务场景。同时,NineData也已支持数十种常见数据库的迁移复制。NineData提供即开即用的SAAS模式,及企业专属集群模式,满足企业最高的数据安全合规要求。
103 0
如何实现不同MongoDB实例间的数据复制?
|
9月前
|
存储 NoSQL JavaScript
MongoDB实例:构建一个简单的任务管理应用
MongoDB作为一种灵活的文档型数据库,适用于多种应用场景。在本文中,我们将使用MongoDB构建一个简单的任务管理应用,展示其在实际应用中的使用。
101 1