Docker鏡像拉取、制作與上傳的完整指南
在現(xiàn)代軟件開發(fā)和部署中,容器化技術(shù)已經(jīng)成為不可或缺的一部分。Docker 作為最流行的容器平臺(tái),其核心概念之一就是“鏡像”。本文將帶你深入理解 Docker 鏡像的本質(zhì),掌握在 Linux 環(huán)境下如何拉取、制作并上傳 Docker 鏡像,并結(jié)合 Java 應(yīng)用場景給出實(shí)用示例。
什么是 Docker 鏡像?
Docker 鏡像是一個(gè)輕量級(jí)、獨(dú)立的、可執(zhí)行的軟件包,它包含了運(yùn)行某個(gè)軟件所需的一切:代碼、運(yùn)行時(shí)環(huán)境、系統(tǒng)工具、系統(tǒng)庫和配置文件。鏡像采用分層結(jié)構(gòu),每一層都是只讀的,當(dāng)容器啟動(dòng)時(shí),會(huì)在鏡像之上添加一個(gè)可寫層(容器層)。
你可以把 Docker 鏡像想象成一個(gè)“應(yīng)用快照”,無論部署到哪臺(tái)機(jī)器上,只要支持 Docker,就能保證一致的運(yùn)行環(huán)境。
# 查看本地已有的鏡像 docker images
輸出示例:
REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest abc123def456 2 weeks ago 142MB hello-world latest def789ghi012 3 months ago 13.3kB
第一部分:拉取 Docker 鏡像
基礎(chǔ)命令:docker pull
最簡單的拉取方式是使用 docker pull 命令:
docker pull nginx:latest
這會(huì)從 Docker Hub(默認(rèn)注冊(cè)中心)拉取最新版的 Nginx 鏡像。
你也可以指定特定版本:
docker pull openjdk:17-jdk-slim
這個(gè)命令會(huì)拉取 OpenJDK 17 的精簡版鏡像,非常適合運(yùn)行 Java 應(yīng)用。
拉取私有倉庫或第三方鏡像
如果你使用的是阿里云、騰訊云等國內(nèi)鏡像加速服務(wù),或者公司內(nèi)部私有倉庫,可以這樣拉?。?/p>
docker pull registry.cn-hangzhou.aliyuncs.com/library/nginx:1.21
或者登錄后拉取私有鏡像:
docker login myregistry.example.com docker pull myregistry.example.com/myapp:1.0.0
加速鏡像拉取 —— 配置鏡像加速器
在國內(nèi),直接訪問 Docker Hub 可能較慢。推薦配置鏡像加速器。
編輯 /etc/docker/daemon.json(若不存在則新建):
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
重啟 Docker 服務(wù):
sudo systemctl daemon-reload sudo systemctl restart docker
驗(yàn)證是否生效:
docker info | grep -A 3 "Registry Mirrors"
實(shí)戰(zhàn):拉取 Java 運(yùn)行環(huán)境鏡像
我們來拉取一個(gè)適合運(yùn)行 Spring Boot 應(yīng)用的鏡像:
docker pull eclipse-temurin:17-jre-alpine
這個(gè)鏡像是基于 Alpine Linux 的輕量級(jí) JRE 17 鏡像,體積小,安全補(bǔ)丁更新及時(shí),是生產(chǎn)環(huán)境的理想選擇。
第二部分:制作 Docker 鏡像
制作鏡像的核心是編寫 Dockerfile —— 一個(gè)定義鏡像構(gòu)建步驟的文本文件。
編寫你的第一個(gè) Dockerfile
假設(shè)我們有一個(gè)簡單的 Java 控制臺(tái)程序:
// HelloWorld.java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, Dockerized Java World! ??");
System.out.println("Current time: " + java.time.LocalDateTime.now());
}
}
編譯它:
javac HelloWorld.java
現(xiàn)在創(chuàng)建 Dockerfile:
# 使用官方 OpenJDK 17 JRE 鏡像作為基礎(chǔ)鏡像 FROM eclipse-temurin:17-jre-alpine # 設(shè)置工作目錄 WORKDIR /app # 將編譯好的 class 文件復(fù)制進(jìn)鏡像 COPY HelloWorld.class . # 設(shè)置容器啟動(dòng)時(shí)執(zhí)行的命令 CMD ["java", "HelloWorld"]
構(gòu)建鏡像
在包含 Dockerfile 和 HelloWorld.class 的目錄下執(zhí)行:
docker build -t my-java-app:1.0 .
參數(shù)說明:
-t:指定鏡像名稱和標(biāo)簽.:表示當(dāng)前目錄為構(gòu)建上下文(context)
構(gòu)建成功后,查看鏡像:
docker images | grep my-java-app
運(yùn)行你的鏡像
docker run --rm my-java-app:1.0
你應(yīng)該看到輸出:
Hello, Dockerized Java World! ?? Current time: 2025-04-05T10:30:45.123
成功!你已經(jīng)制作并運(yùn)行了第一個(gè) Java Docker 鏡像!
深入 Dockerfile —— 更復(fù)雜的 Java 應(yīng)用
現(xiàn)實(shí)中的 Java 應(yīng)用通常是打包成 .jar 文件的 Spring Boot 項(xiàng)目。我們來看看如何為這類應(yīng)用構(gòu)建鏡像。
項(xiàng)目結(jié)構(gòu)示例
my-spring-app/ ├── src/ │ └── main/ │ └── java/ │ └── com/example/DemoApplication.java ├── pom.xml └── Dockerfile
DemoApplication.java 示例:
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@GetMapping("/hello")
public String hello() {
return "Hello from Dockerized Spring Boot! ??";
}
}
使用 Maven 打包:
mvn clean package
生成 target/demo-app.jar
編寫優(yōu)化版 Dockerfile
# 第一階段:構(gòu)建階段
FROM maven:3.8.6-eclipse-temurin-17 AS builder
WORKDIR /app
# 復(fù)制 pom.xml 并下載依賴(利用緩存)
COPY pom.xml .
RUN mvn dependency:go-offline -B
# 復(fù)制源碼并打包
COPY src ./src
RUN mvn package -DskipTests
# 第二階段:運(yùn)行階段
FROM eclipse-temurin:17-jre-alpine
# 安裝時(shí)區(qū)數(shù)據(jù)(可選但推薦)
RUN apk add --no-cache tzdata
# 創(chuàng)建非 root 用戶提高安全性
RUN addgroup -g 1001 -S appgroup && \
adduser -u 1001 -S appuser -G appgroup
WORKDIR /app
# 從構(gòu)建階段復(fù)制 jar 包
COPY --from=builder /app/target/demo-app*.jar app.jar
# 更改文件所有者
RUN chown appuser:appgroup app.jar
# 切換到非 root 用戶
USER appuser
# 暴露端口
EXPOSE 8080
# 啟動(dòng)應(yīng)用
ENTRYPOINT ["java", "-jar", "app.jar"]
多階段構(gòu)建的優(yōu)勢
上述 Dockerfile 使用了多階段構(gòu)建(multi-stage build),好處包括:
- 最終鏡像不包含 Maven、源碼等構(gòu)建工具,體積更小
- 安全性更高(沒有多余工具可被攻擊者利用)
- 構(gòu)建層緩存更高效(pom.xml 不變則跳過依賴下載)
鏡像大小對(duì)比圖表
渲染錯(cuò)誤: Mermaid 渲染失敗: Parsing failed: Lexer error on line 3, column 5: unexpected character: ->“<- at offset: 30, skipped 11 characters. Lexer error on line 3, column 17: unexpected character: ->:<- at offset: 42, skipped 1 characters. Lexer error on line 4, column 5: unexpected character: ->“<- at offset: 52, skipped 9 characters. Lexer error on line 4, column 15: unexpected character: ->:<- at offset: 62, skipped 1 characters. Lexer error on line 5, column 5: unexpected character: ->“<- at offset: 72, skipped 11 characters. Lexer error on line 5, column 17: unexpected character: ->:<- at offset: 84, skipped 1 characters. Parse error on line 3, column 19: Expecting token of type 'EOF' but found `580`. Parse error on line 4, column 17: Expecting token of type 'EOF' but found `190`. Parse error on line 5, column 19: Expecting token of type 'EOF' but found `165`.
可以看到,通過多階段構(gòu)建和使用 Alpine 基礎(chǔ)鏡像,體積減少了約 70%!
構(gòu)建并測試 Spring Boot 鏡像
# 構(gòu)建鏡像 docker build -t spring-demo:1.0 . # 運(yùn)行容器,映射端口 docker run -d -p 8080:8080 --name myapp spring-demo:1.0 # 查看日志 docker logs -f myapp # 測試接口 curl http://localhost:8080/hello
預(yù)期輸出:
Hello from Dockerized Spring Boot! ??
清理無用鏡像和容器
構(gòu)建過程中會(huì)產(chǎn)生中間鏡像,定期清理很有必要:
# 刪除停止的容器 docker container prune # 刪除未被使用的鏡像 docker image prune -a # 刪除所有未使用的資源(謹(jǐn)慎?。? docker system prune -a
第三部分:上傳 Docker 鏡像
制作好的鏡像,通常需要推送到遠(yuǎn)程倉庫,便于團(tuán)隊(duì)共享或部署到生產(chǎn)環(huán)境。
登錄 Docker Hub 或私有倉庫
docker login
輸入你的用戶名和密碼(或訪問令牌)。如果是私有倉庫:
docker login myregistry.corp.com
標(biāo)記鏡像
推送前,必須給鏡像打上符合目標(biāo)倉庫格式的標(biāo)簽:
# 格式:[倉庫地址/]用戶名/鏡像名:標(biāo)簽 docker tag spring-demo:1.0 yourusername/spring-demo:1.0 # 如果是私有倉庫: docker tag spring-demo:1.0 myregistry.corp.com/yourteam/spring-demo:1.0
推送鏡像
docker push yourusername/spring-demo:1.0
推送成功后,其他人就可以通過 docker pull yourusername/spring-demo:1.0 拉取使用了!
安全最佳實(shí)踐
使用非 root 用戶
前面的 Dockerfile 中我們創(chuàng)建了 appuser,這是非常推薦的做法:
RUN adduser -u 1001 -S appuser USER appuser
避免容器內(nèi)以 root 身份運(yùn)行應(yīng)用,降低安全風(fēng)險(xiǎn)。
固定基礎(chǔ)鏡像版本
不要使用 latest 標(biāo)簽:
# ? 不推薦 FROM eclipse-temurin:latest # ? 推薦 FROM eclipse-temurin:17.0.8_7-jre-alpine
這樣可以確保構(gòu)建的可重復(fù)性和穩(wěn)定性。
掃描鏡像漏洞
可以使用 docker scan(需安裝 Docker Desktop 或 Snyk CLI):
docker scan yourusername/spring-demo:1.0
或者使用開源工具 Trivy:
trivy image yourusername/spring-demo:1.0
使用 BuildKit 提升構(gòu)建體驗(yàn)
BuildKit 是 Docker 的新一代構(gòu)建引擎,支持并行構(gòu)建、更好的緩存、更清晰的輸出等。
啟用方式:
export DOCKER_BUILDKIT=1 docker build -t myapp .
或者在 /etc/docker/daemon.json 中全局啟用:
{
"features": {
"buildkit": true
}
}實(shí)戰(zhàn)案例:自動(dòng)化構(gòu)建腳本
創(chuàng)建一個(gè) build.sh 腳本來自動(dòng)化整個(gè)流程:
#!/bin/bash
set -e # 遇錯(cuò)即停
APP_NAME="spring-demo"
VERSION="1.0.0"
IMAGE_TAG="$APP_NAME:$VERSION"
REGISTRY_USER="your_dockerhub_username"
echo "?? 正在打包 Maven 項(xiàng)目..."
./mvnw clean package -DskipTests
echo "??? 正在構(gòu)建 Docker 鏡像..."
DOCKER_BUILDKIT=1 docker build -t $IMAGE_TAG .
echo "?? 正在本地測試鏡像..."
CONTAINER_ID=$(docker run -d -p 8080:8080 $IMAGE_TAG)
sleep 10 # 等待應(yīng)用啟動(dòng)
if curl -s http://localhost:8080/actuator/health | grep -q "UP"; then
echo "? 應(yīng)用健康檢查通過"
else
echo "? 應(yīng)用啟動(dòng)失敗"
docker logs $CONTAINER_ID
docker stop $CONTAINER_ID
exit 1
fi
docker stop $CONTAINER_ID
echo "??? 正在標(biāo)記鏡像..."
docker tag $IMAGE_TAG $REGISTRY_USER/$IMAGE_TAG
echo "?? 正在登錄 Docker Hub..."
echo "$DOCKER_PASSWORD" | docker login -u "$REGISTRY_USER" --password-stdin
echo "?? 正在推送鏡像..."
docker push $REGISTRY_USER/$IMAGE_TAG
echo "?? 鏡像發(fā)布完成!"
提示:敏感信息如密碼應(yīng)使用環(huán)境變量或密鑰管理工具,不要硬編碼在腳本中。
使用 .dockerignore 優(yōu)化構(gòu)建
類似 .gitignore,.dockerignore 用于排除不需要復(fù)制到構(gòu)建上下文的文件:
.git .gitignore README.md *.md target/ !target/*.jar logs/ *.log .env .DS_Store
放在項(xiàng)目根目錄,與 Dockerfile 同級(jí)。
調(diào)試技巧
查看鏡像歷史
docker history myimage:tag
可以了解每一層做了什么、大小多少。
進(jìn)入容器調(diào)試
如果容器啟動(dòng)失敗,可以這樣進(jìn)入調(diào)試:
# 啟動(dòng)臨時(shí)容器并進(jìn)入 shell docker run -it --rm myimage:tag sh # 或者針對(duì)已運(yùn)行的容器 docker exec -it container_name sh
查看鏡像詳細(xì)信息
docker inspect myimage:tag
返回 JSON 格式的完整元數(shù)據(jù),包括環(huán)境變量、掛載點(diǎn)、網(wǎng)絡(luò)配置等。
高級(jí)技巧:使用 Build Args 和 ENV
可以在構(gòu)建時(shí)傳入?yún)?shù):
ARG APP_PORT=8080 ENV PORT=$APP_PORT EXPOSE $APP_PORT
構(gòu)建時(shí)指定:
docker build --build-arg APP_PORT=9000 -t myapp .
自動(dòng)化 CI/CD 集成
雖然不能提供 GitHub Actions 示例,但在 Jenkins、GitLab CI、Drone 等平臺(tái)都可以輕松集成 Docker 構(gòu)建。
通用流程:
- 代碼提交觸發(fā)流水線
- 拉取代碼
- 編譯打包
- 構(gòu)建 Docker 鏡像
- 推送到倉庫
- 通知部署系統(tǒng)
性能優(yōu)化建議
合理安排 Dockerfile 指令順序
經(jīng)常變動(dòng)的指令(如 COPY 源碼)應(yīng)放在后面,不變的指令(如安裝系統(tǒng)包)放在前面,以便充分利用緩存。
# ?? 好的順序 FROM ... RUN apt-get update && apt-get install -y some-package COPY pom.xml . RUN mvn dependency:go-offline COPY src ./src # ← 經(jīng)常變動(dòng)放最后
使用 .jar 分層(Spring Boot 2.3+)
Spring Boot 2.3 開始支持分層 jar,可以進(jìn)一步優(yōu)化 Docker 層緩存:
在 pom.xml 中啟用:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layers>
<enabled>true</enabled>
</layers>
</configuration>
</plugin>然后在 Dockerfile 中:
FROM eclipse-temurin:17-jre-alpine as builder WORKDIR application COPY target/demo-app.jar app.jar RUN java -Djarmode=layertools -jar app.jar extract FROM eclipse-temurin:17-jre-alpine WORKDIR application COPY --from=builder application/dependencies/ ./ COPY --from=builder application/snapshot-dependencies/ ./ COPY --from=builder application/resources/ ./ COPY --from=builder application/application/ ./ ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]
這樣,只有業(yè)務(wù)代碼變更時(shí)才會(huì)重建最后一層,大幅提升構(gòu)建速度。
鏡像管理策略
版本控制
推薦使用語義化版本:
myapp:1.0.0—— 生產(chǎn)穩(wěn)定版myapp:1.0.0-beta—— 預(yù)發(fā)布版myapp:sha-abc123—— Git Commit 對(duì)應(yīng)版myapp:latest—— 最新版(慎用于生產(chǎn))
生命周期管理
制定鏡像保留策略:
- 開發(fā)環(huán)境:保留最近 10 個(gè)版本
- 測試環(huán)境:保留帶標(biāo)簽的所有版本
- 生產(chǎn)環(huán)境:保留所有上線過的版本
可以編寫腳本定期清理:
# 刪除 30 天前未使用的鏡像 docker image prune -a --filter "until=720h"
私有鏡像倉庫搭建
雖然 Docker Hub 很方便,但企業(yè)通常需要私有倉庫。
推薦使用 Harbor 或 Nexus Repository。
快速啟動(dòng) Harbor(使用 docker-compose):
# docker-compose.yml 片段
version: '2.3'
services:
harbor-core:
image: goharbor/harbor-core:v2.7.0
# ... 其他配置訪問 https://goharbor.io 獲取完整安裝指南。
測試你的鏡像
健康檢查
在 Dockerfile 中加入健康檢查:
HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \ CMD curl -f http://localhost:8080/actuator/health || exit 1
運(yùn)行后查看狀態(tài):
docker ps --format "table {{.Names}}\t{{.Status}}"
集成測試
編寫測試腳本驗(yàn)證鏡像功能:
#!/bin/bash
IMAGE=$1
CONTAINER=test-container
docker run -d --name $CONTAINER -p 8080:8080 $IMAGE
sleep 15
if ! curl -s http://localhost:8080/hello | grep -q "Dockerized"; then
echo "? 測試失敗"
docker logs $CONTAINER
exit 1
fi
echo "? 所有測試通過"
docker rm -f $CONTAINER
常見問題解答
如何減小 Java 鏡像體積?
- 使用
jlink創(chuàng)建自定義 JRE(Java 9+) - 使用 Alpine 基礎(chǔ)鏡像
- 多階段構(gòu)建
- 分層 Jar
構(gòu)建很慢怎么辦?
- 使用國內(nèi)鏡像加速器
- 合理利用緩存(調(diào)整 Dockerfile 順序)
- 使用 BuildKit
- 分層構(gòu)建依賴
容器啟動(dòng)后立即退出?
- 檢查
ENTRYPOINT或CMD是否正確 - 查看日志:
docker logs <container> - 交互式運(yùn)行調(diào)試:
docker run -it yourimage sh
進(jìn)階:使用 Jib 工具(無需 Dockerfile)
Google 開發(fā)的 Jib 工具可以直接從 Maven/Gradle 構(gòu)建 Docker 鏡像,無需編寫 Dockerfile。
在 pom.xml 中添加插件:
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>3.3.1</version>
<configuration>
<from>
<image>eclipse-temurin:17-jre-alpine</image>
</from>
<to>
<image>your-dockerhub-username/spring-app</image>
<tags>
<tag>latest</tag>
<tag>${project.version}</tag>
</tags>
</to>
<container>
<mainClass>com.example.DemoApplication</mainClass>
<ports>
<port>8080</port>
</ports>
</container>
</configuration>
</plugin>構(gòu)建并推送:
./mvnw compile jib:build
Jib 會(huì)自動(dòng)優(yōu)化層結(jié)構(gòu)、處理依賴緩存,是現(xiàn)代化 Java 項(xiàng)目的推薦方案。
鏡像構(gòu)建時(shí)間優(yōu)化前后對(duì)比
渲染錯(cuò)誤: Mermaid 渲染失敗: Parse error on line 7: ...依賴 :a1, 0, 120 編譯源碼 :a2, -----------------------^ Expecting 'taskData', got 'NL'
通過緩存復(fù)用和分層構(gòu)建,總構(gòu)建時(shí)間從 300 秒降至 85 秒!
總結(jié)
掌握 Docker 鏡像的拉取、制作與上傳,是現(xiàn)代開發(fā)者必備技能。本文從基礎(chǔ)命令講起,逐步深入到 Java 應(yīng)用的實(shí)戰(zhàn)構(gòu)建、安全加固、性能優(yōu)化和自動(dòng)化部署,希望能為你提供完整的知識(shí)體系。
記住幾個(gè)關(guān)鍵點(diǎn):
- ? 使用多階段構(gòu)建減小鏡像體積
- ? 固定基礎(chǔ)鏡像版本確保一致性
- ? 使用非 root 用戶提升安全性
- ? 合理利用緩存加速構(gòu)建
- ? 自動(dòng)化測試確保鏡像質(zhì)量
容器化不是終點(diǎn),而是持續(xù)交付和云原生架構(gòu)的起點(diǎn)。繼續(xù)探索 Kubernetes、Helm、服務(wù)網(wǎng)格等技術(shù),讓你的應(yīng)用真正“生于云、長于云”。
“Dockerize all the things!” —— 但請(qǐng)記得,工具是手段,不是目的。始終關(guān)注業(yè)務(wù)價(jià)值和系統(tǒng)穩(wěn)定性。
以上就是Docker鏡像拉取、制作與上傳的完整指南的詳細(xì)內(nèi)容,更多關(guān)于Docker鏡像拉取、制作與上傳的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Docker 運(yùn)行多個(gè)Springboot的詳細(xì)教程
這篇文章主要介紹了Docker 運(yùn)行多個(gè)Springboot的詳細(xì)教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
在docker-compose.yml文件中配置容器的環(huán)境變量方式
本文介紹了在docker-compose.yml文件中設(shè)置和使用環(huán)境變量的方法,包括直接設(shè)置環(huán)境變量、從文件讀取環(huán)境變量以及使用多個(gè)環(huán)境文件進(jìn)行不同部署環(huán)境的配置2024-11-11
docker部署MongoDB數(shù)據(jù)庫的實(shí)現(xiàn)步驟
Docker可以提供一個(gè)輕量級(jí)、可移植的容器化環(huán)境,使得MongoDB的部署變得更加簡單和靈活,本文主要介紹了docker部署MongoDB數(shù)據(jù)庫的實(shí)現(xiàn)步驟,具有一定的參考價(jià)值,感興趣的可以了解一下2024-04-04
如何實(shí)現(xiàn)不同網(wǎng)段docker容器網(wǎng)絡(luò)互通
文章講解了通過Docker bridge網(wǎng)絡(luò)實(shí)現(xiàn)容器間通信的方法,包括關(guān)閉防火墻、拉取busybox鏡像、創(chuàng)建容器并測試IP連通性,使用--link參數(shù)連接容器,以及跨網(wǎng)段通信的配置技巧2025-07-07
Docker開啟遠(yuǎn)程訪問的實(shí)現(xiàn)方式
這篇文章主要介紹了Docker開啟遠(yuǎn)程訪問的實(shí)現(xiàn)方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
Docker部署Ragflow(完美解決502 bad gateway)
本文主要介紹了Docker部署Ragflow,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04
三分鐘完成 ubuntu16.04初始化,Java,maven,docker環(huán)境的部署問題
這篇文章主要介紹了三分鐘完成 ubuntu16.04初始化,Java,maven,docker環(huán)境的部署問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-11-11

