用Docker构建与环境无关的系统

Docker 有三个特定的功能,以帮助建立与环境无关的系统:

  • 只读文件系统
  • 环境变量注入
  • 存储卷

处理卷是一个大主题,为了学习前两个功能,在本文的其余部分将改变对示例的需求。
WordPress 使用一个名为MySQL 的数据库程序来存储大部分数据,所以先确保运行WordPress 的容器是只读文件系统,是一个好主意。

1 只读文件系统

使用只读文件系统产生以下两个积极效果。首先,你对容器不能更改它所包含的文件产生信心;其次,你也会进一步树立信念:容器中的攻击者无法破坏文件。
为了在客户系统上使用--read-only 标志,从WordPress 镜像创建和启动一个容器:

docker run -d --name wp --read-only wordpress:4

完成这些步骤后,检查容器是否正在运行。你可使用任何先前介绍的方法,也可以直接检查容器元数据。如果指定的wp 容器正在运行,以下命令将输出为真,否则为假。

docker inspect --format "{{.State.Running}}" wp

docker inspect 命令将显示Docker 为该容器保留的所有元数据(一个JSON 文件)。
格式选项会改变元数据。除了该容器的运行状态,本例中其会滤除元数据的所有字段。这个命令将简单地输出为错误。
在这种情况下,容器没有运行。为了找出原因,检查容器中的日志:

docker logs wp

输出是这样的:

error: missing WORDPRESS_DB_HOST and MYSQL_PORT_3306_TCP environment variables
Did you forget to --link some_mysql_container:mysql or set an external db with -e WORDPRESS_DB_HOST=hostname:port?

看起来WordPress 有一个MySQL 数据库的依赖关系。数据库是一个程序,根据检索和搜索方式存储数据。好消息是,你可以使用Docker 安装MySQL,就像安装WordPress:

docker run -d --name wpdb \
-e MYSQL_ROOT_PASSWORD=ch2demo \
mysql:5

一旦启动后,会创建一个不同的WordPress 容器,并链接到这个新的数据库容器中:

再检查一次,WordPress 是否正常运行:

docker inspect --format "{{.State.Running}}" wp2

你可以得知WordPress 失败后重新启动。检查日志以确定原因:

docker logs wp2

应该有类似以下的日志:

... Read-only file system: AH00023: Couldn't create the rewrite-map mutex (file /var/lock/apache2/rewrite-map.1)

同样是WordPress 失败后重新启动,但这次的问题是,它试图写一个锁定文件到特定的位置。这是启动的必要组成部分,并无特殊。在这个示例中,需要为只读文件系统增加异常处理。你需要使用卷来做这个异常处理。使用下面的命令启动WordPress,不会有任何问题:

更新版本后你能用的脚本看上去像是这样:

SQL_CID=$(docker create -e MYSQL_ROOT_PASSWORD=ch2demo mysql:5)

docker start $SQL_CID
MAILER_CID=$(docker create dockerinaction/ch2_mailer)
docker start $MAILER_CID

WP_CID=$(docker create --link $SQL_CID:mysql -p 80 \
-v /run/lock/apache2/ -v /run/apache2/ \
--read-only wordpress:4)

docker start $WP_CID

AGENT_CID=$(docker create --link $WP_CID:insideweb \
--link $MAILER_CID:insidemailer \
dockerinaction/ch2_agent)

docker start $AGENT_CID

恭喜你,现在你应该有了一个正在运行的WordPress 容器!通过使用只读文件系统,以及链接WordPress 到另一个运行着数据库的容器,可以确保运行WordPress 镜像的容器永远不会改变。这意味着,如果运行客户的WordPress 博客程序的机器出了问题,可轻松在其他地方启动该容器的另一个副本。
但是这一设计有两个问题。首先,数据库和WordPress 的容器运行在同一个机器上。其次,WordPress 对重要的设置,如数据库名称、管理用户、管理密码、数据库加盐等使用默认值。为了解决这个问题,你可以创建多个版本的WordPress 软件,每一个客户都有一个特殊的配置。这样做会使简单的配置脚本变成一个在创建镜像时写入文件的怪物。通过使用环境变量来注入配置则是一个更好的方式。

2 环境变量的注入

环境变量是通过其执行上下文提供给程序的键值对。它可以让你在改变一个程序的配置时,无须修改任何文件或更改用于启动该程序的命令。
Docker 使用环境变量来传达相关信息,包括容器的守护选项、容器的主机名,以及其他在容器中运行程序的实用信息。Docker 还为用户提供了一个机制,可将环境变量注入到一个新的容器。那些期望通过环境变量获取重要信息的程序,可在容器创建时就进行配置。幸运的是,WordPress 就是这样一个程序。

在深入WordPress 的细节之前,尝试注入和观察你的环境变量。UNIX 命令env 显示当前执行上下文(终端)中的所有环境变量。要查看注入的环境变量,请使用以下命令:

--env 标志或-e 缩写,可用于注入任何环境变量。如果变量已经由镜像或Docker 设置,则该值将被覆盖。容器内部运行程序的方式,可以依赖于这种变量。WordPress 遵循以下环境变量:


 WORDPRESS_DB_HOST
 WORDPRESS_DB_USER
 WORDPRESS_DB_PASSWORD
 WORDPRESS_DB_NAME
 WORDPRESS_AUTH_KEY
 WORDPRESS_SECURE_AUTH_KEY
 WORDPRESS_LOGGED_IN_KEY
 WORDPRESS_NONCE_KEY
 WORDPRESS_AUTH_SALT
 WORDPRESS_SECURE_AUTH_SALT
 WORDPRESS_LOGGED_IN_SALT
 WORDPRESS_NONCE_SALT

提示 这个示例忽略了KEY 和SALT 变量,但任何实际的生产系统绝对应该设置这些值。

开始之前,你应该解决数据库和WordPress 容器在同一个机器上运行的问题。不是使用链接来满足WordPress 的数据库依赖,而是注入WORDPRESS_DB_HOST 变量的值:

docker create --env WORDPRESS_DB_HOST=<my database hostname> wordpress:4

这个示例会创建(并不启动)WordPress 容器。不管你在中指定的是什么,该容器都会试着连上一个MySQL 数据库。
由于远程数据库可能不会使用任何默认的用户名和密码,你就必须同时注入这些设置。假设数据库管理员是养猫爱好者且痛恨强密码:

docker create \
--env WORDPRESS_DB_HOST=<my database hostname> \
--env WORDPRESS_DB_USER=site_admin \
--env WORDPRESS_DB_PASSWORD=MeowMix42 \
wordpress:4

使用环境变量注入这一方法,能帮助你区分WordPress 容器和MySQL 容器之间的物理联系。由于数据库和客户的WordPress 网站都在同一台机器上,你仍然需要解决前面提到的第二个问题——所有的网站都使用相同的默认数据库名称。你需要为每一个独立的站点设置数据库名称以环境变量的方式注入:

你已经解决了这些问题,现在可以修改配置脚本了。首先,设置机器只能运行一个MySQL 容器:

DB_CID=$(docker run -d -e MYSQL_ROOT_PASSWORD=ch2demo mysql:5)
MAILER_CID=$(docker run -d dockerinaction/ch2_mailer)

那么网站配置脚本将是这样的:

这个新脚本将为每一位客户启动WordPress 实例和监控器,并将这些容器以及一个单独的邮件程序和MySQL 数据库彼此连接。WordPress 容器在被销毁、重新启动、升级的同时,完全不用担心数据会丢失。如图所示就是这种架构。

每个WordPress 和监控器容器使用相同的数据库和邮件服务

客户对当前交付的所有工作成果很满意。但有一件事可能会比较烦人。在早期的测试中,你发现监视器在该网站不可用时,的确可以准确通知邮件服务器,但重新启动该网站和监控器需要手动实现。要是系统在检测到故障时,能尝试自动恢复就更好了。Docker 对此提供了重启的策略,但仍不够稳定。

本文选自《Docker实战》。

想及时获得更多精彩文章,可在微信中搜索“博文视点”或者扫描下方二维码并关注。

时间: 2024-08-01 04:22:27

用Docker构建与环境无关的系统的相关文章

在 OSX 下使用 docker 构建 hexo 环境

2015-05-31 08:55        摘要: 截止目前为止,在docker hub上还看不到hexo 3+版本的镜像构建. 由于Node环境的安装时间比较长,对于电脑比较多的人相对来说还是比较麻烦的. 基于DockerFile构建自己的HEXO环境非常灵活,可以根据自己的情况进行定制. 可以导入导出复制环境部署到其他电脑中. 实践开始 docker安装 大部分Linux,比如说Ubuntu,Debian都可以通过如下命令安装: curl -sSL https://get.daoclou

Mac系统上用Docker搭建lamp环境_docker

前言 docker终于出来mac版本了,赶紧去下载,安装步骤,以前没有Mac版本的时候还要装docker toolbox,现在直接下载安装就好了. 安装好了的样子 状态栏 docker的提示 这个时候就可以到终端里面输入docker命令 $ docker --version Docker version 1.13.0-rc3, build 4d92237 $ docker-compose --version docker-compose version 1.9.0, build 2585387

容器,云和代码:Yelp如何使用Mesos和Docker构建混合云?

本文讲的是容器,云和代码:Yelp如何使用Mesos和Docker构建混合云,[编者的话]为了解决Yelp的基础设施问题,Eaton带领团队对容器进行调研并寻求解决方法,最终决定使用Apache Mesos和Mesosphere.基于Mesosphere构建了PaasTA服务,为测试环境开发了Seagull平台.本文对Yelp公司采取容器方案前的困境以及采取容器方案后的好处分别进行了说明. 2013年底,Yelp的运营总监Sam Eaton意识到公司基础设施存在问题.对开发和运维人员来说,在Ye

通过Ruby on Rails和docker构建微服务架构之入门教程

说到时下的架构,免不了会涉及到微服务.而谈到微服务架构,又跟容器和Docker技术脱不了关系.虽然容器和Docker并不完全是一回事,但两者是密不可分的,而且二者之间也有共同之处:在大型复杂应用的构建和运营方面,二者都可以大大提高企业的效率.   微服务可不像一般的应用,可以通过apt-get工具进行安装,大家可能会问了:我们该如何才能像安装应用一样实现这种服务呢?在很大的程度上,这个问题的答案是否定的,我们无法轻松实现这种服务.更准确的说,至少目前我们还无法实现.在一个系统中,最难修改的就是架

Spring Boot与Docker(二):使用Spring Boot和Docker构建微服务架构

本文讲的是Spring Boot与Docker(二):使用Spring Boot和Docker构建微服务架构,[编者的话]本篇是<使用Spring Boot和Docker构建微服务架构>系列的第二篇,本篇我们将会利用工具进行设置,深入探讨如何使用Docker工作,然后搭建我们的第一个容器.原文作者为3Pillar环球旗下美国Adbanced技术集团的总监Dan Greene,Dan有十八年的软件设计和开发经验,包括在电子商务.B2B集成.空间分析.SOA架构.大数据以及云计算等领域的软件产品架

联想企业网盘基于Docker构建分布式部署框架实践

本文讲的是联想企业网盘基于Docker构建分布式部署框架实践[编者的话]本文首先介绍了企业级分布式系统部署所面临的挑战,并且结合联想云存储自有框架研发经验分享了一些解决问题的思想和具体做法.最后还与Kubernetes项目进行了简单对比. 众所周知,企业网盘在这两年呈现爆发式增长,越来越多的企业选择企业网盘,来解决企业在业务过程中面临的数据集中存储.共享.分发.协同办公以及移动化等痛点需求.同时将企业网盘整合到各个业务系统中,大幅提高企业的数据流转效率和安全! 而联想企业网盘增长尤为迅速,仅联想

Garena黄智凯:Docker构建自动化运维

文章讲的是Garena黄智凯:Docker构建自动化运维,本文根据[2016 第七届中国数据库技术大会](微信搜索DTCC2014,关注关注中国数据库技术大会公众号)现场演讲嘉宾黄智凯老师分享内容整理而成.录音整理及文字编辑IT168@ZYY@老鱼 讲师简介 来自新加坡最大的互联网公司Garena,曾就职于新浪和奇虎360,DBA背景成长的他同时一直致力于运维平台自动化的建设和创新 正文 大家好,我是来自Garena公司的黄智凯,大家可能对Garena比较陌生,Garena最开始做游戏运营,现在

去哪儿网基于Mesos和Docker构建私有云服务的实践

本文讲的是去哪儿网基于Mesos和Docker构建私有云服务的实践[编者的话]本文深入介绍了去哪儿网利用Mesos和Docker构建私有云服务的全过程,分享了从无状态应用向有状态应用逐步过度的经验与心得. 平台概览 2014年下半年左右,去哪儿完成了有关构建私有云服务的技术调研,并最终拍定了Docker/Mesos这一方案.下图1展示了去哪儿数据平台的整体架构: 图1:去哪儿数据平台的整体架构 该平台目前已实现了如下多项功能: 每天处理约340亿/25TB的数据: 90%的数据在100ms内完成

去哪儿网基于Mesos和Docker构建私有云服务实践

本文深入介绍了去哪儿网利用Mesos和Docker构建私有云服务的全过程,分享了从无状态应用向有状态应用逐步过度的经验与心得. 平台概览 2014年下半年左右,去哪儿完成了有关构建私有云服务的技术调研,并最终拍定了Docker/Mesos这一方案.下图1展示了去哪儿数据平台的整体架构: 图1:去哪儿数据平台的整体架构 该平台目前已实现了如下多项功能: 每天处理约340亿/25TB的数据; 90%的数据在100ms内完成处理; 最长3h/24h的数据回放; 私有的Elasticsearch Clo