使用django寫了一個前後端分離的個人博客,正好趕上之前買的阿里雲的服務器到期,又重新裝了一次環境,總之很麻煩,正好最近在學docker,試一下用docker部署。
個人感覺使用docker部署的好處就在於一次性部署,隨處可用,在windows下生成的鏡像也可以遷移到Linux。
項目簡介
博客使用了django-rest-framework框架進行後端程序編寫,緩存用到了redis,數據存儲在mysql,使用Nginx做反向代理與靜態服務器,uwsgi做後端服務器,elasticsearch做搜索後端,使用了異步框架celery。
myslq,redis,es,python,nginx分別使用獨立的容器。
Docker-Compose
Compose 是用於定義和運行多容器 Docker 應用程序的工具。通過 Compose,您可以使用 YML
文件來配置應用程序需要的所有服務。然後,使用一個命令,就可以從 YML 文件配置中創建並啓動所有服務。
由於這是一個多容器部署,所以使用docker-compose。
python運行環境容器
首先自己製作一個python3.6.8的鏡像作爲python運行環境的基礎鏡像,Dockerfile如下
FROM centos:7.6.1810
ENV PATH $PATH:/usr/local/python3/bin/
ENV PYTHONIOENCODING utf-8
RUN set -ex \
&& mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup \
&& curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo \
&& yum makecache \
&& sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo \
&& yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make wget \
&& yum clean all \
&& mkdir /usr/local/python3 \
&& wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tar.xz \
&& tar -xvJf Python-3.6.8.tar.xz && rm -f Python-3.6.8.tar.xz \
&& cd Python-3.6.8 \
&& ./configure prefix=/usr/local/python3 \
&& make && make install \
&& cd .. \
&& rm -rf Python-3.6.8
CMD ["usr","bin","bash"]
執行 docker build -t python3.6.8:latest .
生成鏡像
準備python容器
Dockerfile如下
FROM python3.6.8:latest
COPY ./djangoBlog /data/server/djangoBlog
ENV HOME_PATH /data/server/djangoBlog/djangoBlog
WORKDIR $HOME_PATH
RUN set -ex \
&& yum -y install mysql-devel gcc gcc-devel python-devel \
&& pip3 install -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com -r ../requirements.txt
EXPOSE 8080
CMD ["uwsgi","--ini","uwsgi.ini"]
不需要build
nginx
nginx作爲靜態服務器,conf本地編輯好放在Dockerfile同級目錄下即可,不用Build
Dockerfile如下
FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf
COPY ./static_server /data/static_server
EXPOSE 80
編寫docker-compose.yml
注意每個:之後都要跟一個空格
version: "2"
networks:
django:
services:
django-blog:
build: django
networks:
- django
depends_on:
- db
ports:
- "8080:8080"
nginx:
build: nginx
networks:
- django
depends_on:
- django-blog
ports:
- "80:80"
db:
image: "mysql:5.6.46"
networks:
- django
environment:
MYSQL_ROOT_PASSWORD: mysqlqwb5251314
volumes:
- $PWD/data:/var/libmysql
ports:
- "3306:3306"
redis:
image: "redis:latest"
networks:
- django
depends_on:
- django-blog
ports:
- "6379:6379"
volumes:
- $PWD/data:/var/libredis
elasticsearch:
image: "elasticsearch:2.4.6"
networks:
- django
depends_on:
- django-blog
ports:
- "9200:9200"
volumes:
- $PWD/data:/var/libes
目錄結構如下(djangoBlog爲項目於代碼)
在docker-compose.yml同級目錄下執行docker-compose up -d
,等待出現以下輸出
docker ps
共啓動了五個容器,且全部運行正常
導入本地測試數據,查看服務是否可用
結束。
遷移
只需要將主目錄打包到另一臺安裝了docker和docker-compose的機器下,執行docker-compose up -d 即可開啓服務。