Byte Ebi's Logo

Byte Ebi 🍤

每天一小口,蝦米變鯨魚

Docker 筆記 2 - 基本使用

Docker 的基本使用方法

Ray

容器化可以隔離不同環境,將環境打包後工程師可以專注開發,不用花過多心力在開發環境安裝上
而 Docker 是目前非常成熟且流行的一個容器化技術

玩轉docker指令

查看容器資訊

docker ps 列出所有運行中的容器
docker ps -a 列出所有存在的容器

看 log

docker logs [CONTAINER]  印出 log
docker logs -f [CONTAINER] 持續印出最新 log

執行容器

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

docker run

範例:

# 執行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

  • -d detach 將 container 置於背景執行
  • -i interactive 維持 STDIN,可互動
  • -t 提供 tty 允許 container 使用 tty
  • -p expose socket 對外:對內 port (ex -p 8080:80) -p Host Port:Docker Port
  • --restart 失敗重啟(always-default, none, on-failure)
  • --rm 關閉後 container 自動消滅,若不刪可能會不斷累積,即使已經死掉了

常用指令

進入運行中的容器,並開啟終端機指令介面

docker exec -ti [CONTAINER] bash

取得 container 或是 image 的 Metadata

docker inspect [CONTAINER]

刪除 docker container

docker rm [CONTAINER]

刪除 docker image

docker rmi [IMAGE]

查看容器運行 process

docker top [CONTAINER]

其他指令

使用 Dockerfile 建立 docker image
-f 手動指定 Dockerfile 名稱

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

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

將 docker image 從 repository 上拉/推上去
要先登入 docker login

docker push / pull

登入 docker repository

docker login

怎麼寫自己的dockerfile

  • 先註冊 Docker Hub
  • Alpine Linux
    • 體積非常的小 (5MB)
    • 有完整的Linux架構
    • 豐富的元件支援

常見 Dockerfile 命令

基本

  • FROM:指定基底 image,不指定版本的話預設都是 latest
  • RUN:
    • docker build 時候執行命令,裝一些相依套件。
    • 每一個 RUN 都是獨立事件
  • ARG:
    • container docker build 時的建置參數
    • 無法在 container 中被使用
  • ENV:
    • printenv 容器內使用的環境變數
    • 格式:ENV <key> <value> 或是 ENV <key1>=<value1> <key2>=<value2>

檔案複製

  • COPY:
    • 複製「來源文件\目錄」到的容器中的「文件\目錄」中
    • COPY [--chown=<user>:<group>] <source path>... <dist path>
    • dist path 可以是 Container 內的絕對路徑,也可以是相對於 WORKDIR 的相對路徑
    • 會保留來源數據的各種屬性
  • ADD:
    • 強化版的 COPY
    • ADD [--chown=<user>:<group>] <source path>... <dist path>
    • 允許 source path 是一個 URL
    • 文件權限自動設置為 600

執行指令

  • ENTRYPOINT:
    • Container 起來預設會執行的指令
    • 最後指令,啟動時要保持在前景的指令
  • CMD:
    • container起來預設會執行的指令(或參數)
    • ENTRYPOINT, CMD 同時存在 CMD 當參數使用
  • WORKDIR(cd + mkdir):
    • 初始容器內工作目錄

指令差異

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內

除錯

docker: Got permission denied

這個錯誤是因為當前使用者的權限不足
可以將使用者提升至 root 保證權限

但是比較安全且正確的做法應該是

  1. 建立 docker 執行群組
  2. 將使用者加入 docker 群組

指令如下,需要退出重新登錄後才會生效!

sudo groupadd docker
sudo usermod -aG docker user_name

最新文章

Category

Tag