Kubernetes 入门实战课
罗剑锋
Kong 高级工程师,Nginx/OpenResty 开源项目贡献者
19527 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 41 讲
Kubernetes 入门实战课
15
15
1.0x
00:00/00:00
登录|注册

06|打破次元壁:容器该如何与外界互联互通

你好,我是 Chrono。
在前面的几节课里,我们已经学习了容器、镜像、镜像仓库的概念和用法,也知道了应该如何创建镜像,再以容器的形式启动应用。
不过,用容器来运行“busybox”“hello world”这样比较简单的应用还好,如果是 Nginx、Redis、MySQL 这样的后台服务应用,因为它们运行在容器的“沙盒”里,完全与外界隔离,无法对外提供服务,也就失去了价值。这个时候,容器的隔离环境反而成为了一种负面特性。
所以,容器的这个“小板房”不应该是一个完全密闭的铁屋子,而是应该给它开几扇门窗,让应用在“足不出户”的情况下,也能够与外界交换数据、互通有无,这样“有限的隔离”才是我们真正所需要的运行环境。
那么今天,我就以 Docker 为例,来讲讲有哪些手段能够在容器与外部系统之间沟通交流。

如何拷贝容器内的数据

我们首先来看看 Docker 提供的 cp 命令,它可以在宿主机和容器之间拷贝文件,是最基本的一种数据交换功能。
试验这个命令需要先用 docker run 启动一个容器,就用 Redis 吧:
docker run -d --rm redis
注意这里使用了 -d--rm 两个参数,表示运行在后台,容器结束后自动删除,然后使用 docker ps 命令可以看到 Redis 容器正在运行,容器 ID 是“062”。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了容器与外部系统之间的互联互通方法,包括文件拷贝、网络互通和端口映射。通过Docker提供的`cp`命令和`docker run -v`命令,容器可以与主机进行文件共享,提升工作效率。此外,文章还讨论了Docker提供的三种网络模式:null、host和bridge,并通过实例演示了它们的应用。在解决端口冲突问题方面,作者介绍了使用`docker run -p`命令将主机端口映射到容器内部端口的方法。总的来说,本文以简洁清晰的语言,帮助读者快速了解了容器与外部系统互联互通的方法,为读者提供了实用的技术指导。文章还提出了两个思考题,引发读者思考和讨论。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Kubernetes 入门实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(36)

  • 最新
  • 精选
  • xmr
    1.第四节的COPY是在构建镜像时把本地文件拷贝到镜像,而本节的cp命令是在容器运行后容器和宿主机互相拷贝文件,一个构建时,一个运行时。 2.host性能好,隔离性差;bridge隔离性好,性能差了一点。host一般用在集群的边界需要和集群外通信的场景,比如ingress-nginx;bridge用于集群内部,如无特殊需求默认都是bridge。

    作者回复: awesome

    2022-07-05
    24
  • 马以
    1:第四节的copy命令是在容器启动过程中的COPY命令,该命令应该是在声明了“namespace”之后,所以这个时候进程看到的世界是一个隔离的环境; 而这里的COPY更像是站在“上帝视角(宿主机操作系统层面)”进行拷贝,所以这里不受“namespace”的约束; 2:host就是简单粗暴效率高,适合小规模集群的简单拓扑结构;bridge适合大规模集群,有了bridge就有更多的可操作空间,比如XLAN和VXLAN这些,它可以提供更多的可定制化服务,比如流量控制、灰度策略这些,从而像flannel和Calico这些组件才有了更多的发挥余地。

    作者回复: 说的很好。 COPY指令会把文件拷贝进镜像,“永远存在”,而cp命令是暂时的。

    2022-07-04
    3
    21
  • SuperSnow
    docker run -d --rm redis --rm不是删除命令么?为什么要在这里用呢?

    作者回复: --rm是告诉docker容器运行完毕后直接删除,就是为了省事,不用再手动删除了。

    2022-07-04
    2
    7
  • 🙄
    COPY会生成新的layer,对于镜像是永久的。copy是在当前layer执行一个命令,不生成新的layer

    作者回复: great

    2022-07-04
    3
    6
  • peter
    请教老师几个问题啊: Q1:docker exec XXX ip addr 容器查询IP的命令中,“XXX”是任意的吗? Q2:“Redis 容器里没有 ip 命令”,为什么? 如果Redis 容器里不能使用 ip 命令,那么,可以用“docker inspect”来查看其ip地址吗? Q3:“宿主机的 IP 地址则是“172.17.0.1””,哪里显示了宿主机的IP地址?图上并没有显示啊。 Q4:“docker inspect adb”查出的不仅仅是redis和nginx的IP吧,是查出所有容器的IP吗? 必须用adb吗? 用其他命令不行吗? Q5: “curl 127.1:8080 -I”,这个命令中“127.1”是“127.0.0.1”的缩写吗?

    作者回复: 1.XXX就是容器id,或者是容器名。 2.Redis镜像里没有安装ip命令,当然就无法使用了。“docker inspect”是docker的功能,与容器和镜像都没有关系。 3.截图里没有,这个IP地址是docker预留的。 4.“docker inspect”后面要接容器id或者名字,“adb”就是当时的容器id 5.是的,我就是图省事。

    2022-07-04
    2
    6
  • 逗逼师父
    1. docker cp是操作宿主和容器之间的文件传输,Dockfile里的COPY命令是在制作镜像时使用的。 2. host效率高,bridge更加灵活;host在平时开发时比较适合,因为我们的电脑一般端口不容易冲突;bridge的话更适合在测试或者生产环境中去使用,可以灵活配置应用端口。

    作者回复: awesome

    2022-07-04
    5
  • 凉人。
    hi,想问个问题,如果我们用网桥模式,任然是外部一个端口映射容器内一个端口,这有什么优势吗

    作者回复: 当然有优势,每个容器可以自己用任意端口,不用担心冲突,开发变简单了,维护的成本也可以减少。

    2022-07-05
    4
  • Frank
    老师,怎么修改容器的网络模式,host/bridge 一般情况下都没有设置它,直接运行容器,怎么知道容器运行在什么模式下?

    作者回复: 默认是bridge模式,可以用ip addr命令,看容器里的网络情况,有veth就是bridge,直接用宿主机网卡就是host。

    2022-07-04
    2
    4
  • 六月
    有一个问题想问一下,docker挂载目录进容器,宿主机的文件会覆盖掉容器的同名目录,但是,有时候想反过来,在挂载的目录里输出容器内原本同名目录下的文件,而不是被宿主机挂载的空目录覆盖掉。这个能实现么

    作者回复: 好像是不能吧,可以去看一下docker的官网文档。

    2022-07-06
    6
    3
  • 朱雯
    问题1: cp命令是容器运行时拷贝进去 有点类似拷贝进入内存 copy是永久拷贝进镜像 等于是放入磁盘 问题2:实践中 一直使用bridge模式 为了隔离而花费那么一点效率我觉得完全值得。 最后 我一直以为只有bridge模式 当时面试官问我 docker容器的运行模式有哪些 我直接告诉他没什么网络模式 我就这么用的 现在才彻底搞明白😄

    作者回复: 其实docker的模式我们简单了解一下就好,因为后面主要学的是Kubernetes。

    2022-07-04
    3
收起评论
显示
设置
留言
36
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部