1. 程式人生 > >Docker入門實戰-SSH連線docker容器

Docker入門實戰-SSH連線docker容器

簡介

什麼是Docker

Docker 是一個開源專案,誕生於 2013 年初,最初是 dotCloud 公司內部的一個業餘專案。它基於 Google 公司推出的 Go 語言實現。 專案後來加入了 Linux 基金會,遵從了 Apache 2.0 協議,專案程式碼在 GitHub 上進行維護。

Docker 自開源後受到廣泛的關注和討論,以至於 dotCloud 公司後來都改名為 Docker Inc。Redhat 已經在其 RHEL6.5 中集中支援 Docker;Google 也在其 PaaS 產品中廣泛應用。

Docker 專案的目標是實現輕量級的作業系統虛擬化解決方案。 Docker 的基礎是 Linux 容器(LXC)等技術。

在 LXC 的基礎上 Docker 進行了進一步的封裝,讓使用者不需要去關心容器的管理,使得操作更為簡便。使用者操作 Docker 的容器就像操作一個快速輕量級的虛擬機器一樣簡單。

下面的圖片比較了 Docker 和傳統虛擬化方式的不同之處,可見容器是在作業系統層面上實現虛擬化,直接複用本地主機的作業系統,而傳統方式則是在硬體層面實現。

Alt text

Alt text

為什麼要用Docker

作為一種新興的虛擬化方式,Docker 跟傳統的虛擬化方式相比具有眾多的優勢。

首先,Docker 容器的啟動可以在秒級實現,這相比傳統的虛擬機器方式要快得多。 其次,Docker 對系統資源的利用率很高,一臺主機上可以同時執行數千個 Docker 容器。

容器除了執行其中應用外,基本不消耗額外的系統資源,使得應用的效能很高,同時系統的開銷儘量小。傳統虛擬機器方式執行 10 個不同的應用就要起 10 個虛擬機器,而Docker 只需要啟動 10 個隔離的應用即可。

具體說來,Docker 在如下幾個方面具有較大的優勢。

更快速的交付和部署

對開發和運維(devop)人員來說,最希望的就是一次建立或配置,可以在任意地方正常執行。

開發者可以使用一個標準的映象來構建一套開發容器,開發完成之後,運維人員可以直接使用這個容器來部署程式碼。 Docker 可以快速建立容器,快速迭代應用程式,並讓整個過程全程可見,使團隊中的其他成員更容易理解應用程式是如何建立和工作的。 Docker 容器很輕很快!容器的啟動時間是秒級的,大量地節約開發、測試、部署的時間。

更高效的虛擬化

Docker 容器的執行不需要額外的 hypervisor 支援,它是核心級的虛擬化,因此可以實現更高的效能和效率。

更輕鬆的遷移和擴充套件

Docker 容器幾乎可以在任意的平臺上執行,包括物理機、虛擬機器、公有云、私有云、個人電腦、伺服器等。 這種相容性可以讓使用者把一個應用程式從一個平臺直接遷移到另外一個。

更簡單的管理

使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分發和更新,從而實現自動化並且高效的管理。

對比傳統虛擬機器總結

特性 容器 虛擬機器
啟動 秒級 分鐘即
硬碟使用 一般為MB 一般為GB
效能 接近原生 弱於
系統支援量 單機支援上千個容器 一般幾十個

安裝Docker

本來打算在CentOS6上安裝Docker,最終由於CentOS6上自帶的kernel版本太低導致Docker啟動失敗而放棄(kernel升級太繁瑣)。

Alt text

下面使用CentOS7安裝Docker,本人採用虛擬機器的方式來安裝,安裝好的虛擬機器必須保證能訪問外網。

CentOS7 系統 CentOS-Extras 庫中已帶 Docker,可以直接安裝:

$ sudo yum install docker

安裝之後啟動 Docker 服務,並讓它隨系統啟動自動載入:

$ sudo service docker start
$ sudo chkconfig docker on

獲取映象

可以使用 docker pull 命令來從倉庫獲取所需要的映象。

下面的例子將從 Docker Hub 倉庫下載一個Centos6並且安裝了jdk7的映象:

$ docker pull tcbenkhard/centos6-jdk7

Alt text

列出本地映象

使用 docker images 顯示本地已有的映象。

$ docker images

Alt text

啟動容器

啟動容器有兩種方式,一種是基於映象新建一個容器並啟動,另外一個是將在終止狀態(stopped)的容器重新啟動。

因為 Docker 的容器實在太輕量級了,很多時候使用者都是隨時刪除和新建立容器。
下面的命令則啟動一個 bash 終端,允許使用者進行互動。

$ docker run -t -i docker.io/tcbenkhard/centos6-jdk7 /bin/bash
[root@ffe81683c404 /]#

Alt text

其中,-t 選項讓Docker分配一個偽終端(pseudo-tty)並繫結到容器的標準輸入上,-i 則讓容器的標準輸入保持開啟。

當利用 docker run 來建立容器時,Docker 在後臺執行的標準操作包括:
(1)檢查本地是否存在指定的映象,不存在就從公有倉庫下載
(2)利用映象建立並啟動一個容器
(3)分配一個檔案系統,並在只讀的映象層外面掛載一層可讀寫層
(4)從宿主主機配置的網橋介面中橋接一個虛擬介面到容器中去
(5)從地址池配置一個 ip 地址給容器
(6)執行使用者指定的應用程式
(7)執行完畢後容器被終止

可以使用下面命令來檢視CentOS版本資訊:

$ cat /etc/redhat-release

修改root密碼

使用passwd密碼來修改密碼(如提示沒有這個命令列使用yum install passwd安裝):

$ passwd
    xxx密碼
    xxx確認密碼

安裝Openssh

使用下面命令安裝ssh server/ssh client:

$ sudo yum -y install openssh-server
$ sudo yum -y install openssh-clients

修改SSH配置檔案以下選項,去掉#註釋,將四個選項啟用:

$ vi /etc/ssh/sshd_config

RSAAuthentication yes #啟用 RSA 認證
PubkeyAuthentication yes #啟用公鑰私鑰配對認證方式
AuthorizedKeysFile .ssh/authorized_keys #公鑰檔案路徑(和上面生成的檔案同)
PermitRootLogin yes #root能使用ssh登入

Alt text

重啟ssh服務,並設定開機啟動:

$ service sshd restart
$ chkconfig sshd on

退出容器並儲存更改

使用exit命令或者ctrl+C來退出當前執行的容器:

[root@ffe81683c404 /]# exit

注意:上面ffe81683c404是容器的ID,退出後用於儲存的唯一ID。

當結束後,我們使用 exit 來退出,現在我們的容器已經被我們改變了,使用 docker commit 命令來提交更新後的副本。

$ sudo docker commit -m 'install openssh' -a 'Docker Newbee' ffe81683c404  centos6-jdk7:ssh
4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c

其中,-m 來指定提交的說明資訊,跟我們使用的版本控制工具一樣;-a 可以指定更新的使用者資訊;之後是用來建立映象的容器的ID;最後指定目標映象的倉庫名和 tag 資訊。建立成功後會返回這個映象的 ID 資訊。

提交後docker中就會多出一個centos6-jdk7:ssh的一個映象。
Alt text

啟動新的容器並打通22埠

將新的映象啟動,並將docker伺服器的50001埠對映到容器的22埠上:

$ docker run -d -p 50001:22 centos6-jdk7:ssh /usr/sbin/sshd -D

ssh連線容器:
Alt text

至此SSH連線docker容器成功完成。

參考資料