Нам нужно развернуть 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 — это инструмент оркестрации контейнеров. С ним нам не нужно писать оболочки для реализации соединения между контейнерами. Давайте сначала установим Docker-ce, здесь в основном имеется в виду Dockerофициальная документация, если то, что я написал, недостаточно подробно или устарело, вы можете обратиться к официалам для просмотра более авторитетных и обновленных документов.
удалить старую версию
Перед установкой необходимо удалить старую версию Docker.Если у вас новая система, вы можете пропустить этот шаг.
$ sudo apt remove docker docker-engine docker.io containerd runc
подходящий репозиторий для установки
- Обновить индекс пакета apt
$ sudo apt update
- Разрешить доступ к репозиторию через https
$ sudo apt install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
- Добавлен официальный GPG-ключ Docker.
$ 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 легко работать. Если вы напрямую загружаете скомпилированный двоичный файл Docker-compose на Linux и других платформах, вы можете его использовать.
$ 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
Сначала создайте папку проекта
$ mkdir project
Затем создайте новый проект Django или скопируйте существующий проект.
$ django-admin.py startproject mysite
Создать файл requirements.txt
На предыдущем шаге уже есть проект Django под названием mysite.Предположим, мы поместили в эту папку требования.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
Конечно, это зависимость, необходимая для моего проекта, ваша зависимость может отличаться от моей.
Новый докерфайл
Следующим шагом с проектом и файлами зависимостей проекта является создание образа Docker рабочей среды нашего проекта Django.Сначала создайте Dockerfile для создания образа Docker. Создайте новый 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.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
command: ['mysqld', '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci']
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. Позвольте мне объяснить элементы конфигурации в двух службах отдельно. дБ:
образ напрямую использует концентратор докеров или локальный существующий образ, для этого используется MySQL5.7 container_name указывает имя контейнера ports указывает сопоставление портов контейнера с хостом, передний — это порт хоста, а последний — порт контейнера. Среда определяет среду, в которой работает текущая служба.Подробнее о среде см. в описании текущего образа.Мы можем указать, какие из них поддерживаются выше. В этом случае мы указали пароль root MySQL, базу данных по умолчанию и набор символов базы данных. command Команда после запуска контейнера, сюда добавляются параметры дефолтной кодировки mysql веб: build компилирует образ, вот Dockerfile в текущей папке команда Команда, которая будет выполнена после запуска контейнера depend_on Служба, от которой зависит текущий контейнер, то есть служба в зависимости должна успешно запустить текущую службу, прежде чем ее можно будет запустить. volumes Тома, которые будут смонтированы текущим контейнером.Передняя часть относится к каталогу хоста, за которым следует каталог контейнера. перезапуск указывает стратегию перезапуска контейнера. Текущий случай — перезапускать все время, если есть ошибка. Здесь порт 8000 контейнера сопоставляется с портом 8002 хоста, а доступ к веб-сервису осуществляется через порт 8002.
Настройте проект Django.
Теперь измените файл settings.py проекта mysite для текущей среды контейнера.
$ vim mysite/mysite/settings.py
Найдите в файле раздел ALLOW_HOSTS и добавьте в него «web» со следующим содержимым:
ALLOW_HOSTS = [
...
'web'
]
Затем измените раздел DATABASES в settings.py и измените параметры на параметры базы данных службы MySQL.Содержимое примерно следующее:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mysite',
'USER': 'root',
'PASSWORD': 'mysite',
'HOST': 'db'
}
}
Здесь все параметры подключения MySQL определены в среде в разделе db файла docker-compose.yml. Стоит отметить, что значение параметра HOST равно db. После того, как docker-compose запустит контейнер, эти контейнеры будут подключены. "Здесь можно напрямую заполнить "db"".
Соберите проект с помощью Docker-compose
После вышеуказанных усилий мы в основном готовы, мы можем создать наш образ, здесь есть две службы, db нужно только загрузить или использовать локальный образ при запуске, и сеть также должна быть построена с использованием Dockerfile.
$ docker-compose build
Через некоторое время загрузки или сборки вы можете увидеть информацию о том, что образ был успешно собран.
Запустите проект и протестируйте его
После завершения сборки есть образ веб-службы, и теперь мы используем docker-compose для запуска службы.
$ docker-compose up -d
Этот процесс также может занять некоторое время, в зависимости от скорости вашего интернета, он загрузит образ MySQL, создаст контейнер на основе db и веб-образов и запустит контейнер. После завершения вы можете использовать docker-compose ps и образы docker-compose для просмотра созданных нами контейнеров и образов.
$ 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 вместе с файлами 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. Вы также заметили, что на рабочем сервере нет Интернета, поэтому зеркало больше нельзя построить, и мы также скопировали зеркало среды разработки, поэтому на этот раз веб-сервис изменен для запуска с зеркала, а содержимое примерно так:
version: '3'
services:
db:
...
web:
image: mysite_web:latest
...
Просто измените элемент сборки в Интернете, удалите его и добавьте элемент изображения, а содержимое — это изображение, которое мы скопировали. Позже мы можем собрать контейнер и запустить службу.
$ 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, и в будущих проектах я сделаю несколько более подробных представлений по другим направлениям. Спасибо, что смотрите мою работу, надеюсь, вы сможете немного помочь вам.