docker自定义镜像无法访问

说一下,自己学习部署容器,把自己的项目做成一个镜像(image),遇到了奇怪的现象,部署了mongo,redis,nginx,使用docker-compose进行编排。比如mongodb的端口默认27017,redis默认6379,nginx端口80.

 

自己定义的镜像信息:

 

version: '3.1'
services:
  myProject:
    build:
      context: ./
      dockerfile: DockerFile
    image: myproject:v2.0.0
    container_name: myproject
    ports:
      - "8541:8885"

 

再介绍一个网络知识:网关

 

docker官网有介绍这容器介绍:https://docs.docker.com/network/network-tutorial-host/

 

常用防火墙指令:


1、开启防火墙
1、systemctl start firewalld 启动防火墙

2、systemctl stop firewalld 关闭防火墙

3、systemctl status firewalld 查看状态

4、systemctl disable firewalld 开机禁用

5、systemctl enable firewalld 开机启用
​
2、开放指定端口
firewall-cmd --zone=public --add-port=1935/tcp --permanent
命令含义:
–zone #作用域
–add-port=1935/tcp #添加端口,格式为:端口/通讯协议
–permanent #永久生效,没有此参数重启后失效
​
3、重启防火墙
firewall-cmd --reload
​
4、查看端口号
netstat -ntlp //查看当前所有tcp端口·
​
netstat -ntulp |grep 1935 //查看所有1935端口使用情况·


查看防火墙列表:firewall-cmd --zone=public --list-ports


firewall-cmd --zone=public --add-port=8541/tcp --permanent

 表示移除3306端口
firewall-cmd --remove-port=3306/tcp --permanent


iptables -L -n  --line-number 

 

补充:firewall 底层还是依赖iptables 

 

mongo的配置文件
ports
   - 27017:27017
 其实就是  -p
前边是宿主机的27017,后边那个是容器的端口27017
,启动后我发现服务器防火墙不需要开放27017端口就可以直接访问

 

自己定义的镜像,映射端口入下 
 ports:
      - "8541:8885"

容器启动后,始终无法访问8541,
查看防火墙里没有他,然后就很纳闷,我创建mongo,也没开放27017呀,一样能访问,没办法怎么都无法访问,把8541加入防火墙,然后还是无法访问。
心里感觉很奇怪,觉得这个端口有问题,后台把端口改成9009,9099都无法访问。


后来想想 -p 后面有两个端口,后面一个是容器的端口,我把映射的端口加入防火墙也没能访问,
就像mongo默认27017,有没有可能mongo本身服务就是27017呢,只不过这个服务也有曾映占用了容器的27017了,

 

看着我项目的端口8541,我把原来的
ports:
 -"8541:8885"
改成了
ports:
  -8541:8541""
带着尝试的心态,容器删除重新创建,访问竟然通了

原来第二个端口就是我项目的端口,端口占用容器的8541,其实也就是常说的
宿主机对应容器的端口,
害,其实多想深一步就能明白,自定义镜像并容器运行,那个容器的端口,就是我们项目的端口

 

后来继续深入研究,容器运行并不是访问绕开了防火墙,而是容器创建的时候向iptables插入了端口,而防火墙底层用到的也是iptables,也就是说创建容器时自动把端口加到了防火墙,只不过firewall命令看不到,要使用iptanles才能看到

 

 

posted @ 2023-05-19 22:51  余生请多指教ANT  阅读(173)  评论(0编辑  收藏  举报