【Java】Empfohlenes Programm zum Erstellen von Docker-Images

Hintergrund

Da unser verteiltes Konzept in verschiedenen Bereichen verwendet wird, werden Docker-Container nach und nach von allen erkannt und verwendet. Wenn wir also einen Container erstellen möchten, müssen wir einen Spiegel haben. Wie erstellt man einen Spiegel? Bitte lesen Sie weiter, Dockerfile ist die ursprüngliche Waffe zum Erstellen von Bildern:
Dockerfile besteht aus zeilenweisen Befehlsanweisungen und unterstützt den Anfang von „#“ als Kommentar. Im Allgemeinen ist Dockerfile in vier Teile unterteilt: grundlegende Bildinformationen, Betreuer Informationen und Bildoperationsanweisungen und Anweisungen, die beim Start des Containers ausgeführt werden sollen.

Produktionsbedingungen

Beim Erstellen eines Spiegelbilds einer JAVA-Anwendung muss die von uns erstellte Spiegeldatei unter normalen Umständen die folgenden Anforderungen erfüllen:

Verwenden Sie die offizielle Website oder basieren Sie auf dem von der offiziellen Website bereitgestellten benutzerdefinierten Basisbild als Grundlage. Stellen Sie die
korrekte Zeit und Zeitzone des Containers ein.
Starten Sie die Anwendung im Container mit Nicht-Root-Benutzerrechten.
Geben Sie den Port des WEB an Anwendung
zum Übertragen der JVM und Java beim Start des Containers. Systemeigenschaften, benutzerdefinierte Programmparameter

Dockerfile-Anweisung:

1. FROM-
Format: FROM oder FROM:

Die erste Anweisung muss eine FROM-Anweisung sein. Wenn mehrere Images in derselben Docker-Datei erstellt werden, können mehrere FROM-Anweisungen verwendet werden (einmal für jedes Image).

2. MAINTAINET
-Format: MAINTAINET

Informationen zum designierten Betreuer

3. RUN-
Format: RUN oder RUN ["", "", ""]

Jede Anweisung wird auf Basis des aktuellen Bildes ausgeführt und als neues Bild übermittelt. (Sie können „\“ für Zeilenumbrüche verwenden)

4、CMD-
Sprache: CMD ["","",""]

Geben Sie den Befehl an, der beim Starten des Containers ausgeführt werden soll. Jede Docker-Datei kann nur einen CMD-Befehl haben. Wenn mehrere Befehle angegeben werden, wird der letzte ausgeführt. (wird durch beim Start angegebene Befehle überschrieben)

5. EXPOSE-
Format: EXPOSE […]

Weisen Sie den Docker-Server an, den Port freizugeben, und die Portzuordnung muss beim Start des Containers über -p erfolgen

6. ENV-
Format: ENV

Geben Sie die Umgebungsvariable an, die vom RUN-Befehl verwendet und gespeichert wird, wenn der Container ausgeführt wird

7. ADD-
Format: ADD

Kopieren Sie die angegebene Datei in den Container. Dies kann ein relativer Pfad des Verzeichnisses sein, in dem sich die Docker-Datei befindet; es kann eine URL oder tar.gz (automatische Dekomprimierung) sein.

8. COPY-
Format: COPY

Kopieren Sie den lokalen Host (ist der relative Pfad des Verzeichnisses, in dem sich die Docker-Datei befindet) in den Container (bei Verwendung des lokalen Verzeichnisses als Quellverzeichnis wird die Verwendung von COPY empfohlen)

9、ENTRYPOINT
格式:ENTRYPOINT ["","",""]

Konfigurieren Sie den Befehl, der nach dem Start des Containers ausgeführt werden soll und nicht durch die von Docker Run bereitgestellten Parameter überschrieben werden kann. (In jeder Docker-Datei kann es nur einen ENTRYPOINT geben. Wenn mehrere angegeben werden, wird nur der letzte wirksam.)

10. VOLUME-
Format: VOLUME ["/mnt"]

Erstellen Sie einen Bereitstellungspunkt, der vom lokalen Host oder anderen Containern bereitgestellt werden kann und im Allgemeinen zum Speichern von Datenbanken und Daten verwendet wird, die aufbewahrt werden müssen usw.

11. USER-
Format: USER-Daemon

Geben Sie beim Ausführen des Containers den Benutzernamen oder die UID an. Beim nachfolgenden Ausführen wird ebenfalls der angegebene Benutzer verwendet.

12、WORKDIR-
Format: WORKDIR /Pfad/zu/Arbeitsverzeichnis

Konfigurieren Sie das Arbeitsverzeichnis für nachfolgende RUN-, CMD- und ENTRYPOINT-Befehle. (Es können mehrere WORKDIR-Anweisungen verwendet werden. Wenn der Parameter des nachfolgenden Befehls ein relativer Pfad ist, basiert er auf dem vom vorherigen Befehl angegebenen Pfad.)

13、ONBUILD
格式:ONBUILD [ANLEITUNG]

Konfigurieren Sie die Betriebsanweisungen, die ausgeführt werden sollen, wenn das erstellte Image als Basisimage für andere neu erstellte Images verwendet wird

Übungsschritte

Verwenden Sie das von der offiziellen Website bereitgestellte Basisbild als Bildbasis

Gemäß dem hochgradig angepassten Alpine Linux + JRE8-Image von openjdk, das die Zeitzoneneinstellung des East Eighth District und die Einstellung der TTF-Zeichnungsbildschriftart
enthält .

openjdk:<version>
openjdk:<version>-slim
openjdk:<version>-apline

# 示例
FROM openjdk:8-alpine

Stellen Sie die richtige Uhrzeit und Zeitzone für den Container ein

//非 Alpine 版本
ENV TZ=Asia/Shanghai
RUN set -eux && ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime && echo ${TZ} > /etc/timezone
//Alpine 版本(不推荐,构建镜像会很慢)
ENV TZ=Asia/Shanghai
RUN set -eux && apk add --no-cache --update tzdata && ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime && echo ${TZ} > /etc/timezone && rm -rf /var/cache/apk/*

Starten Sie die Anwendung im Container mit Nicht-Root-Benutzerrechten

Produktion: docker build -t myappname . ( . Nicht vergessen)
Anzeigen: Docker-Bilder (prüfen Sie, ob es einen Spiegel myappname gibt)
Ausführen: docker run -it myappname

非 Alpine 版本
RUN set -eux && addgroup --gid 1000 userName && adduser --system --uid 1000 --gid 1000 --home=opt/java/ --shell=/bin/sh --disabled-password userName
# 采用此用户进行操作
USER userName

Alpine 版本
RUN set -eux && addgroup --gid 1000 userName && adduser -S -u 1000 -g userName -h /opt/java/ -s /bin/sh -D userName
# 采用此用户进行操作
USER userName


//指定 WEB 应用程序的端口
# Dockerfile 中指定暴露的端口
EXPOSE 8080

//启动容器过程中能够传递 JVM、Java System Properties、程序自定义参数
# 在项目启动过程中新增参数
docker run -p 8080:8080 -e JAVA_OPTS='-Xmx128M -Xms128M -Dabc=xyz -Ddef=aaa' 镜像名称/镜像ID

DockerFile-Beispiel

# From 基础镜像
FROM ramboyang/openjdk-alpine:jre-8u212-timezone

# 工作目录[可选] 
WORKDIR /home/xx

# 定义镜像创建者[可选] 
LABEL maintainer=[email protected]

# 前端界面路径[可选] 
# RUN mkdir -p /opt/java/front/spring-boot-sample-web

# 后端程序路径
WORKDIR /opt/java/spring-boot-sample

COPY ./*.jar ./spring-boot-sample.jar

COPY ./libsigar-amd64-linux.so /usr/lib/

# 设置环境或者编码utf8[可选]
#jdk enviroment
ENV JAVA_HOME=/usr/java/jdk1.8.0_231
ENV JRE_HOME=/usr/java/jdk1.8.0_231/jre
ENV CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib
ENV PATH=$JAVA_HOME/bin:$PATH

# 设置端口
EXPOSE 8888

# 设置容器中用户组和用户[可选]
RUN set -eux && addgroup --gid 1000 Rambo && adduser -S -u 1000 -g Rambo -h /opt/java/ -s /bin/sh -D Rambo

# 采用此用户进行操作怕[可选]
USER Rambo
ENTRYPOINT ["java", "-jar", "./spring-boot-sample.jar"]

# 执行命令
CMD ["java", "-jar", "/xxx/xxx.jar"]
或者
CMD ["/data/xxx.sh"]

Der Unterschied zwischen COPY und ADD

Bei Dateien kann COPY
die Dateien direkt in das Image kopieren.
Bei Verzeichnissen kopiert dieser Befehl nur den Inhalt des Verzeichnisses, ohne das Verzeichnis selbst einzuschließen. Der Befehl COPY nickdir .
ADD
ADD kann Dateien dekomprimieren und relativ zum Befehl COPY zum Image hinzufügen. Gleichzeitig ADD nickdir.tar.gz .
kann ADD auch Dateien von der URL auf den Spiegel kopieren, der Beamte empfiehlt diese Verwendung jedoch nicht. Der Beamte schlägt vor, dass es am besten ist, die Befehle curl oder wget zu verwenden, wenn wir Dateien von einem Remote-Standort kopieren müssen anstelle des ADD-Befehls. Der Grund dafür ist, dass bei Verwendung des ADD-Befehls mehr Spiegelebenen erstellt werden und die Spiegelgröße natürlich größer wird

ADD http://example.com/big.tar.xz /usr/src/things/
RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things
RUN make -C /usr/src/things all

Wenn Sie den folgenden Befehl verwenden, wird nicht nur die Anzahl der Ebenen des Bildes reduziert, sondern auch die Datei big.tar.xz wird nicht in das Bild eingefügt. Der Code lautet wie folgt:

RUN mkdir -p /usr/src/things \
    && curl -SL http://example.com/big.tar.xz \
    | tar -xJC /usr/src/things \
    && make -C /usr/src/things all

Daher ist die offizielle Empfehlung des ADD-Befehls nur erforderlich, wenn Dateien dekomprimiert und zum Image hinzugefügt werden.

Gib eine Kastanie

Ich denke, wie kann man ein JAR-Paket einer Java-Anwendung in ein Spiegelbild umwandeln?
Der spezifische Prozess ist wie folgt:
1. Legen Sie zunächst Ihr JAR-Paket und die Docker-Datei, die Sie verpacken möchten, im selben Verzeichnis ab:
Fügen Sie hier eine Bildbeschreibung ein
Schreiben Sie dockerFile

# Dockerfile for springcloud-eurekaService
# 1. Copy springcloud-eurekaService.jar to current directory
# 2. Build with: docker build -t springcloudeurekaservice .
# 3. Run with: docker run -d -p 8761:8761 -v D:/data/logs:/data1/logs -ti springcloudeurekaservice:latest

FROM openjdk:8-jdk-alpine

MAINTAINER XXXXX <[email protected]>

ADD springcloud-eurekaService.jar /gitvpro/

EXPOSE 8761

ENTRYPOINT ["java","-jar","/gitvpro/springcloud-eurekaService.jar"]

3. Führen Sie nun die Docker-Datei aus, um das Image zu generieren: (im aktuellen Verzeichnis ausführen)
docker build -t springcloudurekaservice.
Hinweis: springcloudurekaservice ist der Name des von Ihnen generierten Images.
4. Im Folgenden wird das Image zum Erstellen des Containers verwendet :

docker run -d -p 8761:8761 -v D:/data/logs:/data1/logs -ti springcloudeurekaservice:latest
// 想查看容器是否在运行 用下面的命令查看全部的容器:
docker ps -a 

Guess you like

Origin blog.csdn.net/weixin_43469680/article/details/119242786