1. 程式人生 > Docker入門教學 >使用 Docker 部署執行常用服務

使用 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官方映象倉庫 提供了眾多高質量的映象和使用文件,生態也非常活躍。這種簡單的部署方式更接近是一種獲取軟體的方式,相信大家都有體會,在平時的開發測試中,個人的開發機上安裝這些服務經常費時費力,到時尋找安裝包,甚至可能還要編譯原始碼,結果出現一些意想不到的問題。熟練掌握這種方法部署應用服務,可以快速且高效地獲取一致的開發部署環境。