容器端口和权限修改

docker修改已有容器的权限和端口映射

使用docker的容器时,可能会遇到当前容器的权限不足,或是端口映射不正确的情况,此时需要对其进行修改。常用的方法是将容器打包成镜像,再通过镜像创建新的容器,在创建时添加权限和新的端口映射,这里给出不通过创建新容器来修改已有容器权限和端口映射的方法。

查看容器的配置信息

docker inspect 容器名

创建一个非特权模式的,3311端口映射到3306端口的centos7容器。

[root@centos2 ~]# docker create -it --name centos7 -h mycentos7 -p 3311:3306  centos:7.9.2009
0adffc8b817f00f07d2b6dd077dbbcff3ef27f400ab0d8141142faede38894db

记录id

进入这个容器

[root@centos2 ~]# docker start centos7
centos7
[root@centos2 ~]# docker exec -it centos7 /bin/bash
[root@mycentos7 /]#

安装httpd并运行,此时没有权限

[root@mycentos7 /]# yum -y install httpd
[root@mycentos7 /]# systemctl start httpd
Failed to get D-Bus connection: Operation not permitted

退出容器,关闭容器和docker

进入宿主机/var/lib/docker/containers目录,找到对应容器id的目录

cd /var/lib/docker/containers

此处只创建了一个容器,进入该目录

请添加图片描述

找到

config.v2.json

hostconfig.json

两个文件
请添加图片描述

先备份

cp -ar config.v2.json config.v2.json.backup
cp -ar hostconfig.json hostconfig.json.backup

修改hostconfig.json

vim hostconfig.json

请添加图片描述

字段"PortBindings":{“3306/tcp”:[{“HostIp”:“”,“HostPort”:“3311”}]}为端口映射,将容器的3306映射到宿主机的3311,这里将其修改为映射到3313

字段"Privileged":false为特权模式标签,这里标记为非特权模式,将其修改为true

请添加图片描述

保存退出

修改config.v2.json

vim config.v2.json

请添加图片描述

“ExposedPorts”:{“3306/tcp”:{}}为存在映射端口,此处不修改

两处/bin/bash 修改为/sbin/init

请添加图片描述

保存退出

重启docker,启动容器

请添加图片描述

可以看到容器shell已经改变

查看端口映射,可以看到3306的映射端口已经从3311改为了3313

请添加图片描述

进入容器,启动httpd,正常启动,说明已经进入特权模式

请添加图片描述

### 动态为运行中的Docker容器添加端口映射Docker 中,默认情况下,`docker run` 命令用于创建并启动一个新的容器,并允许通过 `-p` 参数指定端口映射关系。然而,在某些场景下,可能需要对已经运行的容器动态添加新的端口映射。 #### 方法概述 尽管 `docker run` 是最常见的端口映射方式[^3],但对于已经在运行的容器,可以借助 `docker port` `docker update` 的组合来间接实现动态端口映射的效果。不过需要注意的是,Docker 并未提供直接修改已运行容器端口映射的功能,因此通常采用以下替代方案: --- #### 方法一:重启容器以应用新的端口映射 如果容器支持重新启动而不会影响服务状态,则可以通过以下步骤完成端口映射更新: 1. **停止正在运行的容器** 使用以下命令停止目标容器: ```bash docker stop <container_id> ``` 2. **删除旧容器实例** 删除当前容器以便重建它(注意保存数据卷以防丢失重要数据): ```bash docker rm <container_id> ``` 3. **基于原镜像重新创建容器并附加新端口映射** 创建带有额外端口映射的新容器: ```bash docker run -d --name=<new_container_name> \ -p <existing_host_port>:<existing_container_port> \ -p <new_host_port>:<new_container_port> \ <original_image_name> ``` 4. **验证端口映射是否生效** 运行以下命令确认新增加的端口已被正确绑定到宿主机上: ```bash docker ps | grep <new_container_name> ``` 此方法适用于大多数情况下的生产环境调整需求。 --- #### 方法二:利用网络模式共享宿主机端口 另一种解决办法是切换至 `--network="host"` 模式运行容器。在这种模式下,容器会直接继承宿主机上的所有开放端口,无需显式声明任何特定范围内的映射规则。但是要注意该选项仅限 Linux 系统可用,并且可能会带来潜在的安全隐患由于缺乏隔离机制所致[^2]。 执行如下指令即可启用 Host Networking Mode : ```bash docker run -it --net=host alpine ash ``` 对于已有处于其他默认桥接网卡 (bridge network) 下工作的实例来说 , 可尝试将其迁移到自定义 bridge 或者 macvlan 类型子网里去 ,从而获得更灵活可控权限分配策略的同时保留原有功能特性不变 。 --- #### 注意事项 无论采取哪种途径都需要权衡利弊得失 。 如果频繁变更端口设置的话建议考虑自动化工具如 Kubernetes 来简化流程提高效率 同时也要记得做好充分测试工作确保改动无误后再推广上线正式环境中使用 [^4]. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值