第三章 docker 入門
3.1 確保docker已經(jīng)就緒
首先查看docker程序是否存在,功能是否正常
[#3#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker info
[sudo] password for cloudsoar:
Containers: 11
Images: 16
Server Version: 1.9.1
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
Backing Filesystem: extfs
Dirs: 38
3.2 運行我們的第一個容器
docker run 命令提供了Docker容器的創(chuàng)建到啟動的功能
書上使用此命令創(chuàng)建第一個容器
[#4#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker run -i -t ubuntu /bin/bash
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
073de23ee32b: Downloading 48.09 MB/65.69 MB
...
可以看到有大概66MB,等待慢慢下載完成。其實Ubuntu鏡像也是一個基礎(chǔ)鏡像。
sudo docker run -i -t ubuntu /bin/bash
這句命令我的理解就是,sudo 臨時切換管理員權(quán)限,使用 docker run 命令,啟動鏡像
ubuntu 中的 bash。docker run 會檢查本地是否有ubuntu這個基礎(chǔ)鏡像,如果沒有,
則去docker hub registry 去檢測并下載此鏡像,下載完畢再執(zhí)行。
由于容器有自己的ip,自己的shell,是獨立的。因此加上 -i 參數(shù)來打開容器的標準輸入
STDIN,使用 -t 給容器配一個交互式終端。當新容器下載完畢后,會自動以root用戶登
錄到新的容器中。界面顯示的是:root@容器ID 。容器的主機名就是容器的ID。
假設(shè)說我們想要給這個容器安裝一個curl,或者是 ping,可以通過如下命令
sudo docker run ubuntu apt-get install -y curl
docker run 容器名 命令
等了半個小時,還沒下載完畢,由于這個基礎(chǔ)鏡像下載實在太慢,我換了一個鏡像
我之前pull了一個名為paulcos11/docker-tutorial的鏡像,容器有11個
如果你想下載其他的鏡像,可以使用 docker search tutorial 首先查看可用鏡像。然后使用
docker pull 把它拉下來。
root@cloudsoar-virtual-machine:/home/cloudsoar# docker search tutorial
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
georgeyord/reactjs-tutorial This is the backend of the React comment b... 2 [OK]
mhausenblas/kairosdb-tutorial GitHub fetcher for KairosDB tutorial 1 [OK]
odk211/spree-tutorial 1 [OK]
paulcos11/docker-tutorial docker tutorial
root@cloudsoar-virtual-machine:/home/cloudsoar# docker pull paulcos11/docker-tutorial
Using default tag: latest
latest: Pulling from paulcos11/docker-tutorial
044ffdf80f70: Pull complete
...
Digest: sha256:8effcf1f4eac7096ba4eaf4a90261580657605d159946372c12ae28b7e5e74f1
Status: Downloaded newer image for paulcos11/docker-tutorial:latest
到這里,我成功下載了容器鏡像paulcos11/docker-tutorial
繼續(xù)流程,進入我們的容器
root@cloudsoar-virtual-machine:~# docker run -i -t paulcos11/docker-tutorial /bin/bash
root@537739299f24:/#
執(zhí)行完畢可以看到進入了容器的bash,用戶是root,容器ID是537739299f24,
3.3 使用容器
可以使用 hostname 查看容器的主機名
root@537739299f24:/# hostname
537739299f24
可以看到容器的ID就是容器的主機名。
下一步看看 /etc/hosts 文件
root@537739299f24:/# cat /etc/hosts
172.17.0.2 537739299f24
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
可以看到docker 已經(jīng)在host文件中為該容器的ijp增加了一條主機配置項
再看看IP
root@537739299f24:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
30: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe11:2/64 scope link
valid_lft forever preferred_lft forever
可以看到這里有l(wèi)o的回環(huán)接口。還有ip是172.17.0.2的標準eth0接口,和宿主機完全一樣。
查看容器 中的進程
root@537739299f24:/# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.2 0.1 21944 3528 ? Ss 03:03 0:01 /bin/bash
root 12 0.0 0.0 19188 2336 ? R+ 03:14 0:00 ps -aux
接下來,我想給容器安裝一個vim
這里我先更新下容器的源再安裝。
root@537739299f24:/# apt-get update && apt-get install vim
安裝完畢使用 exit,即可退出到宿主機系統(tǒng)。這時容器也會停止,因為一旦退出容器,
容器也隨之停止了運行。但是容器仍然存在,可以用 docker ps -a 查看容器列表。
root@537739299f24:/# exit
exit
docker ps 可以查看運行中的容器,加上 -a 參數(shù)可以查看所有的容器
3.4 容器命名
可以使用如下命令為容器指定一個合法有意義的名字。
root@cloudsoar-virtual-machine:~# docker run --name wzy_the_container -i -t paulcos11/docker-tutorial /bin/bash
root@0a09dfd688ea:/# exit
exit
3.5 重新啟動已經(jīng)停止的容器
此時,wzy_the_container 已經(jīng)停止了。可以使用如下命令重啟一個已經(jīng)停止的容器。
root@cloudsoar-virtual-machine:~# docker start wzy_the_container
wzy_the_container
也可以使用容器ID替換容器名。
3.6 附著到容器上
容器啟動的時候會按照docker run指定的參數(shù)來運行。因此這個容器啟動后會啟動一個交互
的shell。我可以使用 docker attach 直接附著到此容器。
root@cloudsoar-virtual-machine:~# docker attach wzy_the_container
root@0a09dfd688ea:/#
可以看到重新會到了容器的Bash提示符界面。
如果退出容器的shell,容器也會隨之停止運行。
3.7 創(chuàng)建守護式容器
除了交互式運行的容器,我們也可以創(chuàng)建守護容器。可以長期的運行應(yīng)用程序或者服務(wù)。
大多時候需要創(chuàng)建守護式容器。
[#10#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker run --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
cf5636f0499fa0105b845b5dfa61913ff7d5fccfb1b19c16b09ed2752233794d
由于此時第 3.2 步我下載的 Ubuntu 基礎(chǔ)鏡像Downloading 48.09 MB/65.69 MB 剛好下載
完畢,所以此時我開始使用ubuntu容器鏡像操作了。
docker run 的參數(shù) -d 是放到后臺執(zhí)行。此時我們并沒有像上一個容器直接附著到新容器的
shell會話上,而是返回了一個容器ID而已。此時使用 docker ps 可以看到正在運行的容器。

ubuntu就是我剛剛下載完畢的基礎(chǔ)鏡像。 paulcos11/docker-tutorial 是我自己下載的其他的鏡像。
3.8 容器內(nèi)部再搞什么
使用 docker logs 獲取容器日志
[#16#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker logs daemon_dave
hello world
hello world
hello world
hello world
hello world
hello world
或者可以加上-f 實時監(jiān)控容器日志。
sudo docker logs -f daemon_dave
也可以追蹤日志某一片段,只需要tail命令加入 -f --lines標志即可。
例如: docker logs --tail 10 daemon_dave 獲取最后10行日志即可。
docker logs --tail 0 -f daemon_dave 獲取最新日志。
如果要查看日志的時間,可以加上時間戳。
[#18#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker logs -ft daemon_dave
2016-03-15T03:45:28.457991514Z hello world
2016-03-15T03:45:29.472422582Z hello world
2016-03-15T03:45:30.475130491Z hello world
3.9 查看容器進程
查看容器內(nèi)的進程可以使用 docker top 命令。
[#20#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker top daemon_dave
UID PID PPID C STIME TTY TIME CMD
root 25381 22325 0 11:45 ? 00:00:00 /bin/sh -c while true; do echo hello world; sleep 1; done
3.10 在容器內(nèi)部運行進程
我們可以使用docker exec 命令在容器內(nèi)部額外啟動新進程,可以運行的進程有兩種類型,
交互式任務(wù)和后臺任務(wù)。首先我們使用 touch 命令創(chuàng)建一個空文件。
$sudo docker exec -d daemon_dave touch /etc/new_config_file
-d 表示是后臺進程。
或者打開一個shell
$sudo docker exec -t -i daemon_dave /bin/bash
root@cf5636f0499f:/#
3.11 停止守護式容器
$sudo docker stop daemon_dave
daemon_dave
3.12 自動重啟容器
如果由于某種錯誤導致容器停止,可以通過 --restart 標志讓docker自動重新啟動容器。
$sudo docker run --restart=on-failure:5 --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
Error response from daemon: Conflict. The name "daemon_dave" is already in use by container cf5636f0499f. You have to remove (or rename) that container to be able to reuse that name.
這里我的運行不起來,因為 -- restart 標示是docker 2.0 引入的。我的是docker 1.9版本。
3.13 深入容器
除了使用docker ps 查看容器信息,還可以使用 docker inspect 查看更多信息
$sudo docker inspect daemon_dave
[sudo] password for cloudsoar:
[
{
"Id": "cf5636f0499fa0105b845b5dfa61913ff7d5fccfb1b19c16b09ed2752233794d",
"Created": "2016-03-15T03:45:28.124542139Z",
"Path": "/bin/sh",
"Args": [
"-c",
"while true; do echo hello world; sleep 1; done"
],
"State": {
"Status": "exited",
"Running": false,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 0,
"ExitCode": 137,
"Error": "",
"StartedAt": "2016-03-15T03:45:28.455126857Z",
"FinishedAt": "2016-03-15T04:05:11.945521026Z"
},
...
也可使用 -f 或者 --format 標志來選定查看結(jié)果。
$sudo docker inspect --format='{{ .State.Running}}' daemon_dave
false
以及查看其他信息
$sudo docker start daemon_dave
daemon_dave
$sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' daemon_dave
172.17.0.3
3.14 刪除容器
如果容器不在使用,可以使用 docker rm 命令刪除。
這里假設(shè)我要刪除 daemon_dave 這個容器,他的容器ID是 cf5636f0499f
$sudo docker rm cf5636f0499f
Error response from daemon: Conflict, You cannot remove a running container. Stop the container before attempting removal or use -f
Error: failed to remove containers: [cf5636f0499f]
$sudo docker stop cf5636f0499f
cf5636f0499f
$sudo docker rm cf5636f0499f
cf5636f0499f
由于不能刪除正在運行的容器,所以需要先停止。
3.15 小結(jié)
下一章學習如何構(gòu)建自己的Docker鏡像,以及如何使用Docker 倉庫和 Docker Registry.