以下為一些基本的 docker 常用指令,僅映像檔與容器的部份。
本頁目錄
docker 的映像檔就像是一個模板(template),提供建立容器的一個範本,擁有映像檔就可快速的建立容器。
指令: images
(完整指令: docker image ls
)
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
php 8.0-apache aa79271a3ea6 7 days ago 472MB
httpd latest c8ca530172a8 8 days ago 138MB
mariadb latest 45eaeedf03de 2 weeks ago 409MB
ubuntu 21.10 f2ecd4f42215 4 weeks ago 79.6MB
hello-world <none> bf756fb1ae65 20 months ago 13.3kB
從 docker hub 取得 hello-world 映像檔。
指令: pull <映像檔名稱[:標籤名稱]>
(完整指令: docker image pull
)
$ docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:7d91b69e04a9029b99f3585aaaccae2baa80bcf318f4a5d2165a9898cd2dc0a1
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest
取得 php 映像檔,標籤為 8.0-apache 的版本
$ docker pull php:8.0-apache
8.0-apache: Pulling from library/php
99046ad9247f: Pull complete
... 中間省略 ...
ae373b9fffe8: Pull complete
Digest: sha256:be7c3c1cef182a0f8dfeaf2208a5ce39649d6efc9ebbf5a325a4d6291e00defe
Status: Downloaded newer image for php:8.0-apache
docker.io/library/php:8.0-apache
指令: rmi <映像檔名稱[:標籤名稱]>
(完整指令: docker image rm
)
$ docker rmi hello-world
Untagged: hello-world:latest
Untagged: hello-world@sha256:7d91b69e04a9029b99f3585aaaccae2baa80bcf318f4a5d2165a9898cd2dc0a1
Deleted: sha256:d1165f2212346b2bab48cb01c1e39ee8ad1be46b87873d9ca7a4e434980a7726
Deleted: sha256:f22b99068db93900abe17f7f5e09ec775c2826ecfe9db961fea68293744144bd
刪除映像檔前須先確認沒有任何容器使用此映像檔,否則會顯示以下錯誤:
$ docker rmi hello-world
Error response from daemon: conflict: unable to remove repository reference "<映像檔名稱>" (must force) - container <容器ID> is using its referenced image <映像檔ID>
docker 的容器就是由映像檔建立的執行個體,一個容器執行一種應用程式。
指令: ps
(完整指令: docker container ls
)
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
eb6ff9333def php:8.0-apache "docker-php-entrypoi…" 24 hours ago Up 13 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp php80
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
144b93a47796 hello-world "/hello" 6 minutes ago Exited (0) 6 minutes ago test-docker
eb6ff9333def php:8.0-apache "docker-php-entrypoi…" 24 hours ago Up 2 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp php80
此指令會從映像檔建立一個新的容器,若映像檔不存在,會自動從 docker hub 取得映像檔。
映像檔名稱後面可用 :
指定映像檔的標籤。
指令: run [-d] [--rm] [--name <新容器名稱>] <映像檔名稱[:標籤名稱]> [程式執行指令]
(完整指令: docker container run
)
其他參數:
-d 讓容器在背景執行
--rm 容器停止時一併刪除容器
--name 指定新容器的名稱
hello-world 此容器最普遍用於檢測 docker 是否正確安裝,執行結果如下。
$ docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
建立一個映像檔為 alpine 的新容器,若此映像檔不存在,則會自動從 docker hub 取得。
取得映像檔後,會建立一個新容器。
容器建立完畢後,會執行 echo 'hello Linwebs!' 的指令。
可看到畫面中顯示 hello Linwebs!
$ docker run alpine echo 'hello Linwebs!'
Unable to find image 'alpine:latest' locally
latest: Pulling from library/alpine
29291e31a76a: Pull complete
Digest: sha256:eb3e4e175ba6d212ba1d6e04fc0782916c08e1c9d7b45892e9796141b1d379ae
Status: Downloaded newer image for alpine:latest
hello Linwebs!
在此指定新建立容器的名字為 test-docker,若不指定容器的名字,則 docker 會自動命名。
$ docker run --name test-docker hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
... 以下省略 ...
指令: stop <容器名稱/容器ID>
(完整指令: docker container stop
)
$ docker stop 7a17ca2c2c5f
7a17ca2c2c5f
$ docker stop php80
php80
指令: start <容器名稱/容器ID]>
(完整指令: docker container start
)
$ docker start php80
php80
指令: rm <容器名稱/容器ID>
(完整指令: docker container rm
)
$ docker rm test-docker
test-docker
執行容器內的指令。
指令: exec <容器名稱/容器ID> [程式執行指令]
(完整指令: docker container exec
)
在容器開啟虛擬終端裝置(TTY),並啟動互動模式,執行容器內的 shell,如同進入容器內進行操作。
以下為進入名稱為 php80 的容器,執行 bash 操控容器。
$ docker exec -it php80 bash
root@eb6ff9333def:/var/www/html#
參考資料: Docker — 從入門到實踐