【Docker篇之二】數據管理與網絡通訊

經過上一篇【Docker篇一】瞭解到Docker的三大核心概念:鏡像、容器、倉庫,以及鏡像下載上傳導入和導出操做,容器的建立以及啓動,導入和導出。
本篇將從以下三個方面詳解如何靈活的構建本身的容器,實現這些容器中數據的遷移,以及怎麼樣實現從網絡中訪問容器中的數據。html

  • 1)Docker鏡像建立方法。
  • 2)Docker數據管理。
  • 3)Docker網絡通訊。

1、Docker鏡像的建立方法

一、基於已有鏡像建立

  • 基於已有鏡像建立主要適用的是docker commit命令。實質就是把一個容器裏面運行的程序以及該程序的運行環境打包起來生成新的鏡像。
命令格式:docker commit [選項] 容器ID/名稱 倉庫名稱[標籤]
經常使用選項:
-m:說明信息
-a:做者信息
-p:生成過程當中中止容器的運行
  • 例:下面利用一個正在運行的docker容器,在該容器裏修改完畢後打包成本身的鏡像。

docker images
docker create -it 11426a19f1a2 /bin/bash
docker ps -a
docker start 4212c3d37718
docker commit -m "new" -a "test" 4212c3d37718 httpd:testweb

【Docker篇之二】數據管理與網絡通訊

二、基於本地模板建立

  • 經過導入操做系統模板文件能夠生成鏡像,模板能夠從OPENVZ開源項目下載,下載地址爲wget http://download.openvz.org/template/precreated
  • 下面是使用docker導入命令將下載debian模板壓縮包導入本地鏡像的例子。

wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
cat debian-7.0-x86-minimal.tar.gz | docker import - zhangsan:newdocker

【Docker篇之二】數據管理與網絡通訊

三、基於Dockerfile建立(推薦)

  • 除了手動生成鏡像以外,還可使用Dockerfile自動生成鏡像。
  • Dockerfile結構大體分爲四個部分

基礎鏡像信息
維護者信息
鏡像操做指令
容器啓動時執行指令apache

  • Dockerfile操做指令以下圖:

【Docker篇之二】數據管理與網絡通訊

  • 如上圖所示,編寫Dockerfile時,有嚴格的格式須要遵循,第一行必須是FROM指令說明所基於的鏡像名稱,以後使用MAINTAINER指令說明維護該鏡像的用戶信息,而後是鏡像操做相關指令,如RUN,每運行一條指令,都會給基礎鏡像添加新的一層,最後使用CMD指令,來指定啓動容器時要運行的命令操做。json

  • 例:利用Dockerfile建立httpd容器鏡像,而且運行。

mkdir apache
cd apach
vim Dockerfile //注意名稱必須是Dockerfilevim

#基於的基礎鏡像,若本地沒有就會自動下載
FROM centos

#維護鏡像的用戶信息
MAINTAINER The porject <cloud-ops@centos.org>

#鏡像操做指令安裝apache軟件
RUN yum -y update            //初始化yum倉庫
RUN yum -y install httpd

#開啓 80 端口
EXPOSE 80

#複製網站首頁文件,將本地與Dockerfile同級目錄下的index.html文件放入容器對應路徑下,需手動建立
ADD index.html /var/www/html/index.html    

#將執行腳本複製到鏡像中,此腳本爲啓動服務腳本,不存在,須要本身建立
ADD run.sh /run.sh

RUN chmod 755 /run.sh

#啓動容器時執行腳本
CMD ["/run.sh"]
  • 建立首頁目錄

echo "NEVER SAY NEVER !" > index.htmlcentos

  • 建立服務啓動腳本

vim run.sh緩存

#!/bin/bash
rm -rf /run/httpd/*     //初始化容器httpd服務,清楚緩存
exec /usr/sbin/apachectl -D FOREGROUND   //啓動容器中httpd服務
  • 全部文件建立完畢後,在當前目錄下執行命令,生成鏡像。

docker build -t httpd:centos . //注意末尾有"."bash

  • 新鏡像容器運行,將宿主機的端口映射到容器中80端口,-p爲指定端口號,-P爲隨機映射,第一次開啓端口爲32768

docker run -d -p 1216:80 httpd:centos //鏡像名稱與標籤同在生成鏡像時設定服務器

【Docker篇之二】數據管理與網絡通訊

  • 注:若是運行容器時,提示:

WARNING:IPv4 forwarding is disabled.Networking will not work.

  • 須要打開路由轉發功能,而後運行容器便可。

sysctl -w net.ipv4.ip_forward=1

2、私有倉庫的創建

  • 當使用docker push命令上傳時,默認上傳到官方公共倉庫,對於一些公共倉庫裏面的鏡像沒法瞭解詳細狀況下,咱們們須要創建私有倉庫,方便咱們選擇更加合適本身的容器鏡像。

  • 首先須要在構建私有倉庫的服務器上下載registry鏡像。

docker pull registry

Using default tag: latest
latest: Pulling from library/registry
4064ffdc82fe: Pull complete 
c12c92d1c5a2: Pull complete 
4fbc9b6835cc: Pull complete 
765973b0f65f: Pull complete 
3968771a7c3a: Pull complete 
Digest: sha256:51bb55f23ef7e25ac9b8313b139a8dd45baa832943c8ad8f7da2ddad6355b3c8
Status: Downloaded newer image for registry:latest
  • 以後須要在/etc/docker/目錄下建立一個json文件,不然每每在自定義的私有倉庫中上傳鏡像時,就會報錯。

vim /etc/docker/deamon.json

{ "insecure-registries":["192.168.144.111:5000"]}    //指定私有倉庫地址和端口號
  • 重啓docker服務

systemctl status docker.service

  • 而後使用下載好的registry鏡像啓動一個容器,默認狀況下倉庫存放於容器內的/tmp/registry目錄下,使用-v選項能夠將本地目錄掛載到容器內的/tmp/registry下使用,這樣就不怕容器被刪除後鏡像也會隨着消失。

docker create -it registry /bin/bash //爲registry鏡像建立容器

docker ps -a
docker start a1a68e5b9b6f //啓動registry鏡像容器

  • 宿主機的/data/registry自動建立掛載容器中的/tmp/registry,當利用docker run命令時,宿主機中本不存在這個目錄,也會自動建立。

docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry

  • 將須要上傳的鏡像更改TAG,注意此處新鏡像名稱前必須加上私有倉庫的地址與端口號

docker tag zhangsan:new 192.168.144.111:5000/zhangsan

  • 將鏡像上傳到私有倉庫

docker push 192.168.144.111:5000/zhangsan

【Docker篇之二】數據管理與網絡通訊

  • 獲取私有倉庫列表

curl -XGET http://192.168.144.111:5000/v2/_catalog

【Docker篇之二】數據管理與網絡通訊

3、Docker數據管理

爲了方便查看容器內產生的數據或者將多個容器中的數據實現共享,就涉及到容器的數據管理操做,管理Docker容器中數據主要有兩種方式,數據卷和數據卷容器。

3.一、數據卷

  • 數據卷是一個供容器使用的特殊目錄,位於容器中,可將宿主機的目錄掛載到數據捲上,對數據卷的修改操做馬上可見,而且更新數據不會影響鏡像,從而實現數據在宿主機與容器之間的遷移,數據卷的使用相似於在Linux下對目錄進行的mount操做。

3.1.一、建立數據卷

在docker run 命令中使用-v選項能夠在容器內建立數據,屢次使用,可建立多個數據卷,使用--name選項能夠給容器建立一個友好的自定義名稱。

  • 宿主機目錄/var/www掛載到容器中的/data1

docker run -v /var/www:/data1 --name web1 -it centos /bin/bash

【Docker篇之二】數據管理與網絡通訊

[root@202dd484fd62 /]# cd /data1/

[root@202dd484fd62 data1]# touch test123

  • 返回宿主機進行查看

[root@localhost ~]# ls /var/www/

【Docker篇之二】數據管理與網絡通訊

3.二、數據卷容器

若是須要在容器之間共享一些數據,最簡單的方法就是使用數據卷容器,數據卷容器就是一個普通的容器,專門提供數據卷給其餘容器掛載使用,使用方法以下:
首先須要建立一個容器做爲數據卷容器,以後在其餘容器建立使用時用--volumes-from掛載數據卷容器中的數據卷使用。

  • 建立數據卷容器

docker run --name web100 -v /data1 -v /data2 -it centos /bin/bash

【Docker篇之二】數據管理與網絡通訊

  • 新容器掛載數據卷容器

docker run -it --volumes-from web100 --name db1 centos /bin/bash

【Docker篇之二】數據管理與網絡通訊
【Docker篇之二】數據管理與網絡通訊
【Docker篇之二】數據管理與網絡通訊

4、Docker網絡通訊

4.一、端口映射

docker run -d -P httpd:centos

docker run -d -p 49280:80 httpd:centos

docker ps -a

6d461287c25d        httpd:centos        "/run.sh"           7 seconds ago        Up 7 seconds        0.0.0.0:49280->80/tcp   zen_swanson

4.二、容器互聯

docker run -P --name web1 -it httpd:centos /bin/bash

docker run -P --name web2 --link web1:web1 -it httpd:centos /bin/bash

【Docker篇之二】數據管理與網絡通訊

相關文章
相關標籤/搜索