容器的网络入门

本文涉及的产品
轻量应用服务器 2vCPU 4GiB,适用于搭建Web应用/小程序
轻量应用服务器 2vCPU 4GiB,适用于网站搭建
轻量应用服务器 2vCPU 1GiB,适用于搭建电商独立站
简介: 在本实验中我们将学习通过容器中的网络用法

容器的网络入门


1. 创建相关实验资源。

  1. 在体验实验室,单击创建资源。
  2. (可选)在实验室⻚⾯左侧导航栏中,单击云产品资源列表,可查看本次实验资源相关信息(例如IP地址、⽤户信息等)。 说明:资源创建过程需要1~3分钟。

2. 创建实验环境镜像

在前面的实验中我们学习了Docker中的容器和容器镜像的用法。而容器作为一种虚拟机技术,其网络和存储模型也是非常重要的知识重点,因此本实验中我们讲的带领大家学习容器的网络模型的基本概念。

  1. 编写自定义Dockerfile

为了后续实验的进行,我们先来创建一个包含python环境的自定义镜像,我们基于python3.7构建实验镜像。接下来我们为实验镜像配置aliyun的ubuntu的apt源,并且进行apt的初始化操作,在初始化完成之后。我们为镜像安装curlpingifconfigtraceroute等常用网络工具。最后我们设置镜像运行时在8000端口启动python3内置的http服务

我们通过vi编辑Dockerfile,并将下面的内容添加到中Dockerfile中,注意使用vim编辑器时:

  1. 需要先按i键进入编辑模式。
  2. 编辑完成之后按esc退出编辑模式。
  3. 然后按大写的ZZ保存并退出vim。
vi Dockerfile
FROM python:3.7
  EXPOSE 8000
  RUN echo "deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse \n\
  deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse \n\
  deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse \n\
  deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse \n\
  deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse \n\
  deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse \n\
  deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse \n\
  deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse \n\
  deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse \n\
  deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse" > /etc/apt/sources.list
  RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32
  RUN apt-get update
  RUN apt-get install -y curl net-tools inetutils-ping traceroute
  CMD ["python3", "-m", "http.server", "8000"]
  1. 编译镜像

编辑好Dockerfile之后,通过docker build命令生成新的镜像。注意镜像生成过程中,需要通过网络安装相关组件,因此容器构建时间可能会比较长。

docker build -t py/http .
docker images

  1. 验证镜像

容器制作完毕后,我们创建容器,然后使用docker exec命令在容器中执行curl 127.0.0.1:8000验证服务的启动。

docker run -itd --name check py/http
docker exec check curl 127.0.0.1:8000
docker rm -f check

3. 容器和宿主机中的网卡

实验环境创建成功后,接下来我们来学习容器和宿主机中的网卡信息

  1. 容器的网卡信息

创建容器后。docker会为容器默认创建一块虚拟网卡。容器通过这块网卡实现网络连接,为了验证容器的网卡,我们首先用自定义镜像pyt/http创建两个容器,当容器创建好之后,我们通过docker inspect命令查看容器详细信息,详细信息中包含容器网卡的IP。为了简化容器信息的查看,我们可以使用-f参数来筛选容器的信息。

docker run -itd --name py1 py/http
docker run -itd --name py2 py/http
docker inspect -f '{{.NetworkSettings.IPAddress }}' py1
docker inspect -f '{{.NetworkSettings.IPAddress }}' py2

  1. 多容器信息查询

当Docker中的容器或者容器镜像数量较多的时候,每次使用一条命令来查询一个容器或者镜像信息就会变得非常的繁琐。这时我们就可以使用docker ps-f "name=value"参数过滤所需要的对象,再用-q参数只获得所需要对象的ID。

接下来再配合linux命令行的$(),将对象的ID作为参数传给docker inspect命令。这样就可以一次性获得所有对象的配置信息。我们通过下列命令显示所有容器名称包含py的容器的IP地址。

docker ps -f "name=py" -q
docker inspect -f '{{.Name}} {{.NetworkSettings.IPAddress }}' $(docker ps -f "name=py" -q)

  1. 宿主机的网卡信息

在docker安装之后,也会在宿主机上安装一块默认的虚拟网卡docker0,该网卡可以和容器中的虚拟网卡互联互通。我们先通过ifconfig查看docker0的网卡信息。

ifconfig docker0

4. 容器和宿主机的连通性

本小节中我们来测试容器和宿主机网络连通性

  1. 测试宿主机和容器之间的连通性

接下来我们来测试的宿主机和容器网卡的互联互通,会发现在默认情况下,宿主机可以通过docker0网卡访问容器中的服务。

ping -c 4 [py1容器IP]
curl [py1容器IP]:8000
ping -c 4 [py2容器IP]
curl [py2容器IP]:8000

  1. 容器之间的网络连接

接下来我们来测试容器之间的网络连通性,我们通过ifconfig命令查看容器详细信息,会可以发现各容器的的IP地址属于同一个子网,这种设置保证了容器之间的网卡可以互联互通,为了验证我们进入py1容器的控制台,然后测试py1到宿主机和py2的连通性。

docker exec -it py1 /bin/bash
ping -c 4 [docker0 IP]
ping -c 4 [py2容器IP]
curl [py2容器IP]:8000
exit

  1. 容器的外网访问

在上一个步骤中查看容器的网络信息时,我们会发现容器的网卡中网关IP正是宿主机的docker0网卡的IP。这就意味着,如果容器的宿主机可以访问互联网,容器就可以通过宿主机的docker0网卡转发网络数据包访问互联网。为了验证我们进入py1容器的控制台,ping访问aliyun.com验证连通性,再通过traceroute命令验证容器访问外网的路径。会发现容器访问外网的第一条就是docker0网卡。

docker exec -it py1 /bin/bash
ping -c 4 www.aliyun.com
traceroute www.aliyun.com -w 0.1
exit

5. 容器的端口映射

在上面的几个小节中我们学习了了,容器和宿主机的互相访问,容器和容器的互相访问,以及容器对外网的访问。但是由于容器本身使用了Docker创建的私有网络地址,虽然可以通过docker0网卡转发访问外网,但是无法提供服务,让外网的使用者来访问。

为了解决这个问题,我们就需要用到容器的端口映射功能。通过端口映射功能,我们可以将宿主机的一个端口和一个指定容器的端口进行映射绑定,所有对宿主机端口的访问数据包,都会自动转发到指定容器的端口上。这样只要外网访问者只要能访问到宿主机,就可以通过端口映射功能,访问到容器中的服务。从而实现了通过容器对外发布服务的能力。

本小节中我们就来为大家演示Docker端口映射的常用用法。

  1. 端口映射的基本用法

第一种用法就是在docker run中通过-p参数进行容器和宿主机的端口映射绑定。-p参数有两种用法,第一种是分别指定宿主机端口和容器端口,其语法格式为 -p 宿主机端口:容器端口;第二种是只指定容器端口,由docker自动分配宿主机端口。其语法格式为 -p 容器端口

如果需要为容器指定映射多个端口,可以在docker run中使用多个-p参数。在使用端口映射启动容器之后,我们可以通过docker ps命令查看容器的端口映射配置。

docker run -itd -p 18000:8000 -p 18001:8000 --name port1 py/http
docker run -itd -p 8000 --name port2 py/http
docker ps -f "name=port"

  1. 查看端口映射

端口映射完成后,我们往往需要查看映射信息,尤其是对docker自动分配宿主机端口的映射方式。除了可以用docker ps命令查看映射信息之外。还可以使用docker port命令查看映射信息,其调用格式为docker port 容器名或者docker port 容器名 容器端口

docker port port1
docker port port1 8000
docker port port2

  1. 验证端口映射

当我们确定了容器在宿主机上的映射端口之后,我们就可以在宿主机上通过curl命令来验证映射功能。为了控制curl命令的输出,我们可以使用linux的|语法,配置head -n1压缩网页输出。。

curl 127.0.0.1:18000 | head -n1
curl 127.0.0.1:18001 | head -n1
curl 127.0.0.1:[port2宿主机端口]  | head -n1

实验地址:https://developer.aliyun.com/adc/scenario/0d6f2eae2de840e68d5e0159d7c6e83e

相关文章
|
18天前
|
监控 Kubernetes 安全
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !
蒋星熠Jaxonic,技术探索者,以代码为笔,在二进制星河中书写极客诗篇。专注Docker与容器化实践,分享从入门到企业级应用的深度经验,助力开发者乘风破浪,驶向云原生新世界。
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !
|
10天前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
115 2
|
3月前
|
存储 Linux 容器
【Container App】在容器中抓取网络包的方法
本文介绍在Azure Container App中安装tcpdump抓取网络包,并通过Storage Account上传抓包文件的方法。内容包括使用curl和nc测试外部接口连通性、长Ping端口、安装tcpdump、抓取网络包、以及通过crul命令上传文件至Azure Storage。适用于需要分析网络请求和排查网络问题的场景。
118 1
|
4月前
|
Docker 容器
Docker网关冲突导致容器启动网络异常解决方案
当执行`docker-compose up`命令时,服务器网络可能因Docker创建新网桥导致IP段冲突而中断。原因是Docker默认的docker0网卡(172.17.0.1/16)与宿主机网络地址段重叠,引发路由异常。解决方法为修改docker0地址段,通过配置`/etc/docker/daemon.json`调整为非冲突段(如192.168.200.1/24),并重启服务。同时,在`docker-compose.yml`中指定网络模式为`bridge`,最后通过检查docker0地址、网络接口列表及测试容器启动验证修复效果。
|
10月前
|
人工智能 弹性计算 运维
ACK Edge与IDC:高效容器网络通信新突破
本文介绍如何基于ACK Edge以及高效的容器网络插件管理IDC进行容器化。
|
5月前
|
网络协议 Docker 容器
使用网络--容器互联
使用网络--容器互联
113 18
|
5月前
|
Kubernetes Cloud Native 区块链
Arista cEOS 4.30.10M - 针对云原生环境设计的容器化网络操作系统
Arista cEOS 4.30.10M - 针对云原生环境设计的容器化网络操作系统
169 0
|
8月前
|
存储 SQL 索引
Python入门:7.Pythond的内置容器
Python 提供了强大的内置容器(container)类型,用于存储和操作数据。容器是 Python 数据结构的核心部分,理解它们对于写出高效、可读的代码至关重要。在这篇博客中,我们将详细介绍 Python 的五种主要内置容器:字符串(str)、列表(list)、元组(tuple)、字典(dict)和集合(set)。
Python入门:7.Pythond的内置容器
|
8月前
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
7月前
|
人工智能 运维 API
云栖大会 | Terraform从入门到实践:快速构建你的第一张业务网络
云栖大会 | Terraform从入门到实践:快速构建你的第一张业务网络
250 1

热门文章

最新文章