使用Docker-compose离线部署Django应用的方法

我们所在的内网环境需要部署一个类似CMS的应用,就是一些表格的CRUD,数据导出,人员权限管理等功能。想到Django做这方面的工作挺擅长的,而且开发量不大,于是选择Django作为开发基础。开发功能比较简单,差不多就是使用xadmin等插件实现以上功能。但有一个问题我们是不好绕过去的,那就是部署到一个内网环境,在内网pip等工具是不能使用的,但好在内网有一个yum服务器可以使用,所以我们决定在内网服务器上安装Docker,然后把开发环境的容器复制到生产环境实现部署。以下是主要的步骤:

  1. 安装开发环境的 Docker-ce
  2. 安装开发环境的 Docker-compose
  3. 配置开发环境
  4. 保存容器
  5. 安装生产环境的 Docker-ce 和 docker-compose
  6. 发送容器文件并运行

注意:我这里的开发环境是Ubuntu18.04,生产环境是Centos7.2。如果你是其他环境请自己检查差异,使用适合自己系统的命令。

安装开发环境的 Docker-ce

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-compose

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文件放在一起准备迁移到生产机器上。

安装生产环境的 Docker-ce 和 docker-compose

由于生产环境是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 还有更多的用法,我会在以后的项目中做些其他方向的更深入的介绍。谢谢大家赏光看我的作品,希望你帮到你一点。

参考文档

Get Docker CE for Ubuntu
Install Docker Compose

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Docker-compose部署gitlab的方法步骤

    Docker-compose部署gitlab 1.安装Docker 安装必要工具 复制代码 代码如下: [root@vm_10_14_centos ~]# yum -y install yum-utils device-mapper-persistent-data lvm2 添加Docker-ce镜像源并安装 [root@vm_10_14_centos ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/li

  • linux使用docker-compose部署软件配置详解

    前言 本篇将分享一些 docker-compose 的配置,可参考其总结自己的一套基于docker的开发/生产环境配置.下面话不多说了,来一起看看详细的介绍吧 安装docker及docker-compose install docker curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun install docker-compose sudo curl -L https://github.com/docker/co

  • 浅析docker-compose部署mysql无法访问的问题

    什么是Docker-Compose Compose项目来源于之前的fig项目,使用python语言编写,与docker/swarm配合度很高.Compose 是 Docker 容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器,使用Docker Compose不再需要使用shell脚本来启动容器. Compose 通过一个配置文件来管理多个Docker容器,在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动,停止和重启应用,和应用

  • Docker Compose部署及基础使用详解

    一 Docker Compose概述 Compose是一个用于定义和运行多容器Docker应用程序的工具.使用Compose,您可以使用YAML文件来配置应用程序的服务.然后,使用单个命令,您可以从配置中创建并启动所有服务. Compose适用于所有环境:生产,登台,开发,测试以及CI工作流程. 使用Compose基本上是一个三步过程: 在Dockerfile中定义您的应用程序环境,以便可以在任何地方进行再生产. 定义构成应用程序的服务,docker-compose.yml 以便它们可以在隔离环

  • Docker-compose一键部署gitlab中文版的方法步骤

    一.gitlab介绍 gitlab官方地址:https://about.gitlab.com/ GitLab是利用 Ruby on Rails 一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目.它拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释.可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库.团队成员可以利用内置的简单聊天程序(Wall)进行交流.它还提供一个代码片段收集功能可以轻松实现代码复用,便于日后有需

  • 使用Docker-compose离线部署Django应用的方法

    我们所在的内网环境需要部署一个类似CMS的应用,就是一些表格的CRUD,数据导出,人员权限管理等功能.想到Django做这方面的工作挺擅长的,而且开发量不大,于是选择Django作为开发基础.开发功能比较简单,差不多就是使用xadmin等插件实现以上功能.但有一个问题我们是不好绕过去的,那就是部署到一个内网环境,在内网pip等工具是不能使用的,但好在内网有一个yum服务器可以使用,所以我们决定在内网服务器上安装Docker,然后把开发环境的容器复制到生产环境实现部署.以下是主要的步骤: 安装开发

  • docker compose 一键部署分布式配置中心Apollo的过程详解

    简介 说起分布式肯定要想到分布式配置中心.分布式日志.分布式链路追踪等 在分布式部署中业务往往有很多配置比如: 应用程序在启动和运行时需要读取一些配置信息,配置基本上伴随着应用程序的整个生命周期,比如:数据库连接参数.启动参数等,都需要去维护和配置,但不可能一台台服务器登录上去配置 今天我要跟大家分享一下分布式配置中心Apollo: Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等

  • 在Docker容器中部署Django的时区问题

    目录 Django 中与时区有关的配置 USE_TZ=True USE_TZ=False Linux 容器中时区的设置 进入 Django 环境查看时间和时区 修改 Linux 容器时区 进入 Django 环境查看时间 总结 现在容器化部署已经非常成熟了,我们很多服务都会使用容器部署,更新恢复都非常方便,但是有一个问题比较麻烦,就是时区处理,通常情况下,都采用注入 TZ 环境变量来解决,但是实际这种处理方式在 django 中却是不行的. Django 中与时区有关的配置 在Django的配置

  • Docker Compose快速部署多容器服务实战的实例详解

    目录 1 什么是Docker Compose 2 安装Docker Compose 3 Docker Compose文件格式的简单介绍 4 Docker Compose常用命令 5 使用Docker Compose一键部署Spring Boot+Redis实战 5.1 构建应用 5.1.1 Spring Boot项目 5.1.2 Redis配置文件 5.2 打包应用并构建目录 5.2.1 打包Spring Boot项目 5.2.2 上传redis.conf配置文件 5.3 编写Dockerfil

  • 使用docker compose一键部署WordPress博客的方法

    目录 1.创建wordpress项目目录 2.创建docker-compose.yml配置文件 3.一键启动wordpress项目 4.查看相关信息参数 5.配置wordpress 1.创建wordpress项目目录 [root@docker ~]# mkdir wordpress [root@docker ~]# cd wordpress/ [root@docker wordpress]# 2.创建docker-compose.yml配置文件 [root@docker wordpress]#

  • Docker镜像+nginx 部署 vue 项目的方法

    一.打包vue项目 在开发完的vue项目输入如下命名,打包生成dist文件夹 yarn build / npm run build 此时根目录会多出一个文件夹:dist文件夹,里面就是我们要发布的东西. 如果将该dist目录整个传到服务器上,部署成静态资源站点就能直接访问到该项目. 二.获取nginx 镜像 nginx 是一个高性能的HTTP和反向代理服务器,此处我们选用 nginx 镜像作为基础来构建我们的vue应用镜像. 在终端输入: docker pull nginx 即可以获取到ngin

  • Docker 部署Django项目的方法示例

    使用docker部署django项目也很简单,挺不错,分享下 环境 默认你已安装好docker环境 django项目大概结构 (p3s) [root@opsweb]# tree opsweb opsweb ├── apps ├── logs ├── manage.py ├── media ├── opsweb ├── README.md ├── requirements.txt └── static 编写Dockerfile 这里指定 Python 版本为docker官方提供的 "0.0.0.0

  • 使用k8s部署Django项目的方法步骤

    接触了一下docker和k8s,感觉是非常不错的东西.能够方便的部署线上环境,而且还能够更好的利用机器的资源,感觉是以后的大趋势.最近刚好有一个基于django的项目,所以就把这个项目打包到docker里面,放到k8是里面运行,顺便学习下k8s和docker的使用. docker 为什么使用docker? 我觉得docker最大的好处是部署的时候比较方便,一个预先打包好的docker镜像,可以在任何安装有docker的机器上面直接运行,不用再安装其他任何的依赖环境.不管是在开发.测试.还是发布阶

  • 使用Docker Compose 实现nginx负载均衡的方法步骤

    以Docker的网络管理,容器的IP设置为基础知识实现Nginx负载均衡 查看所有docker网络 docker network ls /* NETWORK ID NAME DRIVER SCOPE b832b168ca9a bridge bridge local 373be82d3a6a composetest_default bridge local a360425082c4 host host local 154f600f0e90 none null local */ // compose

  • .Net Core自动化部署之利用docker版jenkins部署dotnetcore应用的方法

    前言 本文主要介绍了关于.Net Core自动化部署用docker版jenkins部署dotnetcore应用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的实现步骤吧. 安装docker版jenkins 因为jenkins的docker版本本身没有 dotnetcore的环境,所以我们需要先自己动手制作下包含dotnet环境的jenkins Docker Container Dockerfile FROM jenkins/jenkins # Switch to root t

随机推荐