最近一直在研究Elasticsearch,后來部門的同事遇到了一個docker集群的未授權(quán)訪問漏洞,于是稍微看了一下docker進行了一下基本的入門,本文把自己學習docker的過程進行了一個詳細的記錄,希望能看過本文的文章能快速入門,本文會撿著最重要的命令分類進行介紹,讓不了解docker的安全從業(yè)人員快速了解docker。

  • Docker與KVM的區(qū)別

  說到KVM和Docker的區(qū)別,我引用一張圖,由于題主不在互聯(lián)網(wǎng)公司工作,對于KVM和Docker對于生產(chǎn)的適用環(huán)境理解還欠佳,如果未來有機會進入互聯(lián)網(wǎng)工作,再把這部分補上。

iOS培訓,Swift培訓,蘋果開發(fā)培訓,移動開發(fā)培訓

  不過通過架構(gòu)我們可以明顯的看出KVM的隔離對于Docker要好很多,由于KVM存在Hypervisor的存在對于硬件層面的虛擬化程度是遠高于docker的,基于Hypervisor我們可以安裝各種系統(tǒng),系統(tǒng)中的文件與環(huán)境也是隔離的。而Docker卻不一樣。應用之間大量的底層和編譯環(huán)境是共享的。這是我認識的Docker與KVM但并不是本文的重點,如果此處有任何錯誤也環(huán)境大牛來指正。

  • Docker公有鏡像的獲取

  在docker中我們可以通過以下命令來查找共有鏡像:

1
docker search nginx \\搜索公有的nginx images

  iOS培訓,Swift培訓,蘋果開發(fā)培訓,移動開發(fā)培訓

  通過docker pull命令來獲取公有鏡像:

1
docker pull nginx \\獲取名為nginx的鏡像
  • Docker啟停創(chuàng)建容器等常用命令分析

  這部分命令非常多,也非常容易混淆,我在學習這部分的時候產(chǎn)生過許多疑問。諸如有了start命令為何還要有run命令。為什么有些參數(shù)只能跟著run而不能跟著start,以及一些常見的一些技巧。

1
docker images  \\查看本機擁有的鏡像

  然而一個鏡像僅僅是鏡像,他需要在容器中進行執(zhí)行,所以我們要將images轉(zhuǎn)換為容器。創(chuàng)建一個新的容器我們通常使用以下的組合命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
docker run -idt --name newcentos centos haha.sh
 
<strong>參數(shù)解釋</strong>:
-it 通常一起出現(xiàn)(標準輸入給容器并產(chǎn)生一個交互性shell)
-d 在后臺運行
--name 給容器起一個名字方便管理(否則你要用容器ID管理了,心態(tài)會爆炸的)
/bin/bash 生成容器后要執(zhí)行的命令
 
<strong>連起來解釋:</strong>
 
創(chuàng)建一個新容器 裝載的鏡像為 centos  這個容器命名為newnetos
創(chuàng)建完成后執(zhí)行haha.sh腳本 通過bash來管理這個容器
并且創(chuàng)建完成后不進入容器(-d參數(shù)的存在)

  管理docker容器我主要用以下命令來實現(xiàn):

1
docker ps -a \\顯示所有docker容器

  我們可以通過attach命令來進入一個容器,進行交互式shell管理:

1
2
docker start newcentos \\容器必須啟動 才可以attach
docker attach newcentos \\上文我們將鏡像命名為newcentos,否則我們要跟鏡像的ID

  我們可以通過start和stop命令來啟停容器,同時需要注意的是,題主在有一點是懵逼的之前。docker run包含docker creat和docker start兩個階段。所以將一個新鏡像裝入容器中我們使用docker run可以一勞永逸的解決兩個階段的問題。

  刪除容器的過程我們需要兩個階段,停止之后刪除:

1
2
docker stop newcentos \\停止容器運行
docker rm newcentos  \\刪除容器

  

  • Docker端口映射

  當我們運行一個apache鏡像的時候,我們往往希望訪問宿主機地址80或者443端口來達到訪問容器中運行的apache進程。這時我們需要將宿主機的80和443端口映射到容器中的80和443端口,通常我們使用如下命令。

1
2
3
4
docker run -idt --name apache -p 80:80 httpd
 
參數(shù)解釋:
-p 宿主機端口:容器端口

  我自己作為安全人員用到-P參數(shù)比較少,主要是將宿主機的隨機端口映射到容器的特定端口。

  • Docker掛載磁盤映像

  經(jīng)典的docker romote api 未授權(quán)訪問漏洞反彈shell一般需要掛載宿主機根目錄來獲取權(quán)限,這里不詳細贅述。一般我們可以掛載本機的nginx配置文件等到容器,實現(xiàn)類似于linux系統(tǒng)中/mnt的效果。

1
2
3
4
docker run -p 80:80 --name mynginx -v /www:/www -v /etc/conf/nginx.conf:/etc/nginx/nginx.conf -d nginx
 
參數(shù)解釋:
-v 宿主機文件目錄:容器目錄  
  • Docker鏡像創(chuàng)建(commit和Dockerfile)

  我們可能在一個centos的鏡像容器中部署了各種環(huán)境如nginx,redis啊,現(xiàn)在我想對這個自定義的centos容器進行打包形成一個新的鏡像。可以使用commit和dockerfile兩種方法。

1
2
3
4
5
6
7
8
docker commit -m "centos-redis" -a "legwindy" abe40a097f26 legwindy/centos-redis:v1
 
參數(shù)解釋:
-m:一段記錄
-a:作者名稱
abe40a097f26:打包的容器ID,比如我在一個abe40a097f26的centos
                       image裝了很多東西,那個容器ID就是abe40a097f26
(legwindy/centos-redis:v1):打包后的鏡像名稱,Tag值為v1

  使用dockerfile進行構(gòu)建,比較復雜,我從網(wǎng)上找了個實例,需要了解很多語法,其實核心思想是把上面每一步操作寫到文件中,使用docker build直接按照步驟去執(zhí)行,以下是轉(zhuǎn)載的一個dockerfile實例:

iOS培訓,Swift培訓,蘋果開發(fā)培訓,移動開發(fā)培訓

  幾個關鍵字段:

1
2
3
4
5
FROM (鏡像名稱)
RUN (執(zhí)行命令)
EXPOSE (容器要打開的端口)
ENTRYPOINT(難理解的點):可以把一個容器封裝成一個應用。
CMD(難理解的點):執(zhí)行的命令

  比較難理解的是ENTRYPOINT和CMD的區(qū)別,ENTRYPOINT可以把容器封裝成一個應用,比如ENTRYPOINT后面接參數(shù)/usr/local/nginx后,我們attach容器后,效果和在Linux下直接執(zhí)行nginx命令的回現(xiàn)是相同的。CMD可以理解為接在ENTRYPOINT后的參數(shù),當我們撰寫這么一個參數(shù):--ENTRYPOINT /usr/local/bin/nginx后。我們我們使用如下命令達到的效果如下。 docker run xxxx --entrypoint /usr/local/bin/nginx help。等于在物理機中運行nginx help命令。

  關于docker的使用,學習的還比較淺,僅僅在應用層層面,跟自己目前的工作還不太相關,有機會會為大家介紹docker remote api訪問漏洞的原因和防范方法。

http://www.cnblogs.com/Hyber/p/7156588.html