[Docker] Command Line, CLI
keywords: tutorial
, cli
docker version # 確認 docker client 可以和 server engine 溝通
docker info # 檢視和 docker engine 有關的設定檔
TL;SC
$ docker ps [--all]
$ docker run -it [image-id] # 根據 image 建立並執行 container
$ docker run -p 8080:8080 <image-id> # port mapping localhost port:container port
$ docker run -d redis # 讓該 container 在背景執行
# 希望能夠對某個執行中的 container 輸入一些指令
$ docker exec -it <container-id> sh
$ docker start [container-id] # 執行已經建立過的某個 container
$ docker stop [container-id] # 停止某個執行中的 container
$ docker system prune # 把所有 docker 中當前沒用到的 container 清空
# 將 container 包成 image
$ docker build -t pjchender/project_name .
##
# docker compose
##
$ docker-compose up --build # 對應到 docker build . 和 docker run <image-id>
$ docker-compose up -d # 對應到類似 docker run <image-id>,-d 是在背景執行
$ docker-compose down
$ docker-compose ps # 列出該 docker-compose 中有哪些 services 在執行
Docker CLI
# 根據 image 來建立並執行一個 container
# docker run <image-name>
$ docker run hello-world
# docker run <image-name> [override command] 會覆蓋掉原本在 image 內的 startup command
$ docker run -it busybox sh
# 根據 image 建立 container
$ docker create <image-name> # 會取得 container id
# 執行某個 container
# -a:監聽 container 中的 output,並顯示在 Terminal 上
$ docker start -a <container-id>
# 取得某一 Container 的 logs
$ docker logs <container-id>
# 停止某個 container
$ docker stop <container-id>
# 刪除某個 container
$ docker kill <container-id>
# 列出 containers
$ docker ps # 列出所有「正在執行」的 container
$ docker ps --all # 列出所有「被建立過」的 container
# 清除 container
$ docker system prune # 把所有 docker 中當前沒用到的 container 清空
# 對 container 執行某一指令
$ docker exec <container-id> <command>
$ docker exec -it <container-id> bash # 執行 container 的 bash shell
docker run:根據 image 來建立並執行一個 container
# 根據 image 來建立並執行一個 container
# docker run <image-name> <override-command>
$ docker run hello-world
$ docker run busybox echo hello
$ docker run busybox ls
# 執行 ubuntu 的 bash
$ docker run -it ubuntu bash
# port mapping
$ docker run -p 8080:8080 <image-id> # port localhost:container
docker run
=docker create
+docker start
- 執行 CLI 時會透過 docker client 告知 docker server (docker daemon) 要執行的任務,接著 docker server 會在本地的 image cache 中找尋有無
hello-world
這個 image,找不到的話就會到 docker hub 上去找,找到後便把這個 image 拉到本機的 image cache 中,接著 docker server 會根據這個 image 建立 container 以執行程序。 - 原本的 image 中都會包含 Startup Command,若想針對這個 container 執行不同的 command,可以在
docker run <image-id> [override command]
後,使用override command
- docker run 預設就會將 container 內的 output 顯示在 terminal 中,因此 不用想
docker start
需要加上-a
的指令才看得到
docker create & docker start
# Create a Container
$ docker create <image-name> # 會取得 container id
# Start a Container
# -a:attached to the contained 並將 output 顯示在終端機上
$ docker start -a <container-id>
docker create
的動作是根據 image 來建立 container,包含把 FS Snapshot 和 Startup Command 複製到 container 中docker start
會去執行 container 中啟動的指令(startup command)
docker exec:在 container 中執行額外的 command
$ docker run redis # 啟動 redis-server,container-id (11937697771a)
# $ docker exec -it <container-id> <command>
# -i 讓 STDIN 保持開啟
# -t 讓 Terminal 介面比較好看(formatted)
# -it 等於 -i -t,意思就是讓開發者可以輸入內容到 container
$ docker exec -it 11937697771a redis-cli
# 執行 container 的 bash shell,就可以進入該 container 的 shell 使用指令
# 如此就不用一直重複使用 exec 的 指令
$ docker exec -it <container-id> bash
> redis-cli # 使用 Ctrl + D 可以離開
docker logs:取得 container 輸出過的 output
$ docker create busybox echo hi there
> 35b632f6c7881
$ docker start 35b632f6c7881
$ docker logs 35b632f6c7881
- docker logs 不會再執行一次該 container,而是把裡面曾經輸出過的 output 顯示在 terminal 中
docker stop & docker kill
$ docker create busybox ping google.com
> 81d72e56e9e
$ docker start 81d72e56e9e
$ docker stop 81d72e56e9e # send SIGTERM
$ docker kill 81d72e56e9e # send SIGKILL
- 使用
docker stop
會向 container 發送 SIGTERM 的指令(Signal Terminate),如此程式有機會執行 graceful shutdown 的過程(例如執行 cleanup) - 使用
docker kill
會向 container 發送 SIGKILL 的指令,意思是要程式立即終止,不要再做任何事 - 如果使用
docker stop
後十秒鐘 container 仍沒有被停止,則 docker 會自動執行 kill 指令