文章目錄
本文大部分內容來自Docker–從入門到實踐
命令 | 功能 |
---|---|
docker images [-a] |
查看本地鏡像 |
docker images -q |
只顯示鏡像的id 信息 |
docker rmi [-f] <鏡像> |
刪除指定鏡像 |
docker ps [-a] |
查看當前正在運行的容器,-a 表示顯示所有的容器 |
docker pull [選項] [Docker Registry 地址[:端口號]/]倉庫名[:標籤] |
從 Docker 鏡像倉庫獲取鏡像 |
docker run <鏡像> |
根據某個鏡像創建容器,如果鏡像不存在,就去遠方拉取 |
docker run -d |
讓容器在後臺運行,其實就是一個進程 |
docker run --name NAME |
給容器指定一個名字 |
docker run -p [容器宿主機端口]:[容器端口] |
將容器的端口映射到宿主機的端口 |
docker exec -it <容器> [bash|/bin/bash|sh] |
進入到某個容器中,通過命令交互 |
鏡像操作
獲取鏡像
docker pull [選項] [Docker Registry 地址[:端口號]/]倉庫名[:標籤]
具體的選項可以通過 docker pull --help
命令看到,這裏我們說一下鏡像名稱的格式。
- Docker 鏡像倉庫地址:地址的格式一般是
<域名/IP>[:端口號]
。默認地址是 Docker Hub。 - 倉庫名:如之前所說,這裏的倉庫名是兩段式名稱,即
<用戶名>/<軟件名>
。對於 Docker Hub,如果不給出用戶名,則默認爲library
,也就是官方鏡像。
docker pull ubuntu:18.04
# 18.04: Pulling from library/ubuntu
# 23884877105a: Pull complete
# bc38caa0f5b9: Pull complete
# 2910811b6c42: Pull complete
# 36505266dcc6: Pull complete
# Digest: sha256:3235326357dfb65f1781dbc4df3b834546d8bf914e82cce58e6e6b676e23ce8f
# Status: Downloaded newer image for ubuntu:18.04
# docker.io/library/ubuntu:18.04
上面的命令中沒有給出 Docker 鏡像倉庫地址,因此將會從 Docker Hub 獲取鏡像。而鏡像名稱是 ubuntu:18.04
,因此將會獲取官方鏡像 library/ubuntu
倉庫中標籤爲 18.04
的鏡像。
從下載過程中可以看到我們之前提及的分層存儲的概念,鏡像是由多層存儲所構成。下載也是一層層的去下載,並非單一文件。下載過程中給出了每一層的 ID 的前 12 位。並且下載結束後,給出該鏡像完整的 sha256
的摘要,以確保下載一致性。
列出鏡像
要想列出已經下載下來的鏡像,可以使用 docker image ls
命令。鏡像 ID 則是鏡像的唯一標識,一個鏡像可以對應多個 標籤。
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 c3c304cb4f22 4 weeks ago 64.2MB
gitlab/gitlab-ce latest 6597e56a80f3 5 weeks ago 1.92GB
hello-world latest bf756fb1ae65 4 months ago 13.3kB
列出特定的某個鏡像
# 倉庫名列出鏡像
$ docker image ls ubuntu
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 f753707788c5 4 weeks ago 127 MB
ubuntu latest f753707788c5 4 weeks ago 127 MB
# 指定倉庫名和標籤
$ docker image ls ubuntu:18.04
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 f753707788c5 4 weeks ago 127 MB
指定過濾器顯示鏡像
# mongo:3.2 之後建立的鏡像
$ docker image ls -f since=mongo:3.2
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 5f515359c7f8 5 days ago 183 MB
nginx latest 05a60462f8ba 5 days ago 181 MB
# mongo:3.2 之前建立的鏡像
$ docker image ls -f before=mongo:3.2
...
# 使用label過濾
$ docker image ls -f label=com.example.version=0.1
...
顯示鏡像摘要 DIGEST
$ docker image ls --digests
REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
ubuntu 18.04 sha256:3235326357dfb65f1781dbc4df3b834546d8bf914e82cce58e6e6b676e23ce8f c3c304cb4f22 4 weeks ago 64.2MB
gitlab/gitlab-ce latest sha256:9be324293de2447c7b19146b58b01d2fae5b8539364bc4b4e0b3ffc45625006e 6597e56a80f3 5 weeks ago 1.92GB
hello-world latest sha256:8e3114318a995a1ee497790535e7b88365222a21771ae7e53687ad76563e8e76 bf756fb1ae65 4 months ago 13.3kB
顯示鏡像的ID
$ docker image ls -q
c3c304cb4f22
6597e56a80f3
bf756fb1ae65
# 刪除所有倉庫名爲 redis 的鏡像:
$ docker image rm $(docker image ls -q redis)
# 刪除所有在 mongo:3.2 之前的鏡像:
$ docker image rm $(docker image ls -q -f before=mongo:3.2)
自定義顯示列表,這裏用到了Go 的模板語法。
$ docker image ls --format "{{.ID}}: {{.Repository}}"
5f515359c7f8: redis
05a60462f8ba: nginx
# 以表格等距顯示,並且有標題行
$ docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"
IMAGE ID REPOSITORY TAG
5f515359c7f8 redis latest
05a60462f8ba nginx latest
fe9198c04d62 mongo 3.2
刪除本地鏡像
docker image rm [選項] <鏡像短 ID|鏡像長 ID|鏡像名|鏡像摘要1> [<鏡像2> ...]
Aliases:
rm, rmi, remove
容器操作
新建並啓動容器
下面的命令於ubuntu:18.04
鏡像新建一個容器並啓動輸出一個 “Hello World”,之後終止容器
docker run ubuntu:18.04 /bin/echo 'Hello world'
# Hello world
啓動一個 bash 終端,允許用戶進行交互
docker run -t -i ubuntu:18.04 /bin/bash
root@af8bae53bdd3:/#
-t
選項讓Docker分配一個僞終端(pseudo-tty)並綁定到容器的標準輸入上,
-i
則讓容器的標準輸入保持打開。在交互模式下的操作,就跟使用一臺虛擬機一樣了。
當利用 docker run
來創建容器時,Docker 在後臺運行的標準操作包括:
- 檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
- 利用鏡像創建並啓動一個容器
- 分配一個文件系統,並在只讀的鏡像層外面掛載一層可讀寫層
- 從宿主主機配置的網橋接口中橋接一個虛擬接口到容器中去
- 從地址池配置一個 ip 地址給容器
- 執行用戶指定的應用程序
- 執行完畢後容器被終止
容器名字和映射端口
-p
參數用來指定容器和宿主機的映射端口,-name
用來指定容器的名字。
docker run --name webserver -d -p 80:80 nginx
後臺運行
通過添加 -d
參數來實現
$ docker run -d ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
77b2dc01fe0f3f1265df143181e7b9af5e05279a884f4776ee75350ea9d8017a
啓動已經終止的容器
docker <containerName|containerID> start
終止一個容器
docker <containerName|containerID> stop
終止狀態的容器可以用 docker container ls -a
命令查看。
重啓一個容器
docker <containerName|containerID> restart
進入容器
在使用 -d
參數時,容器啓動後會進入後臺。某些時候需要進入容器進行操作,就可以使用exec
命令。
docker exec -it <containerName|containerID> /bin/bash
只用 -i
參數時,由於沒有分配僞終端,界面沒有我們熟悉的 Linux 命令提示符,但命令執行結果仍然可以返回。
當 -i
-t
參數一起使用時,則可以看到我們熟悉的 Linux 命令提示符。
$ docker exec -i 69d1 bash
ls
bin
boot
dev
...
$ docker exec -it 69d1 bash
root@69d137adef7a:/#
刪除容器
可以使用 docker container rm
來刪除一個處於終止狀態的容器。例如
$ docker container rm <containerName|containerID>
trusting_newton
如果要刪除一個運行中的容器,可以添加 -f
參數。Docker 會發送 SIGKILL
信號給容器。
清理所有處於終止狀態的容器
用 docker container ls -a
命令可以查看所有已經創建的包括終止狀態的容器,如果數量太多要一個個刪除可能會很麻煩,用下面的命令可以清理掉所有處於終止狀態的容器。
$ docker container prune
容器的導入和導出
將文件拷貝到本機
docker container cp
命令用於從正在運行的 Docker 容器裏面,將文件拷貝到本機。下面是拷貝到當前目錄的寫法。
docker container cp [containID]:[/path/to/file] .
查看日誌
docker container logs
命令用來查看 docker 容器的輸出,即容器裏面 Shell 的標準輸出。如果docker run
命令運行容器的時候,沒有使用-it
參數,就要用這個命令查看輸出。
docker container logs [containerID]