轉載請注明出處:http://blog.csdn.net/gamer_gyt
博主微博:http://weibo.com/234654758
Github:https://github.com/thinkgamer
Docker江湖
寫在前邊的話

在之前便想學習Docker技術了,可是一直沒有機會,近期在做elk的一個項目,須要在一個不能連接外網的機器上安裝各種環境,本來想一步步下載rpm包,進行安裝,然而事實證明我太單純,各種依賴包。搞的我頭大,然后便想到了docker。一個能夠裝載環境和便於移植的小船。
環境介紹
本地 win10
VMware 虛擬機 安裝的redhat 7.1 server版(模擬server環境)
redhat 7.1(server)上部署docker
在linux部署
安裝的方法有非常多種。能夠選擇rpm包安裝。也能夠使用二進制包安裝,不同的os 在線安裝的方式也有所不同,我這是是基於redhat7.1進行安裝的,其它的一些安裝方式能夠參考官網(https://docs.docker.com/)
我這里採用的是安裝二進制包的形式:
1、內核版本號要求
查看內核版本號
[redhat@localhost ~]$ uname -r
3.10.0-229.el7.x86_64
官方建議不低於3.10.0
2、下載二進制包並解壓
https://get.docker.com/builds/Linux/x86_64/docker-latest.tgz
tar -xvzf docker-latest.tar
3、載入到全局變量
mv docker/* /usr/bin/
4、關閉防火牆
避免一些不必要的麻煩
systemctl status firewalld (redhat查看防火牆狀態)
systemctl stop firewalld (redhat臨時關閉防火牆)
systemctl disable firewalld (redhat永久關閉防火牆)
systemctl enable firewalld (redhat打開防火牆)
5、啟動服務
sudo dockerd &
6、測試
sudo docker run hello-world
會彈出來一系列看似正常的東東,然后就ok了
閑談Docker
1、Docker是什么
Docker是一個誕生於2013年的開源項目,基於Go語言實現,遵從apache2.0協議。目標是實現輕量級的操作系統虛擬化解決方式,其基礎是Linux容器(LXC)等技術。
在LXC的基礎上Docker進行了進一步的封裝。讓用戶不須要去關心容器的管理,使得操作更為簡便。用戶操作Docker的容器就像操作一個高速輕量級的虛擬機一樣簡單。
以下的圖片比較了Docker和傳統虛擬化方式的不同之處,可見容器是在操作系統層面上實現虛擬化。直接復用本地主機的操作系統。而傳統方式則是在硬件層面實現。
推薦一篇docker架構的文章,個人感覺不錯:
http://www.infoq.com/cn/articles/docker-source-code-analysis-part1/
2、為什么要使用Docker
1)、啟動在秒級實現
Docker容器的啟動能夠在秒級實現,占用的資源也較少。其次對系統的資源利用率高,傳統虛擬機方式執行10個不同的應用就要起10個虛擬機,而Docker僅僅要啟動10個隔離的應用就可以。這些都決定的Docker容器的啟動速度
2)、更高速的交付和部署
開發人員能夠使用一個標准的鏡像來構建一套開發容器,開發完畢之后。運維人員能夠直接使用這個容器來部署代碼。Docker能夠高速創建容器,高速迭代應用程序。並讓整個過程全程可見,使團隊中的其它成員更easy理解應用程序是怎樣創建和工作的。
Docker容器非常輕非常快!
容器的啟動時間是秒級的,大量地節約開發、測試、部署的時間。
3)、更高效的虛擬化
Docker 容器的執行不須要額外的hypervisor支持,它是內核級的虛擬化。因此能夠實現更高的性能和效率。
4)、更輕松的遷移和擴展
Docker 容器差點兒能夠在隨意的平台上執行,包含物理機、虛擬機、公有雲、私有 雲、個人電腦、server等。這種兼容性能夠讓用戶把一個應用程序從一個平台直接遷移到另外一個。
5)、更簡單的管理
使用Docker,僅僅須要小小的改動,就能夠替代以往大量的更新工作。全部的改動都以增量的方式被分發和更新,從而實現自己主動化而且高效的管理。
6)、對照傳統虛擬機總結
特性 | 容器 | 虛擬機 |
啟動 | 秒級 | 分鍾級 |
硬盤使用 | 一般為MB | 一般為GB |
性能 | 接近原生 | 弱於 |
系統支持量 | 單機支持上千個容器 | 一般幾十個 |
3、Docker的三個基本概念
鏡像(Image)
Docker 鏡像(Image)就是一個僅僅讀的模板。
比如:一個鏡像能夠包含一個完整的 ubuntu 操作系統環境,里面僅安裝了 Apache 或用戶須要的其它應用程序。
鏡像能夠用來創建 Docker 容器。
Docker 提供了一個非常easy的機制來創建鏡像或者更新現有的鏡像。用戶甚至能夠 直接從其它人那里下載一個已經做好的鏡像來直接使用。容器(Container)
Docker 利用容器(Container)來執行應用。
容器是從鏡像創建的執行實例。它能夠被啟動、開始、停止、刪除。每一個容器都是 相互隔離的、保證安全的平台。
能夠把容器看做是一個簡易版的 Linux 環境(包含root用戶權限、進程空間、用戶 空間和網絡空間等)和執行在當中的應用程序。
*注:鏡像是僅僅讀的,容器在啟動的時候創建一層可寫層作為最上層。倉庫(Repository)
倉庫(Repository)是集中存放鏡像文件的場所。有時候會把倉庫和倉庫注冊服務 器(Registry)混為一談,並不嚴格區分。實際上,倉庫注冊server上往往存放着 多個倉庫,每一個倉庫中又包含了多個鏡像。每一個鏡像有不同的標簽(tag)。
倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式。
最大的公開倉庫是 Docker Hub,存放了數量龐大的鏡像供用戶下載。
國內的公開倉庫包含 時速雲 、網易雲 等。能夠提供大陸用戶更穩定高速的訪問。
當然,用戶也能夠在本地網絡內創建一個私有倉庫(參考本文“私有倉庫”部分)。
當用戶創建了自己的鏡像之后就能夠使用 push 命令將它上傳到公有或者私有倉 庫,這樣下次在另外一台機器上使用這個鏡像時候,僅僅須要從倉庫上 pull 下來 就能夠了。
*注:Docker 倉庫的概念跟 Git 相似,注冊server能夠理解為 GitHub 這種托管服 務。
docker的基本操作
執行sudo docker –help(-h)能夠看到docker所支持的命令,同一時候有其相應的解釋
attach: 進入到正在執行的容器
build: 從Dockerfile構建鏡像
commit: 容器更改之后創建新鏡像
cp: 在容器和本地之間復制文件和文件夾
create: 創建一個新的容器
diff: 檢查容器文件系統上的更改
events: 從server上獲取實時事件
exec: 在正在執行的容器中執行命令
export: 將容器的文件系統導出為tar存檔
history: 顯示鏡像的歷史記錄
images: 列出鏡像
import: 從tar包導入創建新的文件系統鏡像
info: 顯示系統范圍的信息
inspect: 返回容器,映像或任務的低級信息
kill: 殺死一個或者多個正在執行的容器
load: 載入一個打包好的鏡像
login: 登錄到docker的服務
logout: 退出docker服務
logs: 獲取容器的日志
network: 管理docker的網絡
node: 管理docker swarm節點
pause: 暫停一個或多個容器中的進程
port: 列出端口映射或者容器的特定映射
ps: 列出正在執行的容器(ps -a 列出正在執行和已經停止的容器)
pull: 從注冊表中載入一個鏡像
push: 將鏡像提交到注冊表中
rename: 重命名容器
restart: 又一次啟動容器
rm: 刪除一個或者多個容器
rmi: 刪除一個或者多個容器
run: 在容器中執行命令
save: 將鏡像保存成tar文件
search: 在docker 倉庫中搜索鏡像
service: 管理鏡像服務
start: 啟動一個或者多個已經停止的容器
stats: 顯示容器資源使用的實時信息流
stop: 停止一個或者多個正在執行的容器
swarm: 管理docker swarm
tag: 將鏡像保存在倉庫中。也能夠作為重命名使用
top: 顯示容器的執行進程
unpause: 取消暫停一個或多個容器中的全部進程
update: 更新一個或者多個容器的配置
version: 顯示docker版本號信息
volume: 管理docker卷
wait: 堵塞知道容器停止,然后打印推出代碼
這里我們要注意幾點問題:
1:start 和run的差別
run是依據現存的鏡像啟動一個新的容器。而start是開始一個停止的容器。即退出時是使用exit或者stop的
2:commit和save
這個意思就是每次對容器做一些改動之后。我們須要先提交到本地庫。然后save成tar包以供其它使用,若不進行commit直接save的話,正在對容器所做的改變則不能save下來
3:export和save的差別
兩者都是導出鏡像為tar形式。可是export導出的文件要比save保存的小,原因是export導出的會丟失一些log信息和鏡像的層信息,詳細可參考:
http://www.server110.com/docker/201411/11213.html
Docker應用實例
1:docker部署ELK
需求分析:
將ELK封裝在Docker中便於封裝成成型的產品進行出售和轉移
PS:因為Docker容器登錄之后,進入的是root用戶,而ELK不同意在root用戶執行,所以這里我們新建了elk用戶作為ELK的執行用戶
1):執行一個ubuntu的容器
sudo docker pull ubuntu
sudo docker run -i -t ubuntu
以下是在docker容器中執行
2):創建elk用戶的文件夾(root用戶下進行)
mkdir /home/elk
3):新建elk用戶和elk用戶組
groupadd elk
useradd elk -g elk
4):給elk用戶賦予password
passwd elk
5):安裝ELK stack
2:docker部署rails服務環境
需求分析:
在一台聯網的機器上安裝docker,並在當中部署好rails服務環境,保存成tar,並load進另外一台沒有網絡的環境
PS:docker容器內執行一個操作系統,好多依賴的包都會缺少,這一點要注意
1):接着1中進行
2):安裝git
apt-get install git
3):安裝rbenv,並增加到環境變量
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
echo ‘export PATH=”HOME/.rbenv/bin: PATH”’ >> ~/.bashrc
再把 eval “$(rbenv init -)” 寫入.bashrc
使環境變量生效:
Source .bashrc
初始化
~/.rbenv/bin/rbenv init
type rbenv
4):安裝ruby-build
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
測試是否成功
rbenv install
5):安wget
apt-get install wget
6):安裝其它一些依賴
apt-get install -y build-essential nodejs
apt-get install bzip2 libssl-dev libreadline-dev zlib1g-dev
7):安裝ruby
rbenv install -l (查看支持安裝的版本號)
rbenv install 2.3.0(以2.3.0為例)
此時應該是沒有問題的,假設還有問題的話具詳細情況定
8):安裝rails
gem install rails
9):打包
提交到本地庫
sudo docker commit containerID new_image_name
保存成tar包
sudo dockek save -o *.tar new_image_name
10):在斷網的server執行
拷貝tar包到該server
sudo scp ubuntu_rails **.tar ip:/home/master
載入鏡像
sudo docker load –input *.tar
3、ELK在Docker中的端口映射
需求分析:
elk部署之后,端口的訪問僅限於執行ELK的Docker容器,所以要建立端口映射將端口暴露給外部以供訪問
1):啟動docker 指定端口,注意不能使部署docker的server和docker內所映射的端口一致
Es:9201-9200 kibana:5600-5601
sudo docker run -t -i -d -p 9201:9200 -p 5600:5601 ubuntu/rails:elk_ok(ubuntu/rails:elk_ok鏡像)
然后進入容器啟動鏡像
2):因為我的是在虛擬機中部署的docker和elk服務,在本地window上並不能直接訪問web端口。可是這里我們能夠加一個映射
netsh interface portproxy add v4tov4 listenport=9200 connectaddress=192.168.197.128 connectport=9201
netsh interface portproxy add v4tov4 listenport=5601 connectaddress=192.168.197.128 connectport=5600
這里之所以是9201和5600是因為我在linuxserver和docker容器的端口映射時將9200映射為9201。將5601映射為5600
3):本地indows就能夠了
4):截圖為證