国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
<div>Django-Docker容器化部署:Django-Docker-MySQL部署 </div>

上一章我們成功搭建了容器化的 Django 項(xiàng)目,用到的數(shù)據(jù)庫為默認(rèn)的 Sqlite。Sqlite 雖然簡單易用,但是線上部署時(shí)通常會(huì)選擇更高效、更可靠的數(shù)據(jù)庫,比如 MySQL。

本章將在上一章的基礎(chǔ)上,修改并構(gòu)建 Docker + Django + MySQL 的容器項(xiàng)目。

Docker-compose

我們?cè)趯W(xué)習(xí)面向?qū)ο蟮木幊陶Z言時(shí),會(huì)想方設(shè)法把功能獨(dú)立的模塊給獨(dú)立出來,方便復(fù)用和維護(hù)。

容器也是一樣的。雖然理論上可以把所有組件塞到同一個(gè)容器中去,但更好的做法是各模塊在單獨(dú)容器中,只要保持必要的通信就可以了。

也就是說,本教程中現(xiàn)在需要兩個(gè)容器了:

  • 名稱叫 app 的 Django 容器

  • 名稱叫 db 的 MySQL 容器

所以如何構(gòu)建 MySQL 鏡像?別擔(dān)心,這么常用的鏡像官方已經(jīng)幫你構(gòu)建好了,只需要把它從倉庫拉取到本地就可以了。

修改上一章寫的 docker-compose.yml ,增加 MySQL 容器:

version: "3"services:  app:    restart: always    build: .    command: bash -c "python3 manage.py migrate && python3 manage.py runserver 0.0.0.0:8000"    volumes:      - .:/code    ports:      - "8000:8000"    depends_on:      - db  db:    image: mysql:5.7    volumes:      - "./mysql:/var/lib/mysql"    ports:      - "3306:3306"    restart: always    environment:      - MYSQL_ROOT_PASSWORD=mypassword      - MYSQL_DATABASE=django_app

app 容器的 command 指令做了修改,讓其在運(yùn)行前先執(zhí)行數(shù)據(jù)遷移;新增了配置 depends_on ,意思是此容器需要等待 db 容器啟動(dòng)完畢才能夠啟動(dòng)。

分析一下新添加的 db 容器:

  • image :從倉庫拉取 MySQL 5.7 。最新版本為 MySQL 8,不過很坑的是新版本修改了用戶登錄的驗(yàn)證方法,導(dǎo)致很容易出現(xiàn)無法通過身份驗(yàn)證的問題。教程為了簡單起見選用 5.7 版本。后期會(huì)在教程示例代碼中添加分支并給出操作方法,有興趣的讀者可以查看。

  • volumes :定義卷(這里實(shí)際是掛載),上一章已經(jīng)講過了,它實(shí)現(xiàn)了宿主機(jī)和容器目錄的映射。功能是將容器中的 MySQL 數(shù)據(jù)映射到宿主機(jī)。

  • ports :MySQL 默認(rèn)通信端口為 3306 。

  • environment :定義容器的環(huán)境變量,設(shè)置了 MySQL 的 root 用戶的密碼、數(shù)據(jù)庫的名稱。

這里為什么要用?就讓數(shù)據(jù)在容器中、保持隔離不好嗎?把數(shù)據(jù)保存在容器中,理論上確實(shí)是可以的,但有一個(gè)致命的問題,即數(shù)據(jù)和容器的生命周期掛鉤了:萬一哪天手賤把容器給刪了,連同里面的數(shù)據(jù)隨風(fēng)而逝,你就是全公司那個(gè)刪庫跑路的傳奇人物了。要知道容器的生命周期可能會(huì)非常短暫,刪除指令也相當(dāng)順滑(docker-compose down)。將數(shù)據(jù)映射到宿主機(jī),容器即使被刪除掉,但數(shù)據(jù)還是安全的躺在你的服務(wù)器中的。換句話說,容器內(nèi)部非常適合運(yùn)行無狀態(tài)的應(yīng)用;涉及到如數(shù)據(jù)之類有狀態(tài)的東西,一定要謹(jǐn)慎思考。

Dockerfile

接下來修改 Dockerfile

FROM python:3.7ENV PYTHONUNBUFFERED 1# 添加這兩行RUN apt-get updateRUN apt-get install python3-dev default-libmysqlclient-dev -yRUN mkdir /codeWORKDIR /codeRUN pip install pip -UADD requirements.txt /code/RUN pip install -r requirements.txtADD . /code/

增加的兩行代碼在系統(tǒng)中安裝了 MySQL 的連接器,具體解釋見官方文檔。

其他配置

修改 requirements.txt ,增加 MySQL 驅(qū)動(dòng):

django==2.2mysqlclient==1.3.14

然后還需要修改 django_app/settings.py ,將數(shù)據(jù)庫設(shè)置為 MySQL:

DATABASES = {    'default': {        'ENGINE': 'django.db.backends.mysql',        'NAME': 'django_app',        'USER': 'root',        'PASSWORD': 'mypassword',        'HOST': 'db',        'PORT': '3306',        'OPTIONS': {'charset': 'utf8mb4'},    }}

注意 HOST 填寫的是容器的名稱,即 db 。

這就可以啦。接下來測試。

測試

測試之前,請(qǐng)先確認(rèn)沒有其他程序占用了 3306 端口,比如宿主機(jī)安裝的 MySQL。

重新生成鏡像:

$ docker-compose build

生成并啟動(dòng)容器:

$ docker-compose upCreating network "django_app_default" with the default driverCreating django_app_db_1 ... doneCreating django_app_app_1 ... doneAttaching to django_app_db_1, django_app_app_1db_1   | 2019-10-06T12:24:57.183860Z 0 [Note] mysqld (mysqld 5.7.27) starting as process 1 ......db_1   | 2019-10-06T12:24:58.120480Z 0 [Note] mysqld: ready for connections.db_1   | Version: '5.7.27'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server (GPL)app_1  | Operations to perform:app_1  |   Apply all migrations: admin, auth, contenttypes, sessionsapp_1  | Running migrations:app_1  |   Applying contenttypes.0001_initial... OK...app_1  |   Applying sessions.0001_initial... OKapp_1  | Watching for file changes with StatReloaderapp_1  | Performing system checks...app_1  | app_1  | System check identified no issues (0 silenced).app_1  | October 06, 2019 - 12:24:58app_1  | Django version 2.2, using settings 'django_app.settings'app_1  | Starting development server at http://0.0.0.0:8000/app_1  | Quit the server with CONTROL-C.

打開瀏覽器訪問 127.0.0.1:8000 ,又能看到 Django 小火箭啦。

**注意:**第一次啟動(dòng)容器時(shí)可能會(huì)出現(xiàn)無法連接 MySQL 的錯(cuò)誤,這是由于雖然 db 容器已經(jīng)啟動(dòng),但初始化并未完成;重新啟動(dòng)容器之后就可以正常工作了。若多次啟動(dòng)都無法正常工作,那就是別的原因了,好好檢查吧。

總結(jié)

本章加入了 MySQL 容器,并實(shí)現(xiàn)了多容器協(xié)同工作。

下一章將實(shí)現(xiàn)正式部署的 Docker + Django + MySQL + Nginx + Gunicorn 項(xiàng)目。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
如何在Debian 10 Linux上安裝和使用Docker Compose
以嚴(yán)肅的方式對(duì)
docker3 docker-compose
8.使用Docker Compose管理多個(gè)容器
python測試開發(fā)django-180.docker-compose部署django+mysql環(huán)境
dock seafile onlyoffice 搭建多人協(xié)作在線文檔編輯
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服