国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

使用Docker Compose部署Django和Vue.js應(yīng)用

hyuan / 1146人閱讀

摘要:前言本文主要內(nèi)容關(guān)于使用實踐部署后端和前端應(yīng)用。記錄其中遇到的一些坑以及解決辦法。只能使用麻煩點的寫法在每個的設(shè)置項里重復(fù)映射主機的文件不同容器互相通信使用實現(xiàn)容器間通信。容器啟動順序?qū)崿F(xiàn)容器按順序啟動,需要用到。

前言

本文主要內(nèi)容關(guān)于使用docker-compose實踐部署后端django-rest-framework和前端vue.js應(yīng)用。記錄其中遇到的一些坑以及解決辦法。

準備Docker-compose環(huán)境

系統(tǒng):Ubuntu 16.04(阿里云)
代碼中用戶名:test

安裝Docker
# 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://.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
部署 目錄結(jié)構(gòu)
.
├── .env // 環(huán)境變量
├── docker-compose.yml
├── backend // 放置后臺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個版本的語法改動不小,遇到很多坑:

不同容器共享數(shù)據(jù)(host主機上的數(shù)據(jù))

有些例子使用volumes_from,但是version 3已經(jīng)刪除該設(shè)置項更新變化。
官方推薦在根節(jié)點(與services同級)下配置volumes,但是沒法映射到host主機的文件,有個插件local-persist可以做到,但是不想依賴第三方插件。只能使用麻煩點的寫法:在每個service的volume設(shè)置項里重復(fù)映射host主機的文件

web:
  volumes:
    - ./backend:/code
nginx:
  volumes:
    - ./backend/public:/usr/share/nginx//html/backend/public:ro
不同容器互相通信
使用links實現(xiàn)容器間通信。配置需要訪問的容器于links配置項下,沒什么毛病。
容器啟動順序

實現(xiàn)容器按順序啟動,需要用到depends_on。

但是會有一個問題:depends_on只保證啟動順序,而我們的實際需求是:web容器啟動的commands必須等到mysql完全啟動,web容器的command才可以執(zhí)行。因為我們加了restart: always,所以會導(dǎo)致web容器不斷重啟直到db容器啟動完成。

我的解決辦法是:給web容器的啟動命令加上對mysql服務(wù)可用的查詢,使用了一個查詢腳本wait-for-it:

command: ["/code/wait-for-it.sh", "db:3306", "--", "bash","startup.sh"]
環(huán)境變量

會有多個容器使用相同環(huán)境變量的情況,所以都放在.env文件里

DEBUG=false

MYSQL_HOST=db
MYSQL_DATABASE=mydb
MYSQL_ROOT_PASSWORD=mypass
關(guān)于Mysql官方鏡像配置

可以定義volume持久化數(shù)據(jù)庫文件:

volumes:

- 如果有初始數(shù)據(jù)需要導(dǎo)入,可以定義volume映射到`/docker-entrypoint-initdb.d`:

volumes:

- ./data/initsql:/docker-entrypoint-initdb.d
注意: 該配置只有在`/var/lib/mysql/`下的`mysql`目錄不存在時才會生效。也就是說,一旦容器啟動過一次,之后就在也不會導(dǎo)入`/docker-entrypoint-initdb.d`里的文件,除非手動清空`/var/lib/mysql/`(或host主機的`./data/db`目錄)。
關(guān)于Nginx容器配置

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主機

docker-compose exec db sh -c "exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" --databases ${MYSQL_DATABASE}" > ./backup/database.sql
關(guān)于django web容器配置

比較簡單

Dockerfile

FROM python:3

ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /tmp/
RUN pip install -r /tmp/requirements.txt

啟動腳本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ǎo)入一些初始數(shù)據(jù)或者fixtures,我寫了一個init的django custom command,手動執(zhí)行該command:

docker-compose exec web python manage.py init

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/39605.html

相關(guān)文章

  • 使用Docker Compose部署DjangoVue.js應(yīng)用

    摘要:前言本文主要內(nèi)容關(guān)于使用實踐部署后端和前端應(yīng)用。記錄其中遇到的一些坑以及解決辦法。只能使用麻煩點的寫法在每個的設(shè)置項里重復(fù)映射主機的文件不同容器互相通信使用實現(xiàn)容器間通信。容器啟動順序?qū)崿F(xiàn)容器按順序啟動,需要用到。 前言 本文主要內(nèi)容關(guān)于使用docker-compose實踐部署后端django-rest-framework和前端vue.js應(yīng)用。記錄其中遇到的一些坑以及解決辦法。 準備...

    RyanQ 評論0 收藏0
  • [譯] 如何使用 Docker 組件開發(fā) Django 項目?

    摘要:按照指示,分別安裝和,然后測試安裝結(jié)果接下來,根據(jù)以下項目結(jié)構(gòu)從克隆一份項目或自己創(chuàng)建項目現(xiàn)在我們準備容器運行開啟,只需運行這個命令設(shè)置一個新的開發(fā)環(huán)境。 原文地址:Django Development With Docker Compose and Machine 以下為譯文 Docker 是一個開源的應(yīng)用容器引擎,讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個可移植的容器...

    forsigner 評論0 收藏0
  • Mac Docker 創(chuàng)建第一個Django 應(yīng)用,Part 1

    摘要:創(chuàng)建第一個應(yīng)用,第一步在構(gòu)建容器原文翻譯整理這篇文章將指導(dǎo)你如何用配置和啟動一個簡單的應(yīng)用。一詞我認為翻譯為編制更恰當。在這里我們需要一個服務(wù)器,一個數(shù)據(jù)服務(wù)器。編制文件指明了我們這些服務(wù)所用的鏡像,他們?nèi)绾芜B接,哪些卷要掛載到容器。 Mac Docker 創(chuàng)建第一個Django 應(yīng)用, Part 1 第一步:在Mac構(gòu)建Django 容器 原文:Quickstart: Compose...

    sydMobile 評論0 收藏0
  • Mac Docker 創(chuàng)建第一個Django 應(yīng)用,Part 1

    摘要:創(chuàng)建第一個應(yīng)用,第一步在構(gòu)建容器原文翻譯整理這篇文章將指導(dǎo)你如何用配置和啟動一個簡單的應(yīng)用。一詞我認為翻譯為編制更恰當。在這里我們需要一個服務(wù)器,一個數(shù)據(jù)服務(wù)器。編制文件指明了我們這些服務(wù)所用的鏡像,他們?nèi)绾芜B接,哪些卷要掛載到容器。 Mac Docker 創(chuàng)建第一個Django 應(yīng)用, Part 1 第一步:在Mac構(gòu)建Django 容器 原文:Quickstart: Compose...

    KnewOne 評論0 收藏0
  • django開發(fā)-在Docker部署django項目

    摘要:今天整理了一下如何在中部署項目。執(zhí)行可以查看容器出錯的具體原因。若上述容器都成功運行,則在瀏覽器中輸入時,視圖會返回相應(yīng)的結(jié)果。以交互方式進入容器后,進入數(shù)據(jù)庫,會看到在數(shù)據(jù)庫中生成了相應(yīng)的表。 今天整理了一下如何在docker中部署django項目。 1.環(huán)境如下: python3.6 django2.0.5 nginx mysql5.7 gunicorn 2.項目結(jié)構(gòu)如下:...

    galois 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<