Docker运行容器端口映射

2023-10-29

大致描述

我发现docker启动容器时(以redis为例),在已经启动了一个-p 6379:6379的redis1容器后,当我们开启第二个redis2容器时,
右边的端口映射既可以写别的我们想要映射的端口(-p 6380:6380 redis2),也可以继续写6379(-p 6380:6379 redis2)!!!

因为众所周知,一个服务只能占用一个端口,但是这里却能映射相同的docker容器的端口号!(所以我很好奇)

详细展示

(注:先测试映射6380的redis2,再换成映射6379的redis2,并且redis1一直是开启的状态)

1* 启动两个redis容器的(redis1配置文件端口为6379,redis2是6380)
首先是映射不同的端口创建两个容器,分别映射6379 和 6380 端口。

[root@zch config]# docker run -d --name redis1 -v /usr/local/docker/redis/config/redis1/redis.conf:/etc/redis.conf -v /usr/local/docker/redis/data:/data -p 6379:6379 redis:6.0.12 redis-server /etc/redis.conf
ffeac01946f1d34115734fb1405a68f5a020e6bb1b0f6100c6dbd257630ffe7a
[root@zch config]# docker run -d --name redis2 -v /usr/local/docker/redis/config/redis2/redis.conf:/etc/redis.conf -v /usr/local/docker/redis/data:/data -p 6380:6380 redis:6.0.12 redis-server /etc/redis.conf
ca58fb27e6f92d12afacebafaa854692f99fab9db4ce8fe66af8304cf8e9fffc
[root@zch config]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ca58fb27e6f9 redis:6.0.12 “docker-entrypoint.s…” 13 seconds ago Up 12 seconds 6379/tcp, 0.0.0.0:6380->6380/tcp redis2
ffeac01946f1 redis:6.0.12 “docker-entrypoint.s…” 52 seconds ago Up 51 seconds 0.0.0.0:6379->6379/tcp redis1

然后进入redis1和redis2的客户端,可以看到都是能成功连接上的
(注:在进入redis2的时候一定要以==-p 6380==进入)

[root@zch config]# docker exec -it redis1 redis-cli 
127.0.0.1:6379> exit
[root@zch config]# docker exec -it redis2 redis-cli -p 6380
127.0.0.1:6380>

2* 接着我将原来的redis2容器删除后,再重新创建redis2,并把右边的映射端口,也改成和redis1一样的6379

docker run -d  --name redis2 -v /usr/local/docker/redis/config/redis2/redis.conf:/etc/redis.conf -v /usr/local/docker/redis/data:/data -p 6380:6379 redis:6.0.12 redis-server /etc/redis.conf

然后再次进入redis2容器,会发现虽然是映射的还是6379,但依然是能够进入到客户端的

[root@zch ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
203a0d3dad1a redis:6.0.12 “docker-entrypoint.s…” 5 hours ago Up 5 minutes 0.0.0.0:6380->6379/tcp redis2
ffeac01946f1 redis:6.0.12 “docker-entrypoint.s…” 15 hours ago Up 3 seconds 0.0.0.0:6379->6379/tcp redis1
[root@zch ~]# docker exec -it redis2 redis-cli -p 6380
127.0.0.1:6380>

但是,注意到docker ps 的时候redis2的PORTS属性只剩下0.0.0.0:6380->6379/tcp

再回看之前映射6380的redis2的PORTS属性:6379/tcp, 0.0.0.0:6380->6380/tcp

可以看到映射内部6380端口的redis2容器PORTS有两个值,并且没有与内部端口6379映射的本机ip

情况分析

我们可以看下pull下来的redis镜像的具体信息

[root@zch config]# docker images
REPOSITORY               TAG                 IMAGE ID       CREATED         SIZE
redis                    6.0.12              090314e0c44c   4 weeks ago     104MB

[root@zch config]# docker inspect 090314e0c44c
[
    {
        "Id": "sha256:090314e0c44c58e5faaa379904242657dcb4203e1a6a61413e534e0f40e8bdd5",
        "RepoTags": [
            "redis:6.0.12"
        ],
        "RepoDigests": [
            "redis@sha256:cc4231ed1a6ae4d0a3e0c85c205ba68d0cbcd60c837caca1334b01661eb8b3bb"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2021-03-13T04:04:30.678552814Z",
        "Container": "c62962de94021537ddd3d2a2cf36c1ee26eec6f374b65c9624fc54675b65beb3",
        "ContainerConfig": {
            "Hostname": "c62962de9402",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "6379/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "GOSU_VERSION=1.12",
                "REDIS_VERSION=6.0.12",
                "REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-6.0.12.tar.gz",
                "REDIS_DOWNLOAD_SHA=f16ad973d19f80f121e53794d5eb48a997e2c6a85b5be41bb3b66750cc17bf6b"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD [\"redis-server\"]"
            ],
            "Image": "sha256:09a494871c16ded394e132a87f16e105522b63e88c92018a1dddcf21d8b401f3",
            "Volumes": {
                "/data": {}
            },
            "WorkingDir": "/data",
            "Entrypoint": [
                "docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {}
        },
        "DockerVersion": "19.03.12",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "6379/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "GOSU_VERSION=1.12",
                "REDIS_VERSION=6.0.12",
                "REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-6.0.12.tar.gz",
                "REDIS_DOWNLOAD_SHA=f16ad973d19f80f121e53794d5eb48a997e2c6a85b5be41bb3b66750cc17bf6b"
            ],
            "Cmd": [
                "redis-server"
            ],
            "Image": "sha256:09a494871c16ded394e132a87f16e105522b63e88c92018a1dddcf21d8b401f3",
            "Volumes": {
                "/data": {}
            },
            "WorkingDir": "/data",
            "Entrypoint": [
                "docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": null
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 104291820,
        "VirtualSize": 104291820,
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/6f0cd9ab5a300e71ce8475861a4bc2b76a2826ec0020e787a43d38a5ff2db2ef/diff:/var/lib/docker/overlay2/d70138999bd376d810f4b4f6d1ada4560923317c74609ac467381fd0fc67d50a/diff:/var/lib/docker/overlay2/12991f82bf1068b3191de47ebf9d581f34bcc3a8a8cbdef0f90f052bf65b53e8/diff:/var/lib/docker/overlay2/85b82010fca6b6fa29cc66a3e3df59c1c934a5340e0dcfd023650c23439b2439/diff:/var/lib/docker/overlay2/0ae0ed3fdcd6cbe7a7c6aa491d837653a84e1a55f774a6604df1035c29012c65/diff",
                "MergedDir": "/var/lib/docker/overlay2/83b39cef71e2dc3cd1ff367a3496afcbf68c248afe6cb427a348907fb94cefce/merged",
                "UpperDir": "/var/lib/docker/overlay2/83b39cef71e2dc3cd1ff367a3496afcbf68c248afe6cb427a348907fb94cefce/diff",
                "WorkDir": "/var/lib/docker/overlay2/83b39cef71e2dc3cd1ff367a3496afcbf68c248afe6cb427a348907fb94cefce/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:14a1ca976738392ffa2ae4e54934ba28ab9cb756e924ad9297a4795a4adbfdf6",
                "sha256:a6b7270e6c20bae1d8c5d009171ce7db2e268c3d32e447a2ec4f33b02b256955",
                "sha256:cf2aefb51919d2cf15e3311fec4e187f968e06f168ee610d500e81757b53a3f7",
                "sha256:6e0e8a8a5ad7776289d5929ba624ce58e64600af5995f0208502fc265773a192",
                "sha256:e3059a3a1a65e206c34ae3e24ae6098ede134e7ad4cbd8a5eae4b5feeeb38589",
                "sha256:65508d7d88a08e37d76fad31e959cd15facecee0f1b3513ef4592d1186be077e"
            ]
        },
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        }
    }
]
[root@zch config]# 

注意到这个地方

“ExposedPorts”: {
“6379/tcp”: {}
},

也就是说,当我们pull下来镜像的时候,就已经在docker内部有一个默认的端口号了(一般就是平常各种服务默认的端口号),所以当我们通过镜像创建容器的时候,对于同一个镜像,它所创建的不同容器在docker内部的端口都有一个默认的和镜像一致的端口!

===查看与6380内部端口映射(-p 6380:6380)的redis2的元数据时(docker inspect redis2)发现

“Ports”: {
“6379/tcp”: null, //这里的就是docker容器内部默认的端口,只不过我们没有本机地址与它映射,所以为null,也是为何docker ps时有两个值的原因
“6380/tcp”: [
{
“HostIp”: “0.0.0.0”,
“HostPort”: “6380”
}
]
}

===再看与6379内部端口映射(-p 6380:6379)的redis2的元数据时(docker inspect redis2)发现

“Ports”: {
“6379/tcp”: [
{
“HostIp”: “0.0.0.0”,
“HostPort”: “6380”
}
]
}
这里就只有容器默认的内部端口6379和本机的映射了

原因分析

所以,为何同一个docker内部端口6379能够与不同的本机端口相映射呢

我猜测是跟docker网络有关。。
所以我们查看一下开启前后的ip
(注:此时两个容器都是与内部端口6379映射的)

[root@zch ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED        STATUS          PORTS                    NAMES
203a0d3dad1a   redis:6.0.12   "docker-entrypoint.s…"   6 hours ago    Up 49 minutes   0.0.0.0:6380->6379/tcp   redis2
ffeac01946f1   redis:6.0.12   "docker-entrypoint.s…"   16 hours ago   Up 43 minutes   0.0.0.0:6379->6379/tcp   redis1

启动容器前

[root@zch ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:16:3e:30:ac:de brd ff:ff:ff:ff:ff:ff
    inet 172.24.11.75/18 brd 172.24.63.255 scope global dynamic eth0
       valid_lft 307823829sec preferred_lft 307823829sec
3: br-2ebc59f84c42: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:51:6f:6a:ad brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.1/16 brd 172.18.255.255 scope global br-2ebc59f84c42
       valid_lft forever preferred_lft forever
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:42:98:e1:75 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

启动两个映射6379的redis容器后

[root@zch ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:16:3e:30:ac:de brd ff:ff:ff:ff:ff:ff
    inet 172.24.11.75/18 brd 172.24.63.255 scope global dynamic eth0
       valid_lft 307824120sec preferred_lft 307824120sec
3: br-2ebc59f84c42: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:51:6f:6a:ad brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.1/16 brd 172.18.255.255 scope global br-2ebc59f84c42
       valid_lft forever preferred_lft forever
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:42:98:e1:75 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
12178: vethb34c46b@if12177: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 5a:35:bb:a2:4e:c1 brd ff:ff:ff:ff:ff:ff link-netnsid 0
12180: vetha7fde8c@if12179: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 72:24:61:31:6a:41 brd ff:ff:ff:ff:ff:ff link-netnsid 1

很明显,最后多了两个ip,也就是说docker为不同的容器分配了不同的ip,所以即便内部端口都是6379,但是由于前面的ip不同,所以自然也就可以共存(我猜的**)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Docker运行容器端口映射 的相关文章

随机推荐

  • Rancher部署

    使用helm方式安装 https blog csdn net zhoumengshun article details 108160704 参考地址 https blog csdn net weixin 47752736 article d
  • 机器学习之数学基础

    机器学习之数学基础 机器学习所需的数学知识 微积分 线性代数 概率论 最优化方法 微积分知识 导数与求导公式 一阶导数与函数的单调性 一元函数极值判定法则 高阶导数 二阶导数与函数的凹凸性 一元函数泰勒展开 偏导数与梯度 高阶偏导数 雅克比
  • android项目迁移到androidX:类映射(content*,multidex*)

    android support content 支持库类 AndroidX 类 android support content ContentPager androidx contentpager content ContentPager
  • ajax传回的数据做表格,Datatables ajax返回的数据顺序与表格中的数据顺序不一致...

    项目中Datatables是采用Ajax作为数据源的 当ajax返回数据后 我查看ajax返回的数据发现 ajax返回的数据顺序与datatables表格中显示的数据顺序不一致 请问如何才能这两者显示一致呢 下面是ajax返回的数据 dat
  • linux 系统对信号的处理,linux内核线程对信号的处理过程(转)

    linux中的线程分为用户线程和内核线程 用户线程是标准的线程 完全的自主性 完全的抢占性 但是内核线程就不那么好了 某种意义上没有用户线程那么清闲 这个怎么理解呢 用户线程的编写者只需要实现应用逻辑就可以 至于调度 信号处理等工作完全有内
  • Gitee上传代码保姆级教程(亲测有效)

    作为一名程序猿or程序媛 怎么能不会使用Gitee上传代码 协同开发呢 今天 一个小白保姆级Gitee上传代码教程他来啦 亲测有效 小伙伴们来trytry吧 前提 1 已经下载过Git Bash 如果还没有下载过 请移步至其他博主的博客下载
  • 嗯嗯

    编写一个程序 可以一直接收键盘字符 如果是小写字符就输出对应的大写字符 如果接收的是大写字符 就输出对应的小写字符 如果是数字不输出 由于键盘每一个符号在c语言中是使用asscii码实现 可以使用范围来判断具体键盘输入的内容 include
  • 【Liunx】Navicat连接ubuntu下mysql

    一 首先准备好 ubuntu虚拟机一台 xftp7 mysql5 7离线包 Navicat软件 二 启动ubuntu虚拟机在主目录下创建mysql文件夹 查询虚拟机ip地址 使用xftp7连接虚拟机上传mysql5 7安装包 创建mysql
  • 基于Numpy构建RNN模块并进行实例应用(附代码)

    文章目录 一 写在前面 二 RNN原理介绍说明 1 RNN架构说明 2 RNN的数学模型及代码 正向传播 输入层 隐藏层 正向传播 隐藏层 输出层 反向传播 输出层 隐藏层 反向传播 隐藏层 输入层 三 RNN在实例中的应用 1 实例问题说
  • 【QT】图形化页面设计

    可视化的图形化界面共有三种设计方式 一种是通过可视化来设计界面的方式 一种是代码化的设计方式 最后是混合上面两种的混合界面设计方式 目前我们只考虑通过Designer和代码来设计图形化页面的两种方式 目录 可视化图形界面设计 图形页面设计
  • 算法小白的自我总结

    2018年10月26号 觉得该把这段时间做一下总结了 大概包括心理变化方面 找工作方面吧 csdn为什么没有表情可以用 并且终于在上线新版之后变得没有那么多bug了 快捷键也能用了 界面看起来还可以 为什么把标志性的红色不见了 红色变成了蓝
  • 使用jquery对输入框内容设置自动校验,只允许数字的输入

    目的 对input输入框的内容进行校验 js的方法 keyup 对键盘的进行监控的事件 正则表达式 d g 原理 就是在输入框添加一个 触发事件 对输入框的内容进行判断 过程遇到问题 js和jquery获取值的方法 value是js获取值的
  • 2021-04-28 Mac上插入公式的三种方法

    文章目录 在线方案 自带的Pages更好用 KLatexformular 在线方案 很多网站可以在线编辑 然后下载图片 给一个我用的链接 https latex codecogs com legacy eqneditor editor ph
  • 整型数据在内存中的存储方式大解密

    提示 先赞后看 养成习惯 文章目录 前言 一 原码 反码 补码 二 体验 存 数据的过程 小小的总结一下 三 体验 取 数据的过程 什么是大小端 如何验证一个机器是大端还是小端的存储模式呢 为什么会有大小端之分呢 取 数据 整型数据范围 前
  • 时序预测

    时序预测 Matlab实现SO CNN GRU蛇群算法优化卷积门控循环单元时间序列预测 目录 时序预测 Matlab实现SO CNN GRU蛇群算法优化卷积门控循环单元时间序列预测 预测效果 基本介绍 程序设计 参考资料 预测效果 基本介绍
  • 获取application.yml文件中配置参数的两个方法

    application yml文件内容 第一种 适用于获取少量配置参数 Value man name private String name 第二种 适用于获取大批量配置参数 第一步 整合pom xml文件
  • 操作系统的调度基础

    操作系统的cpu调度 把内核线程当成内核中的一个进程去理解 任务系统的三个核心特征是 权限分级 数据隔离和任务切换 以X86 64架构为例 权限分级通过CPU的多模式机制和分段机制实现 数据隔离通过分页机制实现 任务切换通过中断机制和任务机
  • Java类与接口、类与类之间的六种关系及UML表示

    转自点击打开链接 一 继承关系 继承指的是一个类 称为子类 子接口 继承另外的一个类 父类 父接口 的功能 并可以增加它自己的新功能的能力 在java中继承关系通过关键字extends明确标识 在设计时一般没有争议性 在UML类图设计中 继
  • 10款炫酷的HTML5动画特效,附源码

    HTML5确实非常强大 很多时候我们可以利用HTML5中的新技术实现非常炫酷效果时 这些效果也非常消耗电脑的CPU 但是这些HTML5效果确实能给用户带来不一样的用户体验 今天我要跟大家分享一些HTML5实现的惊艳特效 希望你可以喜欢 1
  • Docker运行容器端口映射

    大致描述 我发现docker启动容器时 以redis为例 在已经启动了一个 p 6379 6379的redis1容器后 当我们开启第二个redis2容器时 右边的端口映射既可以写别的我们想要映射的端口 p 6380 6380 redis2