docker學習筆記--重基礎使用

  最近一直在研究Elasticsearch,後來部門的同事遇到了一個docker集羣的未受權訪問漏洞,因而稍微看了一下docker進行了一下基本的入門,本文把本身學習docker的過程進行了一個詳細的記錄,但願能看過本文的文章能快速入門,本文會撿着最重要的命令分類進行介紹,讓不瞭解docker的安全從業人員快速瞭解docker。linux

  • Docker與KVM的區別

  說到KVM和Docker的區別,我引用一張圖,因爲題主不在互聯網公司工做,對於KVM和Docker對於生產的適用環境理解還欠佳,若是將來有機會進入互聯網工做,再把這部分補上。nginx

  不過經過架構咱們能夠明顯的看出KVM的隔離對於Docker要好不少,因爲KVM存在Hypervisor的存在對於硬件層面的虛擬化程度是遠高於docker的,基於Hypervisor咱們能夠安裝各類系統,系統中的文件與環境也是隔離的。而Docker卻不同。應用之間大量的底層和編譯環境是共享的。這是我認識的Docker與KVM但並非本文的重點,若是此處有任何錯誤也環境大牛來指正。redis

  • Docker公有鏡像的獲取

  在docker中咱們能夠經過如下命令來查找共有鏡像:docker

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

  

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

docker pull nginx \\獲取名爲nginx的鏡像
  • Docker啓停建立容器等經常使用命令分析

  這部分命令很是多,也很是容易混淆,我在學習這部分的時候產生過許多疑問。諸若有了start命令爲什麼還要有run命令。爲何有些參數只能跟着run而不能跟着start,以及一些常見的一些技巧。apache

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

  然而一個鏡像僅僅是鏡像,他須要在容器中進行執行,因此咱們要將images轉換爲容器。建立一個新的容器咱們一般使用如下的組合命令:centos

docker run -idt --name newcentos centos haha.sh

參數解釋:
-it 一般一塊兒出現(標準輸入給容器併產生一個交互性shell)
-d 在後臺運行
--name 給容器起一個名字方便管理(不然你要用容器ID管理了,心態會爆炸的)
/bin/bash 生成容器後要執行的命令

連起來解釋:

建立一個新容器 裝載的鏡像爲 centos  這個容器命名爲newnetos 
建立完成後執行haha.sh腳本 經過bash來管理這個容器 
而且建立完成後不進入容器(-d參數的存在)

  管理docker容器我主要用如下命令來實現:api

docker ps -a \\顯示全部docker容器

  咱們能夠經過attach命令來進入一個容器,進行交互式shell管理:安全

docker start newcentos \\容器必須啓動 才能夠attach
docker attach newcentos \\上文咱們將鏡像命名爲newcentos,不然咱們要跟鏡像的ID

  咱們能夠經過start和stop命令來啓停容器,同時須要注意的是,題主在有一點是懵逼的以前。docker run包含docker creat和docker start兩個階段。因此將一個新鏡像裝入容器中咱們使用docker run能夠一勞永逸的解決兩個階段的問題。bash

  刪除容器的過程咱們須要兩個階段,中止以後刪除:

docker stop newcentos \\中止容器運行
docker rm newcentos  \\刪除容器

  

  • Docker端口映射

  當咱們運行一個apache鏡像的時候,咱們每每但願訪問宿主機地址80或者443端口來達到訪問容器中運行的apache進程。這時咱們須要將宿主機的80和443端口映射到容器中的80和443端口,一般咱們使用以下命令。

docker run -idt --name apache -p 80:80 httpd

參數解釋:
-p 宿主機端口:容器端口 

  我本身做爲安全人員用到-P參數比較少,主要是將宿主機的隨機端口映射到容器的特定端口。

  • Docker掛載磁盤映像

  經典的docker romote api 未受權訪問漏洞反彈shell通常須要掛載宿主機根目錄來獲取權限,這裏不詳細贅述。通常咱們能夠掛載本機的nginx配置文件等到容器,實現相似於linux系統中/mnt的效果。

docker run -p 80:80 --name mynginx -v /www:/www -v /etc/conf/nginx.conf:/etc/nginx/nginx.conf -d nginx 

參數解釋:
-v 宿主機文件目錄:容器目錄   
  • Docker鏡像建立(commit和Dockerfile)

  咱們可能在一個centos的鏡像容器中部署了各類環境如nginx,redis啊,如今我想對這個自定義的centos容器進行打包造成一個新的鏡像。可使用commit和dockerfile兩種方法。

docker commit -m "centos-redis" -a "legwindy" abe40a097f26 legwindy/centos-redis:v1

參數解釋:
-m:一段記錄
-a:做者名稱
abe40a097f26:打包的容器ID,好比我在一個abe40a097f26的centos
                       image裝了不少東西,那個容器ID就是abe40a097f26
(legwindy/centos-redis:v1):打包後的鏡像名稱,Tag值爲v1

  使用dockerfile進行構建,比較複雜,我從網上找了個實例,須要瞭解不少語法,其實核心思想是把上面每一步操做寫到文件中,使用docker build直接按照步驟去執行,如下是轉載的一個dockerfile實例:

  幾個關鍵字段:

FROM (鏡像名稱)
RUN (執行命令)
EXPOSE (容器要打開的端口)
ENTRYPOINT(難理解的點):能夠把一個容器封裝成一個應用。
CMD(難理解的點):執行的命令

  比較難理解的是ENTRYPOINT和CMD的區別,ENTRYPOINT能夠把容器封裝成一個應用,好比ENTRYPOINT後面接參數/usr/local/nginx後,咱們attach容器後,效果和在Linux下直接執行nginx命令的回現是相同的。CMD能夠理解爲接在ENTRYPOINT後的參數,當咱們撰寫這麼一個參數:--ENTRYPOINT /usr/local/bin/nginx後。咱們咱們使用以下命令達到的效果以下。 docker run xxxx --entrypoint /usr/local/bin/nginx help。等於在物理機中運行nginx help命令。

  關於docker的使用,學習的還比較淺,僅僅在應用層層面,跟本身目前的工做還不太相關,有機會會爲你們介紹docker remote api訪問漏洞的緣由和防範方法。

相關文章
相關標籤/搜索