【Docker】走進Docker

Docker簡介

什麼是Docker?

  • Docker是一個容器引擎,提供了一套完整的容器解決方案。
  • Docker是2014年最火熱的開源項目,由Docker公司(www.docker.com)領導開發,基於Apache2.0開源授權協議發行。
  • Docker是用Go語言開發的,其源碼在https://github.com/docker/docker。
  • Docker的官方文檔在https://docs.docker.com。

什麼是容器?

  • 容器是一種歷史悠久的虛擬化技術,如OpenVZ,Solaris上的Zones,Linux上的LXC等,都是容器的不同實現方式。
  • 一個容器實質上就是運行在宿主機上的一個進程。只不過在啓動這個進程之前,進行了一些特殊處理,讓這個進程進入了一個全新的虛擬環境,與宿主機環境分開,所以這個進程以及它的子進程認爲自己運行在一個獨立的世界裏面。

容器的優勢

  • 相比於傳統的KVM、ZEN等虛擬化及半虛擬化技術來說:
  • 創建容器速度快,速度在1秒左右,而傳統虛擬機需要15秒以上。
  • 刪除容器速度快,速度也在幾秒左右。
  • 容器在運行期間佔用的額外開銷非常小。在一個宿主機上,能運行的容器數量更多。

正因爲容器的這些輕、快的特點,所以容器技術右叫做「輕量虛擬化」技術,在很多場合下,容器技術比傳統虛擬化技術更有優勢。

Docker之前的各種容器技術,最大問題是使用起來不方便,只有少數技術高手才能熟練應用。而Docker的最大優勢就是讓容器的管理變得極其方便,不需要掌握高深的技術就能使用。

什麼是Docker鏡像?

每個Docker容器運行在獨立的虛擬環境中,虛擬環境包括多個方面,其中最重要的就是獨立的文件系統;在這個文件系統的讀寫操作,即不影響宿主機的文件系統,也不影響其他容器的文件系統。

Docker鏡像是一個比較複雜的概念,現階段,我們可以簡單地把Docker鏡像理解成一個目錄。Docker Server在啓動容器的時候,先根據這個鏡像目錄,複製出一個新的目錄,然後在容器進程啓動時,讓這個進程chroot到這個新的目錄下。這樣,這個目錄就成了這個容器的根文件系統(rootfs)。

Tips: 在宿主機中使用chroot aufs/mnt/容器編號 可以進入容器的文件系統

查看鏡像:

通過docker images指令來查看本地有哪些鏡像

  1. 鏡像ID:每個鏡像有一個唯一的ID,長度爲64個字符。通常只使用前12個字符就可以了
  2. 鏡像TAG:每個鏡像上可以打上一個或多個TAG
  3. 鏡像Repository:每個鏡像存儲在一個倉庫中
  4. Repositoty:TAG  唯一標識了一個鏡像

Docker Registry:

  • 鏡像和鏡像倉庫存儲在Registry中
  • 本地Registry:通過docker images查看的就是本地Redistry
  • 官方Registry:Docker官方維護了一個Registry,裏面存儲了各種各樣的鏡像。

從官方Registry拉取鏡像:

Docker剛安裝完,本地Registry是空的。因此我們需要從Docker官方Registry來拉取鏡像。docker pull命令用於從官方Registry拉取鏡像。

如果從Docker官方Registry拉取鏡像的速度很慢,可以嘗試daocloud提供的加速器服務。https://dashboard.daocloud.io/mirror有詳細使用方法介紹。

運行容器:

docker run命令用於運行容器。

docker run是最常用也是最複雜的命令,通過docker help run我們可以看到該命令有很多選項,其中最常用的選項包括:

  • -i -t      這兩個選項經常一起使用,可以縮寫爲-it,用於創建交互式容器。
  • -d        讓容器運行在後臺,用於創建守護式容器。
  • --name 爲容器指定一個名稱

容器運行成功後,會返回一個64字符的容器ID,作爲容器的唯一標識。類似於鏡像ID,容器ID也可以採用簡寫形式。

運行交互式容器:

通過如下命令來運行一個交互式容器:

sudo docker run -it centos:6 /bin/bash

  • -it                  指定要創建交互容器
  • centos:6       以倉庫:TAG的形式指定了鏡像名稱
  • /bin/bash      容器對應的進程,會啓動一個新的shell

通過如上的命令,我們啓動了新的shell,並運行在容器環境中。由於是一個交互式容器,所有我們會離開當前的shell,被這個新的shell帶入到容器的虛擬世界中,此後我們在這個shell裏面執行的任何命令,都是相對於這個虛擬世界的。

當我們在新的shell裏面執行exit,就結束了這個bash進程,從而也結束了這個容器,我們從虛擬世界又返回到宿主機的現實世界。

交互式容器適合一些臨時性的任務,當退出bash的時候,交互式容器的生命也就結束了。大多數場合下,我們需要的是守護式容器。

通過如下方式運行守護式容器:

 sudo  docker run -d redis

  • -d          創建守護式容器
  • redis     鏡像名稱     這裏只有倉庫名稱,沒有指定TAG,那麼就使用默認TAG‘latest’

沒有指定命令,那麼會使用鏡像所提供的默認命令。redis鏡像的默認命令是/entrypoint.sh redis-server

守護式容器運行在後臺,這樣我們就可以繼續留在當前shell中進行其他操作。

通過docker ps命令可以查看容器的基本信息,包括容器ID、命令、狀態等;

sudo  docker ps          查看運行中的容器

Tips : 在上述命令後加上-a ,可以查看所有運行過的容器,包括已經退出的。

docker ps命令只能查看容器的基本信息;

docker inspect命令則可以查看容器的詳細信息。

sudo  docker inspect [ID]

docker inspect返回的信息是JSON格式的,非常豐富。有時候我們需要獲取這些信息來進行二次開發。

docker inspect -f   則可以指定查看某種信息,例如查看容器的IP地址:

sudo docker inspect -f '{{.NetworkSettings.IPAddress}}' [ID]

docker stop命令用來停止一個正在運行的守護式容器

sudo  docker stop [ID]

docker rm命令用來刪除容器:

sudo  docker rm [ID]

Tips:容器停止後,並不會被自動刪除

刪除完之後再運行docker ps -a,會發現容器已經消失了

安裝Docker:

目前Docker已可以安裝到絕大多數Linux發行版上,包括Ubuntu、CentOS、Redhat等,也可以安裝到蘋果Mac OS上。

需要注意的是,目前Docker只支持64位操作系統

  • 通過uname -i,如果是x86_64則爲64位操作系統
  • 確認Linux內核版本>=3.10,通過uname -r可以查看到內核版本信息。

在Ubuntu系統上通過apt-get命令來安裝軟件

Ubuntu官方軟件倉庫提供了Docker的穩定版,通過如下步驟進行安裝:

  1. sudo  apt-get update
  2. sudo apt-get install docker.io
  3. 運行 ps axf|grep docker來驗證
  4. 運行sudo  docker version查看docker版本

可以從Docker的私有軟件倉庫來安裝最新版,安裝步驟如下:

在Ubuntu上,按如下方式來啓動和運行Docker server:

Docker架構

Docker是一個經典的CS架構:

  • Docker Server:它是一個守護進程(Daemon),一直運行在後臺。它其中內嵌了一個Web Server。
  • Docker Client:它是一個命令行工具,通過HTTP協議與Docker Server交互
  • 巧妙的是,Docker Server與Docker Client共用同一個可執行文件。通過which docker這個命令就可以找到它安裝後的路徑。

Docker應用實驗

實驗描述:

  1. 先創建一個守護式容器A運行Redis Server
  2. 再創建一個交互式容器B,在裏面安裝Redis客戶端
  3. 最後使用Redis客戶端去訪問Redis Server

本實驗模擬了需要兩個機器,分別運行客戶端和服務端程序的場景

實驗步驟:

  1. 拉取Redis鏡像
  2. 創建守護式容器A,運行Redis Server
  3. 獲取A的IP地址
  4. 創建交互式容器B
  5. 在B裏面安裝Redis客戶端
  6. 從B中訪問容器A的Redis數據庫。

回顧:

什麼是Docker?

什麼是容器?

如何安裝Docker?

Docker鏡像和鏡像倉庫。

Docker容器的創建、刪除、停止、查看等基本命令。