话说docker数据管理与端口映射
前言
? 前面两篇文章讲述的是构建docker镜像的三种方式以及如何搭建docker私有仓库,而本文将讲述有关docker中的数据管理及端口映射的内容。
docker数据管理
什么是docker的数据管理?
? 先想一想关于Linux系统管理中的磁盘管理,其实本质上也都是对存储的数据进行管理,docker中的数据管理也是如此。docker中,对数据的管理主要在于两个方面,其一是为了方便查看容器内的数据,其二是实现多个容器的数据共享。
? 那么管理docker的数据的方式有两个:数据卷和数据卷容器。下面会逐个介绍。
docker的数据管理方式
数据卷
? 数据卷是一个供容器使用的特殊目录,位于容器中,可将宿主机的目录挂载到数据卷上,对数据卷的修改操作立刻可见(其实上篇文章中已经接触到了),并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移。
? 其实,在docker中,数据卷的使用可以类比于Linux下对目录进行的mount操作。
数据卷容器
? 显然,数据卷容器和数据卷不是同一个概念,但是作用是一样的。只不过数据卷容器的目的是在容器间共享一些数据。数据卷容器就可以认为是一个普通的容器,只不过是专门用来提供数据卷给其他容器挂载使用的。
数据卷和数据卷容器的概念和区别可以通过下图来理解:
数据卷就是宿主机中提供的一块空间(目录空间)挂载给容器,使得容器与宿主机之间可以共享文件数据,而数据卷容器是将一个容器内的一个空间(目录)挂载给另一个容器,使得容器与容器之间共享文件数据。
下面来实际来操作一下是如何通过中两种方式对docker进行数据管理的。
如何进行对docker的数据管理?
1、创建数据卷(为后面的数据卷容器做准备)
#目前是空镜像和空容器环境 [ ~]# 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
[ ~]# 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 [ ~]# docker exec -it 8e21b3e13669 /bin/bash :/usr/local/apache2# ls /data/ data1 data2
2、挂载主机目录作为数据卷:数据卷实际案例
[ ~]# docker run -d -v /var/www:/data/data1 --name web1 httpd:latest 5ff89e3dbdd25bbb1b105678c50364758fe62cb5c7d10aa5f47e8865ddd5e8d8 #参数解释: -d:守护进程 -v:数据卷操作 /var/www:宿主机目录将被挂载的目录 /data/data1:容器中数据卷 --name:容器名称
3、测试
[ ~]# cd /var/www/ [ www]# touch file [ www]# ls file [ www]# docker exec -it web1 /bin/bash #在新的容器中查看目录内容 :/usr/local/apache2# ls /data/data1/ file :/usr/local/apache2#
4、数据卷容器实际案例
#前面已经进行创建了一个名为web的容器,其中所创建的数据卷分别挂载到了/data/data1与/data/data2目录上,使用--volumes-from选项来挂载web容器中的数据卷到新的容器 [ ~]# docker run -it --volumes-from web --name web_test httpd:latest /bin/bash :/usr/local/apache2# ls / bin boot data dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var :/usr/local/apache2# ls /data/ data1 data2 #两个目录(数据卷容器)提供给新的容器web_test使用
我们可以进行测试,在其中一个目录中创建文件,如何进入原本的数据卷容器中查看是否有该文件
:/usr/local/apache2# cd /data/data1 :/data/data1# touch newfile :/data/data1# exit exit [ ~]# docker exec -it web /bin/bash :/usr/local/apache2# ls /data/data1 newfile
? 测试成功了,这样可以通过数据卷容器实现容器之间的数据共享了。通过这些机制,即使容器在运行过程中出现故障,用户也不必担心数据发生丢失了,如果发生意外,只需要快速重新创建容器即可。
下面简述一下有关docker的端口映射
docker网络通信之端口映射
? 其实docker的端口映射应该在先前的网络部分进行讲述的,还记得docker0网络模式的原理吗?其实,在docker中,默认的选择是docker网桥模式,而实现网络通信也是依赖于NAT地址转换,简单而言就是外部网络可以通过访问宿主机的ip地址结合端口号对docker内部的容器进行访问通信获取数据信息。
? 端口映射有两种命令方式,一种是加入选项-P,另一种是使用-p。-P表示docker自己分配一个端口,适用于自己未规定而又避免与其他容器冲突端口的情况,-p则表示指定端口,适用于自定义的情况,节省资源和优化管理的情况。
下面看看实际案例:
[ ~]# 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 [ ~]# 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
使用小写尝试一下:
[ ~]# docker run -d -p 54544:80 httpd 26d52f0d0a49a8c3b87aa4f4eb251eee080c9ba776902987e0173d7a290412d0 [ ~]# 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、创建容器
[ ~]# 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、创建接收容器
[ ~]# docker run -itd -P --name test2 --link test1:test1 centos /bin/bash f3c2974dcd19796cd8a48ecaf398370f891887cbfb92a192e8d7e706ccbefd62
3、进入一个容器中进行测试(ping)
[ ~]# docker exec -it test2 /bin/bash [ /]# 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的状态否则会遇到报错。