Docker 搭建 Django+Mariadb 環(huán)境

一、閱讀建議

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

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

本文思路:

直接拉取 Mariadb 鏡像,搭建數(shù)據(jù)庫
手動 Build Django 鏡像:
以 python2.7 為基礎(chǔ)鏡像
讓我們做的更好:以 Python2.7-slim 為基礎(chǔ)鏡像的優(yōu)化
"docker -v"&&"docker --link"

源碼:git@github.com:AnInputForce/autodepopy.git

基本上是邊學(xué)邊實驗,關(guān)鍵步驟都有 commit。請各位參考。

二、正文

環(huán)境之“Docker-Mariadb”搭建

參考:在 Mac 中直接安裝 Maridb(不推薦),Mac 中 MariaDB 數(shù)據(jù)庫的安裝步驟(https://www.jb51.net/article/93202.htm

首先,把你的宿主機(jī) mac 或 linux 裝上 tree 命令。沒有也沒關(guān)系,下文有相關(guān)的換成 ls 即可;

下載 Mariadb 數(shù)據(jù)庫鏡像
docker pull mariadb
啟動并配置 DB
  • 映射數(shù)據(jù)庫數(shù)據(jù)文件和配置文件

  • 新建~/mariadb/data 、~/mariadb/custom 目錄

  • -v ~/mariadb/data:/var/lib/mysql 映射數(shù)據(jù)文件出來

  • -v ~/mariadb/custom:/etc/mysql/conf.d 映射配置文件出來

  • 指定數(shù)據(jù)庫編碼 utf8mb4,參考:mysql 使用 utf8mb4 經(jīng)驗吐血總結(jié)

$ 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 psCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES77de3a6bf3fe        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 bashroot@77de3a6bf3fe:/# mysql -uroot -p1q2wWelcome 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)

環(huán)境之“Docker-Django”搭建

很意外,翻了翻官方 hub 鏡像,有如下提示:

This image is officially deprecated in favor of the standard python image;

大致意思是:這個鏡像已被標(biāo)準(zhǔn) python 鏡像取代。該鏡像不能直接帶來Django 環(huán)境,僅有的價值是提供一些 Django 依賴如 mysql-client 等。或許因為Django 是 APP 級的,依賴于 Project 的 requirements.txt,like this:

只能自己動手,豐衣足食了。正好練練剛學(xué)習(xí)到的知識。

準(zhǔn)備項目目錄
  • workspace 工作空間,所有項目大本營:自己習(xí)慣

  • autodeploy 自動部署項目的目錄:自己習(xí)慣

  • z-dev 存放開發(fā)環(huán)境 dockerfile 及相關(guān)信息:自己習(xí)慣

  • z-pub 存放生產(chǎn)環(huán)境 dockerfile 及相關(guān)信息:自己習(xí)慣

  • .dockerignore 存放不被鏡像build 時關(guān)注的文件:來自 Vscode。linux下不可見,具體內(nèi)容詳見此項目 github;

$ mkdir -p ~/workspace/autodeploy && cd ~/workspace/autodeploy && mkdir z-dev z-pub
創(chuàng)建 Dockerfile

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

# 基礎(chǔ)鏡像FROM python:2.7# 維護(hù)者信息MAINTAINER kang.cunhua <kangcunhua@git.com.cn> # app 所在目錄WORKDIR /usr/local/webADD . /usr/local/web/# 安裝 app 所需依賴RUN pip install --no-cache-dir -r requirements.txt
創(chuàng)建 requirements.txt
Django==1.11.3MySQL-python
宿主機(jī)當(dāng)前目錄結(jié)構(gòu)
ChinaDreams:autodeploy kangcunhua$ tree.├── readme.md├── z-dev│   ├── Dockerfile│   └── requirements.txt└── z-pub   └── Dockerfile2 directories, 4 files
Build 鏡像

當(dāng)前目錄:~\workspace\autodeploy

cd z-dev && docker build -t mydjango:latest .
查看鏡像
ChinaDreams:z-dev kangcunhua$ docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEmydjango            latest              90a25c587400        23 seconds ago      699MB
啟動運(yùn)行&進(jìn)入容器

后臺啟動:-d 參數(shù),不加就進(jìn)入 bash 交互界面了。此處為演示,先 run -d 后臺,再 exec 進(jìn)入;

ChinaDreams:z-dev kangcunhua$ docker run --name web -it -p 8000:8000 -d mydjango /bin/bash0b0e757708c29d0aa1799c14b6cd1f19a48e7cd748223064a0ab9205432ed23aChinaDreams:z-dev kangcunhua$ docker exec -it web /bin/bashroot@9326b308aacd:/usr/local/web#
清理和驗證環(huán)境

清理多余文件

root@9326b308aacd:/usr/local/web# lsrequirements.txtroot@9326b308aacd:/usr/local/web# rm *

驗證

root@9326b308aacd:/usr/local/web# python --versionPython 2.7.13root@9326b308aacd:/usr/local/web# python -m django --version1.11.3
腳手架生成項目,啟動 web 服務(wù)
root@26ad1dfb070f:/usr/web# django-admin startproject autodeployroot@26ad1dfb070f:/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;然后退出容器:

root@9326b308aacd:/usr/local/web/autodeploy# exitexitChinaDreams: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   └── Dockerfile3 directories, 13 files
刪除容器 web

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

ChinaDreams:autodeploy kangcunhua$ docker stop web && docker rm web
新啟容器 web,掛載本地目錄

本地目錄優(yōu)先覆蓋容器目錄,然后就實時同步了。PS:所以一開始想把容器內(nèi)某目錄掛載出來,比較難。不如先 copy 出來,清空。然后從本地掛載上去。

“run -d”后臺啟動,exec執(zhí)行命令啟動 web server

ChinaDreams:autodeploy kangcunhua$  docker run --name web -d -it -p 8000:8000 -v ~/workspace:/usr/local/web  mydjango /bin/bash2bf0f6d17f1d103a37a7992393e1f97483034cdadb01df6cf49ab4e1d8746f62ChinaDreams:autodeploy kangcunhua$ docker exec -it web /bin/bash -c "cd autodeploy&&python manage.py runserver 0:8000"
運(yùn)行,收獲 Django 歡迎界面

http://localhost:8000

It worked!Congratulations on your first Django-powered page.

歡慶吧,少年!

三、讓我們做的更好

需要清醒的是,還有以下問題
  • 我們此時還未使用到 Mariadb,默認(rèn)使用的是 SqlLite 數(shù)據(jù)庫。接下來我們看看,從 web 容器中如何訪問數(shù)據(jù)庫;

  • 我們默認(rèn)使用的是 Python 的基礎(chǔ)庫,安裝完 django 體積達(dá)到了驚人的近 700M。

  • 在 docker pull 安裝鏡像時,簡直是龜速:由于眾所周知的原因

  • 在 pip install 安裝 python 模塊是,也和龜速差不多了:由于眾所周知的原因

  • 我們能不能做的更好?答案是,必須能!

改進(jìn)我們的 Dockerfile
# 基礎(chǔ)鏡像FROM python:2.7-slim# 維護(hù)者信息MAINTAINER kang.cunhua <kangcunhua@git.com.cn> # app 所在目錄WORKDIR /usr/src/webADD . /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

注釋已經(jīng)不少了,對于新增的內(nèi)容,還有些解釋如下:

python:2.7-slim

改用更小的 slim 鏡像。一是減小構(gòu)建鏡像大小,二是可以從精簡版折騰開始,復(fù)習(xí)鞏固 Dockerfile 的知識。

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

ChinaDreams:z-dev kangcunhua$ docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEmydjango            latest              8fee1723a96c        2 minutes ago       355MB<none>              <none>              90a25c587400        About an hour ago   699MB
sources.list

python 的鏡像使用的 Debian,版本是 jessie。找到了國內(nèi)阿里云的加速鏡像。

deb http://mirrors.aliyun.com/debian/ jessie main non-free contribdeb http://mirrors.aliyun.com/debian/ jessie-proposed-updates main non-free contribdeb-src http://mirrors.aliyun.com/debian/ jessie main non-free contribdeb-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” 命令需要。此命令可以方便操作數(shù)據(jù)庫,并自動加載了一些環(huán)境變量;開發(fā)環(huán)境還是用得到的;生成環(huán)境可以移除;若不安裝,執(zhí)行命令 python manage.py dbshell 時,會提示

CommandError: You appear not to have the 'mysql' program installed or on your path.安裝和卸載gcc
安裝和卸載 gcc

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

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

unable to execute 'gcc': No such file or directoryerror: command 'gcc' failed with exit status 1
安裝 ipython==5.4.1

是因為 “python manage.py shell” 進(jìn)入交互式命令行會用到。不安裝不方便。如果你安裝了 ipython 會自動用它們的界面。ipython 是一套增強(qiáng)交互式 Shell,用過的都說好;當(dāng)然:生產(chǎn)環(huán)境可以不用安裝。

開始重新構(gòu)建
準(zhǔn)備:創(chuàng)建數(shù)據(jù)庫
ChinaDreams:autodeploy kangcunhua$ docker exec -d my-mariadb mysql -uroot -p1q2w -e "create database mydeploy;"
準(zhǔn)備:修改 DB 配置

刪除db.sqlite3,之前雖然copy時刪除了,但是運(yùn)行webserver時默認(rèn)配置的還是sqlite3,所以又生成了。

cd ~/workspace/autodeploy && rm db.sqlite3

進(jìn)入 web 容器,修改 /autodeploy/autodeploy/settings.py中DATABASES 配置:

docker exec -it web /bin/bash

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

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

DATABASES = {     'default': {         'ENGINE': 'django.db.backends.mysql',         'NAME': 'mydeploy',         'USER': 'root',         'PASSWORD': '1q2w',         'HOST': 'db',         'PORT': '3306',     }  }
Build 鏡像

當(dāng)前目錄:~\workspace\autodeploy

cd z-dev && docker build -t mydjango:latest .
查看鏡像
ChinaDreams:z-dev kangcunhua$ docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEmydjango            latest              90a25c587400        23 seconds ago      699MB

Web 容器訪問 Mariadb 數(shù)據(jù)庫

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

—link name:alias

name 是我們連接容器的名字,alias 是 link 的別名。比如我們連接了數(shù)據(jù)庫容器的 web 容器,就可以拿 alias 來配置數(shù)據(jù)庫連接了。見下文:我們在啟動容器時 link 數(shù)據(jù)庫:

不加這個 link,你在 web 容器中,是連不上 127.0.0.1:3306 的。即使暴露了 3306 端口;

后臺啟動數(shù)據(jù)庫(-d)

此時我們數(shù)據(jù)庫應(yīng)該是啟動的,如果 docker ps 發(fā)現(xiàn)沒有啟動,沒關(guān)系,敲如下命令啟動:

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

為項目創(chuàng)建數(shù)據(jù)庫 mydeploy,如果有錯誤,先查日志

docker exec -d my-mariadb mysql -uroot -p1q2w -e "create database mydeploy;" docker logs my-mariadb
啟動 web 容器 link 數(shù)據(jù)庫容器
docker run --name web  --link=my-mariadb:db -it -p 8000:8000 -v ~/workspace:/usr/src/web  -d mydjango:latest /bin/bash e309fd9e718faf6629ce668860d5c9392c52da4f649f4307abf632a15b67285c
驗證環(huán)境命令

分別是:檢查 python 版本、檢查 django 版本、進(jìn)入 dbshell 操作數(shù)據(jù)庫、進(jìn)入 ipython;

python --versionpython manage.py -m django --version./manage.py dbshell./manage.py shell
創(chuàng)建管理員

先 migrate 數(shù)據(jù)庫,在創(chuàng)建管理員

ChinaDreams:z-dev kangcunhua$ docker exec -it web /bin/bashroot@e309fd9e718f:/usr/src/web# cd autodeploy/root@e309fd9e718f:/usr/src/web/autodeploy# python manage.py migrateroot@e309fd9e718f:/usr/src/web/autodeploy# python manage.py createsuperuser
啟動 web 服務(wù)器

在 web 容器中,執(zhí)行

python manage.py runserver 0:8000

在宿主機(jī)上訪問

http://localhost:8000

就可以看到傳說中的 Django 歡迎頁:“It works!”。查看數(shù)據(jù)庫,也有對應(yīng)的表創(chuàng)建了。登錄后臺,也可以看到對應(yīng)自動生成好的頁面

http://localhost:8000/admin
MySql客戶端推薦

對了,mac 下 MySQL 或 Mariadb 客戶端,推薦 Sequel Pro,免費且超級好用,比Oracle 官方的都好用。

四、能不能做的更好

答案是:能,必須能!比如我們可以引進(jìn) docker compose 來創(chuàng)建幾個微服務(wù),整合指揮整個系統(tǒng)架構(gòu);

讓我們引入 docker-compose

docker-compse 是我們?nèi)萜骷旱谋姸辔⒎?wù)管理利器。

修訂 dockerfile

不使用文件的方式更新源,改為在 dockfile 中直接用命令寫入阿里云的源,方便在 git中管理版本。

來一份完整的 dockerfile 參考:

# 基礎(chǔ)鏡像FROM python:2.7-slim# 維護(hù)者信息MAINTAINER kang.cunhua <kangcunhua@git.com.cn> # app 所在目錄WORKDIR /usr/local/webADD . /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、創(chuàng)建管理員
ChinaDreams:z-dev kangcunhua$ docker exec -it zdev_web_1 /bin/bashroot@e309fd9e718f:/usr/local/web# cd autodeploy/root@e309fd9e718f:/usr/local/web/autodeploy# python manage.py migrateroot@e309fd9e718f:/usr/local/web/autodeploy# python manage.py createsuperuser
校驗環(huán)境變量
root@e309fd9e718f:/usr/local/web/autodeploy# python manage.py dbshellshow variables like 'character_set_database';show variables like 'collation_%';
排錯命令

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

docker-compose up -d  # 后臺啟動docker-compose logs    # 查看微服務(wù)群日志docker-compose ps    # 查看微服務(wù)群容器狀態(tài)
指定 Project 名啟動

如果不指定,默認(rèn)容器服務(wù)的name是”當(dāng)前目錄 _service_number”,比如”zdev_web_1”,指定為 autoploy 后,應(yīng)該會變成 _”autodeploy__web_1”。

COMPOSE_PROJECT_NAME=autodeploy docker-compose updocker-compose -p autodeploy up
訪問
當(dāng)前文件目錄
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       └── Dockerfile4 directories, 15 files

五、參考列表

Mariadb 在 Docker 下安裝配置

參考:Start a mariadb server instance,強(qiáng)烈推薦。

參考: docker(6):使用dokcer 構(gòu)建 mariadb 數(shù)據(jù)庫

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

Mac tree 命令

參考:mac tree 命令及參數(shù)

> $ brew install tree>
Django 文檔
  • Getting Started

  • Writing your first Django app, part 1

  • Writing your first Django app, part 2

51Reboot 最新課程招生信息

docker + k8s

此課程為網(wǎng)絡(luò)直播課程,一共 10 個課時,每周上一個全天,歷時兩個多月。附加:錄播視頻+筆記+除課堂外的答疑時間(7次+)2019-1-13 開課,原價 5800 ,現(xiàn)在周年活動 100 定金抵 800(活動馬上結(jié)束)

課程主講師
GY 老師:

10年一線軟件開發(fā)經(jīng)驗,先后經(jīng)歷了傳統(tǒng)安全公司,以及多家互聯(lián)網(wǎng)公司;在安全開發(fā)方面,曾開發(fā)過 Linux 防火墻、web 應(yīng)用防火墻、Linux 安全內(nèi)核加固,基于大流量的 Web 安全威脅分析等項目;在互聯(lián)網(wǎng)公司工作時,曾基于 DPDK 高性能網(wǎng)絡(luò)開發(fā)框架開發(fā)過基于全流量的網(wǎng)絡(luò)流量分析平臺和基于 Sflow 網(wǎng)絡(luò)流量分析平臺,基于 Golang 開發(fā) SmartDNS 等;開發(fā)語言也是從C -> python -> golang 的轉(zhuǎn)變過程?現(xiàn)從事基于 K8S 和 Docker在私有云平臺建設(shè)方面的研發(fā)工作;具備豐富的Linux系統(tǒng)開發(fā)經(jīng)驗、網(wǎng)絡(luò)開發(fā)經(jīng)驗以及項目管理經(jīng)驗;目前開發(fā)工作90+% 都在用 Golang,Golang 是一門簡潔、高效、強(qiáng)大且靈活的編程語言。

關(guān)于課程的具體內(nèi)容想要了解的, 掃碼加小助手咨詢


掃碼咨詢,備注“公開課,來源簡書”
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容