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通的,而且也能夠連外網