Docker 筆記 2 - 基本使用
Docker 的基本使用方法
容器化可以隔離不同環境,將環境打包後工程師可以專注開發,不用花過多心力在開發環境安裝上
而 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
保證權限
但是比較安全且正確的做法應該是
- 建立 docker 執行群組
- 將使用者加入 docker 群組
指令如下,需要退出重新登錄後才會生效!
sudo groupadd docker
sudo usermod -aG docker user_name