创建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网络模式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/30839.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Go】用 Go 原生以及 Gorm 读取 SQLCipher 加密数据库

本文档主要描述通过 https://github.com/mutecomm/go-sqlcipher 生成和读取 SQLCipher 加密数据库以及其中踩的一些坑 用 go 去生成读取 SQLCipher 数据库用 gorm 去读取 SQLCipher 数据库在生成后分别用 DBeaver、db browser 和 sqlcipher 读取 SQLCipher 数据库&#xff0c;…

1.搭建SpringBoot项目三种方式

目录 1.使用Spring Initializr 1.1访问Spring Initializr: 1.2填写项目基本信息 1.3配置项目元数据: 1.4添加依赖: 1.5生成项目: 1.6下载项目: 1.7解压项目: 1.8导入项目到IDE: 1.9运行项目: 1.10创建控制器: 1.11访问应用 2.使用IDE&#xff08;集成开发环境&…

langchain调用多模态大模型

下面示例是使用langchain调用多模态的示例 数据处理 import os import base64 from mimetypes import guess_typedef local_image_to_data_url(image_path):# Guess the MIME type of the image based on the file extensionmime_type, _ guess_type(image_path)if mime_typ…

34、shell数组+正则表达式

0、课前补充 jiafa () { result$(echo " $1 $2 " | bc ) print "%.2f\n" "$result" } ##保留小数点两位 薄弱加强点 a$(df -h | awk NR>1 {print $5} | tr -d %) echo "$a"一、数组 1.1、定义 数组的定义&am…

配电室数据中心巡检3d可视化搭建的详细步骤

要搭建配电室巡检的3D可视化系统&#xff0c;可以按照以下步骤进行&#xff1a; 收集配电室数据&#xff1a; 首先&#xff0c;需要收集配电室的相关数据&#xff0c;包括配电室的布局、设备信息、传感器数据等。可以通过实地调查、测量和设备手册等方式获取数据。 创建3D模型…

树莓派4b硬件资源

树莓派4B的硬件资源相当丰富&#xff0c;以下是对其硬件资源的详细归纳&#xff1a; 处理器&#xff1a; 树莓派4B使用Broadcom BCM2711芯片&#xff0c;该芯片基于ARM Cortex-A72架构。Cortex-A72是一个高性能的处理器架构&#xff0c;具有单线程性能高、功耗低以及强大的多核…

C# OpenCvSharp 图像处理函数-颜色通道-cvtColor

使用 OpenCvSharp 中的 cvtColor 函数进行图像颜色转换 在图像处理领域,颜色空间转换是一个非常常见的操作。OpenCvSharp 提供了一个强大的函数 cvtColor 来处理这类转换。本文将详细介绍 cvtColor 函数的使用方法,并通过具体的示例演示如何在实际项目中应用这些知识。 函数…

解决java.sql.SQLIntegrityConstraintViolationException: Duplicate entry ‘1‘ for key ‘book.PRIMARY‘

目录 问题 原因 解决方案 问题 场景&#xff1a;有张图书表&#xff0c;主键是自增的。现在我写了个添加图书功能。因为主键是自增的我插入时无需设置主键值。 关键代码如下&#xff1a; 然后就报这个异常了&#xff1a; 找了一圈并没有发现能解决我这个问题的。最终仔细分…

电脑桌面文件夹删除不了怎么办?6种方法快速解决,建议收藏!

桌面文件夹删不掉怎么办&#xff1f;有时会遇到桌面上的文件夹无法删除的问题&#xff0c;这是由于文件夹被系统进程或某些应用占用&#xff0c;或者是由于权限设置等原因造成的。以下是解决桌面文件夹无法删除问题的方法&#xff0c;帮助你有效地清理桌面环境。 桌面文件夹删不…

中欧科学家论坛暨第六届人工智能与先进制造国际会议(AIAM2024)

会议日期&#xff1a;2024年10月20-21日 会议地点&#xff1a;德国-法兰克福 会议官网&#xff1a;https://www.iaast.cn/meet/home/Bx130JiM 出版检索&#xff1a;EI、Scopus等数据库收录 【会议简介】 “中欧科学家论坛”由德国、法国、荷兰、瑞士、丹麦、意大利、西班牙…

欧几里得算法求解最大公约数(附代码实现,习题练习)

1.公约数、最大公约数的定义 公约数&#xff0c;亦称“公因数”。它是指能同时整除几个整数的数 。如果一个整数同时是几个整数的约数&#xff0c;称这个整数为它们的“公约数”。公约数中最大的称为最大公约数。对任意的若干个正整数&#xff0c;1总是它们的公因数。eg.30和4…

微信小程序常用的api(2)

动画API 创建实例 wx.createAnimation() 作用&#xff1a;用于在微信小程序中完成动画效果的制作 动画的常用属性 duration 【number型】 动画持续时间&#xff0c;单位毫秒&#xff0c;默认400毫秒 timingFunction 【string型】 动画效果 默认linear delay 【number型】 动…

C++回溯算法(2)

棋盘问题 #include<bits/stdc.h> using namespace std; void func(int,int); bool tf(int,int); void c(); int n,k; char a[110][110]; int cnt20; int main() {cin>>n>>k;for(int i0;i<n;i){for(int j0;j<n;j){cin>>a[i][j];}}func(0,0);cout…

交易账户实现多人下单 分仓系统 交易外接 多指令管理

交易账户实现多人下单 分仓系统 交易外接 多指令管理 指令管家下载&#xff1a;https://raw.githubusercontent.com/LeoGQ/quant/main/CommandKeeper/%E6%8C%87%E4%BB%A4%E7%AE%A1%E5%AE%B6.zip 或项目地址&#xff1a;https://github.com/LeoGQ/quant/tree/main/CommandKeeper…

在国内默默无闻的.NET,在国外火的超乎想象?

.NET开篇概述 在编程语言的竞技场上&#xff0c;.NET似乎在国内并未获得与其实力相匹配的名声&#xff0c;相较于Java和Python的广为人知&#xff0c;.NET更像是一位隐匿在幕后的高手。然而&#xff0c;当我们放眼国际&#xff0c;.NET的火爆程度却让人不得不重新审视这位“幕后…

nvm 管理多版本node

因有多个前端项目&#xff0c;不同项目使用的node版本不一样&#xff0c;所以在本地使用nvm管理不同的node版本。 一、安装nvm 1&#xff09;nvm理解 nvm全英文也叫node.js version management&#xff0c;是一个nodejs的版本管理工具。nvm和n都是node.js版本管理工具&#xff…

minIo ubuntu单节点部署

资源准备 minio二进制包 下载地址:https://dl.min.io/server/minio/release/linux-amd64/minio ubuntu-单节点部署 选择一台ubuntu18.04机器10.253.9.41、intel 或者 amd 64位处理器 上传minio到~目录 sudo cp minio /usr/local/bin/ sudo chmod x /usr/local/bin/minio 设…

2024MathorCup A题 赛后思路代码分享(分赛区一等奖)移动通信网络中 PCI 规划问题

今年突然变成分赛区 (10%) 推国&#xff0c;国奖结果还没出&#xff0c;感觉一等&#xff08;2%&#xff09;有点悬&#xff0c;论文写的太一般了我没时间去修。 4 月不务正业又被拉着打了次比赛&#xff0c;刚好这几天有闲暇&#xff0c;传一下之前写的解题思路&#xff0c;不…

PHP面试必会的20个问题

PHP是什么&#xff0c;它的全称是什么&#xff1f; PHP是一种服务器端脚本语言&#xff0c;主要用于Web开发。它的全称是Hypertext Preprocessor&#xff08;超文本预处理器&#xff09;&#xff0c;由Rasmus Lerdorf在1994年首次创建。PHP可以嵌入到HTML中&#xff0c;用于生成…

文本预处理1--去除#和句号之间内容

1.针对文本里特定两个符号之间内容的中文进行去除&#xff0c;本次选取#和句号之间的内容进行去除。 2.大家可以根据自己的实际需求修改代码实现自己的文本内容的整理。 3.下面是去除#和句号之间内容的python代码&#xff1a;其中读取的是txt文本&#xff0c;处理后的内容写回…