【Docker学习】docker run的端口映射-p和-P选项

docker run的端口映射选项分为-p(小写,全称--publish),-P(大写,全称--publish-all),之前认为只有改变容器发布给宿主机的默认端口号才会进行-p的设置,而不改变默认端口号就无所谓设置与否。但当我在进行一个go连接容器redis的实验时才发现这个问题,即使不改变默认端口号,也要进行设置,否则宿主机是访问不到相应容器的。打铁要趁热,趁着这个机缘,和大家一起来学习端口映射的选项。

一、-p(小写),--publish

英文对此选项的解释为将容器的端口号发布给宿主机(Publish a container's port(s) to the host),我们总喜欢称之为端口映射。我们怎么理解方便怎么来就好了,没必要在这上面较真。下面是实操:

docker run -d --name myredis -p 26379:6379 redis

以上是使用docker run命令以后台方式(-d)运行容器redis,将容器命名为myredis(--name myredis),将容器的端口号6379发布给宿主机的26379端口(-p 26379:6379)。这样宿主机想访问容器中的myredis容器,就可以通过127.0.0.1:26379来访问了。

我们先用docker inspect myredis来查看端口映射是否成功。可以看出执行命令后,在输出的信息"HostConfig"中找到“PortBindings”,里面是我们-p进行的设置。

windows上我们打开Redis Insight进行测试,选择Add Redis database后,输入Host和Port后,点击Test Connection按钮,显示Connection is successful,连接成功。

假如不进行-p指定,我们输入

docker run -d --name myredis redis

结果显示如下:

无法连接myredis容器。

二、-P(大写),--publish-all

官网解释此选项为将所有暴露的端口发布到随机端口(Publish all exposed ports to random ports)。基于此,我们进行测试

docker run -d --name myredis -P redis

上述指令以后台方式(-d)运行一个redis容器(docker run),将容器命名为myredis(--name myredis),并将暴露的端口发布到随机端口(-P)。

我们使用docker ps查看此容器。显示如下:

可以看到系统将myredis容器的6379端口随机映射为32768端口。再来使用Redis Insight测试,结果成功。

备注:

docker ps显示的PORTS列表项中的数据为0.0.0.0:32768->6379/tcp。其中0.0.0.0代表任意本地和远端ip地址都可以访问此容器的32768端口。若是出于安全考虑,应该指定特定的IP地址才可以访问。

另外6379/tcp中的tcp,也可以指定为udp和sctp,根据需要进行改写即可。

最后:

一开始我说过,为了进行go连接容器redis的实验,才发现此-p的问题,现把go源码发上来。

//RedisTest.go
package mainimport ("context""fmt""github.com/go-redis/redis/v8"
)func main() {rdb := redis.NewClient(&redis.Options{Addr:     "localhost:26379",Password: "", // no password setDB:       0,  // use default DB})ctx := context.Background()// 创建一个字节切片,包含单个字节 0xc0value := []byte{0xc0}// 使用 SET 命令将键 key 设置为这个字节切片err := rdb.Set(ctx, "key", value, 0).Err()if err != nil {fmt.Println("Error setting value in Redis:", err)return}// 获取键 key 的值result, err := rdb.Get(ctx, "key").Bytes()if err != nil {fmt.Println("Error getting value from Redis:", err)return}// 输出获取到的值fmt.Printf("Value from Redis: %v\n", result)
}

使用go build RedisTest.go进行编译,再执行编译好的RedisTest.exe,结果如下:

go build RedisTest.go
.\RedisTest.exe
Error setting value in Redis: dial tcp [::1]:26379: connectex: No connection could be made because the target machine actively refused it.

发现报错了,连不上。是因为上面通过-P已经将26379改成了32768端口,改过再来一遍,编译运行结果如下:

结果正是我想要的。将0xc0代表的字节转化成数字为192。

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

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

相关文章

Java面试八股文(MySQL篇)

数据库三范式 数据库事务介绍 索引介绍 SQL优化手段 mysql union 与 union all 语法及用法 并发事务带来的问题 大表如何优化 索引类型介绍 MYSQL数据库锁介绍

leetcode91.解码方法(动态规划)

问题描述: 一条包含字母 A-Z 的消息通过以下映射进行了 编码 : A -> "1" B -> "2" ... Z -> "26" 要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可…

如何才能做好源代码防泄密

目前很多企业都拥有自己的研发机构,其研发成果往往体现在源代码和技术文档方面,这些核心机密,如何防止研发参与人员泄密,如何防止核心成员把研究成果带走另立山头,或者提供给竞争对手,是一个很现实的一个问…

Vue-路由介绍

目录 一、思考引入 二、路由介绍 一、思考引入 单页面应用程序,之所以开发效率高,性能高,用户体验好,是因为页面按需更新。 而如果要按需更新,首先需要明确:访问路径和组件的对应关系。该关系通过路由来…

Vue CLI配置代理、2.0、3.0

一、vue cli2.0 代理配置 proxy: {/api:{target: "http://localhost:8067",pathRewrite: {/api: }}, } 一、vue cli3.0 代理配置 proxy: {/api: {target: http://localhost:8067,pathRewrite: {/api: }} }

【C++】滑动窗口:最大连续1的个数

1.题目 2.算法思路 其实在做这道题的时候并不需要真的把0翻转成1,只需要找到最长的子数组且该子数组中0的个数不大于K,就可以了! 当然我们首先想到的是暴力穷举法: 找到所有符合题意的子数组,跳出最长的那个就可以了…

NodeMCU ESP8266 操作 SSD1306 OLED显示屏详解(图文并茂)

文章目录 1 模块介绍2 接线介绍3 安装SSD1306驱动库4 源码分析4.1 硬件兼容性4.2 可能存在的问题总结1 模块介绍 我们将在本教程中使用的OLED显示屏是SSD1306型号:单色0.96英寸显示屏,像素为12864,如下图所示。 OLED显示屏不需要背光,这在黑暗环境中会产生非常好的对比度。…

仓库管理系统需求调研要点

仓库管理系统需求调研 一、仓库的作用 仓库分类 原材料仓库:用于存放生产所需的原材料和零部件,需要保持原材料的质量和数量稳定。半成品仓库:存放生产过程中的半成品和在制品,需要保持良好的生产流程和及时出库。成品仓库&#x…

微信小程序和微信H5微商城的区别,微信商城主要有哪些类型

什么是微信小程序? 微信小程序的推出是一场革命,它为用户提供了应用程序中的应用程序。这些轻量级的、不到10 MB的实用程序改变了微信的体验,使其从一个纯粹的消息传递平台转变为一个包罗万象的数字宇宙。截至2024年初,WeChat拥有…

SPSS多元线性回归

(要满足)模型的假设条件需要对数据进行怎样处理?? 为了使数据满足多元线性回归的条件,通常需要进行以下预处理步骤: 1. 数据清洗:处理缺失值、异常值和重复值,确保数据质量。 2. 特…

C/C++ 初级球球大作战练手

效果演示&#xff1a; https://live.csdn.net/v/385490 游戏初始化 #include <stdbool.h> #include<stdio.h> #include<stdlib.h> #include<time.h> #include<graphics.h> #include <algorithm> #include<math.h> #include<mmsy…

【刷题篇】双指针(二)

文章目录 1、有效三角形的个数2、查找总价格为目标值的两个商品3、三数之和4、四数之和 1、有效三角形的个数 给定一个包含非负整数的数组 nums &#xff0c;返回其中可以组成三角形三条边的三元组个数。 class Solution { public:int triangleNumber(vector<int>& n…