最常執行的Docker指令就是run
,我們就拿前幾章提到多次的範例來說明:
$ docker run busybox echo "hello world"
hello world
就是在標準輸出stdout
列出hello world
。
接下來使用一個沒有執行指令,而是單純啟動Container。其實這個Container並不是沒有執行程式,而是預先設定好的啟動程式已經設定在這個Container的來源映像檔joshhu/webdemo
中了。
$ docker run -d --name web -p 8080:80 joshhu/webdemo
這個指令可以建立一個標準的apache/php
的網頁服務,指令及參數說明如下:
run
:標準的Docker建立Container並執行指令-d
:run
指令的無數值參數,背景執行。--name web
:run
指令的文字參數,指定這個Container的名字為web
。-p 8080:80
:run
指令的數值參數,把主機的8080
通訊埠所有流量轉發到web
這個Container的80
通訊埠。joshhu/webdemo
:run
指令的文字參數,使用joshhu/webdemo
來填入web
這個Container。
Docker用指令加參數就可以完成99%的動作,非常方便。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所代表的標準輸出上。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能一直執行下去,不要死掉或消失呢?