Docker 搭建 Django+Mariadb 環境
閱讀建議
先通讀全文後,再自行決定需要實踐的步驟。後文總是有更簡潔更快更好的實踐。
不過,新人建議從頭到尾實踐,也不失為“笨辦法學 Docker” 的美談一樁。
本文思路:
直接拉取Mariadb映象,搭建資料庫
手動Build Django映象:
以python2.7為基礎映象
讓我們做的更好:以Python2.7-slim為基礎映象的優化
"docker -v"&&"docker --link"
原始碼:[email protected]:AnInputForce/autodepopy.git
基本上是邊學邊實驗,關鍵步驟都有 commit。請各位參考。
正文
環境之 “Docker-Mariadb” 搭建
參考:在 Mac 中直接安裝 Maridb(不推薦),Mac中MariaDB資料庫的安裝步驟
首先,把你的宿主機 mac 或 linux 裝上 tree 命令。沒有也沒關係,下文有相關的換成 ls 即可;
下載 Mariadb 資料庫映象
docker pull mariadb
啟動並配置 DB
- 對映資料庫資料檔案和配置檔案
- 新建 ~/mariadb/data 、~/mariadb/custom 目錄
- -v ~/mariadb/data:/var/lib/mysql 對映資料檔案出來
- -v ~/mariadb/custom:/etc/mysql/conf.d 對映配置檔案出來
- 指定資料庫編碼 utf8mb4,參考:mysql 使用 utf8mb4 經驗吐血總結
$ mkdir -p ~/mariadb/data ~/mariadb/custom $ docker run --name my-mariadb -v ~/mariadb/data:/var/lib/mysql -v ~/mariadb/custom:/etc/mysql/conf.d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1q2w -d mariadb:latest --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
測試驗證
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
77de3a6bf3fe mariadb:latest "docker-entrypoint..." 2 minutes ago Up About a minute 0.0.0.0:3306->3306/tcp my-mariadb
$ docker exec -it my-mariadb bash
[email protected]:/# mysql -uroot -p1q2w
Welcome to the MariaDB monitor. Commands end with ; or \g.
....
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
3 rows in set (0.02 sec)
環境之“Docker-Django”搭建
很意外,翻了翻官方 hub 映象,有如下提示:
This image is officially deprecated in favor of the standard python image;
大致意思是:這個映象已被標準 python 映象取代。該映象不能直接帶來 Django 環境,僅有的價值是提供一些 Django 依賴如mysql-client 等。或許因為 Django 是 APP 級的,依賴於 Projec t的 requirements.txt,like this:
只能自己動手,豐衣足食了。正好練練剛學習到的知識。
準備專案目錄
- workspace 工作空間,所有專案大本營:自己習慣
- autodeploy 自動部署專案的目錄:自己習慣
- z-dev 存放開發環境 dockerfile 及相關資訊:自己習慣
- z-pub 存放生產環境 dockerfile 及相關資訊:自己習慣
- .dockerignore 存放不被映象 build 時關注的檔案:來自 Vscode。linux下不可見,具體內容詳見此專案 github;
$ mkdir -p ~/workspace/autodeploy && cd ~/workspace/autodeploy && mkdir z-dev z-pub
建立 Dockerfile
直接使用 Python2.7 基礎映象,簡單粗暴省事,適合想快速體驗的孩子:
# 基礎映象
FROM python:2.7
# 維護者資訊
MAINTAINER kang.cunhua <[email protected]>
# app 所在目錄
WORKDIR /usr/local/web
ADD . /usr/local/web/
# 安裝 app 所需依賴
RUN pip install --no-cache-dir -r requirements.txt
建立 requirements.txt
Django==1.11.3
MySQL-python
宿主機當前目錄結構
ChinaDreams:autodeploy kangcunhua$ tree
.
├── readme.md
├── z-dev
│ ├── Dockerfile
│ └── requirements.txt
└── z-pub
└── Dockerfile
2 directories, 4 files
Build 映象
當前目錄:~\workspace\autodeploy
cd z-dev && docker build -t mydjango:latest .
檢視映象
ChinaDreams:z-dev kangcunhua$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mydjango latest 90a25c587400 23 seconds ago 699MB
啟動執行&進入容器
後臺啟動:-d 引數,不加就進入 bash 互動介面了。此處為演示,先 run -d 後臺,再 exec 進入;
ChinaDreams:z-dev kangcunhua$ docker run --name web -it -p 8000:8000 -d mydjango /bin/bash
0b0e757708c29d0aa1799c14b6cd1f19a48e7cd748223064a0ab9205432ed23a
ChinaDreams:z-dev kangcunhua$ docker exec -it web /bin/bash
[email protected]:/usr/local/web#
清理和驗證環境
清理多餘檔案
[email protected]:/usr/local/web# ls
requirements.txt
[email protected]:/usr/local/web# rm *
驗證
[email protected]:/usr/local/web# python --version
Python 2.7.13
[email protected]:/usr/local/web# python -m django --version
1.11.3
腳手架生成專案,啟動 web 服務
[email protected]:/usr/web# django-admin startproject autodeploy
[email protected]:/usr/web# cd autodeploy && python manage.py runserver 0:8000
瀏覽器訪問
http://localhost:8000,不出意外,你可以看到傳說中的 Django 歡迎頁面:
It worked!
Congratulations on your first Django-powered page.
把專案框架 copy 出來
CONTROL-C 退出 webserver;然後退出容器:
[email protected]:/usr/local/web/autodeploy# exit
exit
ChinaDreams:z-dev kangcunhua$ cd ~/workspace && docker cp web:/usr/local/web/autodeploy . && cd autodeploy && rm -rf db.sqlite3 && tree
.
├── autodeploy
│ ├── __init__.py
│ ├── __init__.pyc
│ ├── settings.py
│ ├── settings.pyc
│ ├── urls.py
│ ├── urls.pyc
│ ├── wsgi.py
│ └── wsgi.pyc
├── manage.py
├── readme.md
├── z-dev
│ ├── Dockerfile
│ └── requirements.txt
└── z-pub
└── Dockerfile
3 directories, 13 files
刪除容器 web
到此為止,此容器使命已經完成:生成專案初始化目錄,刪了即可;
ChinaDreams:autodeploy kangcunhua$ docker stop web && docker rm web
新啟容器 web,掛載本地目錄
本地目錄優先覆蓋容器目錄,然後就實時同步了。PS:所以一開始想把容器內某目錄掛載出來,比較難。不如先 copy 出來,清空。然後從本地掛載上去。
“run -d” 後臺啟動,exec 執行命令啟動 web server
ChinaDreams:autodeploy kangcunhua$ docker run --name web -d -it -p 8000:8000 -v ~/workspace:/usr/local/web mydjango /bin/bash
2bf0f6d17f1d103a37a7992393e1f97483034cdadb01df6cf49ab4e1d8746f62
ChinaDreams:autodeploy kangcunhua$ docker exec -it web /bin/bash -c "cd autodeploy&&python manage.py runserver 0:8000"
執行,收穫 Django 歡迎介面
It worked!
Congratulations on your first Django-powered page.
歡慶吧,少年!
讓我們做的更好
需要清醒的是,還有以下問題
- 我們此時還未使用到 Mariadb,預設使用的是 SqlLite 資料庫。接下來我們看看,從 web 容器中如何訪問資料庫;
- 我們預設使用的是 Python 的基礎庫,安裝完 django 體積達到了驚人的近 700M。
- 在 docker pull 安裝映象時,簡直是龜速:由於眾所周知的原因
- 在 pip install 安裝 python 模組是,也和龜速差不多了:由於眾所周知的原因
- 我們能不能做的更好?答案是,必須能!
改進我們的 Dockerfile
# 基礎映象
FROM python:2.7-slim
# 維護者資訊
MAINTAINER kang.cunhua <[email protected]>
# app 所在目錄
WORKDIR /usr/src/web
ADD . /usr/src/web
# 安裝 app 所需依賴,做一些清理工作
RUN buildDeps='gcc'; \
deveDeps='mysql-client'; \
set -x \
&& cp /etc/apt/sources.list /etc/apt/sources.list.backup \
&& mv sources.list /etc/apt/sources.list \
&& apt-get update && apt-get install -y libmysqlclient-dev $buildDeps $deveDeps \
# When using Python 2.7, please install IPython 5.x LTS Long Term Support version.
&& pip install --no-cache-dir -r requirements.txt ipython==5.4.1 \
-i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com \
&& rm -rf requirements.txt \
# 移除gcc
&& apt-get purge -y --auto-remove $buildDeps
註釋已經不少了,對於新增的內容,還有些解釋如下:
python:2.7-slim
改用更小的 slim 映象。一是減小構建映象大小,二是可以從精簡版折騰開始,複習鞏固 Dockerfile 的知識。
比對下前後兩個構建完畢的映象打下,安裝了一大堆工具,映象減小了1/2的體積。之所以第二個映象 repository:tag 都為 none,是因為我們這次打包的映象也使用了mydjango:latest。
ChinaDreams:z-dev kangcunhua$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mydjango latest 8fee1723a96c 2 minutes ago 355MB
<none> <none> 90a25c587400 About an hour ago 699MB
sources.list
python 的映象使用的 Debian,版本是 jessie。找到了國內阿里雲的加速映象。
deb http://mirrors.aliyun.com/debian/ jessie main non-free contrib
deb http://mirrors.aliyun.com/debian/ jessie-proposed-updates main non-free contrib
deb-src http://mirrors.aliyun.com/debian/ jessie main non-free contrib
deb-src http://mirrors.aliyun.com/debian/ jessie-proposed-updates main non-free contrib
mirrors.aliyun.com
同樣使用的是阿里雲的 python pip源,安裝時指定阿里雲的源,並信任即可即可:
-i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
安裝 mysql-client
是因為 “python manage.py dbshell” 命令需要。此命令可以方便操作資料庫,並自動載入了一些環境變數;開發環境還是用得到的;生成環境可以移除;若不安裝,執行命令 python manage.py dbshell時,會提示
CommandError: You appear not to have the 'mysql' program installed or on your path.
安裝和解除安裝 gcc
因為 MySQL-python 的安裝依賴 gcc。網上也有說安裝 MySQL-devel 包就能解決,暫不需要,也有提示把這些 python-devel mysql-devel zlib-devel openssl-devel,都安裝上就好了,太多了。只安裝 gcc,用完之後再解除安裝即可。
不安裝 gcc 在 build 時編譯 MySQL-python 報錯:
unable to execute 'gcc': No such file or directory
error: command 'gcc' failed with exit status 1
安裝 ipython==5.4.1
是因為 “python manage.py shell” 進入互動式命令列會用到。不安裝不方便。如果你安裝了 ipython 會自動用它們的介面。ipython是一套增強互動式 Shell,用過的都說好;當然:生產環境可以不用安裝。
開始重新構建
準備:建立資料庫
ChinaDreams:autodeploy kangcunhua$ docker exec -d my-mariadb mysql -uroot -p1q2w -e "create database mydeploy;"
準備:修改 DB 配置
刪除 db.sqlite3,之前雖然 copy 時刪除了,但是執行 webserver 時預設配置的還是 sqlite3,所以又生成了。
cd ~/workspace/autodeploy && rm db.sqlite3
進入 web 容器,修改 /autodeploy/autodeploy/settings.py中DATABASES 配置:
docker exec -it web /bin/bash
因為我們已經做了本地對映,直接用 Vscode 修改對應配置檔案也是有效的;
注意’HOST’: ‘db’中,db 就是我們在 link 中配置的別名。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mydeploy',
'USER': 'root',
'PASSWORD': '1q2w',
'HOST': 'db',
'PORT': '3306',
}
}
Build 映象
當前目錄:~\workspace\autodeploy
cd z-dev && docker build -t mydjango:latest .
檢視映象
ChinaDreams:z-dev kangcunhua$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mydjango latest 90a25c587400 23 seconds ago 699MB
Web 容器訪問 Mariadb 資料庫
這時,就不得不提“–link”命令的使用了:
—link name:alias
name 是我們連線容器的名字,alias 是 link 的別名。比如我們連線了資料庫容器的 web 容器,就可以拿 alias 來配置資料庫連線了。見下文:我們在啟動容器時 link 資料庫:
不加這個 link,你在 web 容器中,是連不上127.0.0.1:3306的。即使暴露了 3306 埠;
後臺啟動資料庫(-d)
此時我們資料庫應該是啟動的,如果 docker ps 發現沒有啟動,沒關係,敲如下命令啟動:
docker run --name my-mariadb -v ~/mariadb/data:/var/lib/mysql -v ~/mariadb/custom:/etc/mysql/conf.d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1q2w -d mariadb:latest --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
為專案建立資料庫 mydeploy,如果有錯誤,先查日誌
docker exec -d my-mariadb mysql -uroot -p1q2w -e "create database mydeploy;"
docker logs my-mariadb
啟動 web 容器 link 資料庫容器
docker run --name web --link=my-mariadb:db -it -p 8000:8000 -v ~/workspace:/usr/src/web -d mydjango:latest /bin/bash
e309fd9e718faf6629ce668860d5c9392c52da4f649f4307abf632a15b67285c
驗證環境命令
分別是:檢查 python 版本、檢查 django 版本、進入 dbshell 操作資料庫、進入 ipython;
python --version
python manage.py -m django --version
./manage.py dbshell
./manage.py shell
建立管理員
先 migrate 資料庫,在建立管理員
ChinaDreams:z-dev kangcunhua$ docker exec -it web /bin/bash
[email protected]:/usr/src/web# cd autodeploy/
[email protected]:/usr/src/web/autodeploy# python manage.py migrate
[email protected]:/usr/src/web/autodeploy# python manage.py createsuperuser
啟動 web 伺服器
在 web 容器中,執行
python manage.py runserver 0:8000
在宿主機上訪問
http://localhost:8000
就可以看到傳說中的 Django 歡迎頁:“It works!”。檢視資料庫,也有對應的表建立了。
登入後臺,也可以看到對應自動生成好的頁面
http://localhost:8000/admin
MySql 客戶端推薦
對了,mac 下 MySQL 或 Mariadb 客戶端,推薦 Sequel Pro,免費且超級好用,比 Oracle 官方的都好用。
能不能做的更好
答案是:能,必須能!比如我們可以引進 docker compose 來建立幾個微服務,整合指揮整個系統架構;
讓我們引入 docker-compose
docker-compse 是我們容器叢集的眾多微服務管理利器。
修訂 dockerfile
不使用檔案的方式更新源,改為在 dockfile 中直接用命令寫入阿里雲的源,方便在 git 中管理版本。
來一份完整的 dockerfile 參考:
# 基礎映象
FROM python:2.7-slim
# 維護者資訊
MAINTAINER kang.cunhua <[email protected]>
# app 所在目錄
WORKDIR /usr/local/web
ADD . /usr/local/web
# 安裝 app 所需依賴,做一些清理工作
RUN buildDeps='gcc'; \
deveDeps='mysql-client'; \
set -x \
&& mv /etc/apt/sources.list /etc/apt/sources.list.bak \
&& echo "deb http://mirrors.aliyun.com/debian/ jessie main non-free contrib" >/etc/apt/sources.list \
&& echo "deb http://mirrors.aliyun.com/debian/ jessie-proposed-updates main non-free contrib" >>/etc/apt/sources.list \
&& echo "deb-src http://mirrors.aliyun.com/debian/ jessie main non-free contrib" >>/etc/apt/sources.list \
&& echo "deb-src http://mirrors.aliyun.com/debian/ jessie-proposed-updates main non-free contrib" >>/etc/apt/sources.list \
&& apt-get update && apt-get install -y libmysqlclient-dev $buildDeps $deveDeps \
# When using Python 2.7, please install IPython 5.x LTS Long Term Support version.
&& pip install --no-cache-dir -r requirements.txt ipython==5.4.1 \
-i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com \
&& rm -rf requirements.txt \
# 移除gcc
&& apt-get purge -y --auto-remove $buildDeps
dockercompose.yml
version: '2'
services:
db:
image: mariadb
expose:
- "3306"
volumes:
- ~/mariadb/data:/var/lib/mysql
- ~/mariadb/custom:/etc/mysql/conf.d
environment:
- MYSQL_DATABASE=mydeploy
- MYSQL_ROOT_PASSWORD=1q2w
- ON_CREATE_DB="mydeploy"
- COMPOSE_PROJECT_NAME=autodeploy
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
web:
build:
context: .
image: mydjango:latest
volumes:
- ~/workspace:/usr/local/web
ports:
- "8000:8000"
links:
- db
command: python ./autodeploy/manage.py runserver 0.0.0.0:8000
啟動並訪問
docker-compose up
migrateDB、建立管理員
ChinaDreams:z-dev kangcunhua$ docker exec -it zdev_web_1 /bin/bash
[email protected]:/usr/local/web# cd autodeploy/
[email protected]:/usr/local/web/autodeploy# python manage.py migrate
[email protected]:/usr/local/web/autodeploy# python manage.py createsuperuser
校驗環境變數
[email protected]:/usr/local/web/autodeploy# python manage.py dbshell
show variables like 'character_set_database';
show variables like 'collation_%';
排錯命令
基本上 docker 能用的命令,docker-compose 也能用
docker-compose up -d # 後臺啟動
docker-compose logs # 檢視微服務群日誌
docker-compose ps # 檢視微服務群容器狀態
指定 Project 名啟動
如果不指定,預設容器服務的 name 是”當前目錄 _service_number”,比如 ”zdev_web1”,指定為 autoploy 後,應該會變成”autodeploy__web_1”。
COMPOSE_PROJECT_NAME=autodeploy docker-compose up
docker-compose -p autodeploy up
訪問
- http://localhost:8000
- http://localhost:8000/admin
- 因為載入了之前的資料庫檔案,所以之前的仍舊能用:
- 賬號是之前建立好的 admin/root8888
當前檔案目錄
ChinaDreams:workspace kangcunhua$ tree
.
└── autodeploy
├── autodeploy
│ ├── __init__.py
│ ├── __init__.pyc
│ ├── settings.py
│ ├── settings.pyc
│ ├── urls.py
│ ├── urls.pyc
│ ├── wsgi.py
│ └── wsgi.pyc
├── manage.py
├── readme.md
├── z-dev
│ ├── Dockerfile
│ ├── docker-compose.yml
│ ├── requirements.txt
│ └── sources.list
└── z-pub
└── Dockerfile
4 directories, 15 files
參考列表
Mariadb 在 Docker 下安裝配置
參考:Start a mariadb server instance,強烈推薦。
參考: docker(6):使用dokcer 構建 mariadb 資料庫
使用一個最簡單的辦法安裝了 mariadb。並且將資料放到了宿主機的 /data/mysql/data 目錄下面了。 方便資料備份,資料遷移,同時暴露了 3306 埠對外。 使用docker還是非常的方便的,比起yum安裝配置簡單多了。 配置檔案也可以通過目錄對映的方式修改。 而且完全的拆分了服務,儲存,介面。真的是一個集裝箱了。
Mac tree 命令
參考:mac tree命令及引數
$ brew install tree
Django 文件
- Getting Started
- Writing your first Django app, part 1
- Writing your first Django app, part 2
docker + k8s
此課程為網路直播課程,一共 10 個課時,每週上一個全天,歷時兩個多月。附加:錄播視訊+筆記+除課堂外的答疑時間(7次+)2019-1-13 開課,原價 5800 ,現在週年活動 100 定金抵 800
課程主講師:GY 老師
10 年一線軟體開發經驗,先後經歷了傳統安全公司,以及多家網際網路公司;在安全開發方面,曾開發過 Linux 防火牆、web 應用防火牆、Linux 安全核心加固,基於大流量的 Web 安全威脅分析等專案;在網際網路公司工作時,曾基於 DPDK 高效能網路開發框架開發過基於全流量的網路流量分析平臺和基於 Sflow 網路流量分析平臺,基於Golang 開發SmartDNS 等;開發語言也是從C -> python -> golang 的轉變過程?現從事基於 K8S 和 Docker在私有云平臺建設方面的研發工作;具備豐富的Linux系統開發經驗、網路開發經驗以及專案管理經驗;目前開發工作90+% 都在用 Golang,Golang 是一門簡潔、高效、強大且靈活的程式語言。
關於課程的具體內容想要了解的, 新增加小助手WeChat:17812796384 諮詢瞭解
本文由作者:蠻大人 授權釋出
連結:https://opsdev.fun/2017/07/17/O1-8-02-Docker%E6%90%AD%E5%BB%BADjango-Mariadb%E7%8E%AF%E5%A2%83/
著作權歸作者所有。
轉載請聯絡作者獲得授權。