天天看點

CentOS 7上搭建Docker環境

一.Docker介紹和安裝

Docker 是一個開源工具,它可以讓建立和管理 Linux 容器變得簡單。容器就像是輕量級的虛拟機,并且可以以毫秒級的速度來啟動或停止。Docker 幫助系統管理者和程式員在容器中開發應用程式,并且可以擴充到成千上萬的節點。

容器和 VM(虛拟機)的主要差別是,容器提供了基于程序的隔離,而虛拟機提供了資源的完全隔離。虛拟機可能需要一分鐘來啟動,而容器隻需要一秒鐘或更短。容器使用宿主作業系統的核心,而虛拟機使用獨立的核心。

Docker 的局限性之一是,它隻能用在 64 位的作業系統上。

在這篇文章中我們将讨論如何在 CentOS 7.x 中安裝 docker。

Docker 軟體包已經包括在預設的 CentOS-Extras 軟體源裡。是以想要安裝 docker,隻需要運作下面的 yum 指令:

[root@localhost ~]# yum install docker

安裝完成後,使用下面的指令來啟動 docker 服務,并将其設定為開機啟動:

[root@localhost ~]# service docker start

[root@localhost ~]# chkconfig docker on

(LCTT 譯注:此處采用了舊式的 sysv 文法,如采用CentOS 7中支援的新式 systemd 文法,如下:

[root@localhost ~]# systemctl start docker.service

[root@localhost ~]# systemctl enable docker.service

下載下傳官方的 CentOS 鏡像到本地 

[root@localhost ~]# docker pull centos

Pulling repository centos

192178b11d36: Download complete

70441cac1ed5: Download complete

ae0c2d0bdc10: Download complete

511136ea3c5a: Download complete

5b12ef8fd570: Download complete

确認 CentOS 鏡像已經被擷取:

[root@localhost ~]# docker images centos

REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE

centos centos5 192178b11d36 2 weeks ago 466.9 MB

centos centos6 70441cac1ed5 2 weeks ago 215.8 MB

centos centos7 ae0c2d0bdc10 2 weeks ago 224 MB

centos latest ae0c2d0bdc10 2 weeks ago 224 MB

運作一個 Docker 容器:

[root@localhost ~]# docker run -i -t centos /bin/bash

[root@dbf66395436d /]#

我們可以看到,CentOS 容器已經被啟動,并且我們得到了 bash 提示符。在 docker 指令中我們使用了 “-i 捕獲标準輸入輸出”和 “-t 配置設定一個終端或控制台”選項。若要斷開與容器的連接配接,輸入 exit。

[root@cd05639b3f5c /]# cat /etc/redhat-release

CentOS Linux release 7.0.1406 (Core)

[root@cd05639b3f5c /]# exit

exit

[root@localhost ~]#

我們還可以搜尋基于 Fedora 和 Ubuntu 作業系統的容器。

[root@localhost ~]# docker search ubuntu

[root@localhost ~]# docker search fedora

顯示目前正在運作容器的清單

二.DAOCLOUD

        daocloud提供了docker上的許多image,對通路被牆的外網來說是一個很好的解決辦法:https://dashboard.daocloud.io/mirror

Docker 1.3.2版本以上支援加速器,如果您沒有安裝Docker或者版本較舊,請安裝或更新。

參考Docker安裝文檔。高速安裝Docker

該腳本可以将<code>--registry-mirror</code>加入到你的Docker配置檔案<code>/etc/sysconfig/docker</code>中。适用于Centos7,其他版本可能有細微不同。其中other_args可替換為OPTIONS,要根據腳步的實際情況來決定,配置完後為:OPTIONS=--registry-mirror=http://f07735fb.m.daocloud.io '--selinux-enabled'

Docker加速器使用時不需要任何額外操作。就像這樣下載下傳官方Ubuntu鏡像

更多精彩鏡像就在下方Docker熱門Repositories中

三.使用Docker在本地搭建Hadoop分布式叢集

http://www.tuicool.com/articles/QBryi23

下面,我們準備以ubuntu鏡像作為基準鏡像,建構我們的Hadoop運作環境鏡像。

先使用指令如下指令啟動容器:

注意:我們在不指定Tag的情況下,預設選擇Tag為 <code>latest</code> 的鏡像啟動容器。 指定Tag啟動指令為:

另外,每次容器啟動的時候需要指定一個指令,容器啟動後便會執行這個指令。例如執行下面的指令:

可以看到,容器啟動了馬上又退出了,因為容器之做了一件事情:就是列印 <code>Hello world</code> ,列印完了,自然就退出了。

如果你想做多件事情,可以自己寫一個shell腳本,把你要的操作寫入進去,然後在 <code>run</code> 後面指定這個腳本路徑。

我們剛剛的 <code>docker run -ti ubuntu</code> 指令中沒有指定執行程式,Docker預設執行 <code>/bin/bash</code> 。

其他啟動參數,大家可以自己在網上查,這裡不再陳述了。好了我們回到剛剛 <code>docker run -ti ubuntu</code> 啟動的容器,可以看到容器幾乎瞬間就啟動起來了,比虛拟機不知快了多少倍!!

容器啟動起來了,接下來就是安裝Java、Hadoop及相關配置了。

依次執行如下指令:

注意:

這裡安裝的Java7(JDK1.7),如需其他版本請自行修改 <code>apt-get install oracle-java7-installer</code> 為 <code>apt-get install oracle-java6-installer</code>

預設使用的是Ubuntu的官方源,如果下載下傳比較慢,請自行修改更新源,不知道如何使用指令行修改的,參考 這裡 。

另外,大家可以将裝好java的鏡像儲存為一個副本,他日可以在此基礎上建構其他鏡像。指令如下:

上面指令中 <code>122a2cecdd14</code> 為目前容器的ID,  <code>ubuntu:java</code> 是為新的鏡像指定一個辨別, <code>ubuntu</code> 為 倉庫名 , <code>java</code> 是 Tag 。

如何擷取容器ID:

有個簡便的辦法找到此ID,就是指令行使用者名 <code>@</code> 後面的那一串字元。這個方法隻在容器啟動時沒有指定hostname時才能用。

使用 <code>docker ps</code> 列出所有運作的容器,在指令結果中檢視

漸漸切入正題了O(∩_∩)O~

使用剛剛已經安裝了Java的容器鏡像啟動:

啟動成功了,我們開始安裝Hadoop。這裡,我們直接使用wget下載下傳安裝檔案。

1.先安裝wget:

2.下載下傳并解壓安裝檔案:

注意:這裡我們安裝的Hadoop版本是2.6.0,如果需要其他版本,請在 這裡 找到連結位址後修改指令即可。

3.配置環境變量

修改 <code>~/.bashrc</code> 檔案。在檔案末尾加入下面配置資訊:

注意:我們使用 <code>apt-get</code> 安裝java,不知道java裝在什麼地方的話可以使用下面的指令檢視:

4.配置Hadoop

下面,我們開始修改Hadoop的配置檔案。主要配置 core-site.xml 、 hdfs-site.xml 、 mapred-site.xml 這三個檔案。

開始配置之前,執行下面指令:

這裡建立了三個目錄,後續配置的時候會用到:

tmp:作為Hadoop的臨時目錄

namenode:作為NameNode的存放目錄

datanode:作為DataNode的存放目錄

1).core-site.xml配置

<code>hadoop.tmp.dir</code> 配置項值即為此前指令中建立的臨時目錄路徑。

<code>fs.default.name</code> 配置為 <code>hdfs://master:9000</code> ,指向的是一個Master節點的主機(後續我們做叢集配置的時候,自然會配置這個節點,先寫在這裡)

2).hdfs-site.xml配置

使用指令 <code>nano hdfs-site.xml</code> 編輯 <code>hdfs-site.xml</code> 檔案:

我們後續搭建叢集環境時,将配置一個Master節點和兩個Slave節點。是以 <code>dfs.replication</code> 配置為2。

<code>dfs.namenode.name.dir</code> 和 <code>dfs.datanode.data.dir</code> 分别配置為之前建立的NameNode和DataNode的目錄路徑

3).mapred-site.xml配置

Hadoop安裝檔案中提供了一個mapred-site.xml.template,是以我們之前使用了指令 <code>cp mapred-site.xml.template mapred-site.xml</code> ,建立了一個mapred-site.xml檔案。下面使用指令 <code>nano mapred-site.xml</code> 編輯這個檔案:

這裡隻有一個配置項 <code>mapred.job.tracker</code> ,我們指向master節點機器。

4)修改JAVA_HOME環境變量

使用指令 <code>.nano hadoop-env.sh</code> ,修改如下配置:

5.格式化 namenode

這是很重要的一步,執行指令 <code>hadoop namenode -format</code>

4.安裝SSH

搭建叢集環境,自然少不了使用SSH。這可以實作無密碼通路,通路叢集機器的時候很友善。

SSH裝好了以後,由于我們是Docker容器中運作,是以SSH服務不會自動啟動。需要我們在容器啟動以後,手動通過 <code>/usr/sbin/sshd</code> 手動打開SSH服務。未免有些麻煩,為了友善,我們把這個指令加入到 <code>~/.bashrc</code> 檔案中。通過 <code>nano ~/.bashrc</code> 編輯 <code>.bashrc</code> 檔案(nano沒有安裝的自行安裝,也可用vi),在檔案後追加下面内容:

5.生成通路密鑰

注意: 這裡,我的思路是直接将密鑰生成後寫入鏡像,免得在買個容器裡面再單獨生成一次,還要互相拷貝公鑰,比較麻煩。當然這隻是學習使用,實際操作時,應該不會這麼搞,因為這樣所有容器的密鑰都是一樣的!!

6.儲存鏡像副本

這裡我們将安裝好Hadoop的鏡像儲存為一個副本。

重點來了!

按照 hadoop 叢集的基本要求,其 中一個是 master 結點,主要是用于運作 hadoop 程式中的 namenode、secondorynamenode 和 jobtracker(新版本名字變了) 任務。用外兩個結點均為 slave 結點,其中一個是用于備援目的,如果沒有冗 餘,就不能稱之為 hadoop 了,是以模拟 hadoop 叢集至少要有 3 個結點。

前面已經将Hadoop的鏡像建構好了,下面就是使用這個鏡像搭建Master節點和Slave節點了:

節點

hostname

ip

用途

Docker啟動腳本

Master

master

10.0.0.5

namenode

secondaryNamenode

jobTracker

docker run -ti -h master ubuntu:hadoop

Slave

slave1

10.0.0.6

datanode

taskTracker

docker run -ti -h slave1 ubuntu:hadoop

slave2

10.0.0.7

docker run -ti -h slave2 ubuntu:hadoop

回顧一下,Docker啟動容器使用的是 <code>run</code> 指令:

這裡有幾個問題:

Docker容器中的ip位址是啟動之後自動配置設定的,且不能手動更改

hostname、hosts配置在容器内修改了,隻能在本次容器生命周期内有效。如果容器退出了,重新啟動,這兩個配置将被還原。且這兩個配置無法通過 <code>commit</code> 指令寫入鏡像

我們搭建叢集環境的時候,需要指定節點的hostname,以及配置hosts。hostname可以使用Docker <code>run</code> 指令的 <code>h</code> 參數直接指定。但hosts解析有點麻煩,雖然可以使用 <code>run</code> 的 <code>--link</code> 參數配置hosts解析資訊,但我們搭建叢集時要求兩台機器互相能夠 <code>ping</code> 通,其中一個容器沒有啟動,那麼ip不知道,是以 <code>--link</code> 參數對于我們的這個場景不實用。要解決這個問題,大概需要專門搭建一個域名解析服務,即使用 <code>--dns</code> 參數(參考 這裡 )。

我們這裡隻為學習,就不整那麼複雜了,就手動修改hosts吧。隻不過每次都得改,我Docker知識淺薄,一時還沒有解決這個問題。相信肯定有更好的辦法。如果有高人能指定一下,感激不盡!!

啟動master容器

啟動slave1容器

啟動slave2容器

通過 <code>ifconfig</code> 指令擷取各節點ip。環境不同擷取的ip可能不一樣,例如我本機擷取的ip如下: 

master:10.0.0.5

slave1:10.0.0.6

slave2:10.0.0.7

使用 <code>sudo nano /etc/hosts</code> 指令将如下配置寫入各節點的hosts檔案,注意修改ip位址:

配置slaves

下面我們來配置哪些節點是slave。在較老的Hadoop版本中有一個masters檔案和一個slaves檔案,但新版本中隻有slaves檔案了。

在master節點容器中執行如下指令:

将如下slave節點的hostname資訊寫入該檔案:

在master節點上執行 <code>start-all.sh</code> 指令,啟動Hadoop。

激動人心的一刻……

如果看到如下資訊,則說明啟動成功了:

四.基于daocloud建立startbbs容器實戰

http://www.simlinux.com/archives/532.html

首先,StartBBS 是一款優雅、開源、輕量社群系統,基于MVC架構,采用PHP+MySQL

官網:        http://www.startbbs.com/

項目位址:https://github.com/startbbs/startbbs

實驗環境:

基于daocloud平台建構鏡像容器 基礎鏡像采用ubuntu:trusty 測試機centos6.6 x64

建立步驟: 

1.測試機安裝docker并編寫dockerfile檔案

yum -y update

yum -y install docker-io

service docker start

chkconfig docker on

1

2

3

4

更改docker的預設mirrors(可以注冊daocloud有免費加速鏡像下載下傳位址)

sed -i 's#other_args=#other_args="--registry-mirror=http://7de036e1.m.daocloud.io"#g'/etc/sysconfig/docker

下載下傳基礎鏡像

docker pull ubuntu:trusty

 在github上fork startbbs

git clone https://github.com/geek-linux/startbbs.git

cd startbbs

建立Dockerfile檔案

FROM ubuntu:trusty

MAINTAINER Geekwolf

RUN apt-get -y update &amp;&amp; apt-get -y install mysql-client php5 ImageMagick apache2 php5-gd php5-mysql

RUN rm -rf /var/www/html/*

ADD . /var/www/html

RUN chown -R www-data:www-data /var/www/html

WORKDIR /var/www/html

RUN echo "ServerName startbbs.daoapp.io"&gt;&gt;/etc/apache2/apache2.conf

RUN sed -i "s#'localhost'#getenv("MYSQL_PORT_3306_TCP_ADDR")#g" app/config/database.php &amp;&amp; sed -i "s#'startbbs'#getenv("MYSQL_INSTANCE_NAME")#g" app/config/database.php &amp;&amp; sed -i "s#'root'#getenv("MYSQL_USERNAME")#g" app/config/database.php &amp;&amp; sed -i "s#'123456'#getenv("MYSQL_PASSWORD")#g" app/config/database.php

EXPOSE 80

CMD ["/usr/sbin/apache2ctl","-D","FOREGROUND"]

5

6

7

8

9

10

11

12

13

14

15

16

17

RUN  apt-get -y update &amp;&amp; apt-get  -y install mysql-client php5 ImageMagick  apache2 php5-gd php5-mysql

RUN  rm -rf  /var/www/html/*

RUN  chown -R www-data:www-data /var/www/html

注:ServerName可以根據daocloud平台自定義一個daoapp.io的二級域

根據Dockerfile從基礎鏡像中建立startbbs web鏡像

docker build -t startbbs .

docker run --name=startbbs -it startbbs:latest /bin/bash

無ssh登陸容器檢視是否正常

nsenter --target $(docker inspect --format "{{.State.Pid}}" startbbs) --mount --uts --ipc --net --pid

  最後,将Dockerfile檔案送出到startbbs代碼庫根目錄

git add Dockerfile

git commit -am "Add Dockerfile"

git push origin master

2.在daocloud平台建構鏡像

A. 登陸 https://www.daocloud.io,選擇<code>代碼建構</code>–<code>建立項目</code> 

B. 設定代碼源github,選擇代碼庫startbbs,暫時關閉<code>持續內建</code>–<code>釋出應用鏡像:鏡像倉庫</code>–<code>開始建立</code> 

C. 選擇<code>服務內建</code>–<code>選擇MySQL鏡像</code>–<code>建立服務執行個體</code> –<code>我的服務</code>檢視資料庫賬号資訊

D. 此處簡單起見使用daocloud自帶的phpMyAdmin鏡像(<code>鏡像倉庫</code>)建立容器,并導入startbbs的sql檔案(data/db/startbbs.sql)

E. 建立startbbs容器,<code>鏡像倉庫</code>–選擇<code>startbbs鏡像</code>–點選<code>部署</code>–容器名字:startbbs–選擇相應的容器配置–點選<code>服務&amp;環境</code>–綁定<code>MySQL容器</code>–<code>立即部署</code>–容器啟動後,設定<code>域名</code>為http://startbbs.daoapp.io,綁定自有域名http://bbs.simlinux.com,增加dns解析cname到z3y206n242.daoap.me 即可

F. 通路http://startbbs.daoapp.io初始化startbbs,到此startbbs容器安裝完成

G. 建立得容器在 https://dashboard.daocloud.io即可看到