【云原生】Docker的端口映射、数据卷、数据卷容器、容器互联

目录

一、端口映射(相当于添加iptables的DANT)

二、数据卷创建(宿主机目录或文件挂载到容器中)

三、数据卷容器(多个容器通过同一个数据卷容器为基点,实现所有容器数据共享)

四、容器互联(可以通过容器名称或连接别名通信)


一、端口映射(相当于添加iptables的DANT)

在启动容器的时候,如果不指定对应的端口,在容器外是无法通过网络来访问容器内的服务的。

端口映射机制将容器内的服务提供给外部网络访问,实际上就是将宿主机的端口映射到容器中,使得外部网络访问宿主机的端口便可以访问容器内的服务。

两种方式

复制代码
[root@localhost ~]#docker run -d --name test01 -P nginx:test
###随机映射端口 (从32768开始)

[root@localhost ~]#docker run -d --name test02 -p 1314:80 nginx:test
##指定映射端口

原理:实际上就是创建了一条iptables规则DNAT规则

拓展:如何针对已经自定义的端口号,修改为新的端口号

方式一:将当前容器打包成镜像,重新指定映射端口,创建新的容器

**就是类似于容器迁移 先快照保存,然后在本地导入,再重新docker run 去指定映射端口,**但是容器的ip会变化,除非把原有的容器删除,然后再通过自定义网络模式去指定相同的ip

方式二:直接在原容器上进行修改

**先关闭容器,然后查看容器的Id,然后进去docker管理容器的目录,修改hostconfig.json和config.v2.json文件;然后重启docker,重启容器。**这种方式,一旦重启docker会让所有的容器停止。

复制代码
##停止容器
[root@localhost opt]#docker stop test01
test01

##查看容器的id
[root@localhost opt]#docker inspect test01 |grep Id
        "Id": "0a242c04664bb5242624b5d40defa2e1b3936e510b5d60ea043bf880f659e31e",

##进入docker管理容器的库目录
[root@localhost opt]#cd /var/lib/docker/containers/0a242c04664bb5242624b5d40defa2e1b3936e510b5d60ea043bf880f659e31e

[root@localhost 0a242c04664bb5242624b5d40defa2e1b3936e510b5d60ea043bf880f659e31e]#ls
0a242c04664bb5242624b5d40defa2e1b3936e510b5d60ea043bf880f659e31e-json.log  config.v2.json   hostname  mounts       resolv.conf.hash
checkpoints                                                                hostconfig.json  hosts     resolv.conf

##修改hostconfig.json 配置文件和config.v2.json配置文件
[root@localhost 0a242c04664bb5242624b5d40defa2e1b3936e510b5d60ea043bf880f659e31e]#vim hostconfig.json 

[root@localhost 0a242c04664bb5242624b5d40defa2e1b3936e510b5d60ea043bf880f659e31e]#vim config.v2.json 

##重启docker
[root@localhost 0a242c04664bb5242624b5d40defa2e1b3936e510b5d60ea043bf880f659e31e]#systemctl restart docker.service 

##查看容器端口是否修改
[root@localhost 0a242c04664bb5242624b5d40defa2e1b3936e510b5d60ea043bf880f659e31e]#docker inspect test01|grep 5566
                        "HostPort": "5566"

##重启容器
[root@localhost 0a242c04664bb5242624b5d40defa2e1b3936e510b5d60ea043bf880f659e31e]#docker start test01
test01

[root@localhost 0a242c04664bb5242624b5d40defa2e1b3936e510b5d60ea043bf880f659e31e]#docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED         STATUS         PORTS                                   NAMES
0a242c04664b   nginx:test01   "nginx -g 'daemon of..."   5 minutes ago   Up 4 seconds   0.0.0.0:5566->80/tcp, :::5566->80/tcp   test01
[root@localhost 0a242c04664bb5242624b5d40defa2e1b3936e510b5d60ea043bf880f659e31e]#curl 192.168.20.10:5566
this is test01
[root@localhost 0a242c04664bb5242624b5d40defa2e1b3936e510b5d60ea043bf880f659e31e]#
复制代码
vim hostconfig.json 

"HostPort":"5566"
复制代码
vim config.v2.json
##如果有的话
"HostPort":"5566"

拓展:关于-p指定端口映射,还有很多方式

二、数据卷创建(宿主机目录或文件挂载到容器中)

因为容器的数据是临时的,一旦容器被删除,数据将永久丢失。想要将容器中的数据持久化,可以将宿主机目录挂载到容器中。

数据卷是一个供容器使用的特殊目录,位于容器中。可将宿主机的目录挂载到数据卷上,对数据卷的修改操作立刻可见,并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移。数据卷的使用类似于Linux下对目录进行的mount操作。

宿主机的目录可以同时挂载到多个容器中,可以实现基于宿主机将容器之间的数据进行共享!!

注意:一般只建议在创建容器时进行挂载,不建议启动容器后再挂载。因为启动容器后再挂载的话,需要修改配置文件,且不一定能挂载成功。

复制代码
docker run -d -v 宿主机目录:数据卷  镜像名称:标签   #将宿主机目录挂载到容器中
 #注意:宿主机本地目录的路径必须是使用绝对路径。如果路径不存在,Docker会自动创建相应的路径。
 #挂载后的目录默认可读可写
 ##如果想要修改为只读,那么为
docker run -d -v 宿主机目录:数据卷:ro  镜像名称:标签


也可以直接创建单独的数据卷,不挂载
 docker run -v 数据卷              #在容器内创建数据卷

容器通过宿主机作为基点,可以实现文件共享

宿主机的目录可以同时挂载到多个容器中,可以实现基于宿主机将容器之间的数据进行共享!!

宿主机挂载到容器目录中,并设置为只读

复制代码
 #如果希望挂载后的目录为只读目录,可以在挂载时加:ro参数
 docker run -v 宿主机目录:数据卷:ro    #将宿主机目录挂载到容器中,只可读

三、数据卷容器(多个容器通过同一个数据卷容器为基点,实现所有容器数据共享)

直接创建数据卷,也可以创建多个数据卷。让容器之间基于数据卷容器,实现数据共享

复制代码
docker run -itd --name cc01 -v /data -v /mnt nginx:test01
##在cc01容器中创建两个数据卷

docker exec -it test01 sh
##进入容器完成测试文件编写

 #使用--volumes-from 来挂载cc01容器中的数据卷到新的容器cc02和cc03中
[root@localhost data]#docker run -d --name cc02 --volumes-from cc01 nginx:test01

[root@localhost data]#docker run -d --name cc03 --volumes-from cc01 nginx:test01

创建数据卷的时候 将宿主机的目录挂载到了数据卷中,然后再将新的容器将test01容器的数据卷挂载到新创建的容器中

这样既可以实现数据的持久化,同时性能比较高,因为容器之间的通信比较块

复制代码
#创建数据卷容器test01。创建/usr/share/nginx/html数据卷。
docker run -d --name test01 -v /data/:/usr/share/nginx/html:ro nginx:test01
 
 #使用--volumes-from 来挂载test01容器中的数据卷到新的容器test03和test04中
docker run -d --name test03 -p 9998:80 --volumes-from test01 nginx:test01

docker run -d --name test04 -p 9997:80 --volumes-from test01 soscscs/myapp:v1

##可以进去查看目录 
docker exec -it test03 sh 
cd /usr/share/nginx/html
ls
完成验证

##因为做了端口映射
或者使用curl 访问ip

四、容器互联(可以通过容器名称或连接别名通信)

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

复制代码
#创建并运行源容器取名test01
docker run -d --name test01 nginx:test01
 #创建并运行接收容器取名test02,使用--link选项指定连接容器test01以实现容器互联。

 docker run -itd --name test02 --link test01:aa centos:7 /bin/bash
 ##--link 容器名:连接的别名
 ​
 #进test02容器,ping test01,通过容器名称或者别名都可以通信
 docker exec -it test02 bash
ping test01
ping aa 
 #可以看到c1容器的IP地址
 ​
#创建容器test03,没有与test01做互联
docker run -d --name test03 nginx:test01
 docker exec -it test03 bash      #进入容器c5
 #通过c1的容器名称和别名,都无法和c1通信
/ # ping test01
ping: bad address 'test01'
/ # ping aa
ping: bad address 'aa'
/ # ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2): 56 data bytes
 #只能通过IP进行通信
相关推荐
伊成9 分钟前
Docker 部署 Nginx 完整指南
nginx·docker·容器
网硕互联的小客服26 分钟前
Apache 如何支持SHTML(SSI)的配置方法
运维·服务器·网络·windows·php
爱掘金的土拨鼠1 小时前
国产化dm数据库锁表解锁
数据库
落日漫游1 小时前
K8s核心组件全解析
运维·docker·运维开发
庖丁解java1 小时前
N个Utils
数据库
Mr. zhihao1 小时前
SQL LEFT JOIN 与 WHERE 条件的隐藏坑
数据库·sql
2301_793086872 小时前
Redis 04 Reactor
数据库·redis·缓存
Sais_Z2 小时前
ClickHouse的学习与了解
数据库·clickhouse
代码的余温2 小时前
MySQL性能优化:10个关键参数调整指南
数据库·mysql·性能优化
silver98863 小时前
sql链接的url中serverTimezone的作用
数据库·sql