User Tools

Site Tools


avril_on_docker

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
avril_on_docker [2019/07/19 19:10] – [Transfer images between computers] kalaschnikowavril_on_docker [2023/05/13 10:14] (current) – [2. Copy war files to the server] kalaschnikow
Line 1: Line 1:
 +====== 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:
 +<code bash>
 +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
 +</code>
 +
 +==== 3. Deploy war files to the server ====
 +
 +Login to the remote server
 +
 +<code bash>
 +ssh -p 1002 kalaschnikow@avril2019.wialon-consulting.de
 +</code>
 +
 +
 +(the following commands will be executed on the remote server)
 +
 +(Optionally) Backup old WAR files (replace 20201208 with current date)
 +<code bash>
 +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 .
 +</code>
 +
 +
 +
 +Stop the compose
 +<code bash>
 +cd /dockerdata/compose
 +sudo docker-compose down
 +</code>
 +
 +
 +Copy the file(s) to the deployment directory:
 +<code bash>
 +cp ~/AvrilDock.war /dockerdata/volumes/avril/wildfly/deployments/AvrilDock.war
 +cp ~/AvrilWebAdmin.war /dockerdata/volumes/avril/wildfly/deployments/AvrilWebAdmin.war
 +</code>
 +
 +Start compose
 +<code bash>
 +cd /dockerdata/compose
 +sudo docker-compose up -d
 +</code>
 +
 +===== Run Avril on my local computer =====
 +
 +==== MySQL ====
 +We need two MySQL containers because we have two containers (''avrilkeycloak'' and ''avril''), which need MySQL.
 +
 +<code bash>
 +# === 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
 +
 +</code>
 +
 +==== RabbitMQ ====
 +
 +<code bash>
 +# === 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
 +</code>
 +
 +After that we can open management UI entering ''http://host_name:15672'' (for example http://62.113.211.161:15672 ) in the browser.
 +
 +==== Keycloak ====
 +
 +<code bash>
 +# === 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
 +</code>
 +
 +==== Avril ====
 +
 +<code bash>
 +# === 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
 +</code>
 +
 +
 +
 +If all containers exist, it is possible to run them with the following simple commands:
 +<code bash>
 +sudo docker start keycloakmysql
 +
 +sudo docker start avrilmysql
 +
 +sudo docker start avrilrabbitmq
 +
 +sudo docker start avrilkeycloak
 +
 +sudo docker start avril
 +</code>
 +Or all with one command:
 +<code bash>
 +sudo docker start keycloakmysql && sudo docker start avrilmysql && sudo docker start avrilrabbitmq && \
 +sudo docker start avrilkeycloak && sudo docker start avril
 +</code>
 +
 +==== 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:
 +
 +<code>
 +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
 +</code>
 +
 +==== 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:
 +<code bash>
 +# first save image as TAR archive
 +docker save -o <path for generated tar file> <image name> 
 +
 +# 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 <path to image tar file>
 +</code>
 +
 +Full version (but not completed yet!):
 +<code bash>
 +# 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
 +# ...
 +
 +</code>
 +
 +==== 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:
 +
 +<code bash>
 +#
 +# ### 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
 +</code>