【Docker江湖】之docker部署與理解

轉載請註明出處:http://blog.csdn.net/gamer_gyt
博主微博:http://weibo.com/234654758
Github:https://github.com/thinkgamerhtml


Docker江湖


寫在前邊的話


這裏寫圖片描寫敘述

    在以前便想學習Docker技術了,但是一直沒有機會,近期在作elk的一個項目,需要在一個不能鏈接外網的機器上安裝各類環境,原本想一步步下載rpm包,進行安裝,然而事實證實我太單純,各類依賴包。搞的我頭大,而後便想到了docker。一個可以裝載環境和便於移植的小船。

環境介紹


本地 win10
VMware 虛擬機 安裝的redhat 7.1 server版(模擬server環境)
redhat 7.1(server)上部署dockergithub

在linux部署


    安裝的方法有很是多種。可以選擇rpm包安裝。也可以使用二進制包安裝,不一樣的os 在線安裝的方式也有所不一樣,我這是是基於redhat7.1進行安裝的,其它的一些安裝方式可以參考官網(https://docs.docker.com/
    我這裏採用的是安裝二進制包的形式:web

一、內核版本號要求

查看內核版本號docker

[redhat@localhost ~]$ uname -r
3.10.0-229.el7.x86_64apache

官方建議不低於3.10.0ubuntu

二、下載二進制包並解壓

https://get.docker.com/builds/Linux/x86_64/docker-latest.tgz安全

tar -xvzf docker-latest.tar

三、載入到全局變量

mv docker/* /usr/bin/

四、關閉防火牆

避免一些沒必要要的麻煩

systemctl status firewalld (redhat查看防火牆狀態)
systemctl stop firewalld (redhat臨時關閉防火牆)
systemctl disable firewalld (redhat永久關閉防火牆)
systemctl enable firewalld (redhat打開防火牆)

五、啓動服務

sudo dockerd &

六、測試

sudo docker run hello-world

會彈出來一系列看似正常的東東,而後就ok了

閒談Docker


一、Docker是什麼

    Docker是一個誕生於2013年的開源項目,基於Go語言實現,聽從apache2.0協議。目標是實現輕量級的操做系統虛擬化解決方式,其基礎是Linux容器(LXC)等技術。
    在LXC的基礎上Docker進行了進一步的封裝。讓用戶不需要去關心容器的管理,使得操做更爲簡便。用戶操做Docker的容器就像操做一個高速輕量級的虛擬機同樣簡單。
    如下的圖片比較了Docker和傳統虛擬化方式的不一樣之處,可見容器是在操做系統層面上實現虛擬化。直接複用本地主機的操做系統。而傳統方式則是在硬件層面實現。


    推薦一篇docker架構的文章,我的感受不錯:
    http://www.infoq.com/cn/articles/docker-source-code-analysis-part1/

二、爲何要使用Docker

1)、啓動在秒級實現

    Docker容器的啓動可以在秒級實現,佔用的資源也較少。其次對系統的資源利用率高,傳統虛擬機方式執行10個不一樣的應用就要起10個虛擬機,而Docker僅僅要啓動10個隔離的應用就能夠。這些都決定的Docker容器的啓動速度

2)、更高速的交付和部署

    開發人員可以使用一個標準的鏡像來構建一套開發容器,開發完畢以後。運維人員可以直接使用這個容器來部署代碼。Docker可以高速建立容器,高速迭代應用程序。並讓整個過程全程可見,使團隊中的其它成員更easy理解應用程序是怎樣建立和工做的。

Docker容器很是輕很是快!

容器的啓動時間是秒級的,大量地節約開發、測試、部署的時間。

3)、更高效的虛擬化

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

4)、更輕鬆的遷移和擴展

    Docker 容器差點兒可以在隨意的平臺上執行,包含物理機、虛擬機、公有云、私有 雲、我的電腦、server等。這種兼容性可以讓用戶把一個應用程序從一個平臺直接遷移到另一個。

5)、更簡單的管理

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

6)、對照傳統虛擬機總結

特性 容器 虛擬機
啓動 秒級 分鐘級
硬盤使用 通常爲MB 通常爲GB
性能 接近原生 弱於
系統支持量 單機支持上千個容器 通常幾十個

三、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

參考:http://blog.csdn.net/gamer_gyt/article/details/52654263


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


三、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):截圖爲證

這裏寫圖片描寫敘述
這裏寫圖片描寫敘述
這裏寫圖片描寫敘述


END

相關文章
相關標籤/搜索