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才能看到
一点点学习,一丝丝进步。不懈怠,才不会被时代淘汰