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](https://hub.docker.com/)?下載公共鏡像。
接下來,我們告訴 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
~~~
太好了,我們的容器停止了。
- 關于Docker
- 鏡像簡介
- 安裝篇
- Mac OS X
- Ubuntu
- Red Hat Enterprise Linux
- CentOS
- Debain
- Gentoo
- Google Cloud Platform
- Rackspace Cloud
- Amazon EC2
- IBM Softlayer
- Arch Linux
- FrugalWare
- Fedora
- openSUSE
- CRUX Linux
- Microsoft Windows
- Binaries
- 用戶指南
- 使用Docker Hub
- 在Docker中運行應用
- 使用容器
- 使用docker鏡像
- 連接容器
- 管理容器數據
- 使用Docker Hub
- Docker Hub
- 賬戶
- 存儲庫
- 自動構建
- 官方案例
- Docker中運行MongoDB
- Docker中運行Redis服務
- Docker中運行PostgreSQL
- Docker中運行Riak服務
- Docker中運行SSH進程服務
- Docker中運行CouchDB服務
- Docker中運行Apt-Cacher-ng服務