Docker 應用 "hello World"
Docker 允許你在容器內運行應用程序, 使用 docker run
命令來在容器內運行一個應用程序。
Hello world
現在讓我們來試試
$ sudo docker run ubuntu:14.04 /bin/echo 'Hello world' Hello world
剛纔你啓動了你的第一個容器!
那麼剛纔發生了什麼? 我們逐步來分析 docker run
命令做了哪些事情。
首先,我們指定了 docker
二進制執行文件和我們想要執行的命令 run
。docker run
組合會運行容器。
接下來,我們指定一個鏡像: ubuntu 14.04
。這是我們運行容器的來源。 Docker 稱此爲鏡像。在本例中,我們使用一個 Ubuntu 14.04
操作系統鏡像。
當你指定一個鏡像,Docker 首先會先從你的 Docker 本地主機上查看鏡像是否存在,如果沒有,Docker 就會從鏡像倉庫 Docker Hub 下載公共鏡像。
接下來,我們告訴 Docker 在容器內我們需要運行什麼命令:
/bin/echo 'Hello world'
當我們的容器啓動了 Docker 創建的新的 Ubuntu 14.04 環境,並在容器內執行 /bin/echo
命令後。我們會在命令行看到如下結果:
hello world
那麼,我們創建容器之後會發生什麼呢? 當命令狀態狀態處於激活狀態的時候 Docker 容器就會一直運行。這裏只要 "hello world" 被輸出,容器就會停止。
一個交互式的容器
讓我們嘗試再次運行 docker run
,這次我們指定一個新的命令來運行我們的容器。
$ sudo docker run -t -i ubuntu:14.04 /bin/bash root@af8bae53bdd3:/#
我們繼續指定了 docker run
命令,並啓動了 ubuntu:14.04
鏡像。但是我們添加了兩個新的標識(參數flags): -t
和 -i
。-t
表示在新容器內指定一個僞終端或終端,-i
表示允許我們對容器內的 (STDIN
) 進行交互。
我們在容器內還指定了一個新的命令: /bin/bash
。這將在容器內啓動 bash shell
所以當容器(container)啓動之後,我們會獲取到一個命令提示符:
root@af8bae53bdd3:/#
我們嘗試在容器內運行一些命令:
root@af8bae53bdd3:/# pwd / root@af8bae53bdd3:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
你可以看到我們運行 pwd
來顯示當前目錄,這時候顯示的是我們的根目錄。我們還列出了根目錄的文件列表,通過目錄列表我們看出來這是一個典型的 Linux 文件系統。
你可以在容器內隨便的玩耍,你可以使用 exit
命令或者使用 CTRL-D 來退出容器。
root@af8bae53bdd3:/# exit
與我們之前的容器一樣,一旦你的 Bash shell 退出之後,你的容器就停止了。
Hello world 守護進程
現在當一個容器運行完一個命令後就會退出,但是這樣看起來有時候並不好。讓我們創建一個容器以進程的方式運行,就像大多數我們運行在 Docker 中的應用程序一樣,這裏我們可以使用 docker run
命令:
$ sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done" 1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147
等等,怎麼回事?我們的 “hello world” 輸出呢?讓我們看看它是怎麼運行的。這個命令看起來應該很熟悉.我們運行docker run
,但是我們指定了一個 -d
標識。-d
標識告訴 docker 在容器內以後臺進程模式運行。
我們也指定了一個相同的鏡像: ubuntu:14.04
最終,我們指定命令行運行:
/bin/sh -c "while true; do echo hello world; sleep 1; done"
這是一個忠實的 hello world 進程:一個腳本會一直輸出 "hello world"
爲什麼我們看不到的一大堆的 "hello world" ? 而是docker返回的一個很長的字符串:
1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147
這個長的字符串叫做容器ID(container ID)。它對於每一個容器來說都是唯一的,所以我們可以使用它。
注意:容器 ID 是有點長並且非常的笨拙,稍後我們會看到一個短點的 ID,某些方面來說它是容器 ID 的簡化版。
我們可以根據容器 ID 查看 "hello world" 進程發生了什麼
首先,我們要確保容器正在運行。我們可以使用 docker ps
命令來查看。docker ps
命令可以查詢 docker 進程的所有容器。
$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1e5535038e28 ubuntu:14.04 /bin/sh -c 'while tr 2 minutes ago Up 1 minute insane_babbage
這裏我們看到了以進程模式運行的容器。docker ps
命令會返回一些有用的信息,這裏包括一個短的容器 ID:1e5535038e28
。
我們還可以查看到構建容器時使用的鏡像, ubuntu:14.04
,當命令運行之後,容器的狀態隨之改變並且被系統自動分配了名稱 insane_babbage
。
注意:當容器啓動的時候 Docker 會自動給這些容器命名,稍後我們可以看到我們如何給容器指定名稱。
好了,現在我們知道它正在運行。但是我們能要求它做什麼呢?做到這,我們需要在我們容器內使用 docker logs
命令。讓我們使用容器的名稱來填充 docker logs
命令。
$ sudo docker logs insane_babbage hello world hello world hello world . . .
docker logs
命令會查看容器內的標準輸出:這個例子裏輸出的是我們的命令 hello world
太棒了!我們的 docker 進程是工作的,並且我們創建了我們第一個 docker 應用。
現在我們已經可以創建我們自己的容器了,讓我們處理正在運行的進程容器並停止它。我們使用 docker stop
命令來停止容器 。
$ sudo docker stop insane_babbage insane_babbage
docker stop
命令會通知 Docker 停止正在運行的容器。如果它成功了,它將返回剛剛停止的容器名稱。
讓我們通過 docker ps
命令來檢查它是否還工作。
$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
太好了,我們的容器停止了。