公網情況
0.Dockerfile關鍵字
關鍵字 | 作用一句話 | 出現位置 |
---|---|---|
FROM | 指定基礎鏡像(任何 Dockerfile 必須且首行) | 全局 |
RUN | 在鏡像構建階段執行命令(常用來安裝軟件) | 構建期 |
COPY | 把宿主機文件/目錄復制進鏡像 | 構建期 |
ADD | 類似 COPY,但額外支持遠程 URL 與自動解壓 tar | 構建期 |
WORKDIR | 設定后續指令的工作目錄(不存在會自動創建) | 構建/運行 |
ENV | 設定環境變量 | 構建+運行 |
EXPOSE | 聲明容器對外監聽端口(僅文檔作用,仍需 -p) | 文檔 |
CMD | 容器啟動時的默認命令(可被 docker run 覆蓋) | 運行期 |
ENTRYPOINT | 容器啟動時的主進程(與 CMD 組合使用) | 運行期 |
VOLUME | 聲明掛載點,匿名或具名卷 | 運行期 |
USER | 切換后續指令的執行用戶 / UID | 構建/運行 |
LABEL | 給鏡像打鍵值對元數據(維護者、版本等) | 文檔 |
ARG | 聲明構建參數(docker build --build-arg) | 構建期 |
ONBUILD | 觸發器:以此鏡像作為基礎鏡像時自動執行 | 構建期 |
STOPSIGNAL | 指定 docker stop 時發給容器的信號 | 運行期 |
HEALTHCHECK | 定義容器健康檢查命令 | 運行期 |
SHELL | 更改 RUN/CMD 的默認 shell(Windows 常用) | 構建期 |
MAINTAINER | 已廢棄,被 LABEL 替代 | 歷史遺留 |
最小可運行示例
# 關鍵字示例
FROM alpine:3.19
LABEL maintainer="you@example.com"
WORKDIR /app
COPY . .
RUN apk add --no-cache python3
EXPOSE 8000
CMD ["python3", "-m", "http.server", "8000"]
以上代碼用到了 8 個關鍵字,足夠覆蓋 90% 的日常需求。
1.創建Dockerfile
# 使用 OpenJDK 8 官方鏡像
FROM openjdk:8-jre# 設置工作目錄
WORKDIR /app# 暴露端口
EXPOSE 5086# 使用 Shell 格式(注意:不要用方括號)
CMD java -Xms2g -Xmx2g -XX:+UseParallelGC -XX:ParallelGCThreads=4 -jar app.jar > /app/app.log 2>&1
2.build鏡像
docker build -t java_image .
3.啟動容器
docker run -d --restart always --name twin_java -p 8080:8080 -v /home/java:/app java_image
圖中可以看到,容器已經啟動,并且容器的監控線程已經由/bin/bash變成了/bin/bash -c 'java -X..",可見,當容器重啟的時候,容器中的jar包也會一起重啟
4.更新jar包
當java項目邏輯有修改的時候,都需要重新打包,重新啟動項目,容器中的jar包沖抵方式是:
剛剛啟動容器的時候,已經通過命令掛載了容器的工作目錄到宿主機,即容器中/app和宿主機/home/java的目錄是互通的,所以只需要將宿主機上的jar更新,又因為在Dockerfile中定義啟動的jar包名稱為app.jar,所以后續更新jar包時,需要將最新的jar包改名為app.jar,然后重啟項目即可
重啟容器命令:
docker restart twin_java
補充:
想在容器內看java運行狀態,報bash: ps: command not found
可以通過命令安裝(因為這個容器是Debian 容器,又因為Ubuntu和Debian的命令很多都一樣)
apt update && apt install procps -y
查看jar包運行日志,可以在宿主機上使用tail命令進行查看,不需要進入容器
tail -100f app.log
內網環境
0.準備工作
將剛剛在公網環境下創建的鏡像進行打包
docker save -o java_image.tar java_image
然后將tar包放在內網電腦上進行載入,啟動即可
1.載入并啟動
載入命令:
docker load -i java_image.tar
啟動命令同上,更新jar包步驟同上