Docker簡介、安裝,鏡像管理,經過容器建立鏡像,經過模板建立鏡像,容器管理,倉庫管理,數據管理,數據卷備份恢復,docker網絡模式,opration not permitted,配置橋接網絡

 

25.1 docker簡介
25.2 安裝docker
25.3 鏡像管理
25.4 經過容器建立鏡像
25.5 經過模板建立鏡像
25.6 容器管理
25.7 倉庫管理
25.8 數據管理
25.9 數據卷備份恢復
25.10 docker網絡模式
25.11 opration not permitted
25.12 配置橋接網絡html

Docker 教程    https://www.runoob.com/docker/docker-tutorial.htmllinux

1、Docker簡介nginx

官網 www.docker.com
docker  容器虛擬化
github  https://github.com/docker/docker.github.io
開源的容器引擎,可讓開發者打包應用以及依賴的庫,而後發佈到任何流行的linux發行版上,移植很方便,交付很快
由go語言編寫,基於apache2.0協議發佈
基於linux kernel,要想在win下運行須要藉助一個vm(虛擬機)來實現 
自2013年開始,近些年發展迅猛
docker從1.13x開始,版本分爲社區版ce和企業版ee,而且基於年月的時間線形式,當前最新穩定版爲17.09 參考http://blog.csdn.net/chenhaifeng2016/article/details/68062414

Docker和傳統的虛擬化比較git

Docker的優點github

啓動很是快,秒級實現
 資源利用率高,一臺高配置服務器能夠跑上千個docker容器
 更快的交付和部署,一次建立和配置後,能夠在任意地方運行
 內核級別的虛擬化,不須要額外的hypevisor支持,會有更高的性能和效率
 易遷移,平臺依賴性不強

Docker核心概念web

鏡像,是一個只讀的模板,相似於安裝系統用到的那個iso文件,咱們經過鏡像來完成各類應用的部署。
容器,鏡像相似於操做系統,而容器相似於虛擬機自己。它能夠被啓動、開始、中止、刪除等操做,每一個容器都是相互隔離的。
倉庫,存放鏡像的一個場所,倉庫分爲公開倉庫和私有倉庫。 最大的公開倉庫是Docker hub(hub.docker.com),國內公開倉庫(dockerpool.com)

2、Docker安裝docker

下載repo的yum源:   curl https://download.docker.com/linux/centos/docker-ce.repo -o  /etc/yum.repos.d/docker.repo

yum install -y docker-ce
 
systemctl start docker  啓動docker

速度比較慢,也能夠直接下載rpm包apache

https://download.docker.com/linux/centos/7/x86_64/stable/Packages/

下載完,上傳到linux下,也須要用yum安裝,能夠自動解決依賴關係json

yum install -y docker-ce-xxxx.rpm

每次啓動docker都會自動生成iptables規則vim

若是要保存規則,執行:docker啓動時就會生成規則,此步驟無關緊要

service iptables save

3、Docker鏡像管理

docker pull centos        //能夠下載centos鏡像,速度很慢

配置docker加速氣(參考 http://blog.csdn.net/xlemonok/article/details/71403534)

vim /etc/docker/daemon.json//加入以下內容
{
  "registry-mirrors": ["https://dhq9bx4f.mirror.aliyuncs.com"]
}

說明:這個url爲加速氣地址,須要同窗們自行到阿里雲申請
配置完加速氣,重啓docker服務,再次docker pull centos會快不少

systemctl restart docker

docker images 查看本地的鏡像,IMAGE ID 區分鏡像的惟一標識
docker search xxx //搜索鏡像,其中xxx是關鍵詞
docker tag centos tobe //給鏡像打標籤,即更改了REPOSITORY
docker tag centos ttt:12345   即更改了REPOSITORY也更改了TAG,可是IMAGE ID相同

docker run -itd centos //把鏡像啓動爲容器,-i表示讓容器的標準輸入打開,-t表示分配一個僞終端,-d表示後臺啓動,要把-i -t -d 放到鏡像名字前面

docker ps //查看運行的容器,加上-a選項後能夠查看全部容器,包括未運行的

docker run -itd centos //把鏡像啓動爲容器,-i表示讓容器的標準輸入打開,-t表示分配一個僞終端,-d表示後臺啓動,要把-i -t -d 放到鏡像名字前面
docker ps //查看運行中的容器,加上-a選項後能夠查看全部容器,包括未運行的
docker rmi abc:333  //用來刪除指定鏡像,rm刪除,i是image 其中後面的參數能夠是tag,若是是tag時,其實是刪除該tag。當後面的參數爲鏡像ID時,則會完全刪除整個鏡像,全部標籤也會一同刪除

4、Docker經過容器建立鏡像

 

docker run啓動容器後,能夠經過下面命令進入容器
docker exec -it xxxxx  bash//其中xxxxx爲容器id,這個id能夠用docker ps查看,最後面的bash爲進入容器後咱們要執行的命令,這樣就能夠打開一個終端
進入到該容器中,咱們作一些變動,好比安裝一些東西,而後針對這個容器進行建立新的鏡像

打開後主機名爲容器id

在容器中執行 yum install -y net-tools,而後ctrl d退出容器,退出後,就能夠把容器中的變動保存到新的鏡像中去

docker commit -m "change somth"  -a "somebody info" container_id new_image_name //container_id經過docker ps -a獲取,後面的new_image_name爲新鏡像名字

例如:  docker commit -m "install net" -a ttobe 7cfcee29052f centos_with_nettool 這個命令有點像svn的提交,-m 加一些改動信息,-a 指定做者相關信息  7cfc這一串爲容器id,再後面爲新鏡像的名字

docker run -itd centos_with_nettool        啓動容器

docker exec -it da577154efb0 bash         進入容器

在centos鏡像中安裝好的net-tools,ifconfig能夠直接在centos_with_nettool鏡像中使用

5、Docker使用模板建立鏡像

首先去下載一個模板

http://openvz.org/Download/templates/precreated //下載速度不快,下載了一個centos6的模板centos-6-x86-minimal.tar.gz
或者wget https://download.openvz.org/template/precreated/centos-6-x86-minimal.tar.gz

導入該鏡像的命令爲:

cat centos-6-x86-minimal.tar.gz|docker import - centos6

docker run -itd centos6 bash   啓動該容器

docker exec -it 128e1fb bash  進入該容器

把現有鏡像,導出爲一個文件:

docker save -o centos7_with_nettool.tar centos_with_nettool  

centos7_with_nettool.tar   導出的文件名
centos_with_nettool    鏡像名

此處刪除報錯是由於鏡像在啓動中,須要結束掉在刪除,接下來進行恢復

docker rm -f da577154efb0        中止、關閉鏡像

docker rmi -f 6cd1ccf53106       刪除鏡像

用該文件恢復本地鏡像:

docker load --input aming-centos.tar  或者
docker load < aming-centos.tar
docker push image_name  //能夠把本身的鏡像傳到dockerhub官方網站上去,但前提是須要先註冊一個用戶,後續若是有需求再研究吧

6、Docker容器管理

docker create -it centos6 bash     //這樣能夠建立一個容器,但該容器並無啓動

docker start  container_id      //啓動容器,可使用 docker ps -a查看到,有start 就有stop,和restart

以前咱們使用的docker run 至關於先create再start
docker run -it centos bash  
這樣進入了一個虛擬終端裏面,咱們能夠運行一些命令,使用命令exit或者ctrl d 退出該bash,當退出後這個容器也會中止。
docker run -d  可讓容器在後臺運行

好比:docker run -d centos bash -c "while :; do echo "123"; sleep 2; done"
docker run --name web -itd centos bash // --name 給容器自定義名字
docker run --rm -it centos bash -c "sleep 30" //--rm 可讓容器退出後直接刪除,在這裏命令(sleep 30)執行完容器就會退出


docker logs 能夠獲取到容器的運行歷史信息,用法以下
docker logs  container_id  

docker attach 能夠進入一個後臺運行的容器,好比
docker attach  container_id    //可是attach命令不算好用,好比咱們想要退出終端,就得exit了,這樣容器也就退出了,還有一種方法

docker exec -it container_id  bash  //能夠臨時打開一個虛擬終端,而且exit後,容器依然運行着
docker rm  container_id  //container_id是ps的時候查看到的,這樣就能夠把container刪除,若是是運行的容器,能夠加-f
docker  export  container_id  > file.tar  // 導出容器,能夠遷移到其餘機器上,須要導入
cat file.tar |docker import - tobe_test   //這樣會生成tobe_test的鏡像

7、Docker倉庫管理

建立本地的docker私有倉庫:

docker pull registry   //下載registry 鏡像,registy爲docker官方提供的一個鏡像,咱們能夠用registry來建立本地的docker私有倉庫。
docker run -d -p 5000:5000 registry   //以registry鏡像啓動容器,-p會把容器的端口映射到宿主機上,:左邊爲宿主機監聽端口,:右邊爲容器監聽端口

curl 127.0.0.1:5000/v2/_catalog //能夠訪問它,此時裏面沒有數據

下面咱們來把其中一個鏡像上傳到私有倉庫:

一、須要先打標籤

docker tag tobe_test  192.168.183.3:5000/centos //標記一下tag,必需要帶有私有倉庫的ip(宿主機的ip):port

二、推送到私有倉庫

docker push 192.168.183.3:5000/centos     //把標記的鏡像給推送到私有倉庫時報錯,須要使用https地址

更改配置文件,指定私有倉庫的地址

vim /etc/docker/daemon.json    //更改成

{ "insecure-registries":["192.168.183.3:5000"] }    #指定私有倉庫的地址

systemctl restart docker   重啓後,全部啓動的鏡像都會中止 

docker ps -a //查看容器已經關閉,還須要啓動

docker start  container_id //這裏的id爲registry容器id,docker ps -a便可查看

再次push 

docker push 192.168.183.3:5000/centos    此時開始上傳

curl 127.0.0.1:5000/v2/_catalog     //能夠查看到推送上來的鏡像

{"repositories":["centos"]} 此處的centos爲推送上來後面的centos

把鏡像push到私有倉庫中,下載到私有倉庫中:

在002機器上操做:須要安裝docker

編輯配置文件:
vim /etc/docker/daemon.json

{ "insecure-registries":["192.168.183.3:5000"] }   指定私有倉庫的地址

systemctl restart docker

docker pull 192.168.183.3:5000/centos

8、Docker數據管理

容器由鏡像啓動,容器中會產生新的數據,關閉或刪除容器,存儲的數據也會刪除,能夠把宿主機的目錄掛載到容器中去,會把數據存到宿主機的目錄中去

1. 掛載本地的目錄到容器裏

docker run -tid -v /data/:/data centos_with_nettool bash     //-v 用來指定掛載目錄,:前面的/data/爲宿主機本地目錄,:後面的/data/爲容器裏的目錄,會在容器中自動建立,目錄能夠不一樣

此時容器中的目錄和宿主機的目錄相同,在容器中建立一個123目錄,在容器上產生的新數據就會存到宿主機上

2. 掛載數據卷
其實咱們掛載目錄的時候,能夠指定容器name,若是不指定就隨機定義了。好比上面咱們沒有指定,它就生成了一個名字爲epic_mclean,這個名字可使用命令 docker ps  看最右側一列NAMES

docker run -itd --volumes-from epic_mclean centos bash  啓動容器
docker exec -it 98a76f bash  進入容器

這樣,咱們使用centos鏡像建立了新的容器,而且使用了 epic_mclean  容器的數據卷,此時新開啓的容器數據和以前的容器數據是一致的

3. 定義數據卷容器
有時候,咱們須要多個容器之間相互共享數據,相似於linux裏面的NFS,因此就能夠搭建一個專門的數據卷容器,而後其餘容器直接掛載該數據卷。
首先創建數據卷容器

docker run -itd -v /data/ --name testvol tobe bash  //-v選項的另外一個寫法,後面不加冒號,不須要把宿主機的目錄作映射,注意這裏的/data/是容器的/data目錄,並不是本地的/data/目錄。-v /data/作成公共的目錄

而後讓其餘容器掛載該數據卷

docker run -itd --volumes-from testvol tttt bash

若是要一個容器是data一個是home,能夠作軟鏈接:

home.1  是原來的home

9、Docker數據卷的備份與恢復

備份

mkdir /data/backup  宿主機上建立
docker run --volumes-from testvol -v /data/backup/:/backup centos tar cvf  /backup/data.tar /data/(最後面的data是要備份的目標目錄)   建立容器

說明:首先咱們須要使用testvol數據卷新開一個容器,同時咱們還須要把本地的/data/backup目錄掛載到該容器的/backup下,這樣在容器中/backup目錄裏面新建的文件,咱們就能夠直接在/data/backup/目錄中看到了。 而後再把/data/目錄下面的文件打包到成data.tar文件放到/backup目錄下面。

恢復
思路: 先新建一個數據卷容器,再建一個新的容器並掛載該數據卷容器,而後再把tar包解包。

新建數據卷容器:docker run -itd -v /data/ --name testvol2 centos bash
掛載數據卷新建容器,並解包:docker run --volumes-from testvol2  -v /data/backup/:/backup centos tar xf /backup/data.tar

10、Docker網絡模式

一、host模式,使用docker run時使用--net=host指定
docker使用的網絡實際上和宿主機同樣,在容器內看到的網卡ip是宿主機ip

二、container模式,使用--net=container:container_id/container_name
多個容器使用共同的網絡,看到的ip是同樣的

三、none模式,使用--net=none指定
這種模式下,不會配置任何網絡

四、bridge模式,使用--net=bridge指定默認模式,不用指定默認就是這種網絡模式。這種模式會爲每一個容器分配一個獨立的Network Namespace。相似於vmware的nat網絡模式。同一個宿主機上的全部容器會在同一個網段下,相互之間是能夠通訊的。

Docker網絡管理-外部訪問容器

首先使用centos_with_nettool鏡像新建一個容器,而後在該容器中安裝nginx服務,並啓動
再把該容器導成一個新的鏡像(centos_th_nginx),而後再使用新鏡像建立容器,並指定端口映射:

啓動centos_with_nettool容器
docker exec -it 3997cc6a1f11 bash   進入容器
yum install -y epel-release   安裝nginx的擴展包
yum install -y nginx

在容器中安裝一個服務(nginx),導成一個鏡像,而後再使用新鏡像建立容器,並指定端口映射

-p後面也支持IP:port:ip:port 的格式,好比
-p 127.0.0.1:8080:80 
也能夠不寫本地的端口,只寫ip,這樣會隨意分配一個端口
-p 127.0.0.1::80 //注意這裏是兩個冒號

導成一個鏡像:    

docker commit -m "install nginx" -a "tobelinux" 3997cc6a1f11 centos_th_nginx

docker run -itd -p 8088:80 centos_th_nginx bash        //-p 能夠指定端口映射,本例中將容器中的80端口映射爲本地的8088端口

11、opration not permitted

啓動nginx,報錯:

緣由:

新建的容器,啓動nginx或者httpd服務的時候會報錯:    Failed to get D-Bus connection: Operation not permitted
這是由於dbus-daemon沒有啓動,解決該問題能夠這樣作:
啓動容器時,要加上--privileged -e "container=docker" ,而且最後面的命令改成/usr/sbin/init
若是以前啓動過容器須要刪除:docker rm -f CONTAINER ID
docker run -itd --privileged -e "container=docker" -p 8088:80 centos_th_nginx /usr/sbin/init

curl localhost     在容器中進行測試

在宿主機上測試,須要使用8088端口

12、Docker網絡管理-配置橋接網絡

使用第三方pipework實現

爲了使本地網絡中的機器和Docker容器更方便的通訊,咱們常常會有將Docker容器配置到和主機同一網段的需求。這個需求其實很容易實現,咱們只要將Docker容器和宿主機的網卡橋接起來,再給docker容器配上IP就能夠了。
爲了讓外面的用戶訪問 
和ens33網卡作橋接:

cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-br0
vim ifcfg-ens33     //增長BRIDGE=br0,刪除IPADDR,NETMASK,GATEWAY,DNS1,UUID
vim ifcfg-br0    //修改DEVICE爲br0,Type爲Bridge,把ens33的網絡設置設置到了br0上

systemctl restart network

此時br0有ip,ens33是沒有ip的,若是須要在添加一個橋接網卡,能夠添加一個br1,能夠配置多個

安裝pipwork

cd 到根目錄
git clone https://github.com/jpetazzo/pipework
cd pipework/
cp pipework /usr/local/bin/

開啓一個容器 

docker run -itd --net=none centos_th_nginx bash        --net=none 不設置網絡

docker exec -it d414127f43c8 bash

給容器增長ip

pipework br0 d414127f43c8 192.168.183.135/24@192.168.183.2        #192.168.183.135爲容器的ip,@後面的ip爲網關ip

此時到002機器上是能夠ping通的,而且也能夠連外網

相關文章
相關標籤/搜索