返回
Featured image of post DockerFile 教學

DockerFile 教學

如何寫出屬於自己服務的DockerFile

Dockefile 是一個文字格式的設定檔,使用者可以使用Dockerfile來快速建立自己的映像檔。

DockerFile 設定檔基本語法

FROM 基底映像檔
USER 指定執行容器的使用者名稱或者ID
WORKDIR 工作目錄

LABEL 指定維護者資訊

ENV 建立環境變數可供後續使用
ARG --build-arg 帶入變數,讓build可以結合外部指定建構時所需的參數

COPY 複製本機上的資料至容器
ADD 複製指定的url或是tar檔(自動解壓縮)至指定的目錄

VOLUME 建立一個可以從本幾對外掛載的目錄
EXPOSE 宣告此容器Run在哪個 Port

RUN Build layer 中執行的指令,一個Dockerfile中可以有多個RUN
CMD 當容器啟動之後默認會執行的命令,可以有多個CMD,不過只有最後一個會生效
ENTRYPOINT 指定容器啟動程序及參數

快速教學 - Nginx

Nginx 網頁伺服器設定教學 - 攥寫中
資料夾格式

Project
|- index.html
|- dockerfile
|- nginx.conf

DockerFile

FROM nginx
WORKDIR /app
EXPOSE 80
COPY index.html /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf

docker build

docker build -t nginx-sample .

docker run

docker run -d --rm --name nginx -p 80:80 nginx-sample

DockerFile 語法比較

此階段非常重要,必須理解原因
可以使用 busybox 進行測試DockerFile情境


RUN & CMD & ENTRYPOINT

  • RUN 命令並建立新的鏡像層,經常用來安裝image中需要的軟件。
  • CMD 容器啟動後默認執行的命令及其參數,能夠被命令行參數代替
  • ENTIRYPOINT 配置容器啟動時運行的命令。

RUN

FROM busybox
RUN ["echo", "Hello Dockerfile!"]

CMD

FROM busybox
CMD ["echo", "Hello Dockerfile!"]

ENTRYPOINT

FROM busybox
ENTRYPOINT ["echo", "Hello Dockerfile!"]

ENTRYPOINT + CMD

FROM busybox
ENTRYPOINT ["echo"]
CMD ["Hello Dockerfile!"]
FROM busybox
ENTRYPOINT ["ping"]
CMD ["tw.yahoo.com"]

ENV VS ARG

  • ENV - 使用情境於運行container的時候 docker run -e
  • ARG - 使用情境於封裝image的時候 docker build -–build-arg

ENV

FROM busybox
ENV name=hifounder
ENTRYPOINT echo ${name}

ENV + ARG

FROM busybox
ARG MY_ARG=456
ENV MY_ENV=$MY_ARG
ENTRYPOINT echo ${MY_ENV}

docker build

docker build --build-arg MY_ARG=hifounder busy .

COPY VS ADD

ADDCOPY在功能上相似,COPY是優選的。
ADD是由遠程URL的方式取得資料,會匯入整包的檔案,相對的COPY只需要相對應的資料夾。


前後端分離架構

需要兩個 server 狀況下分不同的port號,使用Restful-API連接

VueJS 的 DockerFile撰寫 - FrontEnd

使用 Nginx 方式 去執行 Vue SPA 服務

# build stage
FROM node:lts as build-stage
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# production stage
FROM nginx:stable-alpine as production-stage
COPY --from=build-stage /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

NodeJS 的 DockerFile撰寫 - BackEnd

使用 NodeJS Server 去執行
可以使用 lts 環境包,功能較完整去安裝,用 lts-alpine 環境較輕量,去執行。

FROM node:lts as build
WORKDIR /app
COPY package*  /app/
RUN npm install

FROM node:lts-alpine as run
WORKDIR /app
COPY --from=0 /app /app/
COPY . /app
EXPOSE 3001
CMD [ "npm", "run", "start" ]

這樣就簡單的完成了前後端分離的image
接下來會使用到docker-compose去連接containercontainer之間的網路層。

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus