2020-04-23

docker 的基礎指令說明[也許會陸續更新][2020-05-07 updated]

最近初自學,先以自己思維下寫說明,可能有一些不太對,再請大家指教…
不過主要的還是可以去看 docker commandline reference
----
pull - 由 docker hub 拉下 images 儲存
command: docker pull [appname]:[version]
appname - 如 nginx, httpd, mysql 等,有一些 app 的名字是慣用,但詳細可以上 docker hub 查
version - 指定 app 的版本,一般是看自己習慣,如果不特別指定,預設就是最新[latest]
push - 由本地的 images 推上 docker hub 發布(需有 docker hub account)
build - 以指定的 Dockerfile 重製為 image
command: docker build [OPTIONS] [New image name] [path | url]
[OPTIONS] - 很多,可參考 docker CLI reference,比較常用的如以下
--tag, -t : image tag name
--no-cache : 建置image時不使用快取
--file, -f : 指定以特定路徑下的 Dockerfile 來建置
[New image name] - 不一定要有,就是把新的 image 另名一個 REPO name
[path | url] - Dockerfile 的位置
load - 將 save 過後的 tar 重新載入為 images
command1: docker load < [package file name]
command2: docker load --input [package file name]
[OPTIONS]
--input, -i : 指定檔案,就不用 STDIN 方式("<")
--quiet, -q : 輸出較精簡的訊息,但不是寧靜模式
[package file name] : save 後的打包檔案,通常會是 tar 或 tar.gz
save - 打包 tar, 方便私下交流 images 或備份, 不用特意傳上 docker hub
command: docker save [OPTIONS] [image repo name] > [package file name]
[OPTIONS] - 基本上不用寫,因為目前只有一個 output,所以不寫的話預設就是 --output
[image repo name] - 指定 image REPOSITORY name
[package file name] - 打包後的檔名,通常會用 tar 或 tar.gz
commit - 把指定的 container 存成新的 image,簡單說是客製化,可以上 docker hub pull 別人做好的 image 下來當初始器,然後將初始器運行後,再進入內部微調成自己想要的環境,之後就可以利用 commit 將修改好的容器存成自己的 image,不過建議是使用 Dockerfile 來進行重製,commit 的方式要小心使用(可參閱 https://yeasy.gitbooks.io/docker_practice/image/commit.html )
command: docker commit [OPTIONS] [container-id] [REPOSITORY[:TAG]]
[OPTIONS] - 不一定要寫,主要看有沒有想修改原 image 的以下的東西
--author, -a : 作者資料
--change, -c : 使用 Dockerfile 中的指令來建構,有 CMD | ENTRYPOINT | ENV | EXPOSE | LABEL | ONBUILD | USER | VOLUME | WORKDIR
--message, -m : 跟 git commit -m 'message' 的作用差不多,就是說明
--pause, -p : 暫停 container 的運作
[container-id] - 指定 container id 或者 container NAMES
run - 將指定的 images 以容器(container)方式運行起來,此容器是獨立的環境,運行的地方可以是本地的真實主機或遠端的,此容器運行時有獨立且屬於自己的作業系統、網路和處理程序
command: docker run [OPTIONS] [image[:tag]] [command] [ARGS]
[OPTIONS] - 有以下比較常用的
--detach, -d - 背景運行
--publish, -p [external-port-number[/tcp|upd]]:[internal-port-number[/tcp|udp]] - 設定容器的埠號與上層(母機?)的埠號發佈,可以特別指定對應的協定
--volumn, -v - 指定上層(母機?)的一個路徑映射並掛載於指定容器內的路徑
[image repo-name|id] - 指定要運行的鏡像名或id,這個可以在 docker pull 後使用 docker images 查詢,REPOSITORY是鏡像名,IMAGE ID 就是 id
exec - 在指定的運行中的容器內執行命令,比較常用的是開啟 terminal
command: docker exec [OPTIONS] [container id|names] [command] [ARGS]
-------
Dockerfile 一些基礎的寫法
FROM [image repo name] - 跟 docker pull 後面接的一樣
COPY [source path] [image destination path] - 把上層(或母機?)指定的檔案或路徑資料複製到新建立的image中
RUN <os shell command> - 在image建立前,運行指定的指令,在image是linux環境時,此執行環境預設是 /bin/sh,如果要使用不一樣的 shell,可使用另一種表達方式
["os shell command", "參數1", "參數2] - RUN 的另一種執行指令的模式,此模式使用 JSON 格式,[]內只能用雙引號來包住各欄位,不得使用單引號,另外要注意 “\“ 會有影響,可以改成 “\\“ 來用
ADD [外部的資料位置] [內部指令對應的資料位置] - 指定上層(母機?)的資料放入內部指定路徑中,若要放入後修改檔案擁有者屬性的話可以用另一種方式
--chown=[user|uid]:[group|gid] [外部的資料位置] [內部指令對應的資料位置] - 此方式會修改資料使用者屬性資料
ENTRYPOINT ["執行檔", "參數1", "參數2"] - json array 表達方式,在image啟動為容器時才有作用,另有 shell type 的表達方式
指令 參數1 參數2 - shell type 表達方式,在image啟動為容器時才有作用,會在 /bin/sh 的環境下執行,另有 json array 的表達方式
ENV [variable_name=path_in_image] - 設定環境變數,若有多個環境變數要設定,可以以空白隔開或用多個 ENV 來表示
[variable_name] [path_in_image] - 另一種設定表達方式,若有多個環境變數要設定,只能以多個 ENV 來表示,或改用上行表達方式
CMD ["執行檔", "參數1", "參數2"] - 啟動指定的程式,另有另一種表達方式
["參數1", "參數2"] - 此方式的參數是提供給有使用 ENTRYPOINT 的執行檔用
執行檔 參數1 參數2 - 是在 /bin/sh -c 的環境下再執行的方式
EXPOSE [port number[/tcp|udp]] - 特別指定運行後發佈的埠號,可特別指定發佈在tcp或udp上,但要記住之後以 docker run 此 image 時,在對應 --publish(-p) 時也要額外再指定協定

*注意:
- Dockerfile 的運行是逐行的,所以要留意執行順序
- ENTRYPOINT 和 CMD 之中是有關聯性的,如果有寫 ENTRYPOINT 的話就要同時寫 CMD ,如果沒有要 CMD 執行的程序,也要寫個 CMD [] 空的
- ENTRYPOINT 是用 json array 寫法還是用 shell 寫法會影響到 CMD 的執行,可以參考 Dockerfile - understand how cmd and entrypoint interact,可以參考 https://blog.tiger-workshop.com/docker-difference-between-entrypoint-and-cmd/
- 如果沒使用 ENTRYPOINT 和 CMD 的話,會繼承原來的 image 的設定
- ENTRYPOINT 和 CMD 的作用是會在啟動為容器時會發生的,只是我目前的理解的狀況,我會把 ENTRYPOINT 當作「容器啟動時會一併啟動的“程序“或“服務“」,有點像 WINDOWS 的 services.msc ,而 CMD 我會當成是「容器啟動完後自動執行的程序」(有點類似windows會放在程式集中的“啟動“)或者是「容器啟動完後受ENTRYPOINT(服務)啟動相依執行的排程」(有點類似windows在寫排程時可以設定使用者登入或網路元件已啟動時才會執行的程式)
-------
docker-compose 用法
up - 新增、重建、建立image並啟動於容器中
command: docker-compose up [OPTIONS] [docker-compose.yml path]
[OPTIONS] - 不一定要有,以下挑幾個可能比較常用的
--detach, -d : 建立好後在背景運行容器
--quiet-pull : 在建立過程時,如果有要 pull image 的訊息不顯示
--force-recreate : 強制重建,不管來源的設定或image有沒有更動過
--always-recreate-deps : 總是重建有相依性的容器,這個指令不能和 --no-recreate 一起用
--no-recreate : 如果相關的容器已存在,就不重建,這個指令不能和 --force-recreate 和 --renew-anon-volumes|-V 一起用
--no-build : 不建立 image ,就算image不存在
--no-start : 最後不啟用於容器
--build : 建立 image 優先於啟動於容器
[docker-compose.yml path] - 就是指定要運行的 docker-compose.yml 的路徑,如果沒有特別寫,會是以指令下達的當前目錄下的 docker-compose.yml
ps - 查看運行中的服務容器,跟 docker ps 類似
command: docker-compose ps