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