全面易懂的Docker指令大全

快速建立你的第一個Docker服務

最簡單的Docker Container程式

最常執行的Docker指令就是run,我們就拿前幾章提到多次的範例來說明:

$ docker run busybox echo "hello world"
hello world

就是在標準輸出stdout列出hello world

Docker建立的網頁服務

接下來使用一個沒有執行指令,而是單純啟動Container。其實這個Container並不是沒有執行程式,而是預先設定好的啟動程式已經設定在這個Container的來源映像檔joshhu/webdemo中了。

$ docker run -d --name web -p 8080:80 joshhu/webdemo

這個指令可以建立一個標準的apache/php的網頁服務,指令及參數說明如下:

  • run:標準的Docker建立Container並執行指令
  • -drun指令的無數值參數,背景執行。
  • --name webrun指令的文字參數,指定這個Container的名字為web
  • -p 8080:80run指令的數值參數,把主機的8080通訊埠所有流量轉發到web這個Container的80通訊埠。
  • joshhu/webdemorun指令的文字參數,使用joshhu/webdemo來填入web這個Container。 Docker用指令加參數就可以完成99%的動作,非常方便。

建立並啟動Container:docker run/create

讀者一定很希望快速建立一個Docker服務。我們就來看看你的第一個Docker應用程式,官方使用Hello world!,我們也不例外: docker run busybox echo "hello world"

$ docker run busybox echo "hello world"
Unable to find image 'busybox:latest' locally
511136ea3c5a: Pull complete
df7546f9f060: Pull complete
ea13149945cb: Pull complete
4986bf8c1536: Pull complete
busybox:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.

Status: Downloaded newer image for busybox:latest
hello world

這就是標準的docker run指令,後面先接著映像檔名稱busybox,然後再在由busybox這個映像檔所建立容器中,執行echo "hello world"這個指令。如果我們再執行一次,由於已經下載映像檔到到本機了,因此就會直接顯示結果

$ docker run busybox echo "hello world"
hello world

短短一個指令,其實已經經過了Container的建立、執行、停止等步驟了。

  • docker run:Container建立並執行。
  • busybox:建立這個Container的映像檔。
  • echo "hello world":Container中執行echo "hello world"指令,並且將結果輸出到Container所代表的標準輸出上。
  • 執行完之後,Container就停止,但還是存在!!

查看Container:docker ps

我們可以使用docker ps指令來查看執行中的Container,但由於這個Container已經執行完畢,因此用docker ps是無法看到。此時要加-a參數,列出所有的Container,包括已經執行結束的(即死掉的Container)。 docker ps -a

$ docker run busybox echo "hello world"
hello world
$ docker run busybox echo "hello world"
hello world
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                      PORTS               NAMES
743b1d2c496c        busybox:latest      "echo 'hello world'"   18 seconds ago      Exited (0) 18 seconds ago                       prickly_pasteur
16d0080388ed        busybox:latest      "echo 'hello world'"   24 seconds ago      Exited (0) 23 seconds ago                       evil_almeida

上面可以看出,使用沒有參數的docker ps時,只會列出正在執行的Container,但echo指令執行完即結束,因此只能用docker ps -a列出已經執行完,死掉但還沒消失的Container。其STATUS是Exited (0) 18 seconds ago,表示18秒前執行完成。那怎麼樣讓一個Container能一直執行下去,不要死掉或消失呢?