• <tfoot id="ukgsw"><input id="ukgsw"></input></tfoot>
    
    • 久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
      分享

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

       看見(jiàn)就非常 2020-04-29

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

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

      Docker-compose

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

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

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

      • 名稱叫 app 的 Django 容器

      • 名稱叫 db 的 MySQL 容器

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

      修改上一章寫(xiě)的 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 :從倉(cāng)庫(kù)拉取 MySQL 5.7 。最新版本為 MySQL 8,不過(guò)很坑的是新版本修改了用戶登錄的驗(yàn)證方法,導(dǎo)致很容易出現(xiàn)無(wú)法通過(guò)身份驗(yàn)證的問(wèn)題。教程為了簡(jiǎn)單起見(jiàn)選用 5.7 版本。后期會(huì)在教程示例代碼中添加mysql-8分支并給出操作方法,有興趣的讀者可以查看。

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

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

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

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

      Dockerfile

      接下來(lái)修改 Dockerfile

      FROM python:3.7
      ENV PYTHONUNBUFFERED 1
      
      # 添加這兩行
      RUN apt-get update
      RUN apt-get install python3-dev default-libmysqlclient-dev -y
      
      RUN mkdir /code
      WORKDIR /code
      RUN pip install pip -U
      ADD requirements.txt /code/
      RUN pip install -r requirements.txt
      ADD . /code/

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

      其他配置

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

      django==2.2
      mysqlclient==1.3.14

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

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

      注意 HOST 填寫(xiě)的是容器的名稱,即 db 。

      這就可以啦。接下來(lái)測(cè)試。

      測(cè)試

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

      重新生成鏡像:

      $ docker-compose build

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

      $ docker-compose up
      
      Creating network "django_app_default" with the default driver
      Creating django_app_db_1 ... done
      Creating django_app_app_1 ... done
      Attaching to django_app_db_1, django_app_app_1
      db_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, sessions
      app_1  | Running migrations:
      app_1  |   Applying contenttypes.0001_initial... OK
      ...
      app_1  |   Applying sessions.0001_initial... OK
      
      app_1  | Watching for file changes with StatReloader
      app_1  | Performing system checks...
      app_1  | 
      app_1  | System check identified no issues (0 silenced).
      app_1  | October 06, 2019 - 12:24:58
      app_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.

      打開(kāi)瀏覽器訪問(wèn) 127.0.0.1:8000 ,又能看到 Django 小火箭啦。

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

      總結(jié)

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

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

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多

        主站蜘蛛池模板: 蜜桃臀无码AV在线观看| A毛片终身免费观看网站| 熟妇人妻无码中文字幕老熟妇| 极品粉嫩国产18尤物在线观看| 中文精品一卡2卡3卡4卡| 久久婷婷五月综合97色直播| 亚洲高清国产拍精品5G| 猫咪AV成人永久网站在线观看| 老司机免费的精品视频| 人人人妻人人澡人人爽欧美一区| 国产熟睡乱子伦视频在线播放 | 亚洲精品国产中文字幕| 男女高潮喷水在线观看| 国产一区二区波多野结衣| 久久精品国产亚洲精品2020| 狠狠做五月深爱婷婷天天综合| 天天影视网色香欲综合网| 99福利一区二区视频| 精品国产一区二区三区2021| 欧美极品色午夜在线视频| 高清看男人插曲女人视频| 国产成人A在线视频免费| 亚洲中文久久久精品无码| 少妇人妻在线视频| 无码AV无码免费一区二区| 欧美成人家庭影院| 四虎成人免费视频在线播放| 国产午夜福利视频合集| 亚洲韩欧美第25集完整版| 韩国三级在线 中文字幕 无码| 一本av高清一区二区三区| 无码A级毛片免费视频内谢| 少妇私密推油呻吟在线播放| 亚洲av无码乱码在线观看野外| 正在播放国产剧情亂倫| 成人网站免费观看永久视频下载| 26uuu另类亚洲欧美日本| 色婷婷综合久久久久中文字幕| 国产久9视频这里只有精品| 99精品国产中文字幕| 天天综合网网欲色|