Docker 部署常用服务

经过上面几节的积累,我们对 Docker 各个方面都有了大致的了解,这一节,我们将常用的 Redis,Nginx, Mysql 等服务部署到 Docker 上来。

1. 获取 Docker 服务

Tips:这里部署时默认使用最新稳定的官方镜像版本,如有版本要求自行在镜像名后标注 :tag 即可。

1.1 Redis

Redis 是一个使用 ANSI C 编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库。

# 使用 Docker 启动 redis 服务,端口默认,使用host网络模式保障性能。
docker run --restart=always --network host -d -it --name myredis redis

将 redis 数据保存到宿主机目录:

mkdir -p ~/docker/redis/data # 新建宿主机目录
docker run --restart=always --network host  -d -it -v ~/docker/redis/data:/data --name myredis redis

指定自己的配置文件

# 先将配置文件放到 ~/docker/redis/redis.conf
docker run --restart=always --network host -d -it -v ~/docker/redis/redis.conf:/usr/local/etc/redis/redis.conf --name myredis redis redis-server /usr/local/etc/redis/redis.conf

1.2 Nginx

Nginx 是异步框架的网页服务器,也可以用作反向代理、负载平衡器和HTTP缓存:

# 使用 Docker 启动 redis 服务,端口默认,使用host网络模式保障性能。
# 使用自己的html目录,ro设定宿主机目录挂载到容器后,容器对此目录只读
docker run --restart=always --network host -d -it -v ~/docker/nginx/html:/usr/share/nginx/html:ro --name mynginx nginx 

指定自己的配置文件

  # 先将配置文件放到 ~/docker/nginx/etc/nginx 目录下
  docker run --restart=always --network host -d -it -v ~/docker/nginx/html:/usr/share/nginx/html:ro -v ~/docker/nginx/etc/nginx:/etc/nginx --name mynginx nginx 

1.3 MySQL

MySQL是一个开放源码的关系数据库管理系统。

# 使用 Docker 启动 redis 服务,端口默认,使用host网络模式保障性能。
# my-secret-pw 指定mysql的root用户密码
docker run --restart=always --network host -d -it --name mymysql -e MYSQL_ROOT_PASSWORD=my-secret-pw mysql

将mysql数据保存到宿主机目录:

mkdir -p ~/docker/mysql/data # 新建宿主机目录
docker run --restart=always --network host  -d -it -v ~/docker/mysql/data:/var/lib/mysql --name mymysql -e MYSQL_ROOT_PASSWORD=my-secret-pw mysql

指定自己的配置文件

 # 将配置文件放入 ~/docker/mysql/conf.d/
docker run --restart=always --network host  -d -it -v ~/docker/mysql/conf.d/:/etc/mysql/conf.d  --name mymysql -e MYSQL_ROOT_PASSWORD=my-secret-pw mysql

2. 实战:使用 flask 调用 redis 容器应用

接下来我们将通过一个flask web应用,实现主页访问计数功能,我们使用 redis 服务帮助我们实现计数统计功能。这个 redis 服务运行在我们的 Docker 容器中。

Tips: 这里使用 flask 只是想借助一个简单的 web 框架来演示使用 docker 容器运行的 redis,不了解也没有关系,这里只是一个小例子。

首先,我们在 CentOS 中安装 Python3 和flask框架,以及 Python 的 redis 客户端库。

# 安装python3
sudo dnf install -y python3
# 安装flask与redis python客户端
pip3 install redis flask --user

接下来,将下面的代码保存到~/test/app.py

import flask

from flask import Flask

app = Flask(__name__)

from redis import StrictRedis
from redis import ConnectionPool

# 指定redis服务地址
REDIS_HOST = os.getenv('REDIS_HOST','127.0.0.1')
# 指定redis端口号
REDIS_PORT = os.getenv('REDIS_PORT', '6379')
# 指定redis的数据库
REDIS_DB = os.getenv('REDIS_DB', '0')
# 指定redis的密码
REDIS_PASSWORD = os.getenv('REDIS_PASSWORD', '12345678')

class Redis:
    def __init__(self):
        self.cli = None

    def connect(self):
        pool = ConnectionPool(host=REDIS_HOST,
                              port=REDIS_PORT,
                              db=REDIS_DB,
                              password=REDIS_PASSWORD)
        return StrictRedis(connection_pool=pool)

    def add_pv(self):
        self.connection.incr('pv', 1)

    def get_pv(self):
        count = self.connection.get('pv')
        return int(count)

    @property
    def connection(self):
        if self.cli:
            return self.cli
        else:
            self.cli = self.connect()
            return self.cli


redis = Redis()


@app.route('/')
def index():
    redis.add_pv()
    return "<h1>Hello World, 本页已访问{}次。</h1>".format(redis.get_pv())

~/docker/redis/ 目录下,配置 redis.conf 文件

cd ~/docker/redis
# 获取官方提供的redis配置文件模板
wget http://download.redis.io/redis-stable/redis.conf
# 修改redis密码
echo  "requirepass 12345678" >> redis.conf

配置文件修改好后,用它来配置 Docker 的 redis 容器应用。

docker run --restart=always --network host -d -it -v ~/docker/redis/redis.conf:/usr/local/etc/redis/redis.conf --name myredis redis redis-server /usr/local/etc/redis/redis.conf

redis容器启动完成后,在 ~/test/ 目录下执行 python3 -m flask run,打开Linux系统中的浏览器,输入127.0.0.1:5000 访问这个 web 应用的主页,多次刷新查看效果。
图片描述

3. 小结

Docker官方镜像仓库 提供了众多高质量的镜像和使用文档,生态也非常活跃。这种简单的部署方式更接近是一种获取软件的方式,相信大家都有体会,在平时的开发测试中,个人的开发机上安装这些服务经常费时费力,到时寻找安装包,甚至可能还要编译源码,结果出现一些意想不到的问题。熟练掌握这种方法部署应用服务,可以快速且高效地获取一致的开发部署环境。