云原生Docker部署Django和mysql項目全過程
一、準備工作



鏡像加速源
| 鏡像加速器 | 鏡像加速器地址 |
|---|---|
| Docker 中國官方鏡像 | https://registry.docker-cn.com |
| DaoCloud 鏡像站 | http://f1361db2.m.daocloud.io |
| Azure 中國鏡像 | https://dockerhub.azk8s.cn |
| 科大鏡像站 | https://docker.mirrors.ustc.edu.cn |
| 阿里云(需要注冊,建議) | https://<your_code>.mirror.aliyuncs.com |
| 七牛云 | https://reg-mirror.qiniu.com |
| 網(wǎng)易云 | https://hub-mirror.c.163.com |
| 騰訊云 | https://mirror.ccs.tencentyun.com |

二、部署 Django & Mysql

1) .Dockignore
創(chuàng)建.dockignore文件
.git settings/local.py **/__pycache__
2) Dockfile
1.使用pip freeze > requirements.txt命令打包好項目的依賴包列表(這種方式只適合在虛擬環(huán)境中導(dǎo)出虛擬環(huán)境中的包,如果不是在虛擬環(huán)境下就會導(dǎo)出全局環(huán)境的python的環(huán)境包)
2.要想在全局環(huán)境中導(dǎo)出我們項目的依賴包,可以利用python包pipreqs
# 進入到項目所在目錄,在執(zhí)行下面的命令 $> pip install pipreqs $> pipreqs . --encoding=utf8 --force # “.” 指的是將導(dǎo)出依賴包的文件放在當前目錄下 # “--encoding=utf8” 指的是存放文件的編碼為utf-8,否則會報錯 # “--force” --force 強制執(zhí)行,當 生成目錄下的requirements.txt存在時強子覆蓋
3.創(chuàng)建dockfile文件
# 指定基礎(chǔ)鏡像
FROM python:3.7
#ENV server.params=
# updata太慢 設(shè)置鏡像源
RUN sed -i s@/deb.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list \
&& apt-get clean \
&& apt-get update \
&& apt-get install python3-dev default-libmysqlclient-dev -y
# 創(chuàng)建 code 文件夾并將其設(shè)置為工作目錄
RUN mkdir /code
WORKDIR /code
# 將 requirements.txt 復(fù)制到容器的 recruitment 目錄
ADD requirements.txt /code/
# 更新 pip 并 安裝依賴庫
RUN pip install pip -U && pip install -r requirements.txt
# COPY 是不解壓的
ADD . /code/
# CMD [ "/bin/sh", "/code/start.local.bat" ]
FROMpython:3.7 指令從倉庫拉取一個包含 python 3.7 的 Linux 操作系統(tǒng)環(huán)境(Linux 版本為 Debian)。RUN和WORKDIR指令都是針對容器的,功能是在容器里創(chuàng)建目錄、并將其設(shè)置為工作目錄。注意宿主機是沒有這個目錄的。ADD指令出現(xiàn)了兩次。ADD requirements.txt /code/意思是將宿主機當前目錄(即Dockerfile所在目錄)的requirements.txt文件復(fù)制到容器的/code目錄中。ADD . /code/意思是把當前目錄所有內(nèi)容復(fù)制到容器/code/目錄,注意中間那個點。
3) docker-compose.yml
version: "3"
services:
# 設(shè)置應(yīng)用 容器
app:
restart: always
build: . # todo 根據(jù)當前項目 dockerfile生成,相當于 docker build -t="ouruser/sinatra:v2" . # bash shell窗口 -c命令行 默認遷移 和 運行
command: bash -c "python manage.py runserver 0.0.0.0:8080" # bash -c "python manage.py runserver 0.0.0.0:8080"
volumes:
- .:/code
ports:
- "8080:8080"
depends_on:
- db
networks:
- db_network
# 設(shè)置數(shù)據(jù)庫 容器
db:
image: mysql:8 # 版本一定要對應(yīng)!
volumes:
- "./mysql/data:/var/lib/mysql" # 設(shè)置timestamp 可為 null # 設(shè)置字符集 (不是utf8會報錯 # collation 這是排序規(guī)則
# - "./mysql/conf/my.cnf:/etc/mysql/my.cnf"
command: "mysqld --user=root --explicit_defaults_for_timestamp --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci"
# - -character-set-server=utf8mb4 # 設(shè)置默認字節(jié)
# - -collation-server=utf8mb4_general_ci # 設(shè)置排序
# - -explicit_defaults_for_timestamp=true # 設(shè)置可為 null
# --default-authentication-plugin=mysql_native_password # 使用 5.7 版本的密碼驗證
# "mysqld --user=root --explicit_defaults_for_timestamp --character-set-server=utf8mb4"
ports:
- "3307:3306"
restart: always
environment:
- MYSQL_ROOT_PASSWORD=123456 # 一定要配置
- MYSQL_DATABASE=django_recruitment
networks:
- db_network
# 設(shè)置網(wǎng)絡(luò)
networks:
db_network:
driver: bridge
version代表 docker-compose.yml 的版本,目前最新版為 3,不需要改動它。
從整體上看,我們定義了二個容器,分別是app、db,容器之間通過定義的端口進行通訊。定義了網(wǎng)絡(luò)db_network,只有處在同一網(wǎng)絡(luò)下的容器才能夠互相通訊。不同網(wǎng)絡(luò)之間是隔離的,即便采用同樣的端口,也無法通訊。
定義了一個名叫 app 的容器。后面的內(nèi)容都是 app 容器的相關(guān)配置:
restart:除正常工作外,容器會在任何時候重啟,比如遭遇 bug、進程崩潰、docker 重啟等情況。build:指定一個包含Dockerfile的路徑,并通過此Dockerfile來構(gòu)建容器鏡像。注意那個 “.” ,代表當前目錄。command:容器運行時需要執(zhí)行的命令。這里就是我們很熟悉的運行開發(fā)服務(wù)器了。volumes:卷,這是個很重要的概念。前面說過容器是和宿主機完全隔離的,但是有些時候又需要將其連通;比如我們開發(fā)的 Django 項目代碼常常會更新,并且更新時還依賴如 Git 之類的程序,在容器里操作就顯得不太方便。所以就有卷,它定義了宿主機和容器之間的映射:“.” 表示宿主機的當前目錄,“:” 為分隔符,“/code” 表示容器中的目錄。即宿主機當前目錄和容器的 /code 目錄是連通的,宿主機當前目錄的 Django 代碼更新時,容器中的 /code 目錄中的代碼也相應(yīng)的更新了。這有點兒像是在容器上打了一個洞,某種程度上也是實用性和隔離性的一種妥協(xié)。
嚴格意義上講,這里用到的 .:/code 并不是卷,而是叫掛載,它兩是有區(qū)別的,只不過 docker-compose 允許將掛載寫到卷的配置中。
expose:暴露容器的8000端口供其他容器訪問,宿主機和外界無法訪問networks:能夠訪問db_networkdepends_on: 意思是此容器需要等待 db 容器啟動完畢才能夠啟動。
分析一下 db 容器:
image:從倉庫拉取 MySQL 5.7 。volumes:這里出現(xiàn)的 static-volume 叫卷。它的使用方式像這樣:static-volume:/code/collected_static ,冒號后面還是容器內(nèi)的目錄,但冒號前的卻不是宿主機目錄、僅僅是卷的名稱而已。從本質(zhì)上講,數(shù)據(jù)卷也是實現(xiàn)了宿主機和容器的目錄映射,但是數(shù)據(jù)卷是由Docker進行管理的,你甚至都不需要知道數(shù)據(jù)卷保存在宿主機的具體位置。
相比掛載,數(shù)據(jù)卷的優(yōu)點是由于是 Docker統(tǒng)一管理的,不存在由于權(quán)限不夠引發(fā)的掛載問題,也不需要在不同服務(wù)器指定不同的路徑;缺點是它不太適合單配置文件的映射。和掛載一樣,數(shù)據(jù)卷的生命周期脫離了容器,刪除容器之后卷還是存在的。下次構(gòu)建鏡像時,指定卷的名稱就可以繼續(xù)使用了。
ports:MySQL 默認通信端口為 3306 。environment:定義容器的環(huán)境變量,設(shè)置了 MySQL 的 root 用戶的密碼、數(shù)據(jù)庫的名稱。network:只能夠訪問db_network。添加db容器后記得的修改Django里的數(shù)據(jù)庫設(shè)置。
4)修改項目settings.py
我們在開發(fā)項目中,往往是使用
django自帶的sqlite進行快速開發(fā)測試,后面部署再使用mysql,這里也是一樣的,個人建議部署到服務(wù)器可以先使用帶過去的sqlite進行測試(且此時數(shù)據(jù)庫是有數(shù)據(jù)的), 進行真正上線則使用mysql(沒有數(shù)據(jù))
ALLOWED_HOSTS = [ '*']
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
# 部署用數(shù)據(jù)庫配置
# DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.mysql',
# 'NAME': 'django_recruitment',
# 'USER': 'root',
# 'PASSWORD': '123456',
# 'HOST': 'db',
# 'HOST': '127.0.0.1',
# 'PORT': '3306',
# 'OPTIONS': {'charset': 'utf8mb4'},
# }
# } # todo 注意:這里使用的是db別名,docker會自動解析成ip 部署!
5)生成表&數(shù)據(jù)遷移
由于我們所配置的數(shù)據(jù)是空的,此時我們需要生成表和數(shù)據(jù)遷移
5.1 生成表
進入到sh命令窗口
bash python manage.py migrate
5.2 數(shù)據(jù)遷移
1.django先連接回原來的數(shù)據(jù)庫,
python manage.py dumpdata > data.json
2.導(dǎo)出數(shù)據(jù),并修改文件編碼! 不然后面 loaddata會報錯!

3.進入mysql終端,設(shè)置忽略外鍵 和 刪除 auth_permission 和 django_content_type 表 ( 由于在數(shù)據(jù)遷移過程中這兩個表數(shù)據(jù)默認生成)

set foreign_key_checks=0; truncate table django_content_type; truncate table auth_permission; set foreign_key_checks=1;
4.回到項目容器終端
進入到sh命令窗口
bash python manage.py loaddata data.json # mysql版本一定要一樣 不然報錯
部署命令
運行命令docker-compose build構(gòu)造鏡像,再使用docker-compose up即可啟用服務(wù)。
下面附上一下經(jīng)常用到的命令:
- 停止容器,docker-compose down
- 后臺運行docker容器:docker-compose up -d
- 只想啟動其中的一個容器:docker-compose up -d db或者docker-compose up -d app即可啟動db容器或app容器。
- 進入容器:docker exec -it container_id /bin/bash
上面的container_id如果不知道如何獲取可以通過docker ps命令查看。
總結(jié)
到此這篇關(guān)于云原生Docker部署Django和mysql項目的文章就介紹到這了,更多相關(guān)Docker部署Django mysql內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pyqt 實現(xiàn)在Widgets中顯示圖片和文字的方法
今天小編就為大家分享一篇pyqt 實現(xiàn)在Widgets中顯示圖片和文字的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06
python中文分詞,使用結(jié)巴分詞對python進行分詞(實例講解)
下面小編就為大家?guī)硪黄猵ython中文分詞,使用結(jié)巴分詞對python進行分詞的實例講解。有比較好的參考價值,希望能給大家做個參考。一起跟隨小編過來看看吧2017-11-11
Python StringIO及BytesIO包使用方法解析
這篇文章主要介紹了Python StringIO及BytesIO包使用方法解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友可以參考下2020-06-06
numpy.transpose對三維數(shù)組的轉(zhuǎn)置方法
下面小編就為大家分享一篇numpy.transpose對三維數(shù)組的轉(zhuǎn)置方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04
Python使用psutil對系統(tǒng)數(shù)據(jù)進行采集監(jiān)控
psutil庫可以實時獲取系統(tǒng)的一些信息,這樣就可以達到實時監(jiān)控系統(tǒng)的目的。本文對詳細講解了ython使用psutil對系統(tǒng)數(shù)據(jù)進行采集監(jiān)控,感興趣的朋友可以看一看2021-08-08
Python3爬蟲里關(guān)于代理的設(shè)置總結(jié)
在本篇文章里小編給大家整理的是一篇關(guān)于Python3爬蟲里關(guān)于代理的設(shè)置總結(jié),需要的朋友們可以參考下。2020-07-07

