Dies ist ein Memo, wenn eine Webanwendung, die MySQL und Redis verwendet, in Java entwickelt und ausgeführt wird (unter Verwendung von Spring Boot als Framework) und eine Umgebung mit Docker CE für Windows erstellt wird. MySQL und Redis sind Container, die das offizielle Image verwenden, und mit Spring Boot entwickelte Webanwendungen installieren und führen das OpenJDK in dem Container aus, der das offizielle Image von CentOS 7 verwendet.
Den Quellcode finden Sie unter rubytomato / docker-demo-redis.
Umgebung
Da Docker-Compose zum Verwalten und Ausführen des Containers verwendet wird, wird Docker-Compose.yml im Stammverzeichnis des Projekts abgelegt. Informationen zu jedem Container werden für jedes Unterverzeichnis getrennt.
Unter project-root befinden sich ungefähr vier Unterverzeichnisse. Das Unterverzeichnis demo-redis-spring ist das Projektverzeichnis für Webanwendungen, die auf dem App-Server anstelle von Containern ausgeführt werden.
sub directory | description |
---|---|
app-server | Ein Verzeichnis, in dem die Docker-Datei und die zugehörigen Dateien des Containers gespeichert sind, in dem die Webanwendung ausgeführt wird. |
mysql-server | mysql-Ein Verzeichnis, in dem die Docker-Datei und die zugehörigen Dateien des Containers gespeichert sind, auf dem der Server ausgeführt wird. |
redis-server | redis-Ein Verzeichnis, in dem die Docker-Datei und die zugehörigen Dateien des Containers gespeichert sind, auf dem der Server ausgeführt wird. |
demo-redis-spring | Dies ist das Projektverzeichnis der Webanwendung, die Spring Boot verwendet. |
** Verzeichnisaufbau **
/project-root
|
+--- docker-compose.yml
+--- README.md
|
+--- /demo-redis-spring
| |
| +--- pom.xml
| |
| +--- /src
| | |
| | +--- /main
| | +--- /test
| |
| +--- /target
| |
| +--- demo.jar
|
+--- /app-server
| |
| +--- Dockerfile
| |
| +--- start.sh
|
+--- /mysql-server
| |
| +--- Dockerfile
| |
| +--- /conf
| | |
| | +--- mysqld.cnf
| |
| +--- /sql
| |
| +--- 1_schema.sql
| +--- 2_init_memo_data.sql
|
+--- /redis-server
|
+--- Dockerfile
|
+--- /conf
|
+--- redis.conf
Das Bild verwendet das offizielle MySQL.
Dockerfile
FROM mysql:8.0.12
COPY ./conf/mysqld.cnf /etc/mysql/conf.d
COPY ./sql/1_schema.sql /docker-entrypoint-initdb.d
COPY ./sql/2_init_memo_data.sql /docker-entrypoint-initdb.d
Configuration
Der Inhalt von /conf/mysqld.cnf lautet wie folgt. Wenn Sie diese Datei im Container nach /etc/mysql/conf.d kopieren, wird sie beim Start von MySQL gelesen und wiedergegeben.
[mysqld]
character_set_server = utf8mb4
collation_server = utf8mb4_general_ci
log_output = FILE
general_log = 1
log_queries_not_using_indexes = 1
log_slow_admin_statements = 1
log_syslog = 0
log_timestamps = SYSTEM
long_query_time = 3
slow_query_log = 1
general_log_file = general_query_all.log
log_error = error.log
slow_query_log_file = slow_query.log
log_bin_trust_function_creators = 1
[mysql]
show-warnings
prompt = "\u@\h [\d] > "
SQL Script
Wenn Sie das SQL-Skript in die Datei /docker-entrypoint-initdb.d des Containers kopieren, wird es ausgeführt, wenn die Datenbank initialisiert wird.
1_schema.sql
CREATE DATABASE sample_db DEFAULT CHARACTER SET = utf8mb4;
CREATE USER 'test_user'@'%' IDENTIFIED BY 'test_user' PASSWORD EXPIRE NEVER;
GRANT ALL ON sample_db.* TO 'test_user'@'%';
USE sample_db;
CREATE TABLE IF NOT EXISTS memo (
id BIGINT AUTO_INCREMENT,
title VARCHAR(255) NOT NULL,
description TEXT NOT NULL,
done BOOLEAN DEFAULT FALSE NOT NULL,
updated TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3) NOT NULL,
PRIMARY KEY (id)
)
CHARACTER SET = utf8mb4,
COLLATE utf8mb4_general_ci;
2_init_memo_data.sql
USE sample_db;
START TRANSACTION;
INSERT INTO memo (title, description, done, updated) VALUES ('title A', 'description A', false, '2018-08-01');
INSERT INTO memo (title, description, done, updated) VALUES ('title B', 'description B', false, '2018-08-02');
COMMIT;
Das Bild verwendet den Beamten von Redis.
Übrigens war beim Erstellen des Redis-Servers unter Windows die Build-Datei von Microsoft Archive / redis bis Redis 3.0 verfügbar, es werden jedoch 4.0 und höher bereitgestellt. Da es so etwas nicht gibt, verwenden Sie tatsächlich eine virtuelle Umgebung wie Docker.
Dockerfile
FROM redis:4.0.11
COPY ./conf/redis.conf /usr/local/etc/redis/redis.conf
RUN set -x && \
touch /var/log/redis.log && \
chown redis:root /var/log/redis.log && \
chmod 664 /var/log/redis.log
CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]
Configuration
/conf/redis.conf ist https://raw.githubusercontent.com/antirez/redis/4.0/redis.conf Die folgenden Teile wurden basierend auf geändert. Kopieren Sie diese Datei in /usr/local/etc/redis/redis.conf im Container und geben Sie sie beim Starten von redis-server als Argument an.
** Vor dem Wechsel **
bind 127.0.0.1
logfile ""
# maxclients 10000
# requirepass foobared
appendonly no
** Änderungen **
# bind 127.0.0.1
logfile /var/log/redis.log
maxclients 100
requirepass foobared
appendonly yes
logfile
In diesem Beispiel wird das Protokoll so geändert, dass es im Container in /var/log/redis.log ausgegeben wird. Wenn die Einstellung für die Protokolldatei jedoch auf den Standardwert festgelegt ist, wird sie in die Standardausgabe (stdout) ausgegeben. Sie können die Protokollausgabe auf die Standardausgabe mit Docker-Compose-Protokollen überprüfen.
> docker-compose logs -f redis-server
Verwenden Sie den redis-cli-Monitor, wenn Sie Befehle überwachen möchten, die von anderen Clients ausgeführt werden.
> docker-compose exec redis-server redis-cli
127.0.0.1:6379> auth foobared
OK
127.0.0.1:6379> monitor
OK
requirepass
Wenn Sie bind auskommentieren, müssen Sie sich bei auth authentifizieren, bevor Sie den Befehl redis ausführen. Stellen Sie das von auth zu diesem Zeitpunkt angegebene Passwort mit requireepass ein.
Auf dem Anwendungsserver wird die mit Spring Boot entwickelte Webanwendung ausgeführt. Das verwendete Image ist nicht das offizielle Image von OpenJDK, sondern das offizielle Image von CentOS7, und ich habe OpenJDK 1.8 mit yum installiert.
Dockerfile
Ich ändere das Gebietsschema und füge einen Benutzer namens app als Ausführungsbenutzer der Webanwendung hinzu.
FROM centos:7
RUN set -x && \
yum update -y && \
yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel && \
yum reinstall -y glibc-common && \
yum -y clean all
ENV JAVA_HOME /usr/lib/jvm/java-1.8.0-openjdk
# locale settings
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
RUN set -x && \
localedef -i ja_JP -c -f UTF-8 ja_JP.UTF-8 && \
unlink /etc/localtime && \
ln -s /usr/share/zoneinfo/Japan /etc/localtime
# application user settings
ENV HOME /home/app
RUN set -x && \
groupadd app && \
useradd -g app -d /home/app -s /bin/bash app
WORKDIR $HOME
USER app
COPY start.sh .
EXPOSE 9000
start.sh
Eine Shell zum einfachen Ausführen von Webanwendungen. Das / var / target des Containers ist das Verzeichnis, in dem Sie / project-root / demo-redis-spring / target unter Windows bereitgestellt haben. Dieser Mount ist in docker-compose.yml geschrieben.
#!/bin/bash
set -x
java -Xmx512m -Xms512m -XX:MaxMetaspaceSize=256m -verbose:gc -Xloggc:app-gc.log -jar /var/target/demo.jar
In diesem Artikel werden der Zeitpunkt des Startens des App-Server-Containers und die Ausführung der in diesem Container ausgeführten Webanwendung getrennt. Die Webanwendung wird jedoch zusammen mit dem Start des App-Server-Containers in der folgenden Zeile am Ende der Docker-Datei ausgeführt Hinzufügen.
CMD [ "./start.sh" ]
Sie können die Webanwendungsprotokolle mit dem Befehl docker-compose logs überprüfen.
> docker-compose logs -f --tail=all app-server
Attaching to app-server
app-server | + java -Xmx512m -Xms512m -XX:MaxMetaspaceSize=256m -verbose:gc -Xloggc:app-gc.log -jar /var/target/demo.jar
app-server |
app-server | . ____ _ __ _ _
app-server | /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
app-server | ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
app-server | \\/ ___)| |_)| | | | | || (_| | ) ) ) )
app-server | ' |____| .__|_| |_|_| |_\__, | / / / /
app-server | =========|_|==============|___/=/_/_/_/
app-server | :: Spring Boot :: (v2.0.4.RELEASE)
// ...Kürzung...
docker-compose.yml
version: "3.6"
services:
mysql-server:
container_name: mysql-server
build:
context: ./mysql-server
volumes:
- mysql-data:/var/lib/mysql
environment:
TZ: Asia/Tokyo
MYSQL_ROOT_PASSWORD: password
ports:
- 3306:3306
networks:
- redis-network
restart: always
tty: true
redis-server:
container_name: redis-server
build:
context: ./redis-server
environment:
TZ: Asia/Tokyo
volumes:
- redis-data:/data
ports:
- 6379:6379
networks:
- redis-network
restart: always
tty: true
app-server:
build:
context: ./app-server
environment:
TZ: Asia/Tokyo
SPRING_PROFILES_ACTIVE: docker
volumes:
- ./demo-redis-spring/target:/var/target
depends_on:
- mysql-server
- redis-server
ports:
- 9000:9000
networks:
- redis-network
restart: always
stdin_open: true
tty: true
networks:
redis-network:
driver: bridge
volumes:
mysql-data:
driver: local
redis-data:
driver: local
Wenn Sie eine Spring Boot-Anwendung im App-Server-Container ausführen, legen Sie eine Umgebungsvariable mit dem Namen SPRING_PROFILES_ACTIVE fest, um ein Profil mit dem Namen Docker anzugeben.
app-server:
environment:
SPRING_PROFILES_ACTIVE: docker
Schaltet das Verbindungsziel von MySQL-Server und Redis-Server in den Container mit dem angegebenen Profil um. Das Folgende ist ein Auszug aus dem relevanten Teil der Spring Boot-Konfigurationsdatei. Im Docker-Profil werden die Hostnamen des MySQL-Servers und des Redis-Servers als Hostnamen der Container verwendet.
application.yml
spring:
profiles:
active: dev
datasource:
url: jdbc:mysql://localhost:3306/sample_db?useSSL=false&allowPublicKeyRetrieval=true
username: test_user
password: test_user
redis:
host: localhost
port: 6379
ssl: false
database: 0
password: foobared
server:
port: 9001
---
spring:
profiles: docker
datasource:
url: jdbc:mysql://mysql-server:3306/sample_db?useSSL=false&allowPublicKeyRetrieval=true
redis:
host: redis-server
server:
port: 9000
Die MySQL-Server- und Redis-Server-Container-Ports sind wie unten gezeigt nach außen ausgerichtet, sodass auf den MySQL-Server und den Redis-Server des Containers zugegriffen werden kann, wenn eine Webanwendung unter Windows ausgeführt wird. ..
mysql-server
ports:
- 3306:3306
redis-server
ports:
- 6379:6379
** Bauen **
> docker-compose build
Wenn Sie den Cache nicht verwenden
> docker-compose build --no-cache
Anlaufen
Das Volume wird beim ersten Start erstellt.
> docker-compose up -d
Creating network "docker-demo-redis_redis-network" with driver "bridge"
Creating volume "docker-demo-redis_mysql-data" with local driver
Creating volume "docker-demo-redis_redis-data" with local driver
Creating mysql-server ... done
Creating redis-server ... done
Creating app-server ... done
Ab dem nächsten Mal wird die Volume-Erstellung übersprungen.
> docker-compose up -d
Creating network "docker-demo-redis_redis-network" with driver "bridge"
Creating mysql-server ... done
Creating redis-server ... done
Creating app-server ... done
** Neustart **
> docker-compose restart
Restarting app-server ... done
Restarting redis-server ... done
Restarting mysql-server ... done
Halt
> docker-compose down
Stopping app-server ... done
Stopping mysql-server ... done
Stopping redis-server ... done
Removing app-server ... done
Removing mysql-server ... done
Removing redis-server ... done
Removing network docker-demo-redis_redis-network
Um die von Spring Boot entwickelte Webanwendung auf dem App-Server-Container auszuführen, hängen Sie das Zielverzeichnis an, in dem die erstellte JAR-Datei in / var / target des App-Server-Containers ausgegeben wird.
app-server:
volumes:
- ./demo-redis-spring/target:/var/target
Um eine Webanwendung auszuführen, geben Sie den App-Server-Container mit dem Befehl exec ein und führen Sie start.sh aus, das in den Container kopiert wurde.
> docker-compose exec app-server bash --login
[app@72e38b38c6ca ~]$ ./start.sh
+ java -Xmx512m -Xms512m -XX:MaxMetaspaceSize=256m -verbose:gc -Xloggc:app-gc.log -jar /var/target/demo.jar
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.0.4.RELEASE)
2018-08-08 22:09:10.248 INFO 46 --- [ main] com.example.demo.Application : Starting Application v0.0.1-SNAPSHOT on 72e38b38c6ca with PID 46 (/var/target/demo.jar started by app in /home/app)
2018-08-08 22:09:10.253 DEBUG 46 --- [ main] com.example.demo.Application : Running with Spring Boot v2.0.4.RELEASE, Spring v5.0.8.RELEASE
2018-08-08 22:09:10.256 INFO 46 --- [ main] com.example.demo.Application : The following profiles are active: docker
// ...Unten weggelassen...
Da Port 9000 des App-Server-Containers nach außen zeigt, greifen Sie über den Browser auf "http: // localhost: 9000 /" zu und bestätigen Sie, dass die Seite angezeigt wird.
Verwenden Sie das benannte Volume.
volumes:
mysql-data:
driver: local
redis-data:
driver: local
Wenn Sie die Daten initialisieren möchten, löschen Sie sie mit dem Docker-Volume-Befehl.
** Volumen prüfen **
> docker volume ls
DRIVER VOLUME NAME
local docker-demo-redis_mysql-data
local docker-demo-redis_redis-data
** Volume löschen **
> docker volume rm docker-demo-redis_redis-data
docker-demo-redis_redis-data
Wenn Sie es löschen, wird es beim nächsten Start automatisch erstellt.
> docker-compose up -d
Creating network "docker-demo-redis_redis-network" with driver "bridge"
Creating volume "docker-demo-redis_redis-data" with local driver
Creating mysql-server ... done
Creating redis-server ... done
Creating app-server ... done
Wenn Sie eine Verbindung zum MySQL-Server herstellen und arbeiten möchten, stellen Sie eine Verbindung mit dem Befehl mysql aus dem Container mysql-server her.
> docker-compose exec mysql-server mysql -u test_user -p --database=sample_db
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.12 MySQL Community Server - GPL
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
test_user@localhost [sample_db] >
Wenn Sie eine Verbindung zum Redis-Server herstellen und arbeiten möchten, stellen Sie eine Verbindung mit dem Befehl redis-cli aus dem Redis-Server-Container her.
> docker-compose exec redis-server redis-cli
127.0.0.1:6379> auth foobared
OK
127.0.0.1:6379> keys *
(empty list or set)
Dies ist eine Methode zum Starten einer beliebigen Anzahl von Anwendungsservern wie angegeben.
Stellen Sie die Anschlüsse auf die Seite, die die Anschlüsse nach außen freigibt, wie unten gezeigt. In diesem Beispiel möchten wir die maximale Anzahl von Scale-Outs auf 2 festlegen. Daher haben wir einen Portbereich von 9000.9001 angegeben.
app-server:
ports:
# - 9000:9000
- 9000-9001:9000
Wenn Sie aktiv sind, geben Sie mit "--scale app-server = num" die Anzahl der App-Server an, die in num gestartet werden sollen.
> docker-compose up -d --scale app-server=2
Creating network "docker-demo-redis_redis-network" with driver "bridge"
Creating mysql-server ... done
Creating redis-server ... done
WARNING: The "app-server" service specifies a port on the host. If multiple containers for this service are created on a single host, the port will clash.
Creating docker-demo-redis_app-server_1 ... done
Creating docker-demo-redis_app-server_2 ... done
Um einen beliebigen Befehl im App-Server-Container auszuführen, verwenden Sie "--index = num" und geben Sie an, in welchem Container mit num ausgeführt werden soll.
> docker-compose exec --index=1 app-server bash --login
Die Java-Anwendung in diesem Artikel ist so konzipiert, dass zwei Verbindungen von einer Instanz gleichzeitig hergestellt werden. Aus den Ergebnissen der folgenden Show-Prozessliste können Sie ersehen, dass ID # 8 und # 9 von 172.22.0.4 und Id # 10 und # 11 von 172.22.0.5 verbunden sind.
> show processlist;
+----+-----------------+------------------+-----------+---------+------+------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-----------------+------------------+-----------+---------+------+------------------------+------------------+
| 4 | event_scheduler | localhost | NULL | Daemon | 843 | Waiting on empty queue | NULL |
| 8 | test_user | 172.22.0.4:48354 | sample_db | Sleep | 674 | | NULL |
| 9 | test_user | 172.22.0.4:48356 | sample_db | Sleep | 676 | | NULL |
| 10 | test_user | 172.22.0.5:40842 | sample_db | Sleep | 263 | | NULL |
| 11 | test_user | 172.22.0.5:40844 | sample_db | Sleep | 265 | | NULL |
| 13 | root | localhost | NULL | Query | 0 | starting | show processlist |
+----+-----------------+------------------+-----------+---------+------+------------------------+------------------+
6 rows in set (0.00 sec)
Sie können sehen, dass die Client-ID Nr. 3 von 172.22.0.4 und die ID Nr. 4 von 172.22.0.5 verbunden ist.
127.0.0.1:6379> client list
id=3 addr=172.22.0.4:37174 fd=9 name= age=1621 idle=1621 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=get
id=4 addr=172.22.0.5:44918 fd=10 name= age=1051 idle=1051 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=get
id=5 addr=127.0.0.1:41110 fd=11 name= age=79 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client
docker-compose scale
Docker-Compose-Skala
ist veraltet. Verwenden Sie stattdessen das Flag --scale mit dem Befehl up.
This command is deprecated. Use the up command with the --scale flag instead. Beware that using up with --scale flag has some subtle differences with the scale command as it incorporates the behaviour of up command.
Führen Sie zuerst nur einen App-Server aus.
> docker-compose up -d
Creating network "docker-demo-redis_redis-network" with driver "bridge"
Creating mysql-server ... done
Creating redis-server ... done
Creating docker-demo-redis_app-server_1 ... done
Skalieren Sie Container auf die angegebene Anzahl
> docker-compose up -d --scale app-server=2
redis-server is up-to-date
mysql-server is up-to-date
WARNING: The "app-server" service specifies a port on the host. If multiple containers for this service are created on a single host, the port will clash.
Starting docker-demo-redis_app-server_1 ... done
Creating docker-demo-redis_app-server_2 ... done
Reduzieren Sie die Container auf die angegebene Anzahl
> docker-compose up -d --scale app-server=1
redis-server is up-to-date
mysql-server is up-to-date
Stopping and removing docker-demo-redis_app-server_2 ... done
Starting docker-demo-redis_app-server_1 ... done