1. 程式人生 > >docker存儲與通信

docker存儲與通信

docker docker存儲與通信

一、數據管理

用戶在使用docker 的過程中,往往需要能查看容器內應用產生的數據,或者需要把容器內的數據進行備份,甚至多個容器之間進行數據的分享,這必然涉及容器的數據管理。 容器數據的管理主要兩種方式: 數據卷 數據卷容器

1、數據卷

(1)數據卷的概念

數據卷是一個可供容器使用的特殊目錄,它繞過文件系統,可以提供很多有用的特性:

1>數據卷可以在容器之間共享和重用。

2>對數據卷的修改會立馬生效。

3>對數據卷的更新,不會影響鏡像。

4>卷會一直存在,直到沒有容器使用。

5>數據卷的使用,類似於Linux 下對目錄或文件進行mount 操作

創建數據卷 docker run 在使用時,後面可加 -v 標記,可以在容器內創建一個數據卷。多次使用-v 標記可以創建多個數據卷。

[[email protected] ~]# docker run -it -p 5000:80 --name web -v /html:/usr/share/nginx/html nginx:1 /bin/bash

//-it 交互式並獲得一個tty 終端,-p 將宿主機5000 端口映射給容器的80 端口,--name 起個名字叫web, -v 創建一個數據卷 把宿主機的/html 目錄(若不存在會自動建立)掛載到容器的/usr/share/nginx/html(此容器中nginx 的默認發布路徑為此目錄),使用nginx:1 這個鏡像運行一個容器,執行/bin/bash 命令獲得一個shell。

[email protected]

/* */:/#

[email protected]:/ ctrl+p ctrl+q # [[email protected] ~]#

[[email protected] ~]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

844ff80d3334 nginx:1 "/bin/bash" About a minute ago Up About a minute 0.0.0.0:5000->80/tcp web

[[email protected] ~]# ls /html/

[[email protected] ~]# echo "123123" > /html/index.html

瀏覽器訪問宿主機5000 端口查看

技術分享

[[email protected] ~]# echo "123" > /html/index.html //只要修改宿主機/html 裏的內容,容器裏的/usr/share/nginx/html 跟著變

技術分享

docker 掛載數據卷的默認權限是讀寫(rw),用戶也可以通過,ro 指定為只讀:

[[email protected] ~]# docker run -it -p5001:80 --name we1 -v /html1:/usr/share/nginx/html:ro nginx:1 /bin/bash

[email protected]:/# /etc/init.d/nginx start

[email protected]:/# ctrl+p ctrl+q [[email protected] ~]#

[[email protected] ~]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

4f7bdd156b4e nginx:1 "/bin/bash" 16 seconds ago Up 14 seconds 0.0.0.0:5001->80/tcp we1

a2752d8fe0fd nginx:1 "/bin/bash" 13 minutes ago Up 13 minutes 0.0.0.0:5000->80/tcp we

加了:ro 之後,容器內掛載的數據卷的數據就無法修改

2、數據卷容器

(1)數據卷容器概述 用戶需要在容器之間共享一些持續性更新的數據,這時,可以使用數據卷容器。數據容器也是一個普通的容器。
(2)創建數據卷容器

[[email protected] ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

nginx 1 2f24e0f40c85 37 minutes ago 181.2 MB

centos 1 385c6554f48e 3 days ago 196.7 MB

[[email protected] ~]# docker run -it -v /dbdata --name dbdata centos:1 /bin/bash //創建一個數據卷容器,並在其中創建一個數據卷掛載到/dbdata

[[email protected] /]# exit

[[email protected] ~]# docker run -it --volumes-from dbdata --name test1 centos:1 /bin/bash

//--volumes-from 來掛載dbdata 容器中的數據卷,創建test1 和test2 兩個容器,查看數據是否同步

[[email protected] /]# ls

anaconda-post.log dbdata etc lib lost+found mnt proc run srv tmp var

bin dev home lib64 media opt root sbin sys usr

[[email protected] /]#

[[email protected] /]# ls dbdata/

[[email protected] /]# touch /dbdata/aaa

[[email protected] /]# ls dbdata/

aaa

[[email protected] /]# exit

exit

[[email protected] ~]# docker run -it --volumes-from dbdata --name test2 centos:1 /bin/bash

[[email protected] /]# ls

anaconda-post.log dbdata etc lib lost+found mnt proc run srv tmp var

bin dev home lib64 media opt root sbin sys usr

[[email protected] /]# ls dbdata/

aaa //測試文件還在

[[email protected] /]# exit

Exit

3、利用數據卷容器遷移數據

(1)備份

[[email protected] ~]# docker run --volumes-from dbdata -v $(pwd):/backup --name worker centos:1 tar cvf /backup/backup.tar /dbdata

//在centos:1 鏡像上創建了一個叫worker 的容器,再通過使用 --volumes-from dbdata 這個參數讓worker 容器掛載dbdata 容器的數據卷(即dbdata 數據卷);使用 -v $(pwd):/backup 參數來掛載本地的當前目錄到worker 容器的/backup 目錄;worker 容器啟動後,使用tar cvf /backup/backup.tar /dbdata 命令, 來將/dbdata 下內容打包備份為容器內的/backup/backup.tar,即宿主機當前目錄下的backup.tar

運行結果:

tar: Removing leading `/‘ from member names

/dbdata/

/dbdata/aaa

(2)恢復

[[email protected] ~]# docker run -it -v /dbdata --name dbdata2 centos:1 /bin/bash // 創建一個帶有數據卷的容器:dbdata2

[[email protected] /]# exit

[[email protected] ~]# docker ps -l

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

2a17825b9823 centos:1 "/bin/bash" 37 seconds ago Exited (0) 12 seconds ago dbdata2

[[email protected] ~]# docker run --volumes-from dbdata2 -v $(pwd):/backup centos:1 tar xvf /backup/backup.tar //創建另一個新的容器,掛載dbdata2 的容器,並使用tar xvf 解壓備份文件到所掛載的容器卷即可

dbdata/

dbdata/aaa

二、docker 的網絡基礎配置

1.端口映射實現訪問容器

從外部訪問容器應用 在啟動容器的時候,如果不指定對應的參數,在容器的外部是無法通過網路來訪問容器內部開的應用和服務的。可以通過 -P 或 -p 參數來指定端口映射

1>大寫P

-P:docker 會隨機映射一個文件/proc/sys/net/ipv4/ip_local_port_range 中定義的端口範圍作

為一個本地端口,隨後將這個本地端口映射到容器內部開放的網絡端口

[[email protected] ~]# docker run -d -P webapp:1 python app.py

9276997c8e3e3a2bee9cb48737bbfa27faa4577d811e2e3f0e5fddd590121a46

[[email protected] ~]# docker ps -l

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

9276997c8e3e webapp:1 "python app.py" 10 seconds ago Up 9 seconds 0.0.0.0:32768->5000/tcp focused_torvalds

[[email protected] ~]# cat /proc/sys/net/ipv4/ip_local_port_range

32768 61000

2>小寫p

-p :指定要映射的端口,並且在一個指定端口上只可以綁定一個容器

格式:

ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort

ip:主機端口:容器端口 | ip::容器端口 | 主機端口:容器端口

映射所有接口地址

[[email protected] ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

nginx 1 2f24e0f40c85 About an hour ago 181.2 MB

centos 1 385c6554f48e 3 days ago 196.7 MB

docker.io/training/webapp latest 6fae60ef3446 21 months ago 348.7 MB

webapp 1 6fae60ef3446 21 months ago 348.7 MB

[[email protected] ~]# docker run -d -p 5000:5000 -p 3000:80 webapp:1 python app.py

7181e66382876d61601bc8c3dc635db09b1c63868c8d2d0ed372b455901b5db2

[[email protected] ~]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

765ed2301854 webapp:1 "python app.py" 5 seconds ago Up 3 seconds 0.0.0.0:5000->5000/tcp, 0.0.0.0:3000->80/tcp evil_almeida

9276997c8e3e webapp:1 "python app.py" 7 minutes ago Up 7 minutes 0.0.0.0:32768->5000/tcp focused_torvalds

映射到指定地址的指定端口,可以使用 ip:hostPort:containerPort

[[email protected] ~]# docker run -d -p 127.0.0.1:6000:5000 webapp:1 python app.py

bc861a62448423350151b8ef7ec31a18925d7d92938de4769135a349a16ffa0e

[[email protected] ~]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

bc861a624484 webapp:1 "python app.py" 5 seconds ago Up 4 seconds 127.0.0.1:6000->5000/tcp tender_heyrovsky

765ed2301854 webapp:1 "python app.py" About a minute ago Up About a minute 0.0.0.0:5000->5000/tcp, 0.0.0.0:3000->80/tcp evil_almeida

9276997c8e3e webapp:1 "python app.py" 9 minutes ago Up 9 minutes 0.0.0.0:32768->5000/tcp focused_torvalds

[[email protected] ~]# curl http://127.0.0.1:6000

Hello world![[email protected] ~]#

映射到指定地址的任意端口,使用ip::containerPort 格式,在本地主機會自動分配一個端口

[[email protected] ~]# docker run -d -p 127.0.0.1::5000 webapp:1 python app.py

3b2b1c871b29673ae1eb702d45b8f6085656f6196cb6d80c11250a58da646d0a

[[email protected] ~]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

3b2b1c871b29 webapp:1 "python app.py" 7 seconds ago Up 5 seconds 127.0.0.1:32769->5000/tcp silly_meitner

bc861a624484 webapp:1 "python app.py" 2 minutes ago Up 2 minutes 127.0.0.1:6000->5000/tcp tender_heyrovsky

765ed2301854 webapp:1 "python app.py" 3 minutes ago Up 3 minutes 0.0.0.0:5000->5000/tcp, 0.0.0.0:3000->80/tcp evil_almeida

9276997c8e3e webapp:1 "python app.py" 11 minutes ago Up 11 minutes 0.0.0.0:32768->5000/tcp focused_torvalds

2.容器互聯實現容器間通信

容器的連接(linking)系統是除了端口映射外另一種可以與容器中應用進行交互的方式。它會在源和接收容器之間創建一個隧道,接收容器可以看到源容器指定的信息

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

[[email protected] ~]# cat mysql5.tar |docker import - mysql:1

sha256:8c1652f0a50af3ac76b630185cc2fb6cc525ec8d47fe13287573e9623d5a899a

[[email protected] ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

mysql 1 8c1652f0a50a 2 minutes ago 375 MB

nginx 1 2f24e0f40c85 About an hour ago 181.2 MB

centos 1 385c6554f48e 3 days ago 196.7 MB

docker.io/training/webapp latest 6fae60ef3446 21 months ago 348.7 MB

webapp 1 6fae60ef3446 21 months ago 348.7 MB

[[email protected] ~]# docker run -d -it --name db mysql:1 /bin/bash

8f96883620812e2abdddc5e46bec48449924557dfa10e974b7ca0ee2ef89ce7c

[[email protected] ~]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

8f9688362081 mysql:1 "/bin/bash" 27 seconds ago Up 26 seconds db

[[email protected] ~]# docker run -d -P --name wec --link db:db webapp:1 python app.py

// --link 參數的格式: --link name:alias , 其中name 是要鏈接的容器的名稱,alias 是這個鏈接的別名

223ba1ec1b986d14cb9394a62ac839705aebab6a8d7dca33b8e3ad7bf549c119

[[email protected] ~]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

223ba1ec1b98 webapp:1 "python app.py" 10 seconds ago Up 8 seconds 0.0.0.0:32770->5000/tcp wec

8f9688362081 mysql:1 "/bin/bash" 4 minutes ago Up 4 minutes db

此時,db 容器和web 容器建立互聯關系


本文出自 “Dr小白” 博客,請務必保留此出處http://1213503.blog.51cto.com/1203503/1945274

docker存儲與通信