首页 > 其他分享 >创建Docker容器与外部机通信(端口映射的方式)

创建Docker容器与外部机通信(端口映射的方式)

时间:2024-06-16 23:31:04浏览次数:25  
标签:容器 自定义 -- 0.0 端口 网络 Docker 端口映射

一、检查端口是否被占用

1.1 查看正在使用中的TCP和UDP端口:

ss -tuln

LISTEN:

表示端口正在监听连接,意味着这些端口已经被系统服务使用。比如,如果你看到 "tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN",这意味着8080端口被一个服务监听,并等待连接。

 判断端口是否被占用:

  • 如果你想知道8080端口是否被占用,你应该查找是否有行显示为 tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 或者 tcp6 0 0 :::8080 :::* LISTEN,这分别表示TCP IPv4或IPv6的8080端口正处于监听状态,即被某个服务占用。
  • 如果没有这样的行出现,那么8080端口很可能没有被任何服务监听,也就是空闲的。

假设您决定使用端口8080(仅作为示例,实际需确认未被使用):

检查端口是否可用:再次使用   ss -tuln | grep :8080 确认8080端口未被监听。

如果运行这条命令没有任何输出,表示端口当前并没有被任何服务监听,因此它是可用的。

1.1 首先,进入您的Docker容器:

docker exec -it <container_name_or_id> /bin/bash

1.2 在容器内部,使用netstatlsof检查端口是否被占用:

使用netstat(如果容器内部有netstat):

netstat -tuln | grep <port_number>
或者使用lsof(如果容器内部有lsof):
lsof -i :<port_number>

 如果这些命令返回结果,则表示指定的端口已被占用。

二、实现端口映射

2.1 创建自定义网络

首先,创建一个自定义的Docker网络,这样可以更好地控制容器间的通信以及容器与外部网络的交互。自定义网络允许你为容器分配固定的IP地址。

docker network create --subnet=172.18.0.0/16 mynetwork

这个命令创建了一个名为mynetwork的网络,使用了172.18.0.0/16作为子网。

2.2 启动容器并配置IP

接下来,分别启动两个容器,并在启动时加入刚刚创建的网络,并为每个容器指定一个静态IP地址。

启动容器1
docker run -d --name container1 --network=mynetwork --ip=172.18.0.2 -p 192.168.0.60:8081:80 your_image1

这里,-d表示后台运行,--name container1为容器命名,--network=mynetwork指定容器加入自定义网络,--ip=172.18.0.2为容器分配静态IP地址,-p 192.168.0.60:8081:80表示宿主机的8081端口映射到容器的80端口,以允许外部访问。

启动容器2
docker run -d --name container2 --network=mynetwork --ip=172.18.0.3 -p 192.168.0.60:8082:80 your_image2

与容器1相似,只是分配了不同的静态IP(172.18.0.3)和宿主机端口映射(8082)。

2.3 验证和外部通信

  • 验证容器IP: 可以通过docker inspect --format '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container1 和相应的命令来检查容器的IP地址是否正确配置。
  • 外部访问: 外部机(192.168.0.170)现在可以通过宿主机的IP和映射的端口(例如192.168.0.60:8081 和 192.168.0.60:8082)访问这两个容器中的服务。

注意事项:

  • 确保宿主机的防火墙规则允许外部访问映射的端口。
  • 容器中的应用需要绑定到0.0.0.0而非localhost,以确保可以从外部网络访问。
  • 自定义网络的子网选择应避免与宿主机的网络冲突。
  • 如果宿主机或网络配置有特殊要求,可能需要额外的网络配置或端口转发设置。

以上步骤完成后,你应该能够通过外部机直接与两个具有独立IP地址的Docker容器进行通信。

  • 直接使用docker0: 简单快捷,适用于快速测试或对网络配置要求不高的场景。
  • 创建自定义网络: 提供了更灵活的网络配置,包括静态IP分配、网络隔离和更直观的容器间通信管理,适合多服务部署、复杂网络架构或需要严格网络控制的场景。

  1. 自定义网络与外网访问:使用自定义网络(如--network my-network)时,容器间可以方便地相互通信,但默认情况下,自定义网络中的容器不直接暴露给外网。若希望外网访问这些容器,仍需通过宿主机端口映射实现。也就是说,即使在自定义网络中,也不必选择host网络模式来使服务可被外网访问,只要正确配置端口映射即可。

 为了使外网能够访问容器内的服务,一般建议使用默认的桥接网络(bridge,这也是Docker默认的网络模式)或自定义网络,并通过-p参数明确映射容器端口到宿主机的端口。这样既可以保持容器网络的隔离性,又能实现服务的外网可访问性,而且更加灵活和安全。除非有特殊需求,否则不建议直接使用host网络模式。

标签:容器,自定义,--,0.0,端口,网络,Docker,端口映射
From: https://blog.csdn.net/m0_52980547/article/details/139675147

相关文章

  • Docker系列 V2 - Docker安装jdk8
    安装的两种方式通过已有的镜像直接pull安装;自己通过dockerfile等命令打包一个镜像安装(此种方式我们到已有镜像满足不了自身需求时使用);本章是根据第一种方式安装的【1.1】安装镜像根据文章docker安装指定版本的tag镜像得到安装JDK的Docker命令dockerpullprimetoninc/j......
  • Docker系列 V1 - 在 Ubuntu 24.04 LTS 上安装 Docker
    在Ubuntu24.04LTS上,虽然可以通过Ubuntu的官方仓库直接安装Docker,但是这种方法通常无法获取到最新的Docker版本,而且安全更新也可能延迟。因此,推荐从Docker的官方仓库进行安装,确保可以用上最新版本并和自动更新。第1步:更新软件包并安装必要软件运行以下命令,更新软件......
  • Docker资源控制
      Cgroup是Controlgroup的简写,是Linux内核提供的一种限制所使用物理资源的机制.这些资源主要包括CPU、内存.blkio。下面就这3个方面来谈一下Docker是如何使用Cgroup机制进行管理的。1、对CPU的控制1.1、限制CPU使用速率        在CentOS7,3中可以通过修改对应的C......
  • docker阶段01 容器化概述, Docker介绍, 安装, 镜像特性和操作, 容器操作
    1.容器化概述容器:泛指可以存放其他物品的一种容纳工具,部分和完全封闭的单台服务器运行多个环境程序假如让不同的环境程序运行在不同环境中容器中怎么实现:1.通过虚拟化实现,如图,通过kvm相当于创建了多个独立的操作系统2.通过容器实现,依赖于宿主机操作系统,更省资源。......
  • Centos 7 Docker 安装
    1、设置主机网络,关闭防火墙,selinux等[root@localhost~]#cat/etc/sysconfig/network-scripts/ifcfg-ens32TYPE=EthernetBOOTPROTO=staticNAME=ens32DEVICE=ens32ONBOOT=yesIPADDR=192.168.xxx.10NETMASK=255.255.255.0GATEWAY=192.168.xxx.2DNS1=192.168.xxx.2DNS......
  • 在window 使用 docker 安装redis 踩坑记
    1.安装REDIS在安装的时候,使用dockerpullredis就可以了。但是实际上发现镜像居然拉不下来。修改了一下docker镜像。配置如下:"registry-mirrors":["https://dockerproxy.com","https://docker.m.daocloud.io","https://docker.mirrors.ustc.edu.cn&quo......
  • Docker部署SpringBoot项目
    准备服务器安装Docker下载dockerWindows版本并登录根据项目需要在项目根目录下创建Dockerfile文件#使用官方的OpenJDK8作为基础镜像FROMopenjdk:8-jdk-alpine#维护者信息LABELmaintainer="name"#添加一个应用程序的工作目录WORKDIR/app#将JAR文件添加到......
  • [C++] vector && list 等容器的迭代器失效问题
    标题:[C++]容器的迭代器失效问题@水墨不写bug正文开始:什么是迭代器?    迭代器是STL提供的六大组件之一,它允许我们访问容器(如vector、list、set等)中的元素,同时提供一个遍历容器的方法。然而,在使用迭代器时,我们必须注意所谓的“迭代器失效”问题。一、插入/删......
  • C++双端队列deque源码的深度学习(stack,queue的默认底层容器)
    什么是deque?deque是C++标准模板库(STL)中的一个容器,代表“双端队列”(double-endedqueue)。deque支持在其前端(front)和后端(back)进行快速插入和删除操作,并且它在序列的中间插入和删除元素时通常比vector或list更高效。deque的特点双端插入和删除:你可以在deque的头部和尾部快速......
  • 【LeetCode最详尽解答】11-盛最多水的容器 Container-With-Most-Water
    欢迎收藏Star我的MachineLearningBlog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star,有问题可以随时与我交流,谢谢大家!链接:11-盛最多水的容器直觉这个问题可以通过可视化图表来理解和解决。通过图形化这个问题,可以简化解决过程。......