Déploiement hors ligne de Docker et de middlewares sur architecture x86

Installation autonome du moteur Docker

Récupération et transfert de l'archive

Depuis une machine disposant d'un accès Internet, téléchargez l'archive statique correspondant à l'architecture x86_64 :

wget https://download.docker.com/linux/static/stable/x86_64/docker-24.0.7.tgz

Transférez ensuite le fichier docker-24.0.7.tgz sur le serveur cible, par exemple dans /opt.

Décompression et installation des binaires

cd /opt
tar -xzf docker-24.0.7.tgz
cp docker/* /usr/local/bin/

Création de l'unité systemd

cat > /etc/systemd/system/docker.service <<'EOF'
[Unit]
Description=Docker Container Runtime
Documentation=https://docs.docker.com
After=network-online.target
Wants=network-online.target

[Service]
Type=notify
ExecStart=/usr/local/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=1048576
LimitNPROC=infinity
LimitCORE=infinity
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s

[Install]
WantedBy=multi-user.target
EOF

Démarrage et vérification

chmod +x /etc/systemd/system/docker.service
systemctl daemon-reload
systemctl enable --now docker
docker version

Installation de Docker Compose sans connexion réseau

Placez le binaire docker-compose-linux-x86_64 sur le serveur, puis procédez comme suit :

mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose version

Conteneurisation d'une application Java packagée en JAR

Préparation d'une image JDK autonome

Sur un hôte connecté :

docker pull eclipse-temurin:8-jdk
docker save -o /opt/jdk8-offline.tar eclipse-temurin:8-jdk

Sur le serveur isolé :

docker load -i /opt/jdk8-offline.tar
docker images

Construction de l'image applicative

mkdir -p /opt/apps/monolith
cd /opt/apps/monolith

Créez un fichier Dockerfile :

FROM eclipse-temurin:8-jdk
WORKDIR /app
COPY monolith-service.jar /app/app.jar
ENV JAVA_OPTS="-Dfile.encoding=UTF-8"
ENV LOG_DIR=/app/logs
EXPOSE 8080
CMD ["sh", "-c", "java $JAVA_OPTS -jar /app/app.jar --logging.file=${LOG_DIR}/application.log"]

Lancement du conteneur

docker build -t monolith-app:latest .
docker run -d --name monolith \
  --restart unless-stopped \
  -p 8080:8080 \
  -v /opt/apps/monolith/logs:/app/logs \
  -v /opt/apps/monolith/monolith-service.jar:/app/app.jar \
  monolith-app:latest

Le statut Up indique que le service est opérationnel. L'API est alors accessible sur http://adresse_ip:8080.

Déploiement de MySQL 8 en environnement isolé

Import de l'image officielle

Sur un hôte avec accès au réseau :

docker pull mysql:8.2.0
docker save -o /opt/mysql-8.2.0.tar mysql:8.2.0

Sur le serveur isolé :

docker load -i /opt/mysql-8.2.0.tar
docker images

Configuraton et volumes persistants

mkdir -p /opt/mysql8/{data,logs,conf}
cat > /opt/mysql8/conf/custom.cnf <<'EOF'
[mysqld]
server-id = 1
datadir = /var/lib/mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
symbolic-links = 0
skip-name-resolve
lower_case_table_names = 1
max_connections = 2000
max_allowed_packet = 50M
max_connect_errors = 100000
EOF

Lancement du conteneur

docker run -d --name mysql8 \
  --restart unless-stopped \
  --privileged \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD='Admin@2024!' \
  -v /opt/mysql8/conf/custom.cnf:/etc/mysql/my.cnf \
  -v /opt/mysql8/logs:/logs \
  -v /opt/mysql8/data:/var/lib/mysql \
  mysql:8.2.0

Si un client ancien refuse la connexion, modifiez le mécanisme d'authentification de l'utilisateur root ou utilisez un client compatible MySQL 8.

Réplication maître-esclave

Sur le serveur maître, mettez à jour la configuraton :

cat > /opt/mysql8/conf/custom.cnf <<'EOF'
[mysqld]
server-id = 10
log_bin = mysql-bin
binlog_expire_logs_seconds = 604800
datadir = /var/lib/mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
symbolic-links = 0
skip-name-resolve
lower_case_table_names = 1
max_connections = 2000
max_allowed_packet = 50M
max_connect_errors = 100000
EOF

Redémarrez le conteneur, puis créez l'utilisateur dédié :

docker restart mysql8
docker exec -it mysql8 mysql -uroot -p
CREATE USER 'replica'@'%' IDENTIFIED WITH mysql_native_password BY 'Replica@2024!';
GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%';
FLUSH PRIVILEGES;
SHOW MASTER STATUS;

Sur le serveur esclave, utilisez un identifiant différent :

server-id = 20
log_bin = mysql-bin
binlog_expire_logs_seconds = 604800

Configurez la réplication :

CHANGE MASTER TO
  MASTER_HOST='192.168.1.10',
  MASTER_PORT=3306,
  MASTER_USER='replica',
  MASTER_PASSWORD='Replica@2024!',
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=157,
  MASTER_CONNECT_RETRY=30;
START SLAVE;
SHOW SLAVE STATUS\G

Les champs Slave_IO_Running et Slave_SQL_Running doivent afficher Yes. En cas de changement de fichier binaire sur le maître, arrêtez l'esclave avec STOP SLAVE, ajustez MASTER_LOG_FILE et MASTER_LOG_POS, puis relencez avec START SLAVE.

Déploiement de NginxWebUI

Exportez l'image depuis un hôte connecté :

docker pull cym1102/nginxwebui:3.7.3
docker save -o /opt/nginxwebui-3.7.3.tar cym1102/nginxwebui:3.7.3

Importez et exécutez sur le serveur isolé :

docker load -i /opt/nginxwebui-3.7.3.tar
docker run -d --name nginxui \
  --restart always \
  --net host \
  --privileged \
  -e BOOT_OPTIONS="--server.port=8081" \
  -v /opt/nginxui:/home/nginxWebUI \
  cym1102/nginxwebui:3.7.3

Si l'interface sur le port 8081 reste inaccessible, ouvrez ce port dans le pare-feu du système.

Déploiement de Redis 6

Import de l'image

docker pull redis:6.2.5
docker save -o /opt/redis-6.2.5.tar redis:6.2.5
docker load -i /opt/redis-6.2.5.tar

Configuration minimale

mkdir -p /opt/redis6/{data,conf}
cat > /opt/redis6/conf/redis.conf <<'EOF'
bind 0.0.0.0
port 6379
protected-mode no
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
pidfile /var/run/redis_6379.pid
loglevel notice
databases 16

save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /data

appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
EOF

Lancement du conteneur

docker run -d --name redis6 \
  --restart unless-stopped \
  -p 6379:6379 \
  -v /opt/redis6/conf/redis.conf:/usr/local/etc/redis/redis.conf \
  -v /opt/redis6/data:/data \
  redis:6.2.5 redis-server /usr/local/etc/redis/redis.conf

Étiquettes: Docker Docker Compose MySQL Redis NginxWebUI

Publié le 28 juin à 01h39