# Docker (二) - Docker 的基本操作 上一篇介紹完了[容器與 Docker 的基本概念](https://tienyulin.github.io/docker-concept/),這一篇我們要開始來介紹 Docker 的一些基本操作。 在開始操作前,我們需要先安裝 Docker,安裝的方式依照作業系統不同可以在[Docker 官網](https://docs.docker.com/engine/install/)找到相對應的安裝方式。 <!--more--> ## Docker開機自動啟動 安裝好 Docker 後,建議設定讓 Docker 開機自動啟動,才能在伺服器或電腦重啟時不用再手動啟動 Docker。 * Windows 系統設定方式: 在 Docker 的設定裡勾選 `Start Docker Desktop when you log in` * Linux系統設定方式: > systemctl : 負責控制 systemd 系統與服務管理器 ```bash= sudo systemctl enable docker ``` ## Docker Image 的管理 安裝好 Docker 之後,就可以開始建立自己的 Image 或是下載別人做好的 Image。 ### 下載 Image 我們先利用 `docker pull <ImageName>` 指令從 DockerHub 下載 [portainer](https://hub.docker.com/r/portainer/portainer) 這個 Image,portainer 是一種 Docker UI 的管理工具。 ```bash= # 從 remote repository (docker hub) 下載 image docker pull portainer/portainer ``` ### 列出 Image 下載好 portainer 後,可以透過以下兩種指令來列出所有的 Image。 ```bash= docker images docker image ls ``` ### 搜尋 Image 如果想直接搜尋 DockerHub 上面的 Image 可以透過 `search` 指令來搜尋。 ```bash= docker search ubuntu ``` ### 刪除 Image 刪除 Image 可以使用 `rmi` 指令並且指定 ImageId 來刪除。 ```bash= docker rmi <ImageId> ``` 若是要刪除所有的 Image,可以指定所有的 ImageId 來刪除。 * -q : 列出 Image Id ```bash= docker rmi $(docker images -q) ``` 或是 docker 本身支援的 prune 來刪除 Options : * -a, `--all` : 刪除全部 * -f : 不跳出確認提醒 ```bash= docker image prune <options> ``` options 沒有填的話只會刪除那些沒有被引用的 Image 和 Dangling Image。 #### Dangling Image Dangling Image 是指這個 Image 已經沒有被使用到了。例如,同樣的 Dockerfile 重新建立 Image 後,則新建立的 Image 會被 tag 為 latest,舊的 Image 不會再被用到就是 Dangling Image。 ### 給 Image 加上 Tag 使用 `tag` 指令給 Image 加上 tag(標籤)。先在 Image 後面加上 `:`,接著再冒號後面填入 tag。tag 通常是版本號碼,例如: ImageName:20200611.1,20200611.1 即為標籤。 呈上,tag 可以是日期、編號或其他能代表出這個 Image 的用途。加上 tag 的目的是為了提供給這個 Image 更詳細的資訊,所以在命名上要特別注意。 另外,若是沒加上 tag,建立好的 Image 預設 tag 會是 latest,所以每次上傳到 Repository 時都是一樣的 ImageName 和 tag。而 Docker 在下載 Image 時,若沒指定 tag 就會自動代入 latest,所以為了避免混淆還是建議要加上 tag。 ```bash= docker tag <ImageName> <ImageName>:<tag> ``` ### 使用 Dockerfile 建立 Image 除了下載別人做好的 Image,我們也可以自己建立 Image。至於甚麼是 Dockerfile ? 又該如何建立成 Image 呢 ? 詳細作法請參考下一篇 [Docker(三) - 撰寫 Dockerfile](https://tienyulin.github.io/docker-dockerfile/) ## Docker Container 的管理 有了 Image 之後我們就可以使用 Image 來建立 Container。 ### 建立 Container 使用 `docker run <ImageName>` 就可以建立起一個 Container,但是通常還會再給予一些變數來設定要啟動的 Container,例如: * -d : 背景執行 * -h : 自訂 Host Name * -i : 進入互動模式(interaactive),讓 Container 的標準輸入保持打開 * -t : 配置一個虛擬終端(pseudo-tty)並綁定到 Container 上 * -p : 設定要對外開啟的 port number(host port:container port) * -e : 設定環境變數 * -v : 資料對應(host folder:container folder) * `--name` : 自訂 Container 名稱 * `--restart` : 設定重啟模式,預設是 No,但實務上應設定 always 才不會因為意外停止還需要人為手動重啟 以下以建立 portainer 的 Container 為例,如果 Image 已經有下載過了,則建立 Container 時會直接拿來做使用,若是沒有下載 Image,在建立時 Docker 會自動去 DockerHub 上面下載下來再使用。 ```bash= docker run \ -d \ --restart always \ --name portainer \ -p 9000:9000 \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /volume1/docker/portainer:/data \ portainer/portainer ``` 建立好後,直接打開瀏覽器輸入 `http://127.0.0.1:9000/` 就會進入到登入畫面,即表示建立成功。 ### 列出 Cotainer 透過 `docker ps -a` 可以列出所有的 Container。 ```bash= docker ps -a ``` 如果只想列出正在執行的 Container,則使用 `docker ps` 即可。 ```bash= docker ps ``` ### 啟動 Container 若是有建立好的 Container 沒有啟動或是因為某些緣故停止了需要手動啟動,可以使用 `start` 指令來啟動。 ```bash= docker start <ContainerName> ``` ### 停止 Container ```bash= docker stop <ContainerName> ``` ### 刪除 Container ```bash= docker rm <ContainerId> ``` ### 查看 Container log 使用 `docker logs` 可以查看 Container 的執行紀錄。 * -f : 持續印出執行紀錄不會跳離,可以不加 ```bash= docker logs -f <ContainerName> ``` ### 進入 Container 如果需要對 Container 進行操作,而且必需進到 Container 內,可以使用 `exec` 指令來對 Container 執行`bash`。 * -i: 進入互動模式(interaactive),讓 Container 的標準輸入保持打開 * -t: 配置一個虛擬終端(pseudo-tty)並綁定到 Container 上 ```bash= docker exec -it <containerName> bash docker exec -it <containerName> /bin/bash # 有些 Image 使用 Alpine Linux,可能沒有 bash,改用 sh docker exec -it <containerName> /bin/sh ``` exec 後面接到 bash 或是 /bin/bash 其實都是 Container 裡的指令,只是打開 Container 的 bash,所以如果沒有一定要開 bash,其實也可以直接輸入指令。例如 : ```bash= docker exec -it <containerName> ls ``` 進入 Container 的另一種方式是使用 `attach` 指令,但是退出 Container 時會導致 Container 停止,所以實務上不太會使用。 ```bash= docker attach <containerName> ``` ### 清除沒有執行的 Container、Image 、Network 和 Cache Options : * `--all` , -a : 刪除所有停止的 Container、Image、Network * `--force`, -f : 強制刪除不跳出確認提醒 * `--volumes` : 刪除 Volume * `--filter` : 刪除指定 label 的 Container、Image、Network、Volume ```bash= docker system prune <options> ``` options 沒有填的話只會刪除那些沒有被引用的 Image 和 [Dangling Image](#Dangling-Image)。 ## Docker 推送 Image 到 Repository 除了 DockerHub 有提供 Container Registry 讓開發者存放 Image,Google、Microsoft 等等的公司也都有提供,以下以 DockerHub 的 Repository 為範例進行操作。 ### 新建 Repository 首先要在 DockerHub 註冊帳號,新建一個 Repository,每個帳號有一個免費的 Private Repository,其他的 Repository 必須是 Public。 接下來回到 CommandLine 開始準備要上傳的 Image。 ### 給 Image 加上 Tag 因為要上傳到 DockerHub 所以還必須指定 DockerHubUserName 和 RepositoryName,這樣再上傳的時候才會傳到對應的 Repository。 ```bash= docker tag <ImageName> <DockerHubUserName>/<RepositoryName>/<ImageName>:<Tag> ``` ### 登入 DockerHub 準備好 Image 後,接著就可以開始上傳了。上傳前要先使用 `login` 指令登入 Docker 的帳戶,再輸入 UserName 和 Password。 ```bash= docker login ``` 也可以加上 `-u` 和 `-p` 或是 `--username` 和 `--password`,直接打上帳號密碼,一次完成登入步驟 ```bash= docker login -u <UserName> -p <Password> docker login --username <UserName> --password <Password> ``` ### 上傳 Image 上傳使用的是 `push` 指令,將已經加好 tag 的 Image 上傳到 Repository。 ```bash= docker push <DockerHubUserName>/<RepositoryName>/<ImageName>:<Tag> ``` ### 登出 DockerHub 上傳完記得要登出 DockerHub。 ```bash= docker logout ``` ## Summary 以上介紹完了常用的 Docker 操作方法和指令,下一篇將介紹如何使用 Dockerfile 自己建立 Image。 ## 參考 [1] [Docker(一) - 容器與 Docker 的基本概念](/Cz7PXrF0SEeT0LLDsLYeLw) [2] [把 Docker Image Push 到 Docker Hub](https://ithelp.ithome.com.tw/articles/10191139) [3] [Docker 基本教學](https://ithelp.ithome.com.tw/articles/10199339) [4] [Docker 學習筆記(三) — Docker指令講解](https://medium.com/%E4%B8%80%E5%80%8B%E5%B0%8F%E5%B0%8F%E5%B7%A5%E7%A8%8B%E5%B8%AB%E7%9A%84%E9%9A%A8%E6%89%8B%E7%AD%86%E8%A8%98/docker-%E5%AD%B8%E7%BF%92%E7%AD%86%E8%A8%98-docker%E6%8C%87%E4%BB%A4%E4%BD%BF%E7%94%A8%E8%AC%9B%E8%A7%A3-9040d9de4677) [5] [docker system prune](https://docs.docker.com/engine/reference/commandline/system_prune/#examples) [6] [如何快速清理 Docker 無用資源](https://kknews.cc/zh-tw/code/kbb6byq.html) ###### tags: `Container` `Docker`
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.