前提部署
Docker:學習 Docker 當然要安裝 Docker 軟體了(免費的社區版),安裝方法見官方文檔。
Docker-compose:這是 Docker 官方推出的用於編排、運行多個容器的工具,安裝方法見官方文檔。本教程大部分內容都與它有關。
Python3:教程部署的是 Django 項目,那 Python3 是當然要有的了(包括 python 的包管理工具 pip)
虛擬機自己部署烏班圖
核查docker版本
啟動 systemctl start docker
安裝docker-compose 在虛擬機安裝
pip install docker-composepip install django==2.2安裝完成後
django-admin startproject django_appcd django_apppython3 manage.py migrate準備工作就搞定了。
接下來正式構建 Django 容器
先建立一個Dockerfile文件
FROM python:3.7 ENV PYTHONUNBUFFERED 1 RUN mkdir /code WORKDIR /code RUN pip install pip -U ADD requirements.txt /code/ RUN pip install -r requirements.txt ADD . /code/理解這些 Docker 指令的關鍵在於,一定要牢記容器裡的環境和外界(宿主機)是隔離的,它兩是完全不一樣的。換句話說,要搞清楚哪些操作是針對宿主機、哪些操作是針對容器。
FROM python:3.7 指令從倉庫拉取一個包含 python 3.7 的 Linux 作業系統環境(Linux 版本為 Debian)。
RUN 和 WORKDIR 指令都是針對容器的,功能是在容器裡創建目錄、並將其設置為工作目錄。注意宿主機是沒有這個目錄的。
ADD 指令出現了兩次。ADD requirements.txt /code/ 意思是將宿主機當前目錄(即 Dockerfile 所在目錄)的 requirements.txt 文件複製到容器的 /code 目錄中。ADD . /code/ 意思是把當前目錄所有內容複製到容器 /code/ 目錄,注意中間那個點。
添加內容 requirements.txt
Docker-compose在線上環境中,通常不會將項目的所有組件放到同一個容器中;更好的做法是把每個獨立的功能裝進單獨的容器,這樣方便復用。比如將 Django 代碼放到容器A,將 Mysql 資料庫放到容器B,以此類推。因此同一個伺服器上有可能會運行著多個容器,如果每次都靠一條條指令去啟動,未免也太繁瑣了。Docker-compose 就是解決這個問題的,它用來編排多個容器,將啟動容器的命令統一寫到 docker-compose.yml 文件中,以後每次啟動這一組容器時,只需要 docker-compose up 就可以了。因此教程也會用 docker-compose 來管理容器。
docker-compose -v
確認無誤後,在項目根目錄創建 docker-compose.yml 並寫入:
version: "3"services: app: restart: always build: . # '點'代表當前目錄 command: "python3 manage.py runserver 0.0.0.0:8000" volumes: - .:/code ports: - "8000:8000"讓我們來分解一下其中的各項含義。
version 代表 docker-compose.yml 的版本,目前最新版為 3,不需要改動它。
接著定義了一個名叫 app 的容器。後面的內容都是 app 容器的相關配置:
restart :除正常工作外,容器會在任何時候重啟,比如遭遇 bug、進程崩潰、docker 重啟等情況。
build :指定一個包含 Dockerfile 的路徑,並通過此 Dockerfile 來構建容器鏡像。注意那個 "." ,代表當前目錄。
command :容器運行時需要執行的命令。這裡就是我們很熟悉的運行開發伺服器了。
volumes :卷,這是個很重要的概念。前面說過容器是和宿主機完全隔離的,但是有些時候又需要將其連通;比如我們開發的 Django 項目代碼常常會更新,並且更新時還依賴如 Git 之類的程序,在容器裡操作就顯得不太方便。所以就有卷,它定義了宿主機和容器之間的映射:"." 表示宿主機的當前目錄,":" 為分隔符,"/code" 表示容器中的目錄。即宿主機當前目錄和容器的 /code 目錄是連通的,宿主機當前目錄的 Django 代碼更新時,容器中的 /code 目錄中的代碼也相應的更新了。這有點兒像是在容器上打了一個洞,某種程度上也是實用性和隔離性的一種妥協。
嚴格意義上講,這裡用到的 .:/code 並不是卷,而是叫掛載,它兩是有區別的,只不過 docker-compose 允許將掛載寫到卷的配置中。後面章節會講到。
docker-compose up 啟動容器服務
可以看到 Docker 按照配置文件的要求,成功構建了鏡像及容器,並啟動了容器。
打開瀏覽器,輸入本地 IP 埠 127.0.0.1:8000 :
排錯:虛擬機的地址是192.168.*.* 發現打不開
在我們創建的項目裡修改setting.py文件
ALLOWED_HOSTS = ['*'] #在這裡請求的host添加了*
docker-compose 其他指令
$ docker-compose down
就可以刪除容器。
如果想在後臺運行容器,則輸入:
$ docker-compose up -d
另外,如果你需要重新構建鏡像,則輸入命令:
$ docker-compose build
啟動和停止已有的容器:
$ docker-compose start
$ docker-compose stop
查看docker狀態和docker ps 類似
docker-compose ps
查看logs
docker-compose logs
如何漢化界面
vi /root/django_app/django_app/settings.pyLANGUAGE_CODE = 'zh-Hans'TIME_ZONE = 'Asia/Shanghai'