一.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 && 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">>/etc/apache2/apache2.conf
RUN sed -i "s#'localhost'#getenv("MYSQL_PORT_3306_TCP_ADDR")#g" app/config/database.php && sed -i "s#'startbbs'#getenv("MYSQL_INSTANCE_NAME")#g" app/config/database.php && sed -i "s#'root'#getenv("MYSQL_USERNAME")#g" app/config/database.php && 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 && 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>服務&環境</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即可看到