Docker 搭建 Django+Mariadb 環境

閱讀建議

先通讀全文後,再自行決定需要實踐的步驟。後文總是有更簡潔更快更好的實踐。

不過,新人建議從頭到尾實踐,也不失為“笨辦法學 Docker” 的美談一樁。

本文思路:

Docker 搭建 Django+Mariadb 環境

源碼:[email protected]:AnInputForce/autodepopy.git

基本上是邊學邊實驗,關鍵步驟都有 commit。請各位參考。

正文

環境之 “Docker-Mariadb” 搭建

參考:在 Mac 中直接安裝 Maridb(不推薦),Mac中MariaDB數據庫的安裝步驟

首先,把你的宿主機 mac 或 linux 裝上 tree 命令。沒有也沒關係,下文有相關的換成 ls 即可;

下載 Mariadb 數據庫鏡像

Docker 搭建 Django+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
root@77de3a6bf3fe:/# 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;
Docker 搭建 Django+Mariadb 環境

創建 Dockerfile

直接使用 Python2.7 基礎鏡像,簡單粗暴省事,適合想快速體驗的孩子:

Docker 搭建 Django+Mariadb 環境

創建 requirements.txt

Docker 搭建 Django+Mariadb 環境

宿主機當前目錄結構

Docker 搭建 Django+Mariadb 環境

Build 鏡像

當前目錄:~\workspace\autodeploy

Docker 搭建 Django+Mariadb 環境

查看鏡像

Docker 搭建 Django+Mariadb 環境

啟動運行&進入容器

後臺啟動:-d 參數,不加就進入bash交互界面了。此處為演示,先 run -d 後臺,再 exec 進入;

Docker 搭建 Django+Mariadb 環境

清理和驗證環境

清理多餘文件

Docker 搭建 Django+Mariadb 環境

驗證

Docker 搭建 Django+Mariadb 環境

腳手架生成項目,啟動 web 服務

Docker 搭建 Django+Mariadb 環境

瀏覽器訪問

http://localhost:8000,不出意外,你可以看到傳說中的 Django 歡迎頁面:

Docker 搭建 Django+Mariadb 環境

把項目框架 copy 出來

CONTROL-C 退出 webserver;然後退出容器:

root@9326b308aacd:/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
---------------------
作者:reboot_xwa
來源:CSDN
原文:https://blog.csdn.net/reboot_xwa/article/details/85249404
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

刪除容器 web

到此為止,此容器使命已經完成:生成項目初始化目錄,刪了即可;

Docker 搭建 Django+Mariadb 環境

新啟容器 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 歡迎界面

http://localhost:8000

Docker 搭建 Django+Mariadb 環境

歡慶吧,少年!

讓我們做的更好

需要清醒的是,還有以下問題

  • 我們此時還未使用到 Mariadb,默認使用的是 SqlLite 數據庫。接下來我們看看,從 web 容器中如何訪問數據庫;
  • 我們默認使用的是 Python 的基礎庫,安裝完 django 體積達到了驚人的近 700M。
  • 在 docker pull 安裝鏡像時,簡直是龜速:由於眾所周知的原因
  • 在 pip install 安裝 python 模塊是,也和龜速差不多了:由於眾所周知的原因
  • 我們能不能做的更好?答案是,必須能!

改進我們的 Dockerfile

Docker 搭建 Django+Mariadb 環境

註釋已經不少了,對於新增的內容,還有些解釋如下:

python:2.7-slim

改用更小的 slim 鏡像。一是減小構建鏡像大小,二是可以從精簡版折騰開始,複習鞏固 Dockerfile 的知識。

比對下前後兩個構建完畢的鏡像打下,安裝了一大堆工具,鏡像減小了1/2的體積。之所以第二個鏡像 repository:tag 都為 none,是因為我們這次打包的鏡像也使用了mydjango:latest。

Docker 搭建 Django+Mariadb 環境

sources.list

python 的鏡像使用的 Debian,版本是 jessie。找到了國內阿里雲的加速鏡像。

Docker 搭建 Django+Mariadb 環境

mirrors.aliyun.com

同樣使用的是阿里雲的 python pip源,安裝時指定阿里雲的源,並信任即可即可:

Docker 搭建 Django+Mariadb 環境

安裝 mysql-client

是因為 “python manage.py dbshell” 命令需要。此命令可以方便操作數據庫,並自動加載了一些環境變量;開發環境還是用得到的;生成環境可以移除;若不安裝,執行命令 python manage.py dbshell時,會提示

Docker 搭建 Django+Mariadb 環境

安裝和卸載 gcc

因為 MySQL-python 的安裝依賴 gcc。網上也有說安裝 MySQL-devel 包就能解決,暫不需要,也有提示把這些 python-devel mysql-devel zlib-devel openssl-devel,都安裝上就好了,太多了。只安裝 gcc,用完之後再卸載即可。

不安裝 gcc 在 build 時編譯 MySQL-python 報錯:

Docker 搭建 Django+Mariadb 環境

安裝 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,所以又生成了。

Docker 搭建 Django+Mariadb 環境

進入 web 容器,修改 /autodeploy/autodeploy/settings.py中DATABASES 配置:

Docker 搭建 Django+Mariadb 環境

因為我們已經做了本地映射,直接用 Vscode 修改對應配置文件也是有效的;

注意’HOST’: ‘db’中,db就是我們在link中配置的別名。

Docker 搭建 Django+Mariadb 環境

Build 鏡像

當前目錄:~\workspace\autodeploy

Docker 搭建 Django+Mariadb 環境

查看鏡像

Docker 搭建 Django+Mariadb 環境

Web 容器訪問 Mariadb 數據庫

這時,就不得不提“–link”命令的使用了:

Docker 搭建 Django+Mariadb 環境

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 搭建 Django+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;

Docker 搭建 Django+Mariadb 環境

創建管理員

先 migrate 數據庫,在創建管理員

Docker 搭建 Django+Mariadb 環境

啟動 web 服務器

在 web 容器中,執行

Docker 搭建 Django+Mariadb 環境

在宿主機上訪問

Docker 搭建 Django+Mariadb 環境

就可以看到傳說中的 Django 歡迎頁:“It works!”。查看數據庫,也有對應的表創建了。

登錄後臺,也可以看到對應自動生成好的頁面

Docker 搭建 Django+Mariadb 環境

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
# 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

Docker 搭建 Django+Mariadb 環境

啟動並訪問

Docker 搭建 Django+Mariadb 環境

migrateDB、創建管理員

Docker 搭建 Django+Mariadb 環境

校驗環境變量

Docker 搭建 Django+Mariadb 環境

排錯命令

基本上 docker 能用的命令,docker-compose 也能用

Docker 搭建 Django+Mariadb 環境

指定 Project 名啟動

如果不指定,默認容器服務的 name 是”當前目錄 _service_number”,比如 ”zdev_web_1”,指定為 autoploy 後,應該會變成_”autodeploy__web_1”。

Docker 搭建 Django+Mariadb 環境

訪問

http://localhost:8000

http://localhost:8000/admin

  • 因為加載了之前的數據庫文件,所以之前的仍舊能用:
  • 賬號是之前創建好的 admin/root8888

當前文件目錄

Docker 搭建 Django+Mariadb 環境

參考列表

Mariadb 在 Docker 下安裝配置

參考:Start a mariadb server instance(https://hub.docker.com/_/mariadb/

),強烈推薦。

參考: docker(6):使用dokcer 構建 mariadb 數據庫(https://blog.csdn.net/freewebsys/article/details/53540615)

使用一個最簡單的辦法安裝了 mariadb。並且將數據放到了宿主機的 /data/mysql/data 目錄下面了。 方便數據備份,數據遷移,同時暴露了 3306 端口對外。 使用docker還是非常的方便的,比起yum安裝配置簡單多了。 配置文件也可以通過目錄映射的方式修改。 而且完全的拆分了服務,存儲,接口。真的是一個集裝箱了。

Mac tree 命令

參考:mac tree命令及參數(http://www.cnblogs.com/ayseeing/p/4097066.html)

Docker 搭建 Django+Mariadb 環境

Django 文檔

Getting Started

  • Writing your first Django app, part 1
  • Writing your first Django app, part 2

51Reboot K8s專場分享

時間:2019年1月4號21:00-22:00​

分享講師:GY 老師

​10年一線軟件開發經驗,先後經歷了傳統安全公司,以及多家互聯網公司;在安全開發方面,曾開發過 Linux 防火牆、web 應用防火牆、Linux 安全內核加固,基於大流量的 Web 安全威脅分析等項目;在互聯網公司工作時,曾基於 DPDK 高性能網絡開發框架開發過基於全流量的網絡流量分析平臺和基於 Sflow 網絡流量分析平臺,基於 Golang 開發 SmartDNS 等;開發語言也是從C -> python -> golang 的轉變過程?現從事基於 K8S 和 Docker在私有云平臺建設方面的研發工作;具備豐富的Linux系統開發經驗、網絡開發經驗以及項目管理經驗;目前開發工作 90+% 都在用 Golang,Golang 是一門簡潔、高效、強大且靈活的編程語言。

參與方式:掃碼添加小助手wechat:18310139238,備註:公開課,拉入直播分享群與老師互動


分享到:


相關文章: