摘要:前言本文主要內(nèi)容關(guān)于使用實(shí)踐部署后端和前端應(yīng)用。記錄其中遇到的一些坑以及解決辦法。只能使用麻煩點(diǎn)的寫法在每個(gè)的設(shè)置項(xiàng)里重復(fù)映射主機(jī)的文件不同容器互相通信使用實(shí)現(xiàn)容器間通信。容器啟動(dòng)順序?qū)崿F(xiàn)容器按順序啟動(dòng),需要用到。
前言
本文主要內(nèi)容關(guān)于使用docker-compose實(shí)踐部署后端django-rest-framework和前端vue.js應(yīng)用。記錄其中遇到的一些坑以及解決辦法。
準(zhǔn)備Docker-compose環(huán)境系統(tǒng):Ubuntu 16.04(阿里云)
代碼中用戶名:test
# install docker ## prepare echo "Preparing..." sudo apt update sudo apt upgrade -y sudo apt install -y linux-image-extra-$(uname -r) linux-image-extra-virtual ## docker echo "Installing docker..." sudo apt remove -y docker-ce docker-engine docker.io wget -qO- http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh sudo apt autoremove -y sudo usermod -aG docker ${USER} ## docker Aliyun accelerator ## https://cr.console.aliyun.com/#/accelerator echo "Configuring docker registry mirrors..." sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-"EOF" { "registry-mirrors": ["https://部署 目錄結(jié)構(gòu).mirror.aliyuncs.com"] } EOF exists(){ command -v "$1" >/dev/null 2>&1 } echo "Installing docker-compose..." if ! exists pip; then sudo apt install python-pip fi sudo python `which pip` install docker-compose echo "Restarting docker..." sudo systemctl daemon-reload sudo systemctl restart docker
. ├── .env // 環(huán)境變量 ├── docker-compose.yml ├── backend // 放置后臺(tái)django文件 ├── frontend // 放置前端vue編譯后代碼 └── nginx // nginx相關(guān)配置 ├── backend.conf ├── Dockerfile └── frontend.conf具體配置 docker-compose.yml
version: "3" services: web: restart: always build: ./backend expose: - "8000" volumes: - ./backend:/code env_file: .env links: - db depends_on: - db command: ["/code/wait-for-it.sh", "db:3306", "--", "bash","startup.sh"] nginx: restart: always build: ./nginx ports: - "80:80" volumes: - ./frontend:/usr/share/nginx/html/frontend:ro - ./backend/public:/usr/share/nginx//html/backend/public:ro links: - web depends_on: - web db: restart: always image: mysql:latest env_file: .env volumes: - ./data/initsql:/docker-entrypoint-initdb.d - ./data/db:/var/lib/mysql command: [mysqld, --character-set-server=utf8, --collation-server=utf8_unicode_ci]
第一次使用docker-compose部署,從網(wǎng)上參考了許多例子。但是由于docker-compose個(gè)版本的語法改動(dòng)不小,遇到很多坑:
不同容器共享數(shù)據(jù)(host主機(jī)上的數(shù)據(jù))不同容器互相通信有些例子使用volumes_from,但是version 3已經(jīng)刪除該設(shè)置項(xiàng)更新變化。
官方推薦在根節(jié)點(diǎn)(與services同級(jí))下配置volumes,但是沒法映射到host主機(jī)的文件,有個(gè)插件local-persist可以做到,但是不想依賴第三方插件。只能使用麻煩點(diǎn)的寫法:在每個(gè)service的volume設(shè)置項(xiàng)里重復(fù)映射host主機(jī)的文件web: volumes: - ./backend:/code nginx: volumes: - ./backend/public:/usr/share/nginx//html/backend/public:ro
使用links實(shí)現(xiàn)容器間通信。配置需要訪問的容器于links配置項(xiàng)下,沒什么毛病。容器啟動(dòng)順序
環(huán)境變量實(shí)現(xiàn)容器按順序啟動(dòng),需要用到depends_on。
但是會(huì)有一個(gè)問題:depends_on只保證啟動(dòng)順序,而我們的實(shí)際需求是:web容器啟動(dòng)的commands必須等到mysql完全啟動(dòng),web容器的command才可以執(zhí)行。因?yàn)槲覀兗恿?b>restart: always,所以會(huì)導(dǎo)致web容器不斷重啟直到db容器啟動(dòng)完成。
我的解決辦法是:給web容器的啟動(dòng)命令加上對(duì)mysql服務(wù)可用的查詢,使用了一個(gè)查詢腳本wait-for-it:
command: ["/code/wait-for-it.sh", "db:3306", "--", "bash","startup.sh"]
關(guān)于Mysql官方鏡像配置會(huì)有多個(gè)容器使用相同環(huán)境變量的情況,所以都放在.env文件里
DEBUG=false MYSQL_HOST=db MYSQL_DATABASE=mydb MYSQL_ROOT_PASSWORD=mypass
關(guān)于Nginx容器配置
可以定義volume持久化數(shù)據(jù)庫文件:
volumes:- 如果有初始數(shù)據(jù)需要導(dǎo)入,可以定義volume映射到`/docker-entrypoint-initdb.d`:volumes:
- ./data/initsql:/docker-entrypoint-initdb.d注意: 該配置只有在`/var/lib/mysql/`下的`mysql`目錄不存在時(shí)才會(huì)生效。也就是說,一旦容器啟動(dòng)過一次,之后就在也不會(huì)導(dǎo)入`/docker-entrypoint-initdb.d`里的文件,除非手動(dòng)清空`/var/lib/mysql/`(或host主機(jī)的`./data/db`目錄)。
關(guān)于django web容器配置Dockerfile
FROM nginx:alpine RUN rm /etc/nginx/conf.d/default.conf ADD frontend.conf /etc/nginx/conf.d/ ADD backend.conf /etc/nginx/conf.d/frontend.conf - vue app build files
server { listen 80 deferred; server_name new.bylie.cn; root /usr/share/nginx/html/frontend; location / { try_files $uri $uri/ /index.html =404; } # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }backend.conf - django app
server { # use "listen 80 deferred;" for Linux # use "listen 80 accept_filter=httpready;" for FreeBSD listen 80 deferred; client_max_body_size 5M; # set the correct host(s) for your site server_name service.bylie.cn; keepalive_timeout 5; location /public { root /usr/share/nginx/html/backend; } location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # enable this if and only if you use HTTPS # proxy_set_header X-Forwarded-Proto https; proxy_set_header Host $http_host; # we don"t want nginx trying to do something clever with # redirects, we set the Host: header above already. proxy_redirect off; proxy_pass http://web:8000; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }備份數(shù)據(jù)庫到host主機(jī)
docker-compose exec db sh -c "exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" --databases ${MYSQL_DATABASE}" > ./backup/database.sql
比較簡單
Dockerfile
FROM python:3 ENV PYTHONUNBUFFERED 1 RUN mkdir /code WORKDIR /code ADD requirements.txt /tmp/ RUN pip install -r /tmp/requirements.txt啟動(dòng)腳本startup.sh
#!/usr/bin/env bash python manage.py collectstatic --noinput && python manage.py migrate && gunicorn django_web_app.wsgi:application -w 2 -b :8000當(dāng)容器運(yùn)行起來之后,可能需要導(dǎo)入一些初始數(shù)據(jù)或者fixtures,我寫了一個(gè)init的django custom command,手動(dòng)執(zhí)行該command:
docker-compose exec web python manage.py init
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/26969.html
摘要:前言本文主要內(nèi)容關(guān)于使用實(shí)踐部署后端和前端應(yīng)用。記錄其中遇到的一些坑以及解決辦法。只能使用麻煩點(diǎn)的寫法在每個(gè)的設(shè)置項(xiàng)里重復(fù)映射主機(jī)的文件不同容器互相通信使用實(shí)現(xiàn)容器間通信。容器啟動(dòng)順序?qū)崿F(xiàn)容器按順序啟動(dòng),需要用到。 前言 本文主要內(nèi)容關(guān)于使用docker-compose實(shí)踐部署后端django-rest-framework和前端vue.js應(yīng)用。記錄其中遇到的一些坑以及解決辦法。 準(zhǔn)備...
摘要:按照指示,分別安裝和,然后測試安裝結(jié)果接下來,根據(jù)以下項(xiàng)目結(jié)構(gòu)從克隆一份項(xiàng)目或自己創(chuàng)建項(xiàng)目現(xiàn)在我們準(zhǔn)備容器運(yùn)行開啟,只需運(yùn)行這個(gè)命令設(shè)置一個(gè)新的開發(fā)環(huán)境。 原文地址:Django Development With Docker Compose and Machine 以下為譯文 Docker 是一個(gè)開源的應(yīng)用容器引擎,讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個(gè)可移植的容器...
摘要:創(chuàng)建第一個(gè)應(yīng)用,第一步在構(gòu)建容器原文翻譯整理這篇文章將指導(dǎo)你如何用配置和啟動(dòng)一個(gè)簡單的應(yīng)用。一詞我認(rèn)為翻譯為編制更恰當(dāng)。在這里我們需要一個(gè)服務(wù)器,一個(gè)數(shù)據(jù)服務(wù)器。編制文件指明了我們這些服務(wù)所用的鏡像,他們?nèi)绾芜B接,哪些卷要掛載到容器。 Mac Docker 創(chuàng)建第一個(gè)Django 應(yīng)用, Part 1 第一步:在Mac構(gòu)建Django 容器 原文:Quickstart: Compose...
摘要:創(chuàng)建第一個(gè)應(yīng)用,第一步在構(gòu)建容器原文翻譯整理這篇文章將指導(dǎo)你如何用配置和啟動(dòng)一個(gè)簡單的應(yīng)用。一詞我認(rèn)為翻譯為編制更恰當(dāng)。在這里我們需要一個(gè)服務(wù)器,一個(gè)數(shù)據(jù)服務(wù)器。編制文件指明了我們這些服務(wù)所用的鏡像,他們?nèi)绾芜B接,哪些卷要掛載到容器。 Mac Docker 創(chuàng)建第一個(gè)Django 應(yīng)用, Part 1 第一步:在Mac構(gòu)建Django 容器 原文:Quickstart: Compose...
摘要:今天整理了一下如何在中部署項(xiàng)目。執(zhí)行可以查看容器出錯(cuò)的具體原因。若上述容器都成功運(yùn)行,則在瀏覽器中輸入時(shí),視圖會(huì)返回相應(yīng)的結(jié)果。以交互方式進(jìn)入容器后,進(jìn)入數(shù)據(jù)庫,會(huì)看到在數(shù)據(jù)庫中生成了相應(yīng)的表。 今天整理了一下如何在docker中部署django項(xiàng)目。 1.環(huán)境如下: python3.6 django2.0.5 nginx mysql5.7 gunicorn 2.項(xiàng)目結(jié)構(gòu)如下:...
閱讀 1228·2023-04-25 20:31
閱讀 3734·2021-10-14 09:42
閱讀 1504·2021-09-22 16:06
閱讀 2689·2021-09-10 10:50
閱讀 3541·2021-09-07 10:19
閱讀 1786·2019-08-30 15:53
閱讀 1183·2019-08-29 15:13
閱讀 2830·2019-08-29 13:20