Я использую Docker вместе с Docker Compose для удобства работы с несколькими Docker-контейнерами. Начал изучать приложение TeamCity от JetBrain, много чего настроил и понял, что буду его использовать как удобный инструмент Continuous Integration. Разработчики настоятельно рекомендуют не использовать встроенную базу данных TeamCity сервера для продакшена, поэтому решил мигрировать на внешнюю СУБД. В наших проектах используется PostgreSQL, но так как я люблю зоопарк, решил разнообразить и без того перегруженный контейнерами Docker Compose и создать ещё одну конфигурацию для Docker-контейнера MySQL сервера. Такой уж я DevOps со странностями.
Структура папок и файлов Docker Compose:
/data/docker/docker-compose.yml
/data/docker/containers/teamcity/Dockerfile
/data/docker/containers/mysql/Dockerfile
/data/teamcity
/data/mysql
/data/logs/teamcity
/data/logs/mysql
docker-compose.yml
version: ‘2.1’
services:
tc-server:
image: profinch_tc-server
container_name: pro_tc-server
hostname: tc-server-container
build: ./containers/teamcity
restart: always
ports:
— 80:8111
— 443:8543
volumes:
— /data/teamcity:/data/teamcity_server/datadir
— /data/logs/teamcity:/opt/teamcity/logs
links:
— mysql
mysql:
image: profinch_mysql
container_name: pro_mysql
hostname: mysql-container
build: ./containers/mysql
restart: always
ports:
— 3306:3306
volumes:
— /data/mysql:/var/lib/mysql
— /data/logs/mysql:/var/log/mysql
environment:
— MYSQL_ROOT_PASSWORD=[password]
— MYSQL_USER=[username]
— MYSQL_PASSWORD=[password]
Необходимо скачать Java драйвер для подключения к серверу базы данных MySQL (jdbc driver):
1. Открываем в браузере https://dev.mysql.com/downloads/connector/j/
2. Выбираем Platform Independent и скачиваем последний драйвер.
На момент написания статьи это был файл mysql-connector-java-8.0.15.tar.gz (https://dev.mysql.com/downloads/file/?id=484818)
3. В операционной системе Debian:
debian$ wget https://dev.mysql.com/downloads/file/?id=484818
debian$ tar tf mysql-connector-java-8.0.15.tar.gz | grep "mysql-connector-java-*.jar"
mysql-connector-java-8.0.15/mysql-connector-java-8.0.15.jar
debian$ tar xf mysql-connector-java-8.0.15.tar.gz mysql-connector-java-8.0.15/mysql-connector-java-8.0.15.jar
debian$ cp mysql-connector-java-8.0.15.jar /data/docker/containers/teamcity
TeamCity Dockerfile
FROM jetbrains/teamcity-server
MAINTAINER profinch <[email protected]>
# copy jdbc driver
RUN mkdir /opt/teamcity/lib/jdbc
COPY mysql-connector-java-8.0.15.jar /opt/teamcity/lib/jdbc
MySQL Dockerfile
FROM mariadb:latest
MAINTAINER profinch <[email protected]>
Запускаем Docker Compose:
debian$ cd /data/docker
debian$ docker-compose up -d
Проверяем, что Docker-контейнеры запущены:
debian$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1cd3b2d77902 profinch_mysql "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:3306->3306/tcp pro_mysql
d3e44b4c1ceb profinch_tc-server "/run-services.sh" About an hour ago Up About an hour 0.0.0.0:80->8111/tcp, 0.0.0.0:443->8543/tcp pro_tc-server
До того, как выполнить миграцию, необходимо создать пустую базу данных в MySQL. Заходим в Docker-контейнер MySQL, создаём базу данных и даём полный доступ пользователю из конфигурации Docker Compose:
debian$ docker-compose exec mysql bash
mysql-container$ mysql -u root -p
password: [password]
mysql: create database [database-name] collate utf8_bin;
mysql: grant all privileges on [database-name].* to [username];
mysql: grant process on *.* to [username];
Теперь, для миграции, нам необходимо скопировать файл базовых настроек для соединения с MySQL во временный файл и прописать в нём наши данные. Существующий файл database.properties не изменяем и не удаляем.
debian$ cd /data/teamcity/config
debian$ cp database.mysql.properties database.temp.properties
debian$ nano database.temp.properties
connectionUrl=jdbc:mysql://mysql:3306/[database-name]
connectionProperties.user=[username]
connectionProperties.password=[password]
Наконец, внутри Docker контейнера TeamCity сервера выполняем миграцию и перезагружаем Docker-контейнер:
debian$ docker-compose exec teamcity bash
teamcity-container$ cd /opt/teamcity/bin
teamcity-container$ bash maintainDB.sh migrate -A /data/teamcity_server/datadir -T /data/teamcity_server/datadir/config/database.temp.properties
migration process...
teamcity-container$ exit
debian$ docker restart pro_tc-server
Обсуждение закрыто.