====== 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