Docker数据管理及网络通信、端口映射

博文目录:

一、docker的数据管理

1、数据卷

2、数据卷容器

二、docker网络通信

1、端口映射

2、容器互联

三、容器中部署MySQL服务并发布

四、容器中部署Apache服务并发布

一、docker的数据管理

在docker中,为了方便查看容器内产生的数据或者将多个容器之间的数据实现共享,会涉及到容器的数据管理操作,管理docker容器中的数据主要有两种方式:数据卷和数据卷容器。

1、数据卷

数据卷是一个供容器使用的特殊目录,位于容器中,可将宿主机的目录挂载到数据卷上,对数据卷的修改操作立即可见,并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移,数据卷的使用类似于Linux下对目录进行的mount挂载操作(注意:是将宿主机本地的目录挂载到容器中,举例:若宿主机本地/data目录挂载的是/dev/sdb1,那么要将/data做数据卷映射时,容器中指定的目录使用的文件系统也是/dev/sdb1,我不知道这样解释,你们能不能理解它的工作原理)。

1)挂载宿主机目录作为数据卷举例:

使用-v选项可以创建数据卷(只是运行容器时,创建一个目录),创建数据卷的同时将宿主机的目录挂载到数据卷上使用,以实现宿主机与容器之间的数据迁移。

需要注意的是,宿主机本地目录的路径必须是使用绝对路径,如果路径不存在,Docker会自动创建相应的路径。

[root@centos01 ~]# docker images   <!--查看Docker宿主机镜像-->
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
hub.c.163.com/public/centos   6.7-tools           b2ab0ed558bb        3 years ago         602 MB
[root@centos01 ~]# docker run -d --name centos6.701 -v /data1 
hub.c.163.com/public/centos:6.7-tools   <!--创建数据卷,数据卷名字为centos6.701-->
b85a2d8419a98756369ddc3b78247d3d42c178e8e563a936fe973f2f6611f951
[root@centos01 ~]# docker ps   <!--查看正在运行的容器-->
CONTAINER ID        IMAGE                                   COMMAND                  CREATED             STATUS              PORTS               NAMES
b85a2d8419a9        hub.c.163.com/public/centos:6.7-tools   "/usr/bin/supervisord"   32 seconds ago      Up 32 seconds       22/tcp              centos6.701
[root@centos01 ~]# ls /var/lib/docker/volumes/  <!--查看正在运行的数据卷-->
fbc3bde69b9eaf6410d7e52ba412ab07bbfe49e83315d245dbcf44bf2aa6b91a  metadata.db
[root@centos01 ~]# dd if=/dev/zero of=./1.iso bs=10M count=10  <!--创建一个测试数据-->
[root@centos01 ~]# cp 1.iso /var/lib/docker/volumes/
fbc3bde69b9eaf6410d7e52ba412ab07bbfe49e83315d245dbcf44bf2aa6b91a/_data/  
       <!--宿主机给容器共享数据-->
[root@centos01 ~]# docker exec -it centos6.701 /bin/bash <!--登录centos6.701容器-->
[root@b85a2d8419a9 /]# ls data1/  <!--查看数据卷是否有宿主机共享的数据-->
1.iso 

2、数据卷容器

如果需要在容器之间共享一些数据,最简单的方法就是使用数据卷容器。数据卷容器就是一个普通的容器,专门提供数据卷给其他容器挂载使用。使用方法如下:首先,需要创建一个容器作为数据卷容器,之后在其他容器创建时用--volumes-from挂载数据卷容器中的数据卷使用。

1)数据卷容器创建及使用举例:

[root@centos01 ~]# docker run -it -d --name datasrv -v /data1 -v /data2 hub.c.163.com/public/centos:6.7-tools /bin/bash
6c2e89e442fba34821f044d1b589ef70cd2c4d775f83084ce0d7bb8a331c0a55
<!--创建运行一个容器,容器名为datasrv,并创建两个数据卷:data1和data2-->
[root@centos01 ~]# docker exec -it datasrv /bin/bash   <!--进入创建的容器-->
[root@6c2e89e442fb /]# ls | grep data   <!--查看是否有对应的数据卷-->
data1
data2
[root@6c2e89e442fb /]# exit   <!--退出当前容器-->
exit 
[root@centos01 ~]# docker run -it -d --volumes-from datasrv --name lyx hub.c.163.com/public/centos:6.7-tools 
56fff3838cb714369d99e30ea6eebc72e0c6ca1aa11b5e66f3c403ca74c2460e
<!--运行一个名为lyx的容器,使用--volumes-from来将datasrv容器中的数据卷挂载到这个lyx新容器上-->
[root@centos01 ~]# docker exec -it lyx /bin/bash      <!--进入新创建的lyx容器-->
[root@56fff3838cb7 /]# ls |grep data <!--查看新的容器是否可以看到datasrv提供的数据卷-->
data1
data2
[root@56fff3838cb7 /]# echo "www.lyx.com" > /data1/lyx.txt 
        <!--在lyx容器中向data1目录写入文件进行测试-->
[root@56fff3838cb7 /]# exit         <!--退出该容器-->
exit
[root@centos01 ~]# docker exec -it datasrv /bin/bash  <!--进入提供数据卷的datasrv容器-->
[root@6c2e89e442fb /]# cat /data1/lyx.txt      <!--可以看到刚在lyx容器创建的文件-->
www.lyx.com
[root@6c2e89e442fb /]# exit          <!--退出该容器-->
exit
[root@centos01 ~]# cd /var/lib/docker/volumes/  
                             <!--在docker宿主机查看刚刚在lyx容器创建的数据-->
[root@centos01 volumes]# ls
cd27325467149a236d16bd8f4dcdf84c7c6018fd800e2f6d7e04980119390428  metadata.db
[root@centos01 volumes]# 
[root@centos01 volumes]# ls cd27325467149a236d16bd8f4dcdf84c7c6018fd800e2f6d7e04980119390428/_data/
lyx.txt

注意,生产环境中最注重的就是存储的可靠性,以及存储的可动态扩展性,一定要在做数据卷时考虑到这一点,在这方面比较出色的还要数GFS文件系统了,我上面只是做了简单的配置,若在生产环境中,一定要好好考虑,就比如上面做的镜像卷容器,就可以在宿主机本地挂载GFS文件系统,然后创建镜像卷容器时,将挂载GFS的目录映射到容器中的镜像卷,这样才是一个合格的镜像卷容器。

二、docker网络通信

1、端口映射

docker提供了映射容器端口到宿主机和容器互联机制来为容器提供网络服务。

在启动容器的时候,如果不指定对应的端口,在容器外是无法通过网络来访问容器内的服务的。docker提供端口映射机制来将容器内的服务提供给外部网络访问,实质上就是将宿主机的端口映射到容器中,使外部网络访问宿主机的端口可访问容器内的服务。

实现端口映射,需要在运行docker run命令时使用-P(大写)选项实现随机映射,Docker一般会随机映射到一个端口访问在49000~49900的端口到容器内部开放的网络端口,但不是绝对的,也有例外情况不会映射到这个范围;也可以使用在运行docker run命令时使用-p(小写)选项实现指定要映射的端口(常用此种方法)。

1)端口映射举例:

[root@centos01 ~]# docker run -d -P --name ssh hub.c.163.com/public/centos:6.7-tools 
   <!--将容器ssh的22号端口映射到宿主机的任意IP地址和随机端口上-->
ff30d37776877e47a3c39b932610f93b74dd48e73260de092f882ac76e8a052f
[root@centos01 ~]# docker run -d -p 49000:22 --name ssh1 hub.c.163.com/public/centos:6.7-tools 
   <!--将容器ssh的22号端口映射到宿主机指定的端口上,映射端口范围是49000~49900-->
2fb5469b67e01fc3fcf653e31dd0462dd9ca484849c34544a7bb55143adc608f
[root@centos01 ~]# docker run -d -p 192.168.100.10:1111:22 --name ssh2 hub.c.163.com/public/centos:6.7-tools 
<!--将容器ssh的22号端口映射到宿主机指定的IP地址和指定端口号上-->
3ee8614b50a777726f1bd857f2b1c57be70b3a06846c3c35de8610511873c962
[root@centos01 ~]# docker run -d -p 192.168.100.10::22 --name ssh3 hub.c.163.com/public/centos:6.7-tools
<!--将容器ssh的22号端口映射到宿主机指定IP地址的任意端口上-->
9de4b73e11db5e25fd9511f7708f812de369673bae79c76880e5493723fcd918
[root@centos01 ~]# docker run -d -p 192.168.100.10:1234:22/tcp --name ssh4 hub.c.163.com/public/centos:6.7-tools 
<!--将容器特定协议的端口号映射到宿主机指定的IP地址和指定端口上-->
ceec5bc53037345d5822a29830b38158d8a0add7b3584e36371a34a0851de043
[root@centos01 ~]# docker port ssh4  <!--查看特定的端口映射信息-->
22/tcp -> 192.168.100.10:1234
[root@centos01 ~]# docker ps  <!--查看是否映射成功-->
CONTAINER ID        IMAGE                                   COMMAND                  CREATED             STATUS              PORTS                          NAMES
ceec5bc53037        hub.c.163.com/public/centos:6.7-tools   "/usr/bin/supervisord"   3 minutes ago       Up 3 minutes        192.168.100.10:1234->22/tcp    ssh4
9de4b73e11db        hub.c.163.com/public/centos:6.7-tools   "/usr/bin/supervisord"   4 minutes ago       Up 4 minutes        192.168.100.10:32769->22/tcp   ssh3
3ee8614b50a7        hub.c.163.com/public/centos:6.7-tools   "/usr/bin/supervisord"   4 minutes ago       Up 4 minutes        192.168.100.10:1111->22/tcp    ssh2
2fb5469b67e0        hub.c.163.com/public/centos:6.7-tools   "/usr/bin/supervisord"   5 minutes ago       Up 5 minutes        0.0.0.0:49000->22/tcp          ssh1
ff30d3777687        hub.c.163.com/public/centos:6.7-tools   "/usr/bin/supervisord"   5 minutes ago       Up 5 minutes        0.0.0.0:32768->22/tcp          ssh

2、容器互联

容器互联是通过容器的名称在容器之间建立一条专门的网络通信隧道从而实现的互联。简单说,就是会在源容器和接收容器之间建立一条隧道,接收容器可以看到源容器指定的信息。

在运行docker run命令时,使用--link选项实现容器之间的互联通信,格式如下:

--link name: alias    #其中name是要连接的容器名称,alias是这个连接的别名。

容器互联是通过容器的名称来执行的,--name选项可以给容器创建一个友好的名称,这个名称是唯一的,如果已经命名了一个相同名称的容器,当要再次使用这个名称的时候,需要先使用docker rm命令来删除之前创建的同名容器。

1)容器互联举例:

[root@localhost ~]# docker run -it -d -P --name web1  docker.io/httpd /bin/bash  <!--运行容器web1-->
c88f7340f0c12b9f5228ec38793e24a6900084e58ea4690e8a847da2cdfe0b
[root@localhost ~]# docker run -it -d -P --name web2 --link web1:web1 docker.io/httpd /bin/bash
<!--运行容器web2,并关联web1容器-->
c7debd7809257c6375412d54fe45893241d2973b7af1da75ba9f7eebcfd4d652
[root@localhost ~]# docker exec -it web2 /bin/bash   <!--进入web2容器-->
root@c7debd780925:/usr/local/apache2# cd
root@c7debd780925:~# ping web1       <!--对web1进行ping测试-->
bash: ping: command not found        <!--sorry,提示没有ping命令,下载一个咯-->
root@c7debd780925:~#apt-get update    <!--更新一下-->
root@c7debd780925:~#apt install iputils-ping     <!--安装ping命令-->
root@c7debd780925:~#apt install net-tools    <!--这个是安装ifconfig命令,可以不安装,我这里只是做个笔记-->
root@c7debd780925:~# ping web1    <!--再对web1进行ping测试-->
PING web1 (172.17.0.2) 56(84) bytes of data.
64 bytes from web1 (172.17.0.2): icmp_seq=1 ttl=64 time=0.079 ms
64 bytes from web1 (172.17.0.2): icmp_seq=2 ttl=64 time=0.114 ms
              ..............<!--省略部分内容-->
<!--ping通了,所以可以说这两个容器肯定是互联的咯-->
<!--若此时又创建了web3这个新容器,要同时和web1、web2进行互联,命令如下:-->
[root@localhost ~]# docker run -dit -P --name web3 --link web1:web1 --link web2:web2 docker.io/httpd /bin/bash
<!--运行容器时,关联web1和web2。-->
<!--以下是进入web3-->
[root@localhost ~]# docker exec -it web3 /bin/bash
root@433d5be6232c:/usr/local/apache2# cd
<!--以下是安装ping命令-->
root@433d5be6232c:~# apt-get update
root@433d5be6232c:~# apt install iputils-ping
<!--以下是分别对web1,web2进行ping测试-->
root@433d5be6232c:~# ping web1
PING web1 (172.17.0.2) 56(84) bytes of data.
64 bytes from web1 (172.17.0.2): icmp_seq=1 ttl=64 time=0.102 ms
64 bytes from web1 (172.17.0.2): icmp_seq=2 ttl=64 time=0.112 ms
              ..............<!--省略部分内容-->
root@433d5be6232c:~# ping web2
PING web2 (172.17.0.3) 56(84) bytes of data.
64 bytes from web2 (172.17.0.3): icmp_seq=1 ttl=64 time=0.165 ms
64 bytes from web2 (172.17.0.3): icmp_seq=2 ttl=64 time=0.115 ms
              ..............<!--省略部分内容-->
<!--OK,没问题-->

三、容器中部署MySQL服务并发布

[root@centos01 ~]# ping www.baidu.com      <!--Docker宿主机添加NAT网卡连接公网-->
PING www.a.shifen.com (39.156.66.14) 56(84) bytes of data.
64 bytes from 39.156.66.14 (39.156.66.14): icmp_seq=1 ttl=128 time=17.6 ms
64 bytes from 39.156.66.14 (39.156.66.14): icmp_seq=2 ttl=128 time=22.2 ms
64 bytes from 39.156.66.14 (39.156.66.14): icmp_seq=3 ttl=128 time=18.8 ms
[root@centos01 ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf  
     <!--开启路由功能共享Docker容器上网-->
[root@centos01 ~]# sysctl -p   <!--刷新配置-->
net.ipv4.ip_forward = 1 
[root@centos01 ~]# docker run -d -p 192.168.100.10:3306:3306/tcp --name mysql hub.c.163.com/public/centos:6.7-tools    <!--创建安装MySQL容器并发布端口号-->
ff30d37776877e47a3c39b932610f93b74dd48e73260de092f882ac76e8a052f
[root@centos01 ~]# docker ps |grep mysql     <!--查看运行的mysql容器-->
c63f5cfd4e02        hub.c.163.com/public/centos:6.7-tools   "/usr/bin/supervisord"   13 seconds ago      Up 12 seconds       22/tcp, 192.168.100.10:3306->3306/tcp   mysql
[root@centos01 ~]# docker exec -it mysql /bin/bash   <!--登录MySQL容器-->
[root@ff30d3777687 /]# yum -y install mysql mysql-server <!--MySQL容器安装MySQL数据库-->
[root@ff30d3777687 /]# service mysqld start   <!--启动MySQL数据库-->
[root@ff30d3777687 /]# chkconfig --level 35 mysqld on   <!--设置开机自动启动-->
[root@ff30d3777687 /]# mysqladmin -uroot password 'pwd@123'   
              <!--初始化MySQL数据库登录密码-->
[root@ff30d3777687 /]# mysql -uroot -ppwd@123    <!--登录MySQL数据库-->
mysql> grant all on *.* to 'liyanxin'@'192.168.100.10' identified by 'pwd@123';  
  <!--授权特定IP地址和账户密码登录MySQL容器中的MySQL数据库-->
[root@centos01 ~]# yum -y install mysql   <!--宿主机安装MySQL客户端-->
[root@centos01 ~]# mysql -h 192.168.100.10 -uliyanxin -ppwd@123  
        <!--宿主机登录MySQL容器发布的MySQL数据库-->
MySQL [(none)]> create database liyanxin;   <!--创建一个liyanxin数据库-->
[root@centos01 ~]# docker exec -it mysql /bin/bash   <!--宿主机登录MySQL容器-->
[root@ff30d3777687 /]# mysql -uroot -ppwd@123    <!--查看新创建的数据库是否同步-->
mysql> show databases;   <!--查看数据库-->
+--------------------+
| Database           |
+--------------------+
| information_schema |
| liyanxin           |
| mysql              |
| test               |
+--------------------+
4 rows in set (0.00 sec)

四、容器中部署Apache服务并发布

[root@centos01 ~]# docker run -d -p 192.168.100.10:80:80/tcp --name httpd hub.c.163.com/public/centos:6.7-tools   
      <!--创建安装Apache容器并发布端口号-->
9de4b73e11db5e25fd9511f7708f812de369673bae79c76880e5493723fcd918
[root@centos01 ~]# docker ps |grep httpd  <!--查看运行的httpd容器-->
836394dc1dd3        hub.c.163.com/public/centos:6.7-tools   "/usr/bin/supervisord"   8 seconds ago       Up 7 seconds        22/tcp, 192.168.100.10:80->80/tcp       httpd
[root@centos01 ~]# docker exec -it httpd /bin/bash   <!--登录httpd容器-->
[root@9de4b73e11db /]# yum -y install httpd  <!--httpd容器中安装Apache服务-->
[root@9de4b73e11db /]# echo "www.docker.apache.com" > /var/www/html/index.html  
       <!--修改网站主页内容-->
[root@9de4b73e11db /]# service httpd start  <!--启动apache服务-->
[root@9de4b73e11db /]# chkconfig --level 35 httpd on  <!--设置开机自动启动-->
[root@9de4b73e11db /]# tail -f /var/log/httpd/access_log  <!--动态监听Apache访问日志-->
[root@centos01 ~]# curl http://192.168.100.10  
       <!--docker宿主机访问httpd容器中的Apache服务-->
www.docker.apache.com
[root@centos01 ~]# docker exec -it httpd /bin/bash   <!--登录httpd容器-->
[root@9de4b73e11db /]# tail -f /var/log/httpd/access_log    <!--查看Apache访问日志-->
192.168.100.10 - - [11/May/2020:17:22:07 +0800] "GET / HTTP/1.1" 403 4961 "-" "curl/7.29.0"
192.168.100.10 - - [11/May/2020:17:23:13 +0800] "GET / HTTP/1.1" 200 22 "-" "curl/7.29.0"

———————— 本文至此结束,感谢阅读 ————————

猜你喜欢

转载自blog.51cto.com/14156658/2495794