Docker是一個不斷發展的系統,開發人員積極改進使用和性能。是以指令總是在變化。docker一些老的指令經常被棄用,并被新的或更有效的指令取代。您可以使用幫助選項檢查Docker安裝上的最新可用指令:
$ docker --help
要使用特定指令的選項,可以使用該指令的help選項。例如,要使用docker run指令選項,可以使用以下指令:
$ docker run --help
目前,有13個管理指令和41個通用指令。下面是我們的docker指令:
- docker attach-将本地輸入/輸出/錯誤流附加到正在運作的容器。
- docker commit-從容器的目前更改狀态建立一個新鏡像。
- docker exec-在正在運作的容器中運作指令。
- docker history-顯示鏡像的曆史記錄。
- docker info-顯示系統資訊,包括鏡像和容器數。
- docker inspect-查找有關Docker容器和鏡像的系統級資訊。
- docker login-登入到本地系統資料庫或Docker Hub。
- docker pull-從本地系統資料庫或Docker Hub中提取鏡像或存儲庫。
- docker ps-列出容器的各種屬性。
- docker restart-停止并啟動容器。
- docker rm-移除容器。
- docker rmi-删除鏡像。
- docker run-在一個獨立的容器中運作一個指令。
- docker search-在Docker Hub中搜尋鏡像。
- docker start-啟動已經停止的容器。
- docker stop-停止運作容器。
- docker version -提供Docker版本資訊。
讓我們深入研究一下使用這些docker指令可以執行的各種操作。
注意:對于部分資訊轉儲,我們使用了三個點(…)。
顯示Docker版本和系統資訊
當您在工作時,您通常都需要檢查Docker版本和Docker系統資訊。您可以使用以下指令查找Docker版本:
$ docker versionClient:Version: 18.03.0-ceAPI version: 1.37Go version: go1.9.4Git commit: 0520e24Built: Wed Mar 21 23:06:22 2018OS/Arch: darwin/amd64Experimental: falseOrchestrator: swarmServer:Engine:Version: 18.03.0-ceAPI version: 1.37 (minimum version 1.12)Go version: go1.9.4Git commit: 0520e24Built: Wed Mar 21 23:14:32 2018OS/Arch: linux/amd64Experimental: true
另一個重要的指令是docker info:
$ docker info
Containers: 0Running: 0Paused: 0Stopped: 0Images: 0Server Version: 18.03.0-ceStorage Driver: overlay2Backing Filesystem: extfsSupports d_type: trueNative Overlay Diff: trueLogging Driver: json-fileCgroup Driver: cgroupfsPlugins:Volume: localNetwork: bridge host ipvlan macvlan null overlayLog: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
…
它将向您顯示各種重要資訊,如伺服器版本、存儲驅動程式、核心版本、作業系統、總記憶體等等。當您試圖為目前的Docker安裝增加新的資源或試圖解決系統級資源配置設定問題時,這些資訊可能很有用。這也是一種快速檢查正在運作、暫停和停止的容器數量以及下載下傳到系統的鏡像數量的方法。
搜尋和下載下傳Docker鏡像
您可以使用docker search指令在docker hub上搜尋已經可用的鏡像。
$ docker search ubuntu
NAME DESCRIPTION STARS OFFICIAL AUTOMATEDubuntu Ubuntu is a Debian-based Linux operating sys… 7861 [OK]dorowu/ubuntu-desktop-lxde-vnc Ubuntu with openssh-server and NoVNC 190 [OK]rastasheep/ubuntu-sshd Dockerized SSH service, built on top of offi… 156 [OK]ansible/ubuntu14.04-ansible Ubuntu 14.04 LTS with ansible 93 [OK]ubuntu-upstart Upstart is an event-based replacement for th… 87 [OK]neurodebian NeuroDebian provides neuroscience research s… 50 [OK]
…
上面的搜尋顯示了對Ubuntu可用的鏡像及其描述。
讓我們下載下傳最著名的Ubuntu鏡像。您可以使用docker pull指令:
$ docker pull ubuntu
Using default tag: latestlatest: Pulling from library/ubuntu6b98dfc16071: Pull complete4001a1209541: Pull complete6319fc68c576: Pull completeb24603670dc3: Pull complete97f170c87c6f: Pull completeDigest: sha256:5f4bdc3467537cbbe563e80db2c3ec95d548a9145d64453b06939c4592d67b6dStatus: Downloaded newer image for ubuntu:latest$
玩轉Docker鏡像
您可以使用docker info指令查找您擁有的鏡像數量:
$ docker info
Containers: 0Running: 0Paused: 0Stopped: 0Images: 1…
該 docker images指令将詳細列出您擁有的鏡像:
$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEubuntu latest 113a43faa138 2 weeks ago 81.2MB
假設您決定下載下傳nginx圖像。你可以運作另一個docker pull 指令:
$ docker pull nginx
現在,如果您檢視Docker鏡像,您會看到如下内容:
$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEubuntu latest 113a43faa138 2 weeks ago 81.2MBnginx latest cd5239a0906a 2 weeks ago 109MB
您可以在此處找到有關這些鏡像的更多資訊:
- Docker Hub官方
- Ubuntu
- nginx
您可以使用這些頁面查找鏡像的特定版本。在Ubuntu頁面上,您會注意到Ubuntu的最新版本是18.04。如果要查找16.04版本的Ubuntu,可以使用16.04标記下載下傳該特定版本:
$ docker pull ubuntu:16.04
然後你将會有兩個Ubuntu鏡像版本:
$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEubuntu 16.04 5e8b97a2a082 2 weeks ago 114MBubuntu latest 113a43faa138 2 weeks ago 81.2MBnginx latest cd5239a0906a 2 weeks ago 109MB
注意:您不需要注冊Docker Hub即可拉取鏡像。但是,如果要将圖像推送到Docker Hub,則需要注冊,然後使用Docker login指令登入:
$ docker login --username = yourhubusername --email = [email protected]
運作鏡像的Docker容器
假設您想在docker上運作nginx伺服器。運作以下指令:
$ docker run -p 8080:80 nginx
docker run指令從先前從Docker Hub中提取的nginx鏡像建立了一個nginx容器。“-p 8080:80”告訴Docker将本地主機端口8080映射到Docker容器的端口80。您應該能夠從http://localhost:8080通路nginx伺服器。
nginx容器附加到指令行。是以,如果退出指令行,容器将不再運作。您可以使用detach(“-d”)選項啟動nginx容器,這樣即使您退出指令行,它也可以繼續運作。
$ docker run -p 8080:80 -d nginx
上面的指令将以分離模式啟動容器并傳回指令行。
列出Docker容器
該 docker ps 指令允許您查找正在運作的所有容器。
$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES6162daed25da nginx "nginx -g 'daemon of…" 7 minutes ago Up 7 minutes 0.0.0.0:8080->80/tcp hardcore_torvalds
它顯示了容器的各種屬性。您可以看到它是從nginx鏡像建立的,并且還顯示了端口轉發資訊。容器ID和名稱屬性需要特别說明。您可以使用這些屬性來唯一地辨別容器。這兩個屬性都是自動生成的。但您也可以在容器建立過程中為容器命名。讓我們建立一個名為“my_nginx”的nginx容器:
$ docker run --name my_nginx -p 8888:80 -d nginx
讓我們再次列出Docker容器:
$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESe7b19b6ad778 nginx "nginx -g 'daemon of…" About a minute ago Up About a minute 0.0.0.0:8888->80/tcp my_nginx6162daed25da nginx "nginx -g 'daemon of…" 15 minutes ago Up 16 minutes 0.0.0.0:8080->80/tcp hardcore_torvalds
注意,新容器的名稱是“my_nginx”。當您處理大量容器時,可以使用命名規則。這将幫助您更好地組織容器。
docker ps指令隻顯示正在運作的容器。如果對上述情況使用docker info指令:
$ docker info
Containers: 2Running: 2Paused: 0Stopped: 0Images: 3…
您可以看到有兩個容器正在運作。如果您有一個暫停或停止的容器,您必須使用a ll(“-a”)選項:
$ docker ps -a
啟動,停止,重新啟動和殺掉容器
假設您要停止'my_nginx'容器。您可以使用CONTAINER ID或NAME。在這種情況下,讓我們使用名稱:
$ docker stop my_nginx
my_nginx我們列出Docker容器:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES6162daed25da nginx "nginx -g 'daemon of…" 27 minutes ago Up 27 minutes 0.0.0.0:8080->80/tcp hardcore_torvalds
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESe7b19b6ad778 nginx "nginx -g 'daemon of…" 12 minutes ago Exited (0) About a minute ago my_nginx6162daed25da nginx "nginx -g 'daemon of…" 27 minutes ago Up 27 minutes 0.0.0.0:8080->80/tcp hardcore_torvalds
如果docker ps 沒有-a選項運作,它隻顯示正在運作的容器。在第二種情況下,您可以看到'my_nginx'容器處于退出狀态。
讓我們docker start容器:
$ docker start my_nginx
my_nginx
如果您檢視Docker容器清單:
$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESe7b19b6ad778 nginx "nginx -g 'daemon of…" 16 minutes ago Up 29 seconds 0.0.0.0:8888->80/tcp my_nginx6162daed25da nginx "nginx -g 'daemon of…" 30 minutes ago Up 30 minutes 0.0.0.0:8080->80/tcp hardcore_torvalds
您可以看到STATUS顯示容器'my_nginx'再次啟動。
如果由于某些問題而想要停止并啟動容器,可以使用restart指令。它比單獨停止和啟動容器更快:
$ docker restart my_nginx
您可以像程序一樣終止docker容器。讓我們殺掉'my_nginx'容器:
$ docker kill my_nginx
再次列出Docker容器:
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESe7b19b6ad778 nginx "nginx -g 'daemon of…" 22 minutes ago Exited (137) 7 seconds ago my_nginx6162daed25da nginx "nginx -g 'daemon of…" 36 minutes ago Up 36 minutes 0.0.0.0:8080->80/tcp hardcore_torvalds
容器my_nginx未運作。此外,您可以在資訊中看到您有一個正在運作的容器和一個已停止的容器:
$ docker info
Containers: 2Running: 1Paused: 0Stopped: 1Images: 3
…使用啟動或重新啟動Docker指令來啟動被殺掉的容器。
Docker exec bash 和Docker SSH 進入容器
您通常需要與容器的shell進行互動,以建立服務或解決問題。可以使用docker exec指令建立互動式shell。讓我們用bash shell從Ubuntu鏡像啟動一個容器:
$ docker run --name my_ubuntu -it ubuntu:latest bash
root@a19c770b8621:/#
這 root@hash# 意味着您位于Docker容器的bash shell中。您可以運作shell指令:
root@a19c770b8621:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr varroot@a19c770b8621:/# pwd
/
您可以列出Docker容器:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESa19c770b8621 ubuntu:latest "bash" About a minute ago Up About a minute my_ubuntu6162daed25da nginx "nginx -g 'daemon of…" About an hour ago Up About an hour 0.0.0.0:8080->80/tcp hardcore_torvalds
你可以看到'my_ubuntu'正在運作。假設你想将Docker ssh放入容器'my_ubuntu'中。你可以使用 docker exec bash方法:
$ docker exec -it my_ubuntu bash
root@a19c770b8621:/#
注意,指令提示符的容器ID和bash比對。是以,您将ssh放入容器“my-ubuntu”的結果是成功的。
使用docker exec向容器中發出指令。例如,您可以直接從指令提示符在“my_buntu”docker容器上運作ls指令:
$ docker exec -it my_ubuntu ls
bin dev home lib64 mnt proc run srv tmp varboot etc lib media opt root sbin sys usr連接配接到正在運作中的容器
在上面的示例中,您以附加模式啟動了Ubuntu容器。相反,您可以在分離模式下啟動它:
$ docker run -it -d --name my_ubuntu_2 ubuntu:latest bash
75b28b7208359137b3e1dc2843387918e28b4c6c4860ef0cdeac79c205f5cbc4
驗證容器是否正在運作:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES75b28b720835 ubuntu:latest "bash" 3 minutes ago Up 3 minutes my_ubuntu_2a19c770b8621 ubuntu:latest "bash" 15 minutes ago Up 15 minutes my_ubuntu6162daed25da nginx "nginx -g 'daemon of…" 2 hours ago Up 2 hours 0.0.0.0:8080->80/tcp hardcore_torvalds
使用該 docker attach 指令獲得 docker exec 類似的效果:
$ docker attach my_ubuntu_2
root@75b28b720835:/#
檢視鏡像的建立曆史。
Docker社群建構了docker鏡像。這些鏡像是分層建立的。您可以使用Docker history指令檢視鏡像的建立方式。我們先來看看你有什麼鏡像:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZEubuntu 16.04 5e8b97a2a082 2 weeks ago 114MBubuntu latest 113a43faa138 2 weeks ago 81.2MBnginx latest cd5239a0906a 2 weeks ago 109MB
讓我們來看看'nginx'鏡像的曆史:
$ docker history nginx
IMAGE CREATED CREATED BY SIZE COMMENTcd5239a0906a 2 weeks ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B <missing> 2 weeks ago /bin/sh -c #(nop) STOPSIGNAL [SIGTERM] 0B <missing> 2 weeks ago /bin/sh -c #(nop) EXPOSE 80/tcp 0B <missing> 2 weeks ago /bin/sh -c ln -sf /dev/stdout /var/log/nginx… 22B <missing> 2 weeks ago /bin/sh -c set -x && apt-get update && apt… 53.7MB <missing> 2 weeks ago /bin/sh -c #(nop) ENV NJS_VERSION=1.15.0.0.… 0B <missing> 2 weeks ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.15.0-… 0B <missing> 7 weeks ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B <missing> 8 weeks ago /bin/sh -c #(nop) CMD ["bash"] 0B <missing> 8 weeks ago /bin/sh -c #(nop) ADD file:ec5be7eec56a74975… 55.3MB
您可以使用鏡像的history指令來了解最近發生了什麼變化。如果在從已經使用的新版本鏡像啟動容器後發現問題,此指令可以幫助您找到原因。或者,也可以使用以下版本的指令:
$ docker image history nginx
擷取容器/鏡像的中繼資料。
您可以使用docker inspect指令查找關于您的系統的低級資訊。運作docker ps指令列出docker容器:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES6162daed25da nginx "nginx -g 'daemon of…" 2 hours ago Up 2 hours 0.0.0.0:8080->80/tcp hardcore_torvalds
讓我們使用CONTAINER ID來檢查容器(您也可以使用容器名稱):
$ docker inspect 6162daed25da
[{"Id": "6162daed25da50b98afca5f7ed8caca2289bf309b2547d87ae8674b899d604a4","Created": "2018-06-25T05:46:37.902211302Z","Path": "nginx","Args": [
………
"DriverOpts": null}}}}]
該指令将以JSON格式提供大量資訊。以下是查找容器IP位址的技巧:
$ docker inspect 6162daed25da | grep "IPAddress"
"SecondaryIPAddresses": null, "IPAddress": "172.17.0.2", "IPAddress": "172.17.0.2",
容器與主機之間的資料拷貝
我們列出Docker容器:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES6162daed25da nginx "nginx -g 'daemon of…" 3 hours ago Up 3 hours 0.0.0.0:8080->80/tcp hardcore_torvalds
nginx容器在端口8080上運作。是以,如果你通路http://localhost:8080,你會看到以下内容:
“Welcome to nginx!”
如果您看到此頁面,則nginx Web伺服器已成功安裝并正常運作。需要進一步配置。
讓我們在你的本地目錄中建立這個index.html:
<html><Header><title>My Website</title></header><body>Hello world</body></html>
讓我們使用docker exec -ls指令和檢視nginx容器中包含index.html檔案的檔案夾:
$ docker exec -it hardcore_torvalds ls /usr/share/nginx/html
50x.html index.html
使用您建立的本地檔案覆寫容器的index.html檔案:
$ docker cp index.html hardcore_torvalds:usr/share/nginx/html/
現在,如果您再次通路http://localhost:8080,您應該看到“hello world”。
可以使用docker cp指令在主機和建立的容器之間移動檔案。
建立鏡像
假設您要從您建立的“Hello World”容器建立将來的容器。為了制作更多“Hello World”容器,您必須将目前“Hello World”容器儲存為鏡像。
首先,停止容器:
$ docker stop hardcore_torvalds
現在列出所有Docker容器:
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES75b28b720835 ubuntu:latest "bash" About an hour ago Exited (0) About an hour ago my_ubuntu_2a19c770b8621 ubuntu:latest "bash" 2 hours ago Exited (0) About an hour ago my_ubuntu6162daed25da nginx "nginx -g 'daemon of…" 3 hours ago Exited (0) 27 seconds ago hardcore_torvalds
從STATUS中,您可以看到'hardcore_torvalds '容器已停止。使用該 docker commit指令建立新鏡像:
$ docker commit 6162daed25da nginx_hello_world_template
sha256:117d060587a316035ed5a776e613d9cfbeee9fbfe202c6edc9203820c7da987b現在,如果您檢視鏡像,您将看到新鏡像:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZEnginx_hello_world_template latest 117d060587a3 40 seconds ago 109MBubuntu 16.04 5e8b97a2a082 2 weeks ago 114MBubuntu latest 113a43faa138 2 weeks ago 81.2MBnginx latest cd5239a0906a 2 weeks ago 109MB
您可以像使用其他鏡像一樣使用此鏡像并啟動新的Docker容器。新建立的容器将具有“Hello world”頁面,而不是“Welcome nginx ”頁面。使用示例:
$ docker run -it -d -p 8886:80 nginx_hello_world_template4e042d76c39125471951626ba42cd609a65c73f041943298f74f4fc43dc5596a$
删除容器與鏡像
Docker容器和鏡像會占用硬碟空間,是以需要定期清理。讓我們首先停止所有Docker容器,然後列出所有容器。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES4e042d76c391 nginx_hello_world_template "nginx -g 'daemon of…" 2 minutes ago Exited (0) 8 seconds ago boring_keldysh75b28b720835 ubuntu:latest "bash" 2 hours ago Exited (0) About an hour ago my_ubuntu_2a19c770b8621 ubuntu:latest "bash" 2 hours ago Exited (0) About an hour ago my_ubuntu6162daed25da nginx "nginx -g 'daemon of…" 3 hours ago Exited (0) 11 minutes ago hardcore_torvalds
有4個處于停止狀态的容器。您可以使用該 docker rm 指令删除容器:
$ docker rm 4e042d76c391 75b28b720835 a19c770b8621 6162daed25da
4e042d76c39175b28b720835a19c770b86216162daed25da
除了容器ID之外,還可以使用名稱。現在列出容器:
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES我們列出Docker鏡像:$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZEnginx_hello_world_template latest 117d060587a3 11 minutes ago 109MBubuntu 16.04 5e8b97a2a082 2 weeks ago 114MBubuntu latest 113a43faa138 2 weeks ago 81.2MBnginx latest cd5239a0906a 2 weeks ago 109MB
$ docker rmi 117d060587a3 5e8b97a2a082 113a43faa138 cd5239a0906a
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE、