Docker (一) 運行容器

Docker 應用 "hello World"

Docker 允許你在容器內運行應用程序, 使用 docker run 命令來在容器內運行一個應用程序。

Hello world

現在讓我們來試試

$ sudo docker run ubuntu:14.04 /bin/echo 'Hello world'
Hello world

剛纔你啓動了你的第一個容器!

那麼剛纔發生了什麼? 我們逐步來分析 docker run 命令做了哪些事情。

首先,我們指定了 docker 二進制執行文件和我們想要執行的命令 rundocker 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

太好了,我們的容器停止了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章