Docker一日工作坊Part2

Michael.K

關於第二部份

  • 玩轉docker指令
  • 怎麼寫自己的dockerfile
  • 寫dockerfile常犯的錯誤
  • 介紹常見的repository
  • 發佈你的docker image

先預設觀念

任何的image預設都是latest

docker run

  • 本地環境的image建立container
  • 如果不存在從repository訪問,private repo必須要有「登入」行為
  • image的格式可以為[IMAGE NAME]:[TAG]
# 執行nginx
docker run -idt nginx

# 執行nginx並且暴露port為8080
docker run -idt -p 8080:80 nginx

# 執行nginx在8080,在失敗的時候會自動重啟動
docker run -idt -p 8080:80 --restart on-failure nginx

# 執行nginx,結束後移除
docker run --rm -idt nginx

常用到的flag

  • p, port 對外:對內port
  • restart 重啓行為
  • i, interactive 維持STDIN
  • d, detach 將container置於背景
  • t, tty 允許container使用tty
  • rm, 結束後移除

docker exec

  • 從已經「存在」、「執行中」的container執行指令
# 執行echo 1
docker exec container echo 1

# 進入container內
docker exec -ti container bash

docker build

  • 從Dockerfile建立docker image
# 在目前的資料夾建立image,來源是Dockerfile
docker build . -t image-name

# 在目前的資料夾建立image,來源是Dockerfile-alt
docker build . -t image-name -f Dockerfile-alt

docker push / pull

  • 將docker image從repository上拉/推上去
  • 需要先有「登入」行為

docker login

  • 登入docker repository

學完基本指令了

如何寫自己的Dockerfile

在寫Dockerfile之前

Docker ❤️ Alpine Linux

Alpine Linux

  • 體積非常的小 (5MB)
  • 有完整的Linux架構
  • 豐富的元件支援

幾個常見的Dockerfile命令

  • FROM
  • RUN
  • ARG
  • ENV
  • ADD
  • COPY
  • ENTRYPOINT
  • CMD

ARG vs ENV

  • ARG由建立image的時候帶入
    • docker build . --build-arg FOO=bar
  • ENV是在docker container內作為環境變數使用

CMD vs ENTRYPOINT

  • ENTRYPOINT在container啟動時預設執行
  • CMD在ENTRYPOINT存在時作為參數使用
FROM ubuntu

ENTRYPOINY ["ping"]
CMD ["localhost"]

COPY vs ADD

  • COPY 適用在將本地端的檔案複製到container內
  • ADD 適用將遠端的檔案複製到container內
FROM alpine:3.8

RUN apk add --update nginx && \
  mkdir /run/nginx

ENTRYPOINT ["nginx", "-g", "daemon off;"]

發佈自己的image!

實際示範

Made with Slides.com