您的位置:首页 > 运维架构 > Docker

深入理解Docker数据管理与端口映射

2020-04-23 00:00 621 查看

前言

​前面两篇文章讲述的是构建docker镜像的三种方式以及如何搭建docker私有仓库,而本文将讲述有关docker中的数据管理及端口映射的内容。

docker数据管理

什么是docker的数据管理?

​ 先想一想关于Linux系统管理中的磁盘管理,其实本质上也都是对存储的数据进行管理,docker中的数据管理也是如此。docker中,对数据的管理主要在于两个方面,其一是为了方便查看容器内的数据,其二是实现多个容器的数据共享。

​ 那么管理docker的数据的方式有两个:数据卷和数据卷容器。下面会逐个介绍。

docker的数据管理方式

数据卷

​ 数据卷是一个供容器使用的特殊目录,位于容器中,可将宿主机的目录挂载到数据卷上,对数据卷的修改操作立刻可见(其实上篇文章中已经接触到了),并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移。

​ 其实,在docker中,数据卷的使用可以类比于Linux下对目录进行的mount操作。

数据卷容器

​ 显然,数据卷容器和数据卷不是同一个概念,但是作用是一样的。只不过数据卷容器的目的是在容器间共享一些数据。数据卷容器就可以认为是一个普通的容器,只不过是专门用来提供数据卷给其他容器挂载使用的。

数据卷和数据卷容器的概念和区别可以通过下图来理解:

数据卷就是宿主机中提供的一块空间(目录空间)挂载给容器,使得容器与宿主机之间可以共享文件数据,而数据卷容器是将一个容器内的一个空间(目录)挂载给另一个容器,使得容器与容器之间共享文件数据。

下面来实际来操作一下是如何通过中两种方式对docker进行数据管理的。

如何进行对docker的数据管理?

1、创建数据卷(为后面的数据卷容器做准备)

#目前是空镜像和空容器环境
[root@localhost ~]# docker run -d -v /data/data1 -v /data/data2 --name web httpd
Unable to find image 'httpd:latest' locally
latest: Pulling from library/httpd
123275d6e508: Pull complete
e984dd982a6e: Pull complete
963280e5cf81: Pull complete
6faf90d050b2: Pull complete
962b56984bb0: Pull complete
Digest: sha256:d5dc0d279039da76a8b490d89a5c96da83a33842493d4336b42ccdfbd36d7409
Status: Downloaded newer image for httpd:latest
8e21b3e1366970633f01ae4d77b0f55a2d52782997138cc1e8ab70904d5f487b
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND              CREATED              STATUS              PORTS               NAMES
8e21b3e13669        httpd               "httpd-foreground"   About a minute ago   Up About a minute   80/tcp              web
[root@localhost ~]# docker exec -it 8e21b3e13669 /bin/bash
root@8e21b3e13669:/usr/local/apache2# ls /data/
data1  data2

2、挂载主机目录作为数据卷:数据卷实际案例

[root@localhost ~]# docker run -d -v /var/www:/data/data1 --name web1 httpd:latest
5ff89e3dbdd25bbb1b105678c50364758fe62cb5c7d10aa5f47e8865ddd5e8d8
#参数解释:
-d:守护进程
-v:数据卷操作
/var/www:宿主机目录将被挂载的目录
/data/data1:容器中数据卷
--name:容器名称

3、测试

[root@localhost ~]# cd /var/www/
[root@localhost www]# touch file
[root@localhost www]# ls
file
[root@localhost www]# docker exec -it web1 /bin/bash #在新的容器中查看目录内容
root@5ff89e3dbdd2:/usr/local/apache2# ls /data/data1/
file
root@5ff89e3dbdd2:/usr/local/apache2# 

4、数据卷容器实际案例

#前面已经进行创建了一个名为web的容器,其中所创建的数据卷分别挂载到了/data/data1与/data/data2目录上,使用--volumes-from选项来挂载web容器中的数据卷到新的容器
[root@localhost ~]# docker run -it --volumes-from web --name web_test httpd:latest /bin/bash
root@afafb9631fc9:/usr/local/apache2# ls /
bin  boot  data  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@afafb9631fc9:/usr/local/apache2# ls /data/
data1  data2
#两个目录(数据卷容器)提供给新的容器web_test使用

我们可以进行测试,在其中一个目录中创建文件,如何进入原本的数据卷容器中查看是否有该文件

root@afafb9631fc9:/usr/local/apache2# cd /data/data1
root@afafb9631fc9:/data/data1# touch newfile
root@afafb9631fc9:/data/data1# exit
exit
[root@localhost ~]# docker exec -it web /bin/bash
root@8e21b3e13669:/usr/local/apache2# ls /data/data1
newfile

​ 测试成功了,这样可以通过数据卷容器实现容器之间的数据共享了。通过这些机制,即使容器在运行过程中出现故障,用户也不必担心数据发生丢失了,如果发生意外,只需要快速重新创建容器即可。

下面简述一下有关docker的端口映射

docker网络通信之端口映射

​ 其实docker的端口映射应该在先前的网络部分进行讲述的,还记得docker0网络模式的原理吗?其实,在docker中,默认的选择是docker网桥模式,而实现网络通信也是依赖于NAT地址转换,简单而言就是外部网络可以通过访问宿主机的ip地址结合端口号对docker内部的容器进行访问通信获取数据信息。

​ 端口映射有两种命令方式,一种是加入选项-P,另一种是使用-p。-P表示docker自己分配一个端口,适用于自己未规定而又避免与其他容器冲突端口的情况,-p则表示指定端口,适用于自定义的情况,节省资源和优化管理的情况。

下面看看实际案例:

[root@localhost ~]# docker run -d -P httpd
Unable to find image 'httpd:latest' locally
latest: Pulling from library/httpd
123275d6e508: Pull complete
e984dd982a6e: Pull complete
963280e5cf81: Pull complete
6faf90d050b2: Pull complete
962b56984bb0: Pull complete
Digest: sha256:d5dc0d279039da76a8b490d89a5c96da83a33842493d4336b42ccdfbd36d7409
Status: Downloaded newer image for httpd:latest
e7a9cda3fea1904401b274a35b51d93a23b95cd0c8e548bb4982e21e8586d657
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                   NAMES
e7a9cda3fea1        httpd               "httpd-foreground"   5 seconds ago       Up 4 seconds        0.0.0.0:32768->80/tcp   charming_ride

我们测试一下这个Apache服务是否成功,从获取到成功差不多就30s

使用小写尝试一下:

[root@localhost ~]# docker run -d -p 54544:80 httpd
26d52f0d0a49a8c3b87aa4f4eb251eee080c9ba776902987e0173d7a290412d0
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                   NAMES
26d52f0d0a49        httpd               "httpd-foreground"   5 seconds ago       Up 4 seconds        0.0.0.0:54544->80/tcp   busy_khorana
e7a9cda3fea1        httpd               "httpd-foreground"   3 minutes ago       Up 3 minutes        0.0.0.0:32768->80/tcp   charming_ride

测试验证:

看了都成功了。接下来说说容器的互联。

容器互联

容器互联是指通过容器的名称在容器间建立一条专门的网络通信隧道从而实现容器的互联。在使用docker run 命令的时候使用--link选项就可以实现容器之间的互联通信。

格式为:--link name:alias

name——容器名

alias——这个连接的别名

需要注意的是:容器互联是通过容器的名称来执行的,--name选项可以给容器创建一个友好的名称,这个名称是唯一的,即不可重复。

具体案例演示:

1、创建容器


[root@localhost ~]# docker run -itd -P --name test1 CentOS /bin/bash
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
8a29a15cefae: Pull complete
Digest: sha256:fe8d824220415eed5477b63addf40fb06c3b049404242b31982106ac204f6700
Status: Downloaded newer image for centos:latest
9f2ce34c7867d8b159201f9a3521a28570a3843a8fca08a60f58b12ff7565188

2、创建接收容器

[root@localhost ~]# docker run -itd -P --name test2 --link test1:test1 centos /bin/bash
f3c2974dcd19796cd8a48ecaf398370f891887cbfb92a192e8d7e706ccbefd62

3、进入一个容器中进行测试(ping)

[root@localhost ~]# docker exec -it test2 /bin/bash
[root@f3c2974dcd19 /]# ping test1
PING test1 (172.17.0.2) 56(84) bytes of data.
64 bytes from test1 (172.17.0.2): icmp_seq=1 ttl=64 time=0.089 ms
64 bytes from test1 (172.17.0.2): icmp_seq=2 ttl=64 time=0.070 ms
64 bytes from test1 (172.17.0.2): icmp_seq=3 ttl=64 time=0.062 ms
64 bytes from test1 (172.17.0.2): icmp_seq=4 ttl=64 time=0.065 ms
64 bytes from test1 (172.17.0.2): icmp_seq=5 ttl=64 time=0.063 ms
^C
--- test1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 13ms
rtt min/avg/max/mdev = 0.062/0.069/0.089/0.014 ms

需要注意的是,我们的容器需要是up的状态否则会遇到报错。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: