如何使用 Docker-compose 离线部署 Django 应用程序!
内网环境需要部署一个类似CMS的应用,就是一些表的CRUD、数据导出、人员权限管理等功能。由于Django非常擅长这种工作,而且开发范围也不大,所以我选择了Django作为开发的基础。开发功能比较简单,基本上就是使用xadmin等插件来实现上述功能。但有一个问题我们无法绕过,即部署在内网环境中。 pip 等工具不能在内网使用。幸运的是,内网有一台 yum 服务器可以使用,所以我们决定在服务器上安装 Docker,然后将 dev 容器复制到生产环境进行部署。主要步骤如下:
- 开发环境安装 Docker-ce
- 开发环境安装 Docker-compose
- 开发环境的配置
- 保存容器-docker-生产环境 compose
- 发送文件容器并运行
注:我这里的开发环境是Ubuntu18.04,生产环境是Centos7.2。如果您处于不同的环境,请自行检查差异并使用适合您系统的命令。
安装Docker开发环境
Docker和Docker-compose是我们这次部署的重点。我会尽量减少Django的应用部分。 Docker负责容器虚拟化的核心部分。 Docker-compose 是一个容器编排工具。有了它,我们不需要再用手写shell来实现容器之间的连接。首先,让我们安装 Docker。这里我们主要参考Docker官方文档(https://docs.docker.com/install/linux/docker-ce/ubuntu/)。如果我写的不够详细或过时,请阅读。官方可以前往官网查看更权威、更新的文档。
卸载旧版本
安装前必须先卸载旧版本的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后,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 --versiondocker-compose version 1.24.0-rc1, build 0f3d4dda
配置开发环境这里的开发环境是Django,Pro示例为了方便演示,我尝试使用新创建的Django项目。 创建一个新的 Django 项目 要创建一个新的 Django 项目,首先创建一个顶级文件夹并将项目文件放入该文件夹中。目录结构大致如下: 首先创建项目文件夹 然后创建一个新的Django项目,也可以复制现有的项目。 生成requirements.txt 文件 在上一步中,名为mysite 的Django 项目已经存在。假设我们将requirements.txt放在这个文件夹中。内容大致如下: 当然,这是我的项目所需要的。依赖项,您的依赖项可能与我的不同。 创建一个新的Dockerfile 项目现已可用,项目的依赖文件也可用。下一步是为我们的 Django 项目的运行环境创建 docker 镜像。首先,创建一个Dockerfile来创建docker镜像。 ?如果您熟悉 Alpine,您也可以使用 Alpine,它的图像要小得多。 您可以使用 Env 关键字创建任意操作系统环境变量 例如,如果您使用它来存储 Django 密钥,您可以编写: 在您的代码中,使用: RUN 顾名思义,RUN就是在容器中运行命令。这里的 RUN 命令创建了两个文件夹 /config 和 /src 以及 Python 安装的依赖环境。 ADD 将本地文件添加到容器 WORKDIR 是指定在容器中运行的所有以下命令的默认路径。要运行的命令稍后可以显示在 docker-compose 文件中。到达。 创建一个新的docker-compose脚本 docker-compose可用于管理多个容器。以前docker-compose可以完成手动添加很多参数来启动容器、挂载容器的工作。我的 docker-compose.yml 文件的内容大致如下: 我简单解释一下这个 docker-compose 文件。 版本:'3' 指的是docker-compose版本。不同版本支持的配置项略有不同。由 服务管理的服务,在我们的示例中有两个服务:db 和 web。我分别解释一下两个服务中的配置项 db: image直接使用docker hub或者本地已有的镜像。这里使用MySQL5.7 container_name 指定容器的名称 ports 指定容器端口到主机的映射。第一个是主机端口,第二个是容器端口。 environment 当前服务运行的环境。有关环境的详细信息,请参阅当前图像的描述。上面支持之后,我们再看看哪些是可配置的。在本例中,我们指定了 MySQL root 密码、默认数据库和数据库字符集。 web: build 编译镜像,这里是当前文件夹下的 Dockerfile command 容器启动后运行的命令 depends_on the services the current container dependent,必须依赖于服务要运行 卷,当前服务必须成功启动。当前容器要安装的卷。前面指的是主机目录,后面指的是容器目录。 restart 指定容器重启策略。在当前情况下,如果发生错误,它总是会重新启动。 这里容器端口8000映射到主机端口8002,可以从8002端口访问Web服务。 配置Django项目 现在编辑当前容器的mysite项目的settings.py文件环境。 在文件中找到 ALLOW_HOSTS 部分并向其中添加“web”。内容如下: 然后编辑settings.py中的DATABASES部分,将参数改为MySQL db参数。内容大致如下: MySQL连接参数都在这里定义在docker-compose.yml文件中db部分的环境中。值得注意的是HOST参数的值为db。 docker-compose 启动容器后,会挂载这些容器。容器之间可以通过服务名和域名互相ping通,所以这里的“HOST”可以直接填写“db”。 ### 使用Docker-compose构建项目 经过上述努力,我们就基本准备好了。我们可以构建我们的形象。这里有两个服务。 db 只需要即时下载或使用本地镜像即可,但网站还需要使用 Dockerfile 来构建 下载或构建一段时间后,您将被告知镜像已成功构建。 启动项目并测试 构建完成后,这是Web服务的图像。我们现在使用 docker-compose 来启动服务。 此过程可能需要一段时间,具体取决于您的互联网速度。它会下载MySQL镜像,根据数据库和站点镜像创建一个容器,并启动容器。完成后,你可以使用 docker-compose ps 和 docker-compose images 来显示我们生成的容器和镜像 你可以还可以使用 docker-compose 停止和启动服务。更具体的使用请参见官方文档。 你看,这里停止和启动服务的顺序是有规律的。启动时,首先启动依赖的服务,然后再启动依赖于它的服务。当服务有价值时,情况恰恰相反。服务正常运行后,可以进入浏览器测试服务是否正常启动。 保存容器 如果服务正常,我们会保存当前容器,为部署到新平台做准备。 **注意:** 您必须使用此处的“保存”来保存图像。存储使用情况包括容器之间的连接状态等信息。如果使用export将镜像导出到生产环境,则无法使用docker-compose恢复服务。 上述命令执行成功后,会在当前目录下生成两个tar文件,同时在项目目录下生成Dockerfile和docker-compose.yml文件,准备迁移到生产机上。 生产环境安装Docker-ce和docker-compose 因为生产环境是CentOS,所以可以直接用yum安装 安装成功后,进入开发环境,将docker-compose部署到生产服务器。 发送容器文件并运行 使用scp或其他工具,将mysql.tar、mysite.tar、Docker-compose.yml文件和项目文件夹发送到生产服务器并找到合适的文件夹来存储这些文件。保留原来的目录结构。 首先我们将两个镜像恢复到生产服务器。 请稍候执行完成。可以看到当前服务器已经有这两个镜像了。 在构建容器之前,我们还需要对 docker-compose.yml 进行简单的编辑。另请注意,生产服务器没有互联网,因此无法再构建映像,并且我们还按原样复制了开发环境映像,因此这次可以从映像运行 Web 服务。内容大致如下: 只要更改站点上的构建项,删除它并添加图像项,内容就是我们复制的图像。稍后我们可以构建容器并启动服务。 结果 再次打开浏览器,查看是否正常启动。 Postscript docker-compose 还有更多用途,我会在以后的项目中在其他方向做更详细的介绍。谢谢大家观看我的作品,希望能给我一点帮助。 参考文档 来自李宝印尹的咆哮--project --Dockerfile --docker-compose.yml --mysite --manage.py --requirements.txt$ mkdir project$ django-admin.py startproject mysite$ cat requirements.txtdefusedxml==0.5.0diff-match-patch==20181111Django==2.1.7django-crispy-forms==1.7.2django-formtools==2.1django-import-export==1.2.0django-reversion==3.0.3et-xmlfile==1.0.1future==0.15.2httplib2==0.9.2jdcal==1.4odfpy==1.4.0openpyxl==2.6.0pytz==2018.9PyYAML==3.13six==1.10.0tablib==0.12.1unicodecsv==0.14.1xadmin==0.6.1xlrd==1.2.0xlwt==1.3.0mysqlclient==1.4.2ENV PYTHONUNBUFFERED 1ENV PYTHONUNBUFFERED 1ENV DJANGO_SECRET_KEY l!fafmjcqyn+j+zz1@2@wt$o8w8k(_dhgub%41l#k3zi2m-b%mimport osSECRET_KEY = os.environ['DJANGO_SECRET_KEY']RUN mkdir /configRUN mkdir /srcRUN pip install -r /config/requirements.txtADD /mysite/requirements.txt /config/WORKDIR /src/mysite$ cat docker-compose.ymlversion: '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"$ vim mysite/mysite/settings.pyALLOW_HOSTS = [ ... 'web']DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mysite', 'USER': 'root', 'PASSWORD': 'mysite', 'HOST': 'db' }}$ docker-compose build$ docker-compose up -d$ docker-compose psName Command State Ports ---------------------------------------------------------------------------------------mysite_db docker-entrypoint.sh mysqld Up 0.0.0.0:3306->3306/tcp, 33060/tcpmysite_web bash -c python manage.py m ... Up 0.0.0.0:8002->8000/tcp$ docker-compose imagesContainer Repository Tag Image Id Size--------------------------------------------------------mysite_db mysql 5.7 e47e309f72c8 355 MBmysite_web mysite_web latest 3989acbcc3c9 938 MB$ docker-compose startStarting db ... doneStarting web ... done$ docker-compose stopStopping mysite_web ... doneStopping mysite_db ... done![]()
$ docker save -o mysql.tar mysql:5.7$ docker save -o mysite.tar mysite_web:latest$ sudo yum install docker-ce$ docker load -i mysql.tar$ docker load -i mysite_web.tarREPOSITORY TAG IMAGE ID CREATED SIZEmysite_web latest 3989acbcc3c9 2 days ago 983MBmysql 5.7 e47e309f72c8 3 weeks ago 372MBversion: '3'services: db: ... web: image: mysite_web:latest ...$ docker-compose up -dName 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
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网