天天看點

54個你必須懂的docker指令

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、      

繼續閱讀