Docker 概念及基本用法
一、 本節內容簡介
本實驗中我們初步接觸Docker的概念和基本用法。需要依次完成下面幾項任務:
- 理解Docker是什么
- 學習如何在Linux上安裝Docker
- 學習如何使用Docker Hub
- 創建第一個Hello Shiyanlou的Docker應用
- Docker基本的容器和鏡像管理
- 推薦閱讀:深入淺入docker docker核心技術預覽:http://www.infoq.com/cn/articles/docker-core-technology-preview
二、Docker概念
1、容器技術
Linux容器技術很早就有了,比較有名的是被集成到主流Linux內核中的LXC項目。容器通過對操作系統的資源訪問進行限制,構建成獨立的資源池,讓應用運行在一個相對隔離的空間里,同時容器間也可以進行通信。
容器技術對比虛擬化技術,容器比虛擬化更輕量級,對資源的消耗小很多。容器操作也更快捷,啟動和停止都要比虛擬機快。但Docker容器需要與主機共享操作系統內核,不能像虛擬機那樣運行獨立的內核。
Docker是一個基於LXC技術構建的容器引擎,基於GO語言開發,遵循Apache2.0協議開源。Docker的發展得益於為使用者提供了更好的容器操作接口。包括一系列的容器,鏡像,網絡等管理工具,可以讓用戶簡單的創建和使用容器。
Docker支持將應用打包進一個可以移植的容器中,重新定義了應用開發,測試,部署上線的過程,核心理念就是 Build once, Run anywhere
。
Docker容器技術的典型應用場景是開發運維上提供持續集成和持續部署的服務。
下面我們開始介紹Docker中的幾個基本概念。
2、鏡像
Docker的鏡像概念類似於虛擬機里的鏡像,是一個只讀的模板,一個獨立的文件系統,包括運行容器所需的數據,可以用來創建新的容器。
鏡像可以基於Dockerfile構建,Dockerfile是一個描述文件,里面包含若干條命令,每條命令都會對基礎文件系統創建新的層次結構。
用戶可以通過編寫Dockerfile創建新的鏡像,也可以直接從類似github的Docker Hub上下載鏡像使用。
3、容器
Docker容器是由Docker鏡像創建的運行實例。Docker容器類似虛擬機,可以支持的操作包括啟動,停止,刪除等。每個容器間是相互隔離的,但隔離的效果比不上虛擬機。容器中會運行特定的應用,包含特定應用的代碼及所需的依賴文件。
在Docker容器中,每個容器之間的隔離使用Linux的 CGroups
和 Namespaces
技術實現的。其中 CGroups
對CPU,內存,磁盤等資源的訪問限制,Namespaces
提供了環境的隔離。
4、倉庫
如果你使用過 git
和 github
就很容易理解Docker的倉庫概念。Docker倉庫相當於一個 github
上的代碼庫。
Docker 倉庫是用來包含鏡像的位置,Docker提供一個注冊服務器(Registry)來保存多個倉庫,每個倉庫又可以包含多個具備不同tag的鏡像。Docker運行中使用的默認倉庫是 Docker Hub 公共倉庫。
倉庫支持的操作類似 git
,創建了新的鏡像后,我們可以 push
提交到倉庫,也可以從指定倉庫 pull
拉取鏡像到本地。
三、安裝
1、Ubuntu 上安裝最新Docker
只需要執行下面的命令就可以安裝:
$ sudo apt-get update
$ sudo apt-get install docker
ps:但是Ubuntu默認的源中版本是1.5
,太老了,目前實驗樓環境中安裝的是最新的 Docker 1.10
版本。
安裝的時候添加的是Docker官方的apt-get
源,安裝過程如下:
$ sudo apt-get update
$ sudo apt-get install apt-transport-https ca-certificates
$ sudo apt-key adv
--keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
添加文件/etc/apt/sources.list.d/docker.list
,然后向文件中寫入下面的內容:
deb https://apt.dockerproject.org/repo ubuntu-trusty main
最后再次執行安裝命令:
$ sudo apt-get update
$ sudo apt-get install docker-engine
更多安裝選項可以參考:https://docs.docker.com/engine/installation/linux/ubuntulinux/
安裝完成后,可以使用 docker version
查看Docker的版本信息
四、基本命令
1、查看Docker命令
$ docker
2、查看指定命令的幫助docker command --help
,例如啟動命令docker run --help
:
五、Docker 服務
1、配置Docker服務啟動選項,可以通過修改文件 /etc/default/docker
來實現,查看實驗樓中已有的配置文件內容:
看到其中的啟動參數為 DOCKER_OPTS
,表示 Docker 服務啟動時會監聽在 tcp://127.0.0.1:4243
。
如果你修改這個文件則需要重新啟動 Docker 服務。
停止Docker服務:$ sudo service docker stop
啟動Docker服務:$ sudo service docker start
查看 Docker 服務狀態:$ sudo service docker status
六、例:
1、需求描述
Docker 安裝后,我們開始嘗試啟動第一個 Docker 應用。這個應用很簡單,作用就是輸出一句 Hello, Shiyanlou!
。
2、需求分析
應用執行的命令是 echo "Hello, Shiyanlou"
,我們需要為這個影響構建一個運行的容器,讓這條命令在容器中運行,運行后容器自動退出。
3、解決方案
首先,我們需要有一個鏡像來運行這個應用,這里我們選擇用 busybox
鏡像,直接使用 docker run
命令來運行容器:
$ docker run busybox echo "Hello, Shiyanlou"
其中后面跟的 busybox 是鏡像的名字, busybox 鏡像不需要提前從倉庫中下載到本地,因為 Docker會首先在本地查找,如果找不到就會自動從 Docker Hub 或系統配置的默認 Registry 中下載 busybox 鏡像。
最后的 echo "Hello, Shiyanlou"
是在容器中運行的命令。docker run
命令會基於指定的鏡像運行一個容器實例,然后把后續的命令傳遞給該容器內部運行。
該操作運行的結果會在屏幕上輸出 Hello, Shiyanlou
。
運行過程見上圖所示,第一個箭頭指向的是運行的命令,第二個箭頭表示在本地沒有查找到 busybox:latest
的鏡像,所以需要從遠端的Docker Registry 中 pull,鏡像下載下來后進入到執行應用階段,最后一個箭頭表示應用執行完畢輸出了Hello, shiyanlou!
字符串到屏幕上。
執行 docker ps
命令查看運行的容器列表:
發現沒有任何容器在運行,原因是容器運行了 echo 命令后已經終止,進入到停止狀態,需要用 docker ps -a
命令查看。
在這個命令的輸出中我們看到列表里有一個處於 Exited (0 3 minutes ago)
的容器,這個容器表示大約3分鍾之前終止。列表中還包括該容器的ID,是用的鏡像,執行的命令,創建的時間等信息。最后一個是為容器隨機設置的名稱,也可以通過run
的參數進行設置為指定名稱,注意同一個服務器上的容器不可以同名。
七、容器管理
本節實驗中我們創建幾個容器,並介紹 docker 容器管理中最常用的幾個命令。
1、docker run
最主要的是創建運行容器的命令 docker run
,這個命令的參數非常多,可以通過docker run --help
查看。
繼續上一節實驗,echo 命令運行后容器就退出了,如果我們需要一個保持運行的容器呢,最簡單的方法就是給這個容器一個可以保持的應用,比如bash
,運行 ubuntu 容器並進入容器的 bash:
$ docker run -t -i ubuntu /bin/bash
上面命令的說明:
-t
:分配一個pseudo-TTY
-i
:--interactive
參數縮寫,表示交互模式,如果沒有attach
保持 STDIN 打開狀態ubuntu
:運行的鏡像名稱,默認為latest
標簽/bin/bash
:容器中運行的應用
新創建容器的bash中,在bash里執行的任何命令都不會影響到我們的宿主機,可以隨意操作。你可以看到主機名和環境變量 HOSTNAME
都已經顯示為容器的ID了。
在這個bash下,我們可以進行各種Ubuntu系統上的操作,當然因為Docker本身的限制,有些涉及到磁盤、網絡、設備等Linux特權命令是無法執行的,可以試試reboot
命令,會提示你shutdown: Unable to shutdown system
。
如何退出這個bash呢?有兩種方法,兩種方法的效果完全不同:
- 直接
exit
,這時候 bash 程序終止,容器進入到停止狀態 - 使用組合鍵退出,仍然保持容器運行,我們可以隨時回來到這個bash中來,組合鍵是
Ctrl-p Ctrl-q
,你沒有看錯,是兩組組合鍵,先同時按下Ctrl
和p,再按Ctrl
和q。就可以退出到我們的宿主機了。
上述第二種方法比較常用,此時使用 docker ps
查看,能看到容器仍然在運行中:
注意:有些瀏覽器把Ctrl-Q
作為退出標簽的快捷鍵,可能在執行上述命令時實驗樓的頁面會關掉,不過沒有關系,重新打開實驗樓的網站登陸后點擊頭像旁邊的繼續實驗
就能夠再次回到實驗桌面。
如果想再次回到剛才的bash中,只需要使用 docker attach
命令就可以再次連接到運行的bash里:
注意: 命令后面的參數是容器的ID,並不需要輸入完整的數字,只要能唯一定位這個容器即可,通常輸入4位就足夠了。
本節只是針對Docker有一個基本的概念,docker run
的其他參數我們將在后續的實驗課程中詳細介紹。
2、docker ps
docker ps
命令用來查看正在運行的容器:
幾個最常用的參數:
-a
:查看所有容器,含停止運行的-l
:查看剛啟動的容器-q
:只顯示容器ID
我們查看所有容器的ID列表:
docker start
docker start
啟動容器,此處我們嘗試啟動先前的運行/bin/bash
的容器:
步驟說明:
docker ps -a
查看當前所有的容器,得到該容器的IDdocker start
啟動該容器docker ps
再次查看運行的容器
最后我們可以通過 docker attach
連接到該bash上繼續操作。
3、docker stop
docker stop
停止容器,此處我們停止剛才啟動的/bin/bash
容器:
此處還有一些其他的類似命令,比如 docker restart
重啟運行中的容器,相當於先stop
,再start
。
4、docker inspect 容器id
查看 Docker 容器或鏡像的一些內部信息:
啟動並查看 /bin/bash
容器:
返回的信息非常多,是JSON格式,每一項內容具體含義本節不做詳細介紹,可以參考官方文檔。
5、docker rm
刪除容器操作。該命令默認不可以刪除運行的容器,但提供了強制刪除的參數-f
,下面的實驗操作中我們嘗試刪除一個運行容器會報錯,只可以把停止狀態的Hello, shiyanlou!
容器刪除:
6、docker top
查看容器中運行的進程信息,顯示容器中進程的PID,UID,PPID,時間,tty等信息。
本節作為入門介紹,無法涵蓋所有命令,后續單獨的容器管理
實驗中學習更多的操作命令。
八、鏡像管理
這里介紹鏡像獲取和創建的最常見的方法。更多實驗會在鏡像管理
實驗中學習。
1、查看鏡像列表
docker images
命令我們可以列出當前系統上所有的鏡像信息:
其中:
- REPOSITORY:倉庫名稱
- TAG:標簽名,一個倉庫可以有若干個標簽對應不同的鏡像,默認都是
latest
- IMAGE ID:鏡像ID
- CREATED:創建時間,注意不是本地的pull時間
- SIZE:鏡像大小
2、獲取鏡像
最簡單的獲取鏡像的方式是從 Docker Hub上 pull
最新的鏡像,比如我們想要一個 busybox
的鏡像,直接使用命令:
$ docker pull busybox
由於我們已經在第一步驟Hello, shiyanlou!
中下載過這個鏡像,則會顯示如下信息:
查看鏡像列表 docker images
,可以看到新pull的鏡像已經在列表里了:
可以查看 Docker Hub 查看別人做好的鏡像,這個網站上有很多制作很好的官方鏡像,可以避免我們自己在制作鏡像過程中重復造輪子。
3、創建鏡像
最常用的是寫一個Dockerfile,從Dockerfile里創建新的鏡像。
Dockerfile的詳細編寫方法我們后續有專門的實驗介紹,此處只寫一個最簡單的Dockerfile來介紹。
使用 vim 或 gedit 打開一個文件 Dockerfile
:
$ cd /home/shiyanlou/
$ mkdir shiyanlouimage
$ cd shiyanlouimage/
$ vim Dockerfile
在文件中輸入以下內容:
from ubuntu:latest
ENV HOSTNAME=shiyanlou
保存退出編輯器。
這個 Dockerfile
中只有兩行,第一行表示基於哪個鏡像創建新的鏡像,類似於程序開發中的 import
或 include
,我們這里以 ubuntu:latest
鏡像為基礎創建新的鏡像。第二行是在新的鏡像中我們要對基礎鏡像 ubuntu:latest
做的改變。這句是設置一個環境變量HOSTNAME
等於shiyanlou
。
完成 Dockerfile 后,使用 docker build
命令進行構建:
$ cd /home/shiyanlou/shiyanlouimage/
$ docker build -t shiyanlou .
這個命令中第一個參數 -t shiyanlou
指定創建的新鏡像的名字,第二個參數是一個點 .
指定從當前目錄查找 Dockerfile 文件。
命令執行過程截圖:
執行完成后我們 docker images
命令中就可以看到新的 shiyanlou
鏡像了。
我們現在運行這個 shiyanlou 鏡像並進入到bash環境:
$ docker run -t -i shiyanlou /bin/bash
進入到bash后,我們查看鏡像是否已經設置了HOSTNAME
環境變量:
$ echo $HOSTNAME
還記得如何退出bash並保持運行嗎?那個組合鍵。
4、清理鏡像
退出到宿主機后,請使用 docker rm
命令刪除容器,並使用 docker rmi
刪除鏡像。
$ docker rmi shiyanlou
$ docker images
上述命令說明:
docker ps
查看運行的容器docker rm -f 6c86
強制刪除運行的容器docker rmi shiyanlou
刪除shiyanlou鏡像docker images
查看鏡像列表
九、總結
- 理解Docker是什么
- 學習如何在Linux上安裝Docker
- 學習如何使用Docker Hub
- 創建第一個Hello Shiyanlou的Docker應用
- Docker基本的容器和鏡像管理
請務必保證自己能夠動手完成整個實驗,只看文字很簡單,真正操作的時候會遇到各種各樣的問題,解決問題的過