dockerd),監聽docker API,管理 docker 物件: image, container, network, volume…docker run (由 image 創建容器),
docker ps 列出目前的容器,docker start, docker stopdocker volume create log-data 創建 volume 於 local, docker run -d -p 80:80 -v **log-data:/logs** docker/welcome-to-docker ,將 image log mount 到 log-data
每一層表示文件系統的變化,可用 cmd or dockerfile:
Dockerfile (每一個指令都代表一層)
# 使用基礎映像
FROM ubuntu:20.04
# 作者信息
LABEL maintainer="your-email@example.com"
LABEL description="This is a sample Dockerfile showcasing all commands"
# 設置構建過程中的變數(ARG 在構建時可改變,ENV 是容器運行時的環境變數)
ARG DEBIAN_FRONTEND=noninteractive
# 設置環境變數(環境變數會在容器內生效)
ENV APP_HOME=/usr/src/app
ENV PYTHONUNBUFFERED=1
# 創建工作目錄並設置為當前工作目錄
WORKDIR $APP_HOME
# 複製當前目錄的內容到容器內的工作目錄
COPY . $APP_HOME
# 添加外部壓縮文件或遠程URL
ADD https://example.com/somefile.tar.gz /tmp/
# 解壓壓縮文件
RUN tar -xzf /tmp/somefile.tar.gz -C /usr/src/
# 執行安裝和其他設置命令
RUN apt-get update && \
apt-get install -y python3 python3-pip && \
pip3 install -r requirements.txt && \
rm -rf /var/lib/apt/lists/*
# 暴露應用端口
EXPOSE 8080
# 設置數據卷,以便持久化存儲
VOLUME [ "/data" ]
# 使用非 root 用戶執行容器,提高安全性
RUN useradd -ms /bin/bash appuser
USER appuser
# 定義健康檢查,檢測應用是否正常運行
HEALTHCHECK \
CMD curl -f http://localhost:8080/health || exit 1
# 設置容器啟動時的命令
CMD ["python3", "app.py"]
docker cmd 範例: docker run xxx -ti(可進入容器環境)⇒ …..operation…. ⇒ docker commit
# 使用官方的 Node.js 基礎映像
FROM node:14
# 設置工作目錄
WORKDIR /app
# 複製 package.json 並安裝依賴
COPY package.json /app/
RUN npm install
# 複製應用程序的源代碼
COPY . /app
# 開放應用的端口
EXPOSE 3000
# 啟動應用
CMD ["npm", "start"]
. 代表dockerfile 所在位置)使用 docker build 時會依照 dockerfile 指令去執行,會根據上一次的 build 的快取加速下一次的 build 時間,有些層的順續會影響 cache 優化效率
.dockerignore :忽略某些檔案不要包進 image, 例如: node_modules,因為 RUN npm install 就會根據 package.json產生
編譯環境打包(compile, packaging)跟執行環境 (runtime)所需要的 From 不同時,可以用 as 將拆成多個階段,例如: 編譯時需要JDK環境(通常肥大),而運行時只需要 JRE 環境,因此最後只需要 JRE環境跟 編譯好的JAR檔,JDK不會被包進image
FROM eclipse-temurin:21.0.2_13-jdk-jammy AS builder
WORKDIR /opt/app
COPY .mvn/ .mvn
COPY mvnw pom.xml ./
RUN ./mvnw dependency:go-offline
COPY ./src ./src
RUN ./mvnw clean install
FROM eclipse-temurin:21.0.2_13-jre-jammy AS final
WORKDIR /opt/app
EXPOSE 8080
COPY /opt/app/target/*.jar /opt/app/*.jar
ENTRYPOINT ["java", "-jar", "/opt/app/*.jar"]
HOST_PORT:CONTAINER_PORT docker compose up:image 若不存在會自動 pull 並運行起來https://github.com/twtrubiks/docker-tutorial
https://docs.docker.com/get-started/introduction/