运用Docker-compose离线部署Django利用的要领
我们所在的内网环境需要部署一个相似CMS的利用,就是一些表格的CRUD,数据导出,人员权限治理等功能。想到Django做这方面的工作挺善于的,而且开发量不大,于是选中Django作为开发根基。开发功能比较简略,差不多就是运用xadmin等插件实现以上功能。但有一个题目我们是不好绕已往的,那就是部署到一个内网环境,在内网pip等工具是不能运用的,但好在内网有一个yum服务器可以运用,所以我们决议在内网服务器上安装Docker,然后把开发环境的容器复制到生产环境实现部署。下列是主要的步骤:
- 安装开发环境的 Docker-ce
- 安装开发环境的 Docker-compose
- 配置开发环境
- 保留容器
- 安装生产环境的 Docker-ce 和 docker-compose
- 发送容器文件并运转
注意:我这里的开发环境是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 http://www.baidow.com/tupian/lupian/20190513/qsts4srzokp | sudo apt-key add -
添加Docker的仓库
$ sudo add-apt-repository \ "deb [arch=amd64] http://www.baidow.com/tupian/lupian/20190513/im13wi50hot \ $(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
以上就是本文的全部内容,但愿对大家的学习有所帮忙,也但愿大家多多支撑脚本之家。