1. 程式人生 > >《第一本Docker書》學習筆記——第3章 Docker入門

《第一本Docker書》學習筆記——第3章 Docker入門

應用程序 接受 inter ipad 此外 cannot settings info 為我

3.1 確保Docker已經就緒

查看docker是否正常工作:

sudo docker info

3.2 運行我們的第一個容器

現在,讓我們嘗試啟動第一個Docker容器。我們可以使用docker run命令創建容器。docker run命令提供了Docker容器的創建到啟動的功能,在本書中我們也會使用該命令來創建新容器。

代碼清單3-2 運行我們的第一個容器

sudo docker run -i -t ubuntu /bin/bash

其中,-i標誌保證容器中STDIN時是開啟的,盡管我們並沒有附著到容器中。持久的標準輸入是交互式shell的“半邊天”,-t標誌則是另外的半邊天,它告訴Docker為要創建的容器分配一個偽tty終端。這樣,新創建的容器才能提供一個交互式shell。若要在命令行下創建一個我們能與之進行交互的容器,而不是一個運行後臺服務的容器,則這兩個參數(指 -i

-t 這兩個參數)已經是最基本的參數了。
接下來我們是通過ubuntu來表示使用ubuntu鏡像。ubuntu鏡像是一個常備鏡像,也可以稱為“基礎”(base)鏡像,它由Docker公司提供,保存在Docker Hub Registry上。可以以ubuntu基礎鏡像(以及類似的fedora、debian、centos等鏡像)為基礎,在選擇的操作系統上構建自己的鏡像。到目前為止,我們基於此基礎景象啟動了一個容器,並且沒有對容器增加任何東西。
Docker在文件系統內會使用這個ubuntu鏡像創建一個新容器。該容器擁有自己的網絡、IP地址,以及一個用來和宿主機進行通信的橋接網絡接口。最後,我們告訴Docker在新容器中要運行什麽命令,在本例中我們在容器中運行/bin/bash
啟動了一個Bash shell。
在容器創建完畢之後,Docker就會執行容器中的/bin/bash命令,就像我們在命令行中看到的:

root@0d9624f5c022:/#

3.3 使用第一個容器

用戶可以繼續在容器中做任何事情。當所有的工作都結束了,輸入exit,就可以返回到Ubuntu宿主機的命令行提示符了。隨著/bin/bash的退出,容器也停止了運行!
但容器仍然是存在的,可以用docker ps -a命令查看當前系統中容器的列表。

3.4 容器命名

使用--name標誌來給容器命令。
代碼清單3-11 給容器命名

sudo docker run --name zifeiy_the_container -i -t ubuntu /bin/bash

如果要使用的容器名稱已經存在,可以先用docker rm命令刪除已有的同名容器後,再來創建新的容器。

3.5 重新啟動已經停止的容器

代碼清單3-12 啟動已經停止運行的容器

sudo docker start zifeiy_the_container

代碼清單3-13 通過ID啟動已經停止運行的容器

sudo docker start b12af0d40150

也可以使用docker restart命令來重新啟動一個容器。
類似的,Docker也提供了docker create命令來創建一個容器,但是並不運行它。這讓我們可以在自己的容器工作流中對其進行細粒度的控制。

3.6 附著到容器上

Docker容器重新啟動的時候,會沿用docker run命令時制定的參數來運行,因此我們的容器重新啟動後會運行一個交互式會話shell。此外,也可以用docker attach命令,重新附著到該容器的會話上。
代碼清單3-14 附著到正在運行的容器

sudo docker attach zifeiy_the_container

(attach之前要確保容器時運行著的:you cannot attach to a stopped container, start it first

3.7 創建守護式容器

除了這些交互式運行的容器(interactive container),也可以創建長期運行的容器。守護式容器(daemonized container)沒有交互式會話,非常適合運行應用程序和服務。大多數時候我們都需要以守護式來運行我們的容器。下面就來啟動一個守護式容器:
代碼清單3-17 創建長期運行的容器

sudo docker run --name daemon_zifeiy -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

代碼清單3-18 查看正在運行的daemon_zifeiy容器

sudo docker logs daemon_zifeiy

我們也可以在命令後使用-f參數來監控Docker的日誌,這與tail -f命令費城相似:
代碼清單3-20 跟蹤守護式容器的日誌

sudo docker logs -f daemon_zifeiy

其他參數:--tail 10
還可以使用-t標誌為每條日誌加上時間戳:
代碼清單3-21 跟蹤守護式容器的最新日誌

sudo docker logs -ft daemon_zifeiy

3.9 Docker日誌驅動

通過--log-driver選項來實現控制Docker守護進程和容器所用的日誌驅動。可以在啟動Docker守護進程或者執行docker run命令時使用這個選項。
json-file時默認的選項,json-file也為我們前面看到的docker logs命令提供了基礎。
其他可用的選項還包括syslog,該選項將禁用docker logs命令,並將所有容器的日誌輸出都重定向到Syslog。
還有一個選項是none,這個選項將會禁用所有容器中的日誌,導致docker logs命令也被禁用。
代碼清單3-22 在容器級別啟動Syslog

sudo docker run --log-driver="syslog" --name daemon_zifeiy2 -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

3.10 查看容器內的進程

使用docker top

sudo docker top daemon_zifeiy

3.11 Docker統計信息

使用docker stats

sudo docker stats zifeiy_the_container

3.12 在容器內部運行進程

使用docker exec
-d參數可以運行一個後臺任務;
-t -i參數可以運行一個交互式任務。
代碼清單3-26 在容器中運行後臺任務

sudo docker exec -d daemon_zifeiy touch /etc/new_config_file

代碼清單3-27 在容器內運行交互命令

sudo docker exec -t -i daemon_zifeiy /bin/bash

3.13 停止守護式容器

使用docker stop命令:
代碼清單3-28 停止正在運行的Docker容器

sudo docker stop daemon_zifeiy
註意 docker stop命令會向Docker容器進程發送SIGTERM信號。如果想快速停止某個容器,也可以使用docker kill命令來向容器進行發送SIGKILL信號。

3.14 自動重啟容器

如果由於某種錯誤而導致容器停止運行,還可以通過--restart標誌,讓Docker自動重新啟動該容器。--restart標誌會檢查容器的退出代碼,並據此來決定是否要重啟容器。默認的行為是Docker不會重啟容器。
代碼清單3-30 自動重啟容器

sudo docker run --restart=always --name daemon_zifeiy -d ubuntu /bin/sh "while true; do echo hello world; sleep 1; done"

在本例中,--restart標誌被設置為always。無論容器的退出代碼是什麽,Docker都會自動重啟該容器。除了always,還可以將這個標誌設為on-failure,這樣,只有當容器的退出代碼為非0值的時候,才會自動重啟。另外,on-failure還接受一個可選的重啟次數參數,如代碼清單3-31所示。
代碼清單3-31 為on-failure指定count參數

--restart=on-failure:5

這樣,當容器退出代碼為非0時,Docker會嘗試自動重啟該容器,最多重啟5次。

3.15 深入容器

除了通過docker ps命令獲取容器的信息,還可以使用docker inspect來獲得更多的容器信息:
代碼清單3-32 查看容器

sudo docker inspect daemon_zifeiy

docker inspect命令會對容器進行詳細的檢查,然後返回其配置信息,包括名稱、命令、網絡配置以及很多有用的數據。
也可以用-f或者--format標誌來選定查看結果:
代碼清單3-33 有選擇地獲取容器信息

sudo docker inspect --format=‘{{ .State.Running }}‘ daemon_zifeiy 
false

上面這條命令會返回容器的運行狀態,示例中該狀態為false。
我們還能回去其他有用的信息,如容器IP地址:
代碼清單3-34 查看容器的IP地址

sudo docker inspect --format ‘{{ .NetworkSettings.IPAddress }}‘ daemon_zifeiy
172.17.0.2

也可以同時指定多個容器,並顯示每個容器的輸出結果:
代碼清單3-35 查看多個容器

$ sudo docker inspect --format ‘{{.Name}} {{.State.Running}}‘ daemon_zifeiy zifeiy_the_container
/daemon_zifeiy false
/zifeiy_the_container false

所有的Docker容器都保存在/var/lib/docker/containers目錄下。

3.16 刪除容器

如果容器不再使用,可以使用docker rm命令來刪除它們:
代碼清單3-36 刪除容器

sudo docker rm 80430f8d0921

代碼清單3-37 刪除所有容器

sudo docker rm `sudo docker ps -a -q`

《第一本Docker書》學習筆記——第3章 Docker入門