docker使用三(docker数据管理与容器互联)

docker数据管理与容器互联

一、Docker数据管理

  在使用docker中,往往需要对数据进行持久化,或者在多个容器之间进行数据的共享,对于这种需求可以可以使用数据卷或者数据卷容器实现。

1、数据卷

  数据卷是一个可供容器使用的特殊目录,可将本地的系统目录直接映射给容器,有点类似mount用法。数据卷的穿件可以在容器创建的时候通过-v参数来指定。

1)数据卷的特性:

    1)数据卷可以在容器之间共享和重用,容器间传输数据将变得高效方便

    2)对数据卷内数据的修改会立马生效,无论时容器内操作还是本地操作

    3)对数据卷的更新不会影响镜像,解耦了应用和数据

    4)数据卷会一直存在,直到没有容器使用

2)创建管理数据卷

    1)给容器创建数据卷

#在容器内创建一个数据卷,挂载到容器内的/data/log目录下   
 root@docker-server:~# docker run -d -P --name tomcat -v /data/log tomcat
#查看数据卷挂载目录
root@docker-server:~# docker inspect tomcat     
   "Mounts": [
            {
                "Type": "volume",
                "Name": "3a1d17280ab0b8a47c191332f71647692e60e2dc7a5e14a79b097310cc6df939",
                "Source": "/var/lib/docker/volumes/3a1d17280ab0b8a47c191332f71647692e60e2dc7a5e14a79b097310cc6df939/_data",
                "Destination": "/data/log",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }

   2)挂载一个主机的文件作为数据卷

  为了方便管理,在为容器创建数据卷时可挂载一个本地已有目录到容器中最为数据卷。默认挂载的数据卷的权限是rw,也可通过ro指定挂载的数据卷为只读。

# 将本地的/data/log挂载到容器内的/var/log目录下
root@docker-server:~# docker run -d -P --name nginx -v /data/log:/var/log nginx 
#为redis挂载一个只读数据卷
root@docker-server:~# docker run -d --name redis -v /data/test:/var/test:ro redis  

   3)挂载一个本地文件作为数据卷

# 将本机的文件作为数据卷挂载给容器
root@docker-server:~# docker run -it -v ~/.bash_history:/.bash_history centos:6.5 /bin/bash
[root@63bebe32a876 /]# cat .bash_history 
apt-get update
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9

2、数据卷容器

    数据卷容器也是一个容器,用来在多个容器之间共享一些持续更新的数据,数据卷容器是专门用来提供数据卷供其他容器挂载。

#创建一个数据卷容器
[root@ansible-server ~]# docker run -it -v /data --name data 70b70c987e8f /bin/bash
# 创建容器,并挂载数据卷
[root@ansible-server ~]# docker run -itd --volumes-from dbdata --name test01 997f0ed97903 /bin/bash        
e5391ef842e02bb380423a1c72468f7b54e7d3edc31464b9d41a456ff9f945f5
[root@ansible-server ~]# docker run -itd --volumes-from dbdata --name test02 centos /bin/bash       
3ceb0dda45549a97a9484fad675edfd88cab6f047e9654e4e468f5f79c69bc23

  将数据卷创建完,挂载到不同的容器下,在某一个容器下挂载数据卷的目录下创建文件,在另外一个容器下改在相同数据卷的容器下会看到相同的文件,这有点类似于linux系统的网络文件系统(nfs)

[root@ansible-server ~]# docker attach test01
[root@e5391ef842e0 /]# ll /data/
total 0
[root@e5391ef842e0 /]# touch /data/{1..10}.html
[root@e5391ef842e0 /]# ll /data/
html  10.html  2.html  3.html  4.html  5.html  6.html  7.html  8.html  9.html
[root@e5391ef842e0 /]# exit
exit
[root@ansible-server ~]# docker attach test02
[root@3ceb0dda4554 /]# ls /data/
1.html  10.html  2.html  3.html  4.html  5.html  6.html  7.html  8.html  9.html

(3)使用数据卷容器备份恢复数据

# 新建容器用于备份数据卷容器backup备份data中的数据,并将本地的目录/dbdata作为数据卷挂载给容器
root@docker-server:~# docker run --volumes-from data -v /dbdata:/backup --name backup ubuntu:16.04 tar cvf /backup/backup.tar /data 
# 创建一个数据卷容器
root@docker-server:~# docker run -v /data --name data2 ubuntu:16.04 /bin/bash
# 新创建容器,挂载新创建的数据卷容器data2,将本地有备份文件的目录作为数据卷挂载给新创建的容器并恢复备份的数据卷容器中的内容
root@docker-server:~# docker run --volumes-from backup -v /dbdata:/backup ubuntu:16.04 tar -xf /backup/backup.tar

二、docker容器互联

      在容器创建完运行的时候,往往外部需要访问容器内的应用或容器之间需要互相访问,这时候可以通过映射容器内应用的端口到宿主机让外部访问容器内的应用,也可以上容器间通过容器名互相访问。

1、使用端口映射实现访问容器

当运行容器时,让外部访问容器内的应用,可以通过”-P”或”-p”参数来指定端口映射。当使用”-P”参数时,docker会随机应设一个端口到内部容器开放的端口。

1)随机映射容器内的应用的端口

#运行容器,给容器内的nginx随机映射一个端口    
root@docker-server:~# docker run -d -P nginx
f359f13bf8e0bc5a86caefc472d818c89e6ebabfb77889044904f4b6edc91653
#查看本地监听的端口时,多了监听的32768端口
root@docker-server:~# ss -tanl
State Recv-Q        Send-Q    Local Address:Port    Peer Address:Port                      
LISTEN      0      128            :::32768              :::* 

2)映射端口到本地监听的所有地址的端口

#在创建仓库是,将容器内的5000端口映射到本地所有地址的5000端口。
docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
# 同时映射多个端口
root@docker-server:~# docker run -d -p 443:443 -p 80:80 nginx
b694de9925c8a3c735a910a5dac03730da064ee701fd77ffa6a0450cf3e84c2e

3)将容器内应用的端口映射到本地的指定地址的指定端口

#将容器内nginx的80端口映射到本地的10.0.0.16的123端口
root@docker-server:~# docker run -d -p 10.0.0.16:123:80 nginx

4)将容器内应用的端口映射到指定地址的任意端口

#将容器内tomcat的8080端口映射到本地地址10.0.0.16的任意端口
root@docker-server:~# docker run -d -p 10.0.0.16::8080 tomcat
f5b6d352c793b51b30e7cde60baf8ced75f8a9c70409b107559b736f3b59b7a0

     在映射时也可以用udp标记来指定udp端口。

2、使用docker互联机制实现容器的便捷互访

      容器互联是一种让多个容器中的应用进行快速交互的方式,会在源和接受容器之间创建连接关系,接受容器可以通过容器名快速访问到源容器。使用容器互联机制让容器互访在创建容器时,为容器定义一个便于识别容器的容器名称很重要。

# 创建数据库容器,容器命名为tomcat
root@docker-server:~# docker run -d --name tomcat tomcat
30effc2f3ccae8a5dcccbbb36e89070b908370004c4aa23e5ed88a2e1f605b95
# 创建容器systemc连接到tomcat
root@docker-server:~# docker run -itd --name system --link tomcat:tomcat centos:6.5 /bin/bash
# 登录容器查看关于tomcat的环境变量
root@docker-server:~# docker exec -it system /bin/bash
[root@410d107480bc /]# env
TOMCAT_ENV_JAVA_DEBIAN_VERSION=8u162-b12-1~deb9u1
HOSTNAME=410d107480bc
TERM=xterm
TOMCAT_PORT=tcp://172.17.0.3:8080
TOMCAT_ENV_OPENSSL_VERSION=1.1.0f-3+deb9u2
TOMCAT_ENV_LD_LIBRARY_PATH=/usr/local/tomcat/native-jni-lib
......
# 查看hosts文件
[root@410d107480bc /]# cat /etc/hosts
......
172.17.0.3      tomcat 30effc2f3cca
172.17.0.4      410d107480bc

       docker容器互联机制时在两个容器之间创建了一个虚拟通道,不用映射他们的端口到宿主机上,从而避免了暴露了某些隐秘的服务端口到外部网络上。

       docker容器互联是通过更新环境变量及更新”/etc/hosts”文件为容器公开连接信息。


猜你喜欢

转载自blog.csdn.net/dayi_123/article/details/80271492