您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關如何使用Docker-compose離線部署Django應用的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
我們所在的內網環境需要部署一個類似CMS的應用,就是一些表格的CRUD,數據導出,人員權限管理等功能。想到Django做這方面的工作挺擅長的,而且開發量不大,于是選擇Django作為開發基礎。開發功能比較簡單,差不多就是使用xadmin等插件實現以上功能。但有一個問題我們是不好繞過去的,那就是部署到一個內網環境,在內網pip等工具是不能使用的,但好在內網有一個yum服務器可以使用,所以我們決定在內網服務器上安裝Docker,然后把開發環境的容器復制到生產環境實現部署。以下是主要的步驟:
安裝開發環境的 Docker-ce
安裝開發環境的 Docker-compose
配置開發環境
保存容器
安裝生產環境的 Docker-ce 和 docker-compose
發送容器文件并運行
注意:我這里的開發環境是Ubuntu18.04,生產環境是Centos7.2。如果你是其他環境請自己檢查差異,使用適合自己系統的命令。
Docker 和 Docker-compose是我們這次部署需要重點演示的內容,Django 的應用部分我會盡量縮減的。Docker 負責容器虛擬化的底層部分,Docker-compose 是一個容器編排工具,有了它咱們就不用手寫 shell 實現容器之間的連接了。我們先安裝 Docker-ce,這里主要是參考 Docker 的官方文檔,如果我寫的不夠詳細或者已經過時,各位看官可到官方查看更權威更新的文檔。
卸載舊版本
在安裝之前需要卸載舊版本的 docker,如果你是新系統,可以忽略這一步。
$ sudo apt remove docker docker-engine docker.io containerd runc
安裝用用到的 apt 倉庫
更新apt包索引
$ sudo apt update
允許apt通過https訪問倉庫
$ sudo apt install \ apt-transport-https \ ca-certificates \ curl \ gnupg-agent \ software-properties-common
增加Docker的官方GPG key
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
增加Docker的倉庫
$ sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable"
安裝 Docker-ce
做好以上的準備后安裝Docker-ce就簡單了,熟悉Ubuntu的話,很快就能裝好。
$ sudo apt update $ sudo apt install -y docker-ce
安裝完成后,啟動 docker 服務并使其能夠在每次系統引導時啟動。
$ sudo systemctl start docker $ sudo systemctl enable docker
Docker-ce安裝完成后,Docker-compose就好辦了。如果你是在Linux等平臺上直接下載Docker-compose的編譯好的二進制文件即可使用。
復制代碼 代碼如下:
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
下載完成后修改權限加上可執行
$ sudo chmod +x /usr/local/bin/docker-compose
最后可執行一下查看Docker-compose的版本號驗證一下是否成功安裝
$ docker-compose --version docker-compose version 1.24.0-rc1, build 0f3d4dda
這里的開發環境是Django的環境,演示的項目為了方便演示我盡量使用一個新建的Django項目。
新建Django項目
新建一個Django項目,先創建一個上層文件夾來把項目文件放到這個文件夾中。目錄結構大致如下:
--project --Dockerfile --docker-compose.yml --mysite --manage.py --requirements.txt
先創建project文件夾
$ mkdir project
然后新建Django項目,或者你也可以把已有的項目拷貝過來。
$ django-admin.py startproject mysite
生成requirements.txt文件
上一步已經有了一個叫mysite的Django項目,假設我們把requirements.txt放到這個文件夾下,內容大致如下:
$ cat requirements.txt
defusedxml==0.5.0 diff-match-patch==20181111 Django==2.1.7 django-crispy-forms==1.7.2 django-formtools==2.1 django-import-export==1.2.0 django-reversion==3.0.3 et-xmlfile==1.0.1 future==0.15.2 httplib2==0.9.2 jdcal==1.4 odfpy==1.4.0 openpyxl==2.6.0 pytz==2018.9 PyYAML==3.13 six==1.10.0 tablib==0.12.1 unicodecsv==0.14.1 xadmin==0.6.1 xlrd==1.2.0 xlwt==1.3.0 mysqlclient==1.4.2
當然這是我的項目需要的依賴,你的依賴可能和我的不一樣。
新建Dockerfile
項目有了,項目的依賴文件也有了,下一步就是創建我們的Django項目的運行環境的docker鏡像了,先建一個Dockerfile來構建docker鏡像。 在project文件夾新建Dockerfile,內容如下:
$ cat Dockerfile
FROM python:3.6.8 ENV PYTHONUNBUFFERED 1 RUN mkdir /config ADD /mysite/requirements.txt /config/ RUN pip install -r /config/requirements.txt RUN mkdir /src WORKDIR /src/mysite
我簡單解釋一下這個文件
FROM python:3.6.8
這里我使用的基礎鏡像是python:3.6.8,它的基礎鏡像是Ubuntu我比較熟悉,如果你對alpine比較熟悉的話也可以使用alpine,那個鏡像要小的多。
ENV PYTHONUNBUFFERED 1
你可以使用 Env 關鍵字創建任意的操作系統的環境變量
ENV PYTHONUNBUFFERED 1
例如,如果你使用它來存儲你的 Django 密鑰,你可以這樣寫:
ENV DJANGO_SECRET_KEY l!fafmjcqyn+j+zz1@2@wt$o8w8k(_dhgub%41l#k3zi2m-b%m
在你的代碼里這樣使用:
import os SECRET_KEY = os.environ['DJANGO_SECRET_KEY']
RUN顧名思義,RUN就是在容器里面運行命令,這里RUN命令創建了兩個文件夾/config和/src,以及安裝Python的依賴環境。
RUN mkdir /config RUN mkdir /src RUN pip install -r /config/requirements.txt
ADD
ADD /mysite/requirements.txt /config/
增加本地的文件到容器中 WORKDIR
WORKDIR /src/mysite
是指定后面所有在容器里運行命令的默認路徑,要運行的命令在稍后的docker-compose文件這種可以看到。
新建docker-compose腳本
docker-compose可以用來管理多個容器,以前手動加海量參數運行容器并連接容器的活都可以讓docker-compose來做了。我的docker-compose.yml內容大致如下:
$ cat docker-compose.yml
version: '3' services: db: image: mysql:5.7 container_name: mysite_db ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: mysite MYSQL_DATABASE: mysite LANG: C.UTF-8 web: build: . container_name: mysite_web command: bash -c "python manage.py makemigrations && python manage.py migrate && python manage.py runserver 0.0.0.0:8000" depends_on: - db volumes: - ./mysite:/src restart: always ports: - "8002:8000"
再簡單解釋一下這個docker-compose文件吧。
version: '3'
指的是docker-compose的版本,不同版本支持的配置項目稍有不同。 services 管理的服務,我們的例子中是兩個服務:db和web。兩個服務中的配置項目我分開解釋一下 db:
image 直接使用docker hub或者本地的已有鏡像,這個使用的是MySQL5.7 container_name 指定容器的名稱 ports 指定容器對宿主機的端口映射,前面的是宿主機端口,后面的是容器端口 environment 指定當前服務運行時候的環境,環境的細節參考當前鏡像的說明,那上面說支持哪些,我們就可以配置哪些。這個案例中我們指定了MySQL的root密碼、默認數據庫和數據庫的字符集。 web: build 編譯鏡像,這里是使用當前文件夾下的Dockerfile command 容器啟動后執行的命令 depends_on 當前容器要依賴的服務,也就是說必須依賴中的服務成功啟動當前服務才能啟動 volumes 當前容器要掛載的卷,前面指的是宿主機的目錄,后面是容器目錄 restart 指定容器的重啟策略,當前案例是如果出錯就一直重啟。 這里把容器的8000端口映射到宿主機的8002端口,web服務就是從8002端口訪問。
配置Django項目
現在針對當前的容器環境修改一下mysite項目的settings.py文件。
$ vim mysite/mysite/settings.py
找到文件中的ALLOW_HOSTS部分,添加“web”到其中,內容如下:
ALLOW_HOSTS = [ ... 'web' ]
然后修改settings.py中的DATABASES部分,把參數改為MySQL服務db的參數,內容大致如下:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mysite', 'USER': 'root', 'PASSWORD': 'mysite', 'HOST': 'db' } }
這里的MySQL連接參數都是docker-compose.yml文件中db部分的environment中定義的。值得指出的是參數HOST值為db,docker-compose啟動容器后,會連接這些容器,容器之間可以使用服務名稱互相ping通,就像使用域名那樣,所以這里的“HOST”可直接填寫“db”。
使用Docker-compose構建項目
經過以上的努力,基本準備齊備了,我們可以構造我們的鏡像了,這里有兩個服務,db只需要在運行的時候下載或者使用本地鏡像就行,web還需要使用Dockerfile構建一下。
$ docker-compose build
經過一陣兒下載或者構建,就能看到成功構建鏡像的信息了。
運行項目并測試一下
構建完成后,就有了web服務的鏡像了,我們現在使用docker-compose來啟動服務。
$ docker-compose up -d
這個過程可能也需要執行一陣兒,取決于你的網速,它會下載MySQL的鏡像,并且根據db和web的鏡像構造容器,并運行容器。完成后可以使用docker-compose ps和docker-compose images來查看我們生成的容器和鏡像
$ docker-compose ps
Name Command State Ports --------------------------------------------------------------------------------------- mysite_db docker-entrypoint.sh mysqld Up 0.0.0.0:3306->3306/tcp, 33060/tcp mysite_web bash -c python manage.py m ... Up 0.0.0.0:8002->8000/tcp
$ docker-compose images
Container Repository Tag Image Id Size -------------------------------------------------------- mysite_db mysql 5.7 e47e309f72c8 355 MB mysite_web mysite_web latest 3989acbcc3c9 938 MB
也可使用docker-compose來停止和開始服務,其他更具體的使用方法,請參考官方文檔吧。
$ docker-compose start Starting db ... done Starting web ... done
$ docker-compose stop Stopping mysite_web ... done Stopping mysite_db ... done
你看這里的服務停止和啟動的順序都是有規律的啟動的時候被依賴的服務先啟動然后啟動依賴它的服務,挺值服務的時候剛好相反。待服務正常運行后,可以訪問瀏覽器測試一下服務是否正常啟動。
如果服務一切正常,我們就要把當前的容器保存起來,為部署到新平臺上做準備。 注意: ?這里要使用save保存鏡像,使用save是包括容器之間的連接狀態等信息的,如果用export導出鏡像到生產環境是不能使用docker-compose恢復服務的。
$ docker save -o mysql.tar mysql:5.7 $ docker save -o mysite.tar mysite_web:latest
當以上命令執行成功后會在當前目錄生成兩個tar文件,再加上project目錄的Dockerfile和docker-compose.yml文件放在一起準備遷移到生產機器上。
由于生產環境是CentOS,可以直接使用yum安裝
$ sudo yum install docker-ce
安裝成功后,參考開發環境把docker-compose部署到生產服務器上。
使用scp或者其他工具把mysql.tar、mysite.tar、Docker-compose.yml以及項目文件夾發送到生產服務器,并找一個合適的文件夾存放這些文件,保持原來的目錄結構。 我們先把兩個鏡像恢復到生產服務器上
$ docker load -i mysql.tar $ docker load -i mysite_web.tar
等待一小會兒執行完成,可以看到當前服務器已經有這兩個鏡像了。
REPOSITORY TAG IMAGE ID CREATED SIZE mysite_web latest 3989acbcc3c9 2 days ago 983MB mysql 5.7 e47e309f72c8 3 weeks ago 372MB
在執行構建容器以前我們還要對docker-compose.yml做個簡單的修改。你也注意到,生產服務器沒有互聯網,所以不能再build鏡像了,而且我們還把開發環境的鏡像原樣照搬了過來,所以這次web服務改為從鏡像運行就行了,內容大致如下:
version: '3' services: db: ... web: image: mysite_web:latest ...
只要更改web中的build項刪除,并加上一個image項,內容就是我們拷貝過來的那個鏡像。稍后我們就可以構建容器并啟動服務了。
$ docker-compose up -d
結果
Name Command State Ports ---------------------------------------------------------------------------------------- mysite_web bash -c python manage.py m ... Up 0.0.0.0:8002->8000/tcp mysite_db docker-entrypoint.sh mysqld Up 0.0.0.0:3306->3306/tcp, 33060/tcp
再打開瀏覽器看看,是否正常啟動了。
感謝各位的閱讀!關于“如何使用Docker-compose離線部署Django應用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。