本文实例讲述了Docker搭建简单的应用栈与容器Hello World访问。分享给大家供大家参考,具体如下:
这里参考《Docker容器和容器云》 2.3.2章节应用栈搭建过程,对原书中出现的问题 -镜像不断的更新导致- 做了修改,特此说明。
系统环境
操作系统版本
$ cat /etc/issue Debian GNU/Linux 8 \n \l
内核版本
$ uname -r 3.16.0-4-amd64
Docker版本
docker version Client: Version: 1.12.1 API version: 1.24 Go version: go1.6.3 Git commit: 23cf638 Built: Thu Aug 18 05:02:53 2016 OS/Arch: linux/amd64 Server: Version: 1.12.1 API version: 1.24 Go version: go1.6.3 Git commit: 23cf638 Built: Thu Aug 18 05:02:53 2016 OS/Arch: linux/amd64
应用栈搭建
我们将搭建一个包含6个节点的Docker应用栈,其中包括一个代理节点、两个Web应用节点、一个主数据库节点及两个从数据库节点。应用栈的具体结构如图所示:

获取应用栈节点所需的镜像
根据应用栈结构,需要从Docker Hub获取HAProxy、Redis和Django的镜像:
# docker pull ubuntu:14.04 # docker pull haproxy # docker pull redis # docker pull django # docker images REPOSITORY TAG IMAGE ID CREATED SIZE haproxy latest 65599e2ea3f2 2 weeks ago 139.1 MB redis latest 0d1cbfaa41da 2 weeks ago 185 MB ubuntu 14.04 4a725d3b3b1c 3 weeks ago 188 MB django latest 79d802ec2b6c 4 weeks ago 437.4 MB
应用栈容器节点互联
docker run --link redis:redis --name console ubuntu bash
此处将在Ubuntu镜像上启动一个容器,并命名为console,同时将新启动的console容器连接到名为redis的容器上。docker run 命令的 --link选项用于添加连接到一个容器。这里还使用了 --name选项为容器指定名称。
关于Docker link用法可参考本站《Docker如何使用link建立容器之间的连接》
应用栈节点启动
启动应用栈节点之前先整理应用栈节点的连接过程:
- 启动redis-master容器节点;
- 两个redis-slave容器节点启动时连接到redis-master;
- 两个APP容器节点启动时连接到redis-master;
- HAProxy容器节点启动时连接到两个APP节点。
此外,为了能够从外网访问应用栈,并通过HAproxy节点访问应用栈中的APP,在启动HAProxy节点时使用-p参数将端口暴露给主机。
综上,容器启动顺序为:
redis-master -》redis slave -》APP -》HAProxy
启动Redis容器
# docker run -it --name redis-master redis /bin/bash # docker run -it --name redis-slave1 --link redis-master:master redis /bin/bash # docker run -it --name redis-slave2 --link redis-master:master redis /bin/bash
启动Django容器
# docker run -it --name APP1 --link redis-master:db -v ~/Projects/Django/APP1:/usr/src/app django /bin/bash # docker run -it --name APP2 --link redis-master:db -v ~/Projects/Django/APP2:/usr/src/app django /bin/bash
启动HAproxy容器
# docker run -it --name HAProxy --link APP1:APP1 --link APP2:APP2 -p 6301:6301 -v ~/Projects/HAProxy:tmp haproxy /bin/bash
说明:启动每个容器时都需分配一个终端。
容器启动信息查看:
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ab25650701f0 haproxy "/docker-entrypoint.s" 3 hours ago Up 3 hours 0.0.0.0:6301->6301/tcp HAProxy ace790044e06 django "/bin/bash" 3 hours ago Up 3 hours APP2 64963af16131 django "/bin/bash" 3 hours ago Up 3 hours APP1 aa77330aee2a redis "docker-entrypoint.sh" 3 hours ago Up 3 hours 6379/tcp redis-slave2 1fd72289d4f2 redis "docker-entrypoint.sh" 3 hours ago Up 3 hours 6379/tcp redis-slave1 518b41200dab redis "docker-entrypoint.sh" 3 hours ago Up 3 hours 6379/tcp redis-master
应用栈容器节点配置
Redis Master主数据库容器节点配置
我们知道通过volume可以在宿主机和容器之间共享数据,因此可在宿主机上创建和编辑Redis的启动配置文件。使用docker inpect命令查看volume挂载情况:
# docker inspect -f '{{ .Mounts }}' redis-master
[{5920a23b5e230a449230bbd4807912793bbc3bab0a05ae085ff95423301f0d6c /var/lib/docker/volumes/5920a23b5e230a449230bbd4807912793bbc3bab0a05ae085ff95423301f0d6c/_data /data local true }]
可以看出,redis-master的volume在宿主机上为目录/var/lib/docker/volumes/5920a23b5e230a449230bbd4807912793bbc3bab0a05ae085ff95423301f0d6c/_data,在容器中为/data。
执行如下命令创建Redis的启动配置文件redis.conf:
# cd /var/lib/docker/volumes/5920a23b5e230a449230bbd4807912793bbc3bab0a05ae085ff95423301f0d6c/_data # cp /~/redis.conf . # vim redis.conf
对于redis主数据库,修改如下模板文件中的几个参数:
daemonize yes pidfile /var/run/redis.pid
redis.conf模板下载:https://github.com/yhsong-linux/docker-redis/blob/master/redis.conf
在宿主机上创建好启动配置文件后,切换到容器中的/data目录,将redis.conf拷贝到执行工作目录,然后启动redis服务:
# cd /data # cp redis.conf /usr/local/bin # cd /usr/local/bin # redis-server redis.conf
Redis Slave从数据库容器节点配置
与Redis Master容器节点类似,在启动Redis Slave容器节点之后,需要查看vloume信息,并创建启动配置文件。
对于Redis从数据库,需要修改如下几个参数:
daemonize yes pidfile /var/run/redis.pid slaveof master 6379
在宿主机上创建好启动配置文件后,切换到容器中的/data目录,将redis.conf拷贝到执行工作目录,然后启动redis服务:
# cd /data # cp redis.conf /usr/local/bin # cd /usr/local/bin # redis-server redis.conf
Redis数据库容器节点测试
在Redis Master和Redis Slave容器节点的配置和服务启动后,可以通过启动Redis的客户端程序来测试数据库。
首先,在Redis Master容器内,启动Redis的客户端程,并存储一个数据:
# redis-cli 127.0.0.1:6379> set master 518b OK 127.0.0.1:6379> get master "518b"
接着,在两个Redis Slave容器内,分别启动Redis的客户端程,查询之前在Master数据库中存储的数据:
# redis-cli 127.0.0.1:6379> get master "518b"
根据响应可知,Master数据库中的数据已经同步到Slave数据库中。至此,应用栈的数据库部分搭建完成。
APP容器节点(Django)的配置
Django容器启动后,需要利用Django框架,开发一个简单的Web程序。为了访问数据库,需要在容器中安装Python的Redis支持包:
# pip install redis
安装完成后,验证支持包是否安装成功:
# python Python 3.4.5 (default, Aug 22 2016, 20:55:07) [GCC 4.9.2] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import redis >>> print(redis.__file__) /usr/local/lib/python3.4/site-packages/redis/__init__.py

