docker容器的通讯——内部访问外部

本文介绍了Docker容器如何通过NAT地址转换访问外部网络的过程。主要包括:物理机与容器间网络连接的基本设置、iptables策略配置及作用原理、以及通过tcpdump监控网络流量的具体操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

《容器访问外部世界:》

 

原理:NAT地址转换

 

 

 

1.物理机可以连接外网

2.docker run -it busybox

ip a

容器可以访问外网

3.查看iptables策略,了解策略原理

iptables -t nat -s

 

-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE

收到来自这个网段的包,把它交给MASQUERADE,然后它将包的源地址替换成host主机的地址发送出去,就是做了一次网络源地址转换(NAT)

 

4.开启一个终端运行,监控docker0网卡:

tcpdump -i docker0 -n icmp

 

5.在另一个终端:

进容器ping百度

docker run -it busybox

ping www.baidu.com

结果,发现容器的IP地址交给了MASQUERADE处理

 

 

 

6.结束上一个终端,运行监控物理机网卡

tcpdump -i ens33 -n icmp

发现已经将容器的地址进行转换了,成了物理机的IP地址。

 

 

 

转载于:https://www.cnblogs.com/Leonardo-li/p/8946455.html

### 关于Docker容器的常见面试问题及其解答 #### 1. 什么是Docker容器Docker容器是镜像的一个可执行实例,它包含了运行应用程序所需的一切:代码、运行时、库、环境变量和配置文件。容器与宿主机和其他容器相互隔离,但共享操作系统内核[^1]。 #### 2. Docker容器和虚拟机的区别是什么? 两者的主要差异在于抽象层次的不同。虚拟机是在硬件层面上进行抽象,而Docker则是在操作系统层面完成这一过程。因此,相较于传统VMs, Docker容器更加轻量级,在启动速度方面也更快,并且资源消耗更少。 #### 3. Docker容器Docker镜像有何不同? - **镜像** 是用于创建容器的只读模板;它是静态的概念。 - **容器** 则是由该镜像所生成的具体实例化对象,具有独立的工作目录及状态信息等动态属性[^3]。 #### 4. Docker容器是如何实现隔离性的? Docker利用Linux命名空间(Namespaces)来提供进程级别的隔离机制,使得各个容器之间互不影响。同时借助控制组(Control Groups),可以有效地管理和限制CPU、内存等系统资源分配给每一个单独的容器使用。 #### 5. 如何创建一个Docker容器? 可以通过`docker run`命令来创建并启动新的容器。此操作会自动下载所需的镜像(如果本地不存在的话),然后基于这个镜像初始化一个新的容器实例[^2]: ```bash docker run -it --name my_container ubuntu /bin/bash ``` #### 6. 启动/停止Docker容器的方法有哪些? 对于已经存在的容器,可通过如下指令来进行相应的生命周期管理: - `docker start CONTAINER_ID_OR_NAME`: 开启暂停中的容器; - `docker stop CONTAINER_ID_OR_NAME`: 平滑关闭正在运行着的服务; - `docker restart CONTAINER_ID_OR_NAME`: 重启指定ID或名称对应的容器服务. #### 7. 怎样删除不再使用的Docker容器? 当确认某个容器确实不需要保留下来之后,则应该及时清理掉以释放磁盘空间及其他有限计算资源。这一步骤通常由下面这条语句完成:`docker rm CONTAINER_ID_OR_NAME` 或者批量移除所有处于退出状态下的容器:`docker container prune`. #### 8. 查询当前活跃中的Docker容器列表的方式是什么? 要获取此刻正处于活动状态下所有的容器详情记录表单,只需简单输入`docker ps`, 若还想进一步了解历史遗留下来的那些非激活态的对象们,则追加参数 `-a` 即可. ```bash docker ps [-a] ``` #### 9. 获取特定Docker容器日志数据的办法有哪些? 针对某单一目标而言,最直接有效的方法莫过于运用内置工具——即通过`docker logs CONTAINER_ID_OR_NAME` 来抓取对应实体所产生的标准输出流以及错误报告等内容. #### 10. 进入正处在工作期间内的Docker容器内部应采取何种措施? 为了能够实时监控或者调试在线业务逻辑流程,往往需要用到交互式的shell终端访问权限。此时推荐采用`docker exec -it CONTAINER_ID_OR_NAME /bin/sh|bash` 的形式获得进入权柄: ```bash docker exec -it CONTAINER_ID_OR_NAME bash ``` #### 11. 在Docker容器里边怎样安装额外软件包呢? 一旦进入到容器环境中以后,就可以按照常规方法去安装各种依赖项了。比如在Debian系发行版上,先更新APT源索引再安装新组件: ```bash apt-get update && apt-get install -y package_name ``` 而对于Alpine Linux来说则是: ```bash apk add --no-cache package_name ``` #### 12. 导出Docker容器里的文件至外部存储介质该如何着手处理? 假设想要把位于某一路径下名为example.txt的数据迁移到宿主机相应位置处,那么就应当这样写脚本: ```bash docker cp CONTAINER_ID:/path/to/example.txt ./local/path/ ``` #### 13. 将本地文件导入到Docker容器之中又该怎么去做? 同样地,“反向传输”的场景也可以轻松应对。只需要调整上述命令的方向即可达成目的: ```bash docker cp ./local/file_or_directory CONTAINER_ID:/container/path/ ``` #### 14. 更改Docker容器默认用户的途径都有哪些? 有时候可能需要改变正在运行的应用程序的身份认证方式,默认情况下大多数基础镜像都会设置root作为初始登录账户。但是出于安全考虑建议尽早切换成低特权等级的新角色。例如修改为www-data用户: ```bash USER www-data ``` 这段声明可以直接加入到构建自定义image的过程中间(Dockerfile)或者是临时性地经由exec子命令传参进去: ```bash docker exec -u www-data CONTAINER_ID command_to_run ``` #### 15. 对Docker容器网络连接策略做出适当规划的重要性体现在哪里? 合理设计网路拓扑结构有助于提高通信效率的同时还能增强系统的稳定性和安全性。常见的做法包括但不限于桥接(Bridge Mode)、主机直通模式(Host Network Mode)还有覆盖网络(Overlay Networks).
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值