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
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
ADD
和COPY
在功能上相似,COPY
是優選的。ADD
是由遠程URL的方式取得資料,會匯入整包的檔案,相對的COPY
只需要相對應的資料夾。
前後端分離架構
需要兩個 server 狀況下分不同的port號,使用Restful-API連接
- FrontEnd VueJS
VueJS - 基礎教學 - 攥寫中 - BackEnd NodeJS
NodeJS - Express 網頁伺服器基礎教學 - 攥寫中
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
去連接container
與container
之間的網路層。