Docker 概念及基本用法


Docker 概念及基本用法

一、 本節內容簡介

本實驗中我們初步接觸Docker的概念和基本用法。需要依次完成下面幾項任務:

  1. 理解Docker是什么
  2. 學習如何在Linux上安裝Docker
  3. 學習如何使用Docker Hub
  4. 創建第一個Hello Shiyanlou的Docker應用
  5. Docker基本的容器和鏡像管理
  6. 推薦閱讀:深入淺入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

上面命令的說明:

  1. -t:分配一個 pseudo-TTY
  2. -i--interactive參數縮寫,表示交互模式,如果沒有 attach 保持 STDIN 打開狀態
  3. ubuntu:運行的鏡像名稱,默認為latest 標簽
  4. /bin/bash:容器中運行的應用

新創建容器的bash中,在bash里執行的任何命令都不會影響到我們的宿主機,可以隨意操作。你可以看到主機名和環境變量 HOSTNAME 都已經顯示為容器的ID了。

在這個bash下,我們可以進行各種Ubuntu系統上的操作,當然因為Docker本身的限制,有些涉及到磁盤、網絡、設備等Linux特權命令是無法執行的,可以試試reboot命令,會提示你shutdown: Unable to shutdown system

如何退出這個bash呢?有兩種方法,兩種方法的效果完全不同:

  1. 直接 exit,這時候 bash 程序終止,容器進入到停止狀態
  2. 使用組合鍵退出,仍然保持容器運行,我們可以隨時回來到這個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的容器:

步驟說明:

  1. docker ps -a 查看當前所有的容器,得到該容器的ID
  2. docker start 啟動該容器
  3. 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 命令我們可以列出當前系統上所有的鏡像信息:

其中:

  1. REPOSITORY:倉庫名稱
  2. TAG:標簽名,一個倉庫可以有若干個標簽對應不同的鏡像,默認都是latest
  3. IMAGE ID:鏡像ID
  4. CREATED:創建時間,注意不是本地的pull時間
  5. 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

上述命令說明:

  1. docker ps 查看運行的容器
  2. docker rm -f 6c86 強制刪除運行的容器
  3. docker rmi shiyanlou 刪除shiyanlou鏡像
  4. docker images 查看鏡像列表

九、總結

  1. 理解Docker是什么
  2. 學習如何在Linux上安裝Docker
  3. 學習如何使用Docker Hub
  4. 創建第一個Hello Shiyanlou的Docker應用
  5. Docker基本的容器和鏡像管理

請務必保證自己能夠動手完成整個實驗,只看文字很簡單,真正操作的時候會遇到各種各樣的問題,解決問題的過


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM