教你如何 Deploying Django To Heroku With Docker
之前已經教學過大家如何將 Django 以及 Flask 佈署到 Heroku 上了,如果你還沒看過或不懂,請先參考以下兩篇,
那今天我要更進階教大家使用 Docker 將 Django 佈署到 Heroku,如果你不懂 Docker,也請先閱讀以下文章
這次使用 Docker 將 Django 佈署到 Heroku 上遇到很雷的事情 😢
讓我們看下去:smiley:
請先確認你的電腦安裝了 Heroku CLI ( 如果你有曾經部署過,應該都有安裝了 ),
另一個要安裝的是 Docker ( 現在要下載 Docker 必須要登入,簡單去註冊一個吧 😉)。
以上都做好了之後,請先確認使否已經登入 Docker 以及 Heroku,
登入 Docker,
docker login
登入 Heroku,
heroku login
接著 Logging in to the registry,執行以下指令,
heroku container:login
( 這邊如果你是 windows 用戶請注意,請使用 內建的命令提示字元 執行,像我如果使用 cmder 執行會錯誤,很重要 ❗)
( 另外,當你執行 heroku login
時,如果你已經登入過,然後再次執行時,請重新輸入一次,不要使用 Ctrl+C 中斷 ,不然也會導致錯誤 )
以上兩點很重要,我就是被這個雷到:sob:
我們先在本地端使用 docker 測試,確認測試沒問題,我們再部署到 Heroku 上,
我們使用的範例是我之前寫的這篇 Docker 基本教學 - 從無到有 Docker-Beginners-Guide,
然後有一點要注意的是,Heroku 的佈署並不支援 docker-compose 的方式 😭 ( 這個我們後面再進一步說明 ),
現在我們只使用一個 image ( 也可以說一個 container )。
先來看 Dockerfile,
FROM python:3.6.2
LABEL maintainer twtrubiks
ENV PYTHONUNBUFFERED 1
RUN mkdir /docker_api
WORKDIR /docker_api
COPY . /docker_api/
RUN pip install -r requirements.txt
# Run the app. CMD is required to run on Heroku
# $PORT is set by Heroku
CMD python manage.py runserver 0.0.0.0:$PORT
比較要注意的就是最後一行,首先,這邊我們就先簡單的使用 python manage.py runserver
,
反正現在已經在 Docker 裡面了,如果你未來想要加上 gunicorn 或是 uwsgi,請再自行修改:smirk:
另外一點是 $PORT
,這個是由 Heroku 設定的。
如果佈署到 Heroku 上,我們會使用 Heroku Postgres,
可以參考 Pushing your containers to Heroku 這邊的說明,
Use Heroku add-ons in production
* For local development: use official Docker images, such as Postgres and Redis.
* For staging and production: use Heroku add-ons, such as Heroku Postgres and Heroku Redis.
settings 中設定 db 的部分如下,
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': os.environ.get('DATABASE_NAME'),
'USER': os.environ.get('DATABASE_USER'),
'PASSWORD': os.environ.get('DATABASE_PASSWORD'),
'HOST': os.environ.get('DATABASE_HOST'),
'PORT': os.environ.get('DATABASE_PORT'),
}
}
到時候這些環境變數會設定到 Heroku 的後台。
接著先到 Heroku 上建立一個 app,建立完 app 之後,再去建立 Heroku Postgres,
可參考之前我的文章 如何在 heroku 上使用 database。
建立完之後,你會看到 db 的連線資訊,
這些連線資訊可以先設定到 Heroku 的後台,
那接著因為我們希望先在本地端執行,但我們需要 Heroku 上的環境變數才可以執行,那該怎麼辦:question:
Heroku 有提供在 local 環境中設定 Heroku 上的環境變數的方法,使用方法就是建立一個 .env
檔案
( 可參考setting-multiple-environment-variables ),
然後將環境變數設定在裡面 ( win 用戶請在 terminal 中輸入 touch .env
建立檔案 )。
.env 內容大致如下,
PORT=8000
DATABASE_NAME=<your heroku db name>
DATABASE_USER=<your heroku db user>
DATABASE_PASSWORD=<your heroku db password>
DATABASE_HOST=<your heroku db host>
DATABASE_PORT=5432
一般來說 .env
應該要被寫入 .dockerignore
裡面,但這邊方便大家測試,我就不寫進去了。
到這邊我們終於可以在本地端啟動 Docker 來測試了:satisfied:
( db 的部分直接使用 Heroku Postgres,所以我才將連線資訊都寫進 .env
裡面 )。
接下來就是 Docker 指令而已,首先,
先 build image ( 使用命令提示字元切換到 Deploying_Django_To_Heroku_With_Docker
底下 ),
docker build --tag web_image .
如果順利 build 成功,使用下列指令會看到 web_image 這個 image,
docker images
最後就是把它啟動,
docker run -p 8000:8000 --env-file .env web_image
.env
前面說明過了,主要是方便 local environment test,可參考 Setting multiple environment variables,
接下來,我們進去 container 中執行 db migrate,
docker ps
docker exec -it xxxxx bash
然後再 db migrate 以及建立 superuser ( 這邊的 db 是使用 Heroku 上的 ),
python manage.py makemigrations musics
python manage.py migrate
python manage.py createsuperuser
建立完之後,可以瀏覽 http://127.0.0.1:8000/api,
如果正確無誤,應該會看到下圖,
既然在本地端測試沒問題,那現在我們就可以佈署到 Heroku 了,步驟只有幾個,
首先,使用命令提示字元切換到 Deploying_Django_To_Heroku_With_Docker
底下,
接著使用以下指令,
Build the image and push to Container Registry
heroku container:push web -a <your heroku app name>
先說明這個 web,這個 web 的意思其實就像之前說的 Procfile 一樣,像是 Procfile。
從上圖可以發現,其實他就是抓目錄資料夾底下是否有 Dockerfile 的檔案,
另外,sdadss
是我建立的 Heroku app name ( 請使用你自己的 app name, 你建立的 name 不會和我一樣 )。
如果順利執行,接著就是 release the image to your app,
heroku container:release web -a <your heroku app name>
最後再執行以下指令,
heroku open -a <your heroku app name>
會自動幫你開一個網頁,如果看到畫面,就代表你成功使用 Docker 佈署了:smiley:
(也可以順便玩玩新增資料是否正常,也就是測試資料庫,這邊不需要再 migrate 了,
因為我們在本機端測試時就已經 migrate 了 )
測試帳號和密碼如下,
account : test123
password : password123
整體來說,這次帶大家嘗試了使用 Docker 佈署 Django 到 Heroku 上,步驟算是還好,就一些小地方要注意,
不過我個人是覺得有些缺點,像是沒辦法使用 docker-compose 的方式佈署,docker-compose 只支持本地端的測試 ,
( 可參考 Local Development with Docker Compose ),
希望有一天可以支援,不然現在如果你有很多的 container ( 也就是使用 docker-compose ),要佈署到 Heroku 上會很麻煩:tired_face:
總之,以上就是帶大家體驗如何使用 Docker 佈署到 Heroku 上:sunglasses:
- Python 3.6.2
- Win 10
文章都是我自己研究內化後原創,如果有幫助到您,也想鼓勵我的話,歡迎請我喝一杯咖啡:laughing:
MIT license