====== Avril on Docker ======
===== Build Docker images =====
There are five containers, that are necessary to run Avril on Docker:
* avrilmysql (based on mysql image)
* keycloakmysql (based on mysql image)
* avrilrabbitmq (based on my own RabbitMQ image)
* avrilkeycloak (based on my own Keycloak image)
* avril (based on Avril image)
So three of them should be built first. The Maven modules for them are located in my Avril project. So open the workspace and start following run configurations:
* package AvrilKeycloak
* package AvrilRabbitMQ
* package AvrilDock -> package an AvrilDock WAR file
* install AvrilDock -> install AvrilDock WAR file to the local repo
* package AvrilWebAdmin
* install AvrilWebAdmin -> install AvrilWebAdmin WAR file to the local repo
* package Avril
===== Deploy wars on remote server =====
==== 1. Package wars ====
Execute following Maven targets (e.g. from the IDE):
* install AvrilDock (avril2019)
* install AvrilWebAdmin (avril2019)
It is also possible to execute "package" targets, but then the files should be manually copied to the proper directories.
==== 2. Copy war files to the server ====
Copy the file(s) to the remote server:
cd /home/kalaschnikow/Desktop/avril_misc/install
# for avril2019:
scp -P 1002 AvrilDock.war kalaschnikow@avril2019.wialon-consulting.de:/home/kalaschnikow/AvrilDock.war
scp -P 1002 AvrilWebAdmin.war kalaschnikow@avril2019.wialon-consulting.de:/home/kalaschnikow/AvrilWebAdmin.war
# for avril2021:
scp -P 1002 AvrilDock.war kalaschnikow@avril2021.avril.work:/home/kalaschnikow/AvrilDock.war
scp -P 1002 AvrilWebAdmin.war kalaschnikow@avril2021.avril.work:/home/kalaschnikow/AvrilWebAdmin.war
==== 3. Deploy war files to the server ====
Login to the remote server
ssh -p 1002 kalaschnikow@avril2019.wialon-consulting.de
(the following commands will be executed on the remote server)
(Optionally) Backup old WAR files (replace 20201208 with current date)
mkdir ~/avril.bak/wars/20201208
mkdir ~/avril.bak/wars/20201208/old
mkdir ~/avril.bak/wars/20201208/new
cd ~/avril.bak/wars/20201208/old
cp /dockerdata/volumes/avril/wildfly/deployments/AvrilDock.war .
cp /dockerdata/volumes/avril/wildfly/deployments/AvrilWebAdmin.war .
cd ~/avril.bak/wars/20201208/new
cp ~/AvrilDock.war .
cp ~/AvrilWebAdmin.war .
Stop the compose
cd /dockerdata/compose
sudo docker-compose down
Copy the file(s) to the deployment directory:
cp ~/AvrilDock.war /dockerdata/volumes/avril/wildfly/deployments/AvrilDock.war
cp ~/AvrilWebAdmin.war /dockerdata/volumes/avril/wildfly/deployments/AvrilWebAdmin.war
Start compose
cd /dockerdata/compose
sudo docker-compose up -d
===== Run Avril on my local computer =====
==== MySQL ====
We need two MySQL containers because we have two containers (''avrilkeycloak'' and ''avril''), which need MySQL.
# === MySQL for keycloak ===
# stop native MySQL service
sudo service mysql stop
# remove old keycloakmysql container if necessary
sudo docker rm keycloakmysql
# run keycloakmysql container
# ( if necessary open port with '-p xxxx:3306', where xxxx port number on localhost, e.g. 3307 )
sudo docker run --network avrilnet \
--name keycloakmysql -v /dockerdata/keycloakmysql:/var/lib/mysql \
-e MYSQL_DATABASE=keycloak -e MYSQL_USER=keycloak -e MYSQL_PASSWORD=keycYaopnlp=8 \
-e MYSQL_ROOT_PASSWORD=mysqlYaopnlp=8 -d mysql:5.5
# === MySQL for avril ===
# remove old avrilmysql container if necessary
sudo docker rm avrilmysql
# run avrilmysql container
sudo docker run --network avrilnet -p 3306:3306 \
--name avrilmysql -v /dockerdata/avrilmysql:/var/lib/mysql \
-e MYSQL_DATABASE=keycloak -e MYSQL_USER=keycloak -e MYSQL_PASSWORD=keycYaopnlp=8 \
-e MYSQL_ROOT_PASSWORD=mysqlYaopnlp=8 -d mysql:5.5
==== RabbitMQ ====
# === RabbitMQ ===
# stop service
sudo service rabbitmq-server stop
# for official image:
sudo docker run --network avrilnet \
-d --hostname kalaschnikow2017 --name avrilrabbitmq \
-p 15672:15672 -p 1883:1883 \
-v /dockerdata/rabbitmq/enabled_plugins:/etc/rabbitmq/enabled_plugins \
rabbitmq:3-management
# for my image:
sudo docker run --network avrilnet \
-d --hostname kalaschnikow2017 --name avrilrabbitmq \
-p 15672:15672 -p 1883:1883 \
avrilrabbitmq
# my image on 1fire
sudo docker run --network avrilnet \
-d --hostname avril2018.wialon-consulting.de --name avrilrabbitmq \
-p 15672:15672 -p 1883:1883 \
avrilrabbitmq
After that we can open management UI entering ''http://host_name:15672'' (for example http://62.113.211.161:15672 ) in the browser.
==== Keycloak ====
# === Keycloak ===
# remove old avrilkeycloak container if necessary
sudo docker rm avrilkeycloak
# run avrilkeycloak container (based on official keycloak image)
sudo docker run --network avrilnet --name avrilkeycloak -p 8180:8080 \
-e DB_VENDOR=mysql \
-e DB_ADDR=avrilmysql \
-e MYSQL_PORT_3306_TCP_ADDR=avrilmysql \
-e MYSQL_PORT_3306_TCP_PORT=3306 \
-e MYSQL_PASSWORD=keycYaopnlp=8 \
-d jboss/keycloak:3.4.3.Final
# run avrilkeycloak container (based my own image)
sudo docker run --network avrilnet --name avrilkeycloak -p 8180:8180 \
-e DB_VENDOR=mysql \
-e DB_ADDR=keycloakmysql \
-e MYSQL_PORT_3306_TCP_ADDR=keycloakmysql \
-e MYSQL_PORT_3306_TCP_PORT=3306 \
-e MYSQL_PASSWORD=keycYaopnlp=8 \
-d avrilkeycloak
==== Avril ====
# === Avril ===
# remove old avril container if necessary
sudo docker rm avril
# start avril container (old way)
sudo docker run --network avrilnet --name avril -p 8080:8080 \
-v /dockerdata/avril/modules/system/add-ons:/opt/jboss/wildfly/modules/system/add-ons \
-v /dockerdata/avril/upload:/opt/jboss/wildfly/upload \
-v /dockerdata/avril/modules/system/layers/base/com/mysql:/opt/jboss/wildfly/modules/system/layers/base/com/mysql \
-v /dockerdata/avril/standalone/configuration/standalone.xml:/opt/jboss/wildfly/standalone/configuration/standalone.xml \
-it avril
# start avril container
sudo docker run --network avrilnet --name avril \
-p 8080:8080 -p 9990:9990 \
-v /dockerdata/avril/modules/system/add-ons:/opt/jboss/wildfly/modules/system/add-ons \
-v /dockerdata/avril/upload:/opt/jboss/wildfly/upload \
-v /dockerdata/avril/modules/system/layers/base/com/mysql:/opt/jboss/wildfly/modules/system/layers/base/com/mysql \
-it avril
# start avril container in debug mode
sudo docker run --network avrilnet --name avril \
-p 8080:8080 -p 9990:9990 -p 8787:8787 \
-v /dockerdata/avril/modules/system/add-ons:/opt/jboss/wildfly/modules/system/add-ons \
-v /dockerdata/avril/upload:/opt/jboss/wildfly/upload \
-v /dockerdata/avril/modules/system/layers/base/com/mysql:/opt/jboss/wildfly/modules/system/layers/base/com/mysql \
-it avril
If all containers exist, it is possible to run them with the following simple commands:
sudo docker start keycloakmysql
sudo docker start avrilmysql
sudo docker start avrilrabbitmq
sudo docker start avrilkeycloak
sudo docker start avril
Or all with one command:
sudo docker start keycloakmysql && sudo docker start avrilmysql && sudo docker start avrilrabbitmq && \
sudo docker start avrilkeycloak && sudo docker start avril
==== Autostart containers on reboot ====
It is possible to to use option ''--restart unless-stopped'' on ''run'' command. (TODO: include it in the documentation above).
See also: https://docs.docker.com/config/containers/start-containers-automatically/
At the moment it is solved with ''update'' commands on all containers:
sudo docker update --restart unless-stopped avrilmysql && \
sudo docker update --restart unless-stopped avril && \
sudo docker update --restart unless-stopped keycloakmysql && \
sudo docker update --restart unless-stopped avrilkeycloak && \
sudo docker update --restart unless-stopped avrilrabbitmq
==== Transfer images between computers ====
See this [[https://stackoverflow.com/questions/23935141/how-to-copy-docker-images-from-one-host-to-another-without-via-repository|Stackoverflow question]]
In short:
# first save image as TAR archive
docker save -o
# then copy it for example with SCP
scp file.ext kalaschnikow@avril2018.wialon-consulting.de:/home/kalaschnikow
# then load it into docker
docker load -i
Full version (but not completed yet!):
# pack mysql images
# ...
# pack rabbit mq image
sudo docker save -o avrilrabbitmq.tar avrilrabbitmq
# pack AvrilDock image
# ...
# pack AvrilWebAdmin image
# ...
# gzip all tars as multi volume
# ...
# sudo gzip avrilrabbitmq.tar ...
# transfer volumes to remote server
...
# unpack on the remote server
# ...
==== Install Avril and all necessary images on a new server (old version) ====
At first package all **my images**. Open IntelliJ and start following run configurations:
* package AvrilKeycloak
* package AvrilRabbitMQ
* package Avril
After that do the following on the console:
#
# ### On SRC server ###
#
# pack AvrilKeycloak image
sudo docker save -o ./AvrilKeycloak.tar avrilkeycloak:latest
# copy file to the DEST server
scp AvrilKeycloak.tar kalaschnikow@avril2018.wialon-consulting.de:/home/kalaschnikow
# pack keycloak database
sudo zip -r keycloakmysql.zip keycloakmysql
# pack avril database
sudo zip -r avrilmysql.zip avrilmysql
# copy files to the DEST server
scp avrilmysql.zip kalaschnikow@avril2018.wialon-consulting.de:/home/kalaschnikow
scp keycloakmysql.zip kalaschnikow@avril2018.wialon-consulting.de:/home/kalaschnikow
#
# ### On DEST server ###
#
# copy files to _artifacts folder
cd /dockerdata/_artifacts
cp ~/keycloakmysql.zip .
cp ~/avrilmysql.zip .
mv ~/AvrilKeycloak.tar .
# unpack files
unzip keycloakmysql.zip
unzip avrilmysql.zip
# move directories to dockerdata
mv keycloakmysql ..
mv avrilmysql ..
# create network 'avrilnet' (if it not already exists)
sudo docker network create avrilnet
# run keycloakmysql container
# ( if necessary open port with '-p xxxx:3306', where xxxx port number on localhost, e.g. 3307 )
sudo docker run --network avrilnet \
--name keycloakmysql -v /dockerdata/keycloakmysql:/var/lib/mysql \
-e MYSQL_DATABASE=keycloak -e MYSQL_USER=keycloak -e MYSQL_PASSWORD=keycYaopnlp=8 \
-e MYSQL_ROOT_PASSWORD=mysqlYaopnlp=8 -d mysql:5.5
# load AvrilKeycloak image
sudo docker load -i AvrilKeycloak.tar
# run avrilkeycloak container
sudo docker run --network avrilnet --name avrilkeycloak -p 8180:8180 \
-e DB_VENDOR=mysql \
-e DB_ADDR=keycloakmysql \
-e MYSQL_PORT_3306_TCP_ADDR=keycloakmysql \
-e MYSQL_PORT_3306_TCP_PORT=3306 \
-e MYSQL_PASSWORD=keycYaopnlp=8 \
-d avrilkeycloak