docker&&數據卷volumes&&網絡

數據卷volumes基本使用

掛載主機本地目錄到容器

在用 docker run 命令的時候,使用 -v 標記來創建一個數據卷並掛載到容器裏。在一次 run 中多次使用可以掛載多個數據卷。

#啓動容器,將物理主機的/data目錄掛載到docker容器的/opt目錄下
docker run -itd -v /data:/opt ubuntu:14.04

可以在 Dockerfile 中使用 VOLUME 來添加一個或者多個新的捲到由該鏡像創建的任意容器
上面的命令加載主機的 /data目錄到容器的/opt目錄。這個功能在進行測試的時候十分方便,比如用戶可以放置一些程序到本地目錄中,來查看容器是否正常工作。本地目錄的路徑必須是絕對路徑,如果目錄不存在 Docker 會自動爲你創建它。

Dockerfile 中不支持這種用法,這是因爲 Dockerfile 是爲了移植和分享用的。然而,不同操作系統的路徑格式不一樣,所以目前還不能支持。

#啓動容器,將物理主機的/data目錄掛載到docker容器的/opt目錄下
docker run -itd -v /data:/opt:ro ubuntu:14.04

Docker 掛載數據卷的默認權限是讀寫,用戶也可以通過 :ro 指定爲只讀。

掛載主機本地文件到容器

#實現記錄在容器輸入過的命令
sudo docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash

如果直接掛載一個文件,很多文件編輯工具,包括 vi 或者 sed --in-place,可能會造成文件 inode 的改變,從 Docker 1.1 .0起,這會導致報錯誤信息。所以最簡單的辦法就直接掛載文件的父目錄。

數據卷容器的使用

數據卷容器可以實現在容器之間共享數據同時持續更新數據。
是專門用來提供數據卷供其它容器掛載的

實現

創建數據卷容器

此處數據卷容器名稱爲volume1,其中容器內存在共享目錄/v1:

root@ubuntu-virtual-machine:/opt# docker run  -dit  -v  /v1  --name  volume1  ubuntu:14.04
e6f7f0fd7f9b00ed5c19747cef01dfa0a377d33b548d73d9708b50152171870a
root@ubuntu-virtual-machine:/opt# 
root@ubuntu-virtual-machine:/opt# 
root@ubuntu-virtual-machine:/opt# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
e6f7f0fd7f9b        ubuntu:14.04        "/bin/bash"         6 seconds ago       Up 4 seconds                            volume1

創建第二容器使用–volumes-from 來掛載 數據卷容器volume1中的數據卷

第二容器名稱爲volume1_1,其容器內存在共享目錄/v1:

docker run  -dit  --volumes-from volume1  --name volume1_1 ubuntu:14.04
docker run  -dit  --volumes-from volume1_1  --name volume1_1_1 ubuntu:14.04

可以使用多個 --volumes-from 參數來從多個容器掛載多個數據卷。
也可以從其他已經掛載了數據卷的容器來掛載數據卷。
通過共享目錄/v1實現數據、文件共享

使用 --volumes-from 參數所掛載數據卷的容器自己並不需要保持在運行狀態。
如果刪除了掛載的容器(包括 volume1_1_1 、volume1_1 和 volume1 ),數據卷並不會被自動刪除。
如果要刪除一個數據卷,必須在刪除最後一個還掛載着它的容器時使用 docker rm -v 命令來指定同時刪除關聯的容器。 這可以讓用戶在容器之間升級和移動數據卷。

數據卷的備份、恢復、遷移

備份

sudo docker run --volumes-from volume1  -v $(pwd):/backup ubuntu:14.04 tar cvf /backup/backup.tar /v1

分兩步:

  1. 創建容器並掛載數據卷容器volume1的共享目錄/v1 ,同時將本地目錄掛載到容器內的/backup目錄下
  2. 掛載完成後,執行打包命令對共享目錄/v1進行打包並保存到/backup目錄下,壓縮包爲backup.tar。

恢復

恢復步驟與上面相反

sudo  docker run  -dit  -v  /v1  --name  volume1  ubuntu:14.04
sudo  docker run --volumes-from volume1 -v $(pwd):/backup ubuntu:14.04 tar xvf  /backup/backup.tar

網絡

外部訪問容器

外部訪問容器端口

root@ubuntu-virtual-machine:/opt/dfq# docker run -dit -p 10080:80 ubuntu:14.04
ee04e47aeae3c43a3f018135fd68d67d4603613b751d3466645e3566371b451f
root@ubuntu-virtual-machine:/opt/dfq# docker ps -a 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                   NAMES
ee04e47aeae3        ubuntu:14.04        "/bin/bash"         4 seconds ago       Up 3 seconds        0.0.0.0:10080->80/tcp   affectionate_chebyshev
root@ubuntu-virtual-machine:/opt/dfq# netstat -anlp| grep :10080
tcp6       0      0 :::10080                :::*                    LISTEN      17096/docker-proxy

此時默認會綁定本地所有接口上的所有地址。
可以使用 udp 標記來指定 udp 端口."-p 10080:80/udp"
-p 標記可以多次使用來綁定多個端口

支持的格式有:
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort

查看映射端口配置:

root@ubuntu-virtual-machine:/home/ubuntu# docker ps -a 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                   NAMES
ee04e47aeae3        ubuntu:14.04        "/bin/bash"         15 minutes ago      Up 15 minutes       0.0.0.0:10080->80/tcp   affectionate_chebyshev
root@ubuntu-virtual-machine:/home/ubuntu# docker port ee04e47aeae3  80
0.0.0.0:10080

端口範圍映射

容器訪問容器

使用 --link 參數可以讓容器之間安全的進行交互:

root@ubuntu-virtual-machine:/home/ubuntu# docker run -dit --name mysql ubuntu:14.04
a49913c31e294e2b2ba231e1a4eadd60650b81c281fcb018ecf1e87c1e7c1ddf
root@ubuntu-virtual-machine:/home/ubuntu# docker ps -a 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
a49913c31e29        ubuntu:14.04        "/bin/bash"         25 seconds ago      Up 24 seconds                           mysql
root@ubuntu-virtual-machine:/home/ubuntu# docker run -dit  --name web  --link  mysql:mysql ubuntu:14.04

此時容器web與容器mysql之間可以互相無障礙訪問。

容器間的網絡互聯體現在哪方面?

在這裏插入圖片描述
在這裏插入圖片描述

使用自定義網橋

創建自定義網橋

root@ubuntu-virtual-machine:/home/ubuntu# sudo service docker stop
root@ubuntu-virtual-machine:/home/ubuntu# apt-get install bridge-utils
root@ubuntu-virtual-machine:/home/ubuntu# brctl addbr  dfq_bridge
root@ubuntu-virtual-machine:/home/ubuntu# ip addr  add  10.2.0.1/24  dev  dfq_bridge
root@ubuntu-virtual-machine:/home/ubuntu# ip link set dev dfq_bridge  up
root@ubuntu-virtual-machine:/home/ubuntu# echo 'DOCKER_OPTS="-b=dfq_bridge"' >> /etc/default/docker
root@ubuntu-virtual-machine:/home/ubuntu# sudo service docker start

啓動 Docker 服務。 新建一個容器,可以看到它已經橋接到了 bridge0 上

如何實現不同容器連接不同的橋接網絡呢?

百度吧~~

–net的使用

Docker 創建一個容器的時候,會執行如下操作:

  • 創建一對虛擬接口,分別放到本地主機和新容器中;
  • 本地主機一端橋接到默認的 docker0 或指定網橋上,並具有一個唯一的名字,如 veth65f9;
  • 容器一端放到新容器中,並修改名字作爲 eth0,這個接口只在容器的名字空間可見;
  • 從網橋可用地址段中獲取一個空閒地址分配給容器的 eth0,並配置默認路由到橋接網卡 veth65f9。
  • 完成這些之後,容器就可以使用 eth0 虛擬網卡來連接其他容器和其他網絡。

docker run 通過 --net 參數來指定容器的網絡配置,有4個可選值:
–net=bridge
這個是默認值,連接到默認的網橋。
–net=host
告訴 Docker 不要將容器網絡放到隔離的名字空間中,即不要容器化容器內的網絡。此時容器使用本地主機的網絡,它擁有完全的本地主機接口訪問權限。容器進程可以跟主機其它 root 進程一樣可以打開低範圍的端口,可以訪問本地網絡服務比如 D-bus,還可以讓容器做一些影響整個主機系統的事情,比如重啓主機。因此使用這個選項的時候要非常小心。如果進一步的使用 --privileged=true,容器會被允許直接配置主機的網絡堆棧。
–net=container:NAME_or_ID
讓 Docker 將新建容器的進程放到一個已存在容器的網絡棧中,新容器進程有自己的文件系統、進程列表和資源限制,但會和已存在的容器共享 IP 地址和端口等網絡資源,兩者進程可以直接通過 lo 環回接口通信。
–net=none
讓 Docker 將新容器放到隔離的網絡棧中,但是不進行網絡配置。之後,用戶可以自己進行配置。

使用 --net=none 後,如何自行配置網絡?

用戶使用 --net=none 後,可以自行配置網絡,讓容器達到跟平常一樣具有訪問網絡的權限。通過這個過程,可以瞭解 Docker 配置網絡的細節。

#首先,啓動一個 /bin/bash 容器,指定 --net=none 參數。
$ sudo docker run -i -t --rm --net=none base /bin/bash
root@63f36fc01b5f:/#

#在本地主機查找容器的進程 id,併爲它創建網絡命名空間。
$ sudo docker inspect -f '{{.State.Pid}}' 63f36fc01b5f
2778
$ pid=2778
$ sudo mkdir -p /var/run/netns
$ sudo ln -s /proc/$pid/ns/net /var/run/netns/$pid

#檢查橋接網卡的 IP 和子網掩碼信息。
$ ip addr show docker0
21: docker0: ...
inet 172.17.42.1/16 scope global docker0

#創建一對 “veth pair” 接口 A 和 B,綁定 A 到網橋 docker0,並啓用它
$ sudo ip link add A type veth peer name B
$ sudo brctl addif docker0 A
$ sudo ip link set A up

#將B放到容器的網絡命名空間,命名爲 eth0,啓動它並配置一個可用 IP(橋接網段)和默認網關。
$ sudo ip link set B netns $pid
$ sudo ip netns exec $pid ip link set dev B name eth0
$ sudo ip netns exec $pid ip link set eth0 up
$ sudo ip netns exec $pid ip addr add 172.17.42.99/16 dev eth0
$ sudo ip netns exec $pid ip route add default via 172.17.42.1

以上,就是 Docker 配置網絡的具體過程。

當容器結束後,Docker 會清空容器,容器內的 eth0 會隨網絡命名空間一起被清除,A 接口也被自動從docker0 卸載。

此外,用戶可以使用 ip netns exec 命令來在指定網絡名字空間中進行配置,從而配置容器內的網絡。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章