Docker说明:如何创建运行Memcached功能的Docker容器

Docker说明:如何创建运行Memcached功能的Docker容器

Dec 16, 2013 Docker, Server Optimization Ubuntu

简介

对大多数网络应用来说,CPU很少成为HTTP请求丢失或者网络堵塞的元凶。更常见的情况是,设计的一个没有缓存层参与的工程,占用了所有的后端数据存储资源(例如你选择的数据库)。

Memcached——无需再多做介绍——可以极大的提升应用的栈部署性能,并且不需要对可用的资源进行任何修改(它能帮你用尽每一滴资源)。

在这篇DigitalOcean的文章中,记得特别注意主机运行了多个网络应用(比如多个WordPress实例,Python应用等),我们准备创建一个Docker镜像,可以快速的开始运行(一经要求)Memcached容器,并且可以独立运行。这些容器可以帮助被托管的应用程序变得更好更快,并保持一个安全的环境。

术语表

1. Docker简介

2. Memcached简介

3. 在Ubuntu上安装Docker

4. 基础Docker命令

1. Running the docker daemon and CLI Usage

2. docker命令

5. 从创建Memcached镜像开始

1. 快速回顾: 什么是Dockerfile?

2. Dockerfile命令回顾

3. 创建一个Dockerfile

4. Final Dockerfile

5. 为Memcached容器创建Docker镜像

6. 运行Dockerised化的Memcached容器

1. 创建一个安装Memcached的容器

2. 限制Memcached容器的内存大小

3. 测试Memcached容器

Docker简介

Docker项目提供的高级工具,支持协同工作,是在一些Linux内核功能的基础上建立的。目的是为了帮助开发者和系统管理员连接应用程序——联合所有的依赖关系——然后让它们能够跨系统、跨主机运行,免去了许多令人头疼的问题。

Docker为应用程序创建安全,基于LXC(即Linux容器)的环境,称为Docker容器。这些使用Docker镜像创建的容器,既可以通过人工执行命令,也可以通过Dockerfile自动创建。

Note:了解更多关于Docker和它的的组件(比如docker daemon, CLI, images等)的信息,参见我们对这个项目的介绍文章:docker Explained: Getting Started

Memcached简介

Memcached是一个分布式,开源的数据存储引擎。它被设计用来在RAM(替换了低速的传统硬盘)中存储特定种类的数据,供应用程序进行快速检索。减少了处理申请所花费的时间,通过减少查询的次数来抵消沉重缓慢的数据集或者API,比如传统的数据库(MySQL等)。

通过引进一个灵巧的,精心设计并经过最优化的缓存机制,它变得可以处理更大的请求量,执行更多的程序。这是Memcached最重要的应用实例,因为它也是这样缓存其他应用或内容的。

可以深度依赖,并被用在网站或者其他应用的生产中,Memcached已经成为一个即时提升性能的工具,而不必使用更好的硬件条件(比如更多的服务器或者服务资源)。

Memcached的工作方式是将关键词和他们对应的值(最大能达到1MB)保存在一个关联矩阵中(比如哈希表),延展和分布在大量的虚拟服务器中。

在Ubuntu上安装Docker(最新版)

想在你的VPS上开始使用Docker项目,你可以使用DigitalOcean的Ubuntu 13.04版本的Docker镜像,或者自行安装。在这一节中,我们会快速的复习Docker 0.7.1的基础安装方法。

Ubuntu安装操作指南

更新你的droplet

sudo aptitude    update
sudo aptitude -y upgrade

确保aufs支持功能可用

sudo aptitude install linux-image-extra-`uname -r`

为apt-key添加Docker仓库key进行包验证

sudo sh -c "wget -qO- https://get.docker.io/gpg | apt-key add -"

向aptitude源中添加Docker库

sudo sh -c "echo deb http://get.docker.io/ubuntu docker main\
> /etc/apt/sources.list.d/docker.list"

更新拥有新特性的库:

sudo aptitude    update

最后,下载安装Docker

sudo aptitude install lxc-docker

Ubuntu默认设置的防火墙(UFW:Uncomplicated Firewall)默认禁止了所有转发流量,然而Docker需要这个功能。

启用UFW的转发功能:

使用nano文本编辑器更改UFW的配置

sudo nano /etc/default/ufw

往下翻,找到以DEFAULTFORWARDPOLICY开头的一行,

将:

DEFAULT_FORWARD_POLICY="DROP"

换成:

DEFAULT_FORWARD_POLICY="ACCEPT"

按下CTRL+X,然后按Y同意保存并关闭。

最后重启UFW:

sudo ufw reload

基本的Docker命令

在我们开始使用Docker之前,先快速的回顾的它的命令,温习一下我们的第一篇文章( Getting Started)中所学的知识吧。

运行Docker后台进程和CLI用量

在安装过程中,Docker应该有后台进程在运行,来随时接收Docker CLI发送的命令。在特定的情况下可能需要手动重启Docker,那就使用下面的命令。

运行Dcoker后台进程

sudo docker -d &

Docker CLI 用量

sudo docker [option] [command] [arguments]

Note:Docker需要sudo权限来工作。

命令列表

目前版本(0.7.1)的Docker可用命令总览。

attach

连接到一个正在运行的可用容器

build

从Dockerfile建立一个容器

commit

给一个容器的改变创建一个新镜像

cp

从容器的文件系统中复制文件/文件夹到主机路径中

diff

检查一个容器的文件系统的变更

events

获取服务器中的实时任务

export

将容器中的内容保存为一个tar归档

history

显示一个镜像的历史记录

images

列出所有镜像

import

使用一个tarball中的内容新建一个文件系统

info

显示系统信息

insert

在镜像中插入一个文件

inspect

返回容器的低等级信息

kill

结束一个运行中的容器

load

从一个tar归档中载入一个镜像

login

注册或者登陆到Docker仓库服务器

logs

取出容器的日志文件

port

查找被转换成私有接口的公有接口

ps

列出所有容器

pull

从Docker库服务器中拉出一个镜像或者仓库

push

向Docker库服务器推送一个镜像或者仓库

restart

重启一个容器

rm

移除一个或多个容器

rmi

移除一个或多个镜像

run

在一个新容器中运行命令

save

将一个镜像保存到tar归档

search

在Docker主页中搜索一个镜像

start

启动一个停止的容器

stop

停止一个正在运行的容器

tag

标记一个进入仓库的镜像

top

查看一个容器中运行的进程

version

显示Docker的版本信息

开始创建Memcached镜像

基于我们之前学习的Docker系列文章里面的知识,我们直接深入到创建Dockerfile来实现自动构建安装Mamcached功能的镜像(将可以用来运行沙盒化的Memcached实例)。

快速回顾:什么是Dockerfile?

Dockerfile是包含可执行的声明的命令的脚本,将以给定的顺序执行,来让Docker自动的创建一个新的Docker镜像。这给部署工作带来了极大的帮助。

这些文件(Dockerfile)使用FROM命令,总是以对基础镜像的描述开头。从那开始,构建进程开始运行,向主机提交(保存镜像的状态)的每一步的操作形成了最终的镜像。

用法:

# Build an image using the Dockerfile at current location
# Tag the final image with [name] (e.g. *nginx*)
# Example: sudo docker build -t [name] .
sudo docker build -t memcached_img . 

Note:了解更多有关Dockerfile的知识,参见我们的文章:Docker Explained: Using Dockerfiles to Automate Building of Images.

##Dockerfile 命令概览
Add

从主机复制一个文件到容器中

CMD

设置默认被执行的命令,或者传递到ENTRYPOINT

ENTRYPOINT

设置容器中的默认ENTRYPOINT应用

ENV

设置环境变量(例如”key = value”)

EXPOSE

对外展示一个端口

FROM

设置使用的基础镜像

MAINTAINER

设置Dockerfile的作者/拥有者数据

RUN

运行一个命令,并提交运行完成后的(容器)镜像

USER

设置运行容器的用户

VOLUME

从主机安装一个目录到容器

WORKDIR

设置要执行CMD指令的目录

创建一个Dockerfile

因为Dockerfile由纯文本组成,所以创建一个变换,来让你使用最爱的文本编辑器,写下创建一个镜像需要Docker执行的命令。在你开始写这个文件后,继续在下面添加内容(一条接着一条),直到保存得到最终的结果。

Note:你会在本节的最后看到最终的Dockerfile是什么样子。

现在使用nano文本编辑器创建一个新的空Dockerfile:

nano Dockerfile

我们需要先后列出所有的指令。然而,一切都从一个(设置了FROM指令的)基础镜像上开始。

首先让我们定义一下Dockerfile的目标,并声明需要使用的基础镜像。

############################################################
# Dockerfile to run Memcached Containers
# Based on Ubuntu Image
############################################################

# Set the base image to use to Ubuntu
FROM ubuntu

# Set the file maintainer (your name - the file's author)
MAINTAINER Maintaner Name

在这个声明部分结束后,我们就可以开始列出Memcached的安装命令。

# Update the default application repository sources list
RUN apt-get update

# Install Memcached
RUN apt-get install -y memcached

设置默认对外开放的容器端口:

# Port to expose (default: 11211)
EXPOSE 11211

设置默认的执行命令和入口(例如Memcached进程):

# Default Memcached run command arguments
CMD ["-u", "root", "-m", "128"]

# Set the user to run Memcached daemon
USER daemon

# Set the entrypoint to memcached binary
ENTRYPOINT memcached

最终的Dockfile

############################################################
# Dockerfile to run Memcached Containers
# Based on Ubuntu Image
############################################################

# Set the base image to use to Ubuntu
FROM ubuntu

# Set the file maintainer (your name - the file's author)
MAINTAINER Maintaner Name

# Update the default application repository sources list
RUN apt-get update

# Install Memcached
RUN apt-get install -y memcached

# Port to expose (default: 11211)
EXPOSE 11211

# Default Memcached run command arguments
CMD ["-m", "128"]

# Set the user to run Memcached daemon
USER daemon

# Set the entrypoint to memcached binary
ENTRYPOINT memcached

全部写完之后,按下CTRL+X,然后按Y同意保存并关闭。

通过使用这个Dockerfile,我们已经做好了开始使用Dockerised化的Memcached容器的准备!

为Memcached容器创建镜像

我们现在可以创建第一个Memcached镜像,参照Dockerfile一节中的用法说明。

运行命令,创建一个标记为“memcached_img”的镜像:

sudo docker build -t memcached_img .

Note:不要遗漏了最后的 . ,Docker需要它来找到Dockerfile。

运行dockerised化的Memcached容器

使用下面的命令来创建一个新容器,可以根据你的需求修改这个例子。

# Example: sudo docker run -name [container name] -p [port to access:port exposed] -i -t [memcached image name]
sudo docker run -name memcached_ins -d -p 45001:11211 memcached_img

现在有了一个名为“memcachedins”的Dockers容器,在端口45001可用,使用我们之前建立的标记为“memcachedimg”的镜像。

限制Memcached容器的内存

如果想要限制一个Docker容器进程可以使用的内存量,只要设置-m [memory amount]并标上限制就可以了。

运行一个内存限制为256MB的容器:

# Example: sudo docker run -name [name] -m [Memory (int)][memory unit (b, k, m or g)] -d (to run not to attach) -p (to set access and expose ports) [image ID]
sudo docker run -name memcached_ins -m 256m -d -p 45001:11211 memcached_img

如果想要确认内存限制,你可以检查这个容器:

# Example: docker inspect [container ID] | grep Memory
sudo docker inspect memcached_ins | grep Memory

Note:上面的命令会抓取检查输出中的内存相关信息。如果想要查看关于你的容器的所有相关信息,选择sudo docker inspect [container ID]

测试Memcached容器

有许多方法来尝试你新建的Memcached容器。我们使用一个简单的Python CLI程序来测试。你可以让程序使用附加组件,框架或者库立刻投入生产。

确保你的主机拥有为Python/Memcached准备的必要库文件:

sudo apt-get update && sudo apt-get -y upgrade 
sudo apt-get install -y python-pip
pip install python-memcached

现在使用nano创建一个简单的Python脚本:

nano cache.py

把下面的内容复制粘贴进去:

# Import python-memcache and sys for arguments
import memcache
import sys

# Set address to access the Memcached instance
addr = 'localhost'

# Get number of arguments
# Expected format: python cache.py [memcached port] [key] [value]
len_argv = len(sys.argv)

# At least the port number and a key must be supplied
if len_argv < 3:
    sys.exit("Not enough arguments.")

# Port is supplied and a key is supplied - let's connect!
port  = sys.argv[1]
cache = memcache.Client(["{0}:{1}".format(addr, port)])

# Get the key
key   = str(sys.argv[2])

# If a value is also supplied, set the key-value pair
if len_argv == 4:

    value = str(sys.argv[3])    
    cache.set(key, value)

    print "Value for {0} set!".format(key)

# If a value is not supplied, return the value for the key
else:

    value = cache.get(key)

    print "Value for {0} is {1}.".format(key, value)

保存并退出。

在主机上使用上面的脚本,测试Docker的Memcached实例:

# Example: python cache.py [port] [key] [value]
python cache.py 45001 my_test_key test_value

# Return: Value for my_test_key set

# See if the key is set:
python cache.py 45001 my_test_key

# Return: Value for my_test_key is test_value.

安装和使用Docker的完整说明,参见docker.io上的docker documentation.

发表评论

电子邮件地址不会被公开。 必填项已用*标注