您好,登錄后才能下訂單哦!
這篇文章主要講解了“Docker怎么搭建Django+Mariadb環境”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Docker怎么搭建Django+Mariadb環境”吧!
先通讀全文后,再自行決定需要實踐的步驟。后文總是有更簡潔更快更好的實踐。
不過,新人建議從頭到尾實踐,也不失為“笨辦法學Docker”的美談一樁。
本文思路:
直接拉取Mariadb鏡像,搭建數據庫 手動Build Django鏡像: 以python2.7為基礎鏡像 讓我們做的更好:以Python2.7-slim為基礎鏡像的優化 "docker -v"&&"docker --link"
源碼:git@github.com:AnInputForce/autodepopy.git
基本上是邊學邊實驗,關鍵步驟都有commit。請各位參考。
參考:在Mac中直接安裝Maridb(不推薦),Mac中MariaDB數據庫的安裝步驟
首先,把你的宿主機mac或linux裝上tree命令。沒有也沒關系,下文有相關的換成ls即可;
docker pull mariadb
映射數據庫數據文件和配置文件
新建~/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)
很意外,翻了翻官方hub 鏡像,有如下提示:
This image is officially deprecated in favor of the standard
python
image;
大致意思是:這個鏡像已被標準python鏡像取代。該鏡像不能直接帶來Django環境,僅有的價值是提供一些Django依賴如mysql-client等。或許因為Django是APP級的,依賴于Project的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
直接使用Python2.7基礎鏡像,簡單粗暴省事,適合想快速體驗的孩子:
# 基礎鏡像 FROM python:2.7 # 維護者信息 MAINTAINER kang.cunhua <kangcunhua@git.com.cn> # app 所在目錄 WORKDIR /usr/local/web ADD . /usr/local/web/ # 安裝 app 所需依賴 RUN pip install --no-cache-dir -r 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
當前目錄:~\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 root@9326b308aacd:/usr/local/web#
清理多余文件
root@9326b308aacd:/usr/local/web# ls requirements.txt root@9326b308aacd:/usr/local/web# rm *
驗證
root@9326b308aacd:/usr/local/web# python --version Python 2.7.13 root@9326b308aacd:/usr/local/web# python -m django --version 1.11.3
root@26ad1dfb070f:/usr/web# django-admin startproject autodeploy root@26ad1dfb070f:/usr/web# cd autodeploy && python manage.py runserver 0:8000
http://localhost:8000,不出意外,你可以看到傳說中的Django歡迎頁面:
It worked! Congratulations on your first Django-powered page.
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
到此為止,此容器使命已經完成:生成項目初始化目錄,刪了即可;
ChinaDreams:autodeploy kangcunhua$ docker stop web && docker rm 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"
http://localhost:8000
It worked! Congratulations on your first Django-powered page.
歡慶吧,少年!
我們此時還未使用到Mariadb,默認使用的是SqlLite數據庫。接下來我們看看,從web容器中如何訪問數據庫;
我們默認使用的是Python的基礎庫,安裝完django體積達到了驚人的近700M。
在docker pull安裝鏡像時,簡直是龜速:由于眾所周知的原因
在pip install 安裝python模塊是,也和龜速差不多了:由于眾所周知的原因
我們能不能做的更好?答案是,必須能!
# 基礎鏡像 FROM python:2.7-slim # 維護者信息 MAINTAINER kang.cunhua <kangcunhua@git.com.cn> # 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
注釋已經不少了,對于新增的內容,還有些解釋如下:
改用更小的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
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
同樣使用的是阿里云的python pip源,安裝時指定阿里云的源,并信任即可即可:
-i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
是因為“python manage.py dbshell”命令需要。此命令可以方便操作數據庫,并自動加載了一些環境變量;開發環境還是用得到的;生成環境可以移除;若不安裝,執行命令python manage.py dbshell
時,會提示
CommandError: You appear not to have the 'mysql' program installed or on your path.
因為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
是因為“python manage.py shell”進入交互式命令行會用到。不安裝不方便。如果你安裝了ipython 會自動用它們的界面。ipython是一套增強交互式Shell,用過的都說好;當然:生產環境可以不用安裝。
ChinaDreams:autodeploy kangcunhua$ docker exec -d my-mariadb mysql -uroot -p1q2w -e "create database mydeploy;"
刪除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', } }
當前目錄:~\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
這時,就不得不提“--link”命令的使用了:
—link name:alias
name是我們連接容器的名字,alias是link的別名。比如我們連接了數據庫容器的web容器,就可以拿alias來配置數據庫連接了。見下文:我們在啟動容器時link數據庫:
不加這個link,你在web容器中,是連不上127.0.0.1:3306的。即使暴露了3306端口;
此時我們數據庫應該是啟動的,如果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
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 root@e309fd9e718f:/usr/src/web# cd autodeploy/ root@e309fd9e718f:/usr/src/web/autodeploy# python manage.py migrate root@e309fd9e718f:/usr/src/web/autodeploy# python manage.py createsuperuser
在web容器中,執行
python manage.py runserver 0:8000
在宿主機上訪問
http://localhost:8000
就可以看到傳說中的Django歡迎頁:“It works!”。查看數據庫,也有對應的表創建了。
登錄后臺,也可以看到對應自動生成好的頁面
http://localhost:8000/admin
對了,mac下MySQL或Mariadb客戶端,推薦Sequel Pro,免費且超級好用,比Oracle官方的都好用。
答案是:能,必須能!比如我們可以引進docker compose來創建幾個微服務,整合指揮整個系統架構;
docker-compse是我們容器集群的眾多微服務管理利器。
不使用文件的方式更新源,改為在dockfile中直接用命令寫入阿里云的源,方便在git中管理版本。
來一份完整的dockerfile參考:
# 基礎鏡像 FROM python:2.7-slim # 維護者信息 MAINTAINER kang.cunhua <kangcunhua@git.com.cn> # 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
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
ChinaDreams:z-dev kangcunhua$ docker exec -it zdev_web_1 /bin/bash root@e309fd9e718f:/usr/local/web# cd autodeploy/ root@e309fd9e718f:/usr/local/web/autodeploy# python manage.py migrate root@e309fd9e718f:/usr/local/web/autodeploy# python manage.py createsuperuser
root@e309fd9e718f:/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 # 查看微服務群容器狀態
如果不指定,默認容器服務的name是"當前目錄_service_number",比如"zdev_web_1",指定為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
參考:Start a mariadb
server instance,強烈推薦。
參考: docker(6):使用dokcer 構建 mariadb 數據庫
使用一個最簡單的辦法安裝了mariadb。并且將數據放到了宿主機的/data/mysql/data 目錄下面了。 方便數據備份,數據遷移,同時暴露了3306端口對外。 使用docker還是非常的方便的,比起yum安裝配置簡單多了。 配置文件也可以通過目錄映射的方式修改。 而且完全的拆分了服務,存儲,接口。真的是一個集裝箱了。
參考:mac tree命令及參數
$ brew install tree
Getting Started
Writing your first Django app, part 1
Writing your first Django app, part 2
感謝各位的閱讀,以上就是“Docker怎么搭建Django+Mariadb環境”的內容了,經過本文的學習后,相信大家對Docker怎么搭建Django+Mariadb環境這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。