目录

前言

一、网络模式

1、Bridge模式

2、Container模式

3、Host模式

4、None模式

5、overlay模式

二、自定义网络

三、暴露端口

四、Docker 数据卷和数据卷容器

1、数据卷(容器和宿主机共享文件)

2、数据卷容器(容器之间共享文件)

五、容器互联

六、端口映射

总结


前言

容器技术很火,经常为人所提及,尤其是开源容器工具docker,已在不少数据中心里有广泛应用。容器主要是对软件和其依赖环境的标准化打包,将应用之间相互隔离,并能运行在很多主流操作系统上。这样看来容器和虚拟机技术很类似,容器是APP层面的隔离,而虚拟化是物理资源层面的隔离,容器解决了虚拟技术的不少痛点问题,很多时候容器可以和虚拟机结合在一起使用,这也是目前数据中心主流的做法。

一、网络模式

1、Bridge模式

  • 此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及iptables nat表配置与宿主之间的关联
  • 当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中
  • 从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建**一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中**。可以通过brctl show命令查看
  • bridge模式是docker的默认网络模式,不写–net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看

2、Container模式

  • 创建的容器不会创建自己的网卡,配置自己的IP,而是**和一个指定的容器共享IP、端口范围(端口不能一致),只有一个容器有自己的网卡**,出去还是docker0进行通讯
  • 有点像各个服务放在同一个宿主机上面这种情况
  • 这个模式指定新创建的容器和**已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信**

3、Host模式

  • host容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口范围。如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的 NetworkNamespace,而是和宿主机共用一个 Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如**文件系统、进程列表等还是和宿主机隔离的**。
  • 使用host模式的容器可以直接使用宿主机的Ip地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是**dockerhost 上已经使用的端口就不能再用了**,网络的隔离性不好。
  • 解决了ip地址不固定的情况

4、None模式

  • 该模式关闭了容器的网络功能
  • 使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等
  • 这种网络模式下容器**只有lo回环网络,没有其他网卡。**none模式可以在容器创建时通过–network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性,可以安全的储存数据,不会被攻击,可以用来当个仓库

5、overlay模式

叠加式网络模式,使用外部的服务组件作为网关或者代理,例如ingress ,一般和docker-swarm结合(所以建议以了解的角度来介绍)

二、自定义网络

##查看网络模式列表
docker network ls

##查看容器信息(包含配置、环境、网关、挂载、cmd等等信息)
docker inspect  容器ID

##指定分配容器IP地址
docker run -itd --name test1 --network bridge --ip 172.17.0.10 centos:7 /bin/bash
#以上会报错,因为用户使用的ip地址不被规则所允许,docker0定义的就是按照顺序来,所有需要创建一个

##自定义网络固定iP
docker network 【--network bridge】 create --subnet=172.18.0.0/16 yxp1
docker run -itd --name test03 --net yxp1 --ip 172.18.0.8 centos:7 /bin/bash

三、暴露端口

两个容器如果端口一致的情况下,暴露出去会产生地址冲突,所以需要在docker0上做一个端口映射,通过ens33暴露出去端口不同就可以了

-p 自定义端口 ( 宿主机端口:容器内端口 )

-P 随机端口 (-P 49153起始 49153到65535)

#自定义端口
docker run -itd -p 8081:80 nginx:latest /bin/bash

#需要在容器中开启nginx
docker exec -it f282a476b06c /bin/bash -c nginx

#在网页测试
http://192.168.223.37:8081

# 随机端口
docker run -itd -P nginx:latest /bin/bash

四、Docker 数据卷和数据卷容器

  • 管理 Docker 容器中数据主要有两种方式:数据卷(Data Volumes)和数据卷容器(Data Volumes Containers)。
  • 数据卷是一个供容器使用的特殊目录,位于容器中。可将宿主机的目录挂载到数据卷上,对数据卷的修改操作立刻可见,并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移。数据卷的使用类似于 Linux 下对目录进行的 mount 操作。
  • 如果需要在容器之间共享一些数据,最简单的方法就是使用数据卷容器。数据卷容器是一个普通的容器,专门提供数据卷给其他容器挂载使用。

1、数据卷(容器和宿主机共享文件)

docker pull centos

#宿主机目录 /var/www 挂载容器中的 /data1
docker run -v /var/www:/data1 --name web1 -it centos /bin/bash

[roote202dd484fd62 / ]#cd /data1/
[root@202dd484fd62 data1]# touch test123
#返回宿主机进行查看
[root@localhost ~]#ls /var/www/

#应用场景
原理:将容器内部的配置文件目录,挂载到宿主机指定目录下。
作用:
① 修改配置文件例如:nginx.conf /usr/local/nginx/conf/nginx.conf ---> /container_nginx/conf/nginx.conf
② 容器内部产生的日志,如何收集将容器内部存放日志文件的目录挂载到宿主机指定目录下 /container_nginx/log/access_log/access_log
③ 传入变量挂载到宿主机在宿主机上添加变量内容,将变量放入共享目录,在容器中 /etc/profile 直接加载就可以
export xxdir=/data/data1/xx-

2、数据卷容器(容器之间共享文件)

#数据卷容器
docker run --name web100 -v /data1 -v /data2 -itd centos /bin/bash

#新容器挂载数据卷容器 web100
docker run -itd --volumes-from web100 --name db1 centos /bin/bash

> 原理:让两个容器实现数据共享
php --> mysql 之间想要通讯借助于 socket 通讯文件

五、容器互联

  • 容器互联是通过容器的名称在容器间建立一条专门的网络通信隧道。简单点说,就是会在源容器和接收容器之间建立一条隧道,接收容器可以看到源容器指定的信息。

docker run -itd -P --name web1 centos:7 /bin/bash    #创建并运行容器取名 web1,端口号自动映射
docker run -itd -P --name web2 --link web1:web1 centos:7 /bin/bash    #创建并运行容器取名 web2,链接到 web1 和其通信

> 进 web2 容器,ping web1

--link 的格式:
--link <name or id>:alias
其中,name 和 id 是源容器的 name 和 id,alias 是源容器在 link 下的别名。

六、端口映射

  • 在启动容器的时候,如果不指定对应的端口,在容器外是无法通过网络来来访问容器内的服务。端口映射机制将容器内的服务提供给外部网络访问,实际上就是将宿主机的端口映射到容器中,使得外部网络访问宿主机的端口便可访问容器内的服务。

[root@docker www]# docker run -d --name test1 -P nginx
0a07519f54de9552a37d076613f9f5af4ff4b80d1d3c258762c45f876a29500b
[root@docker www]# docker run -d --name test2 -p 11111:80 nginx
9316ffd9e2aa98e8d1ea679128d308fc0f1842d854e8b772c7cd5c07647251a8
[root@docker www]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                     NAMES
9316ffd9e2aa   nginx     "/docker-entrypoint.…"   1 second ago     Up 1 second     0.0.0.0:11111->80/tcp, :::11111->80/tcp   test2
0a07519f54de   nginx     "/docker-entrypoint.…"   19 seconds ago   Up 18 seconds   0.0.0.0:49154->80/tcp, :::49154->80/tcp   test1

[root@docker www]# curl http://192.168.122.10:11111
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

总结

进入容器没有systemctl命令怎么解决

docker run -itd  --name cenos_v1 --privileged=true centos:7 /sbin/init
docker exec -it cenos_v1 /bin/bash

Docker网络模式有哪些?分别提供哪些功能?

我这边了解到的有四种,Host container none bridge

  • Host :与宿主机共享网络名称空间/网络协议栈
  • Container:多个容器之间共享一个network namespaces
  • None :自闭空间
  • bridge:默认模式通过Veth对连接容器与docker0网桥,网桥分配给容器IP,同时**docker 0**作为“局域网”内容器的网关,最后和宿主机网卡进行通讯

如何把脚本传入一个已经运行的容器

#使用cp命令复制进去容器
docker cp start.sh cenos_v1:/opt

#使用cp命令从容器复制出来
docker cp cenos_v1:/opt/start.sh ./

docker中,假设运行一个业务容器,但是业务容器需要暴露三个端口,启动后发现自己少加了一个端口。如何动态添加端口(如何对已经运行的容器添加或者修改端口)

  1. 首先,我们可以修改/var/lib/docker/containers/containers_id中两个文件
  2. hostconfig.json 中的 portbinding:{}修改端口或添加端口
  3. 修改config.v2.json文件,修改对应的Ports{}来添加/修改端口
  4. 最后,重启守护进程

Docker容器之网络详解相关推荐

  1. Docker中的网络详解

    本节主要是介绍Docker默认的网络行为,包含创建的默认网络类型以及如何创建用户自定义网络,也会介绍如何在单一主机或者跨主机集群上创建网络的资源需求. 1.默认网络 当你安装了docker,她自动创建 ...

  2. Docker (容器) 的原理详解(--超详细--)

    第一次接触 docker 的人可能都会对它感到神奇,一行 docker run,就能创建出来一个类似虚拟机的隔离环境,里面的依赖都是 reproduceable 的!然而这里面并没有什么魔法,有人说 ...

  3. Docker容器数据卷详解

    文章目录 1. 数据卷介绍 2. 简单使用 3. MySQL容器建立数据卷同步数据 4. 常用命令 5. 具名挂载和匿名挂载 5.1 匿名挂载 5.2 具名挂载 6. Dockerfile中设置数据卷 ...

  4. Docker的基础知识详解(镜像,容器,网络)

    文章目录 Docker 一. Docker的概述 1. Docker为什么会出现 2. Docker能干什么 3. Docker的组成 4. Docker的运行流程 5. Docker的底层原理 二. ...

  5. Docker持续部署图文详解

    2019独角兽企业重金招聘Python工程师标准>>> Docker持续部署图文详解 博客分类: docker 架构 JAVA项目如何通过Docker实现持续部署(只需简单四步),即 ...

  6. grpc通信原理_容器原理架构详解(全)

    目录 1 容器原理架构 1.1 容器与虚拟化 1.2 容器应用架构 1.3 容器引擎架构 1.4 Namespace与Cgroups 1.5 容器镜像原理 2 K8S原理架构 2.1 K8S主要功能 ...

  7. Dockerfile详解、镜像发布、网络详解学习

    一.DockerFile 1.Docker介绍 Dockerfile是用来构建Docker镜像的文件是命令参数脚本.docker build命令用于从Dockerfile构建镜像.可以在docker ...

  8. 基于Kubernetes构建Docker集群管理详解

    from: 基于Kubernetes构建Docker集群管理详解 Kubernetes是Google开源的容器集群管理系统,基于Docker构建一个容器的调度服务,提供资源调度.均衡容灾.服务注册.动 ...

  9. Docker系列07—Dockerfile 详解

    Docker系列07-Dockerfile 详解 1.认识Dockerfile 1.1 镜像的生成途径 基于容器制作  dockerfile,docker build 基于容器制作镜像,已经在上篇Do ...

最新文章

  1. 2018-3-31 ELM极限学习机--笔记(黄广斌PPT,以及极限学习机原理介绍的部分,但是忘记网址了)
  2. 接口测试--version2
  3. linux shell 删除7天前的文件
  4. bootstarp js设置列隐藏_隐藏工作表的行、列(第一种简单,第二种很坑,第三种最坑)...
  5. Linxu用户登录监测
  6. iphone屏幕录制_如何将iPhone投屏到Mac上?iphone投屏到苹果电脑方法
  7. linux 标准输入句柄,标准文件描述符与标准文件句柄
  8. js打开本地文件夹_vue + ArcGIS 地图应用系列一:arcgis api本地部署(开发环境)
  9. oracle oic配置,Oracle数据库 client配置
  10. nsqlookupd:高性能消息中间件 NSQ 解析
  11. jenkins插件更换源_jenkins快速入门,自动构建一个hello world项目(devops,ci/cd)
  12. IMI 基于 Swoole 开发的协程 PHP 开发框架 常驻内存、协程异步非阻塞
  13. 图片格式转换器ico_Pixillion——图片格式转换工具
  14. 汽车传感器:车载雷达与摄像头
  15. 学习日记:scipy库的版本差异
  16. 读程士宏之《测度论与概率论基础》
  17. 编程之道 The Tao Of Programming
  18. 2022软件测试常见抓包工具
  19. gitlab 版本升级
  20. 元宇宙的第一步,应该在汽车里迈出去?

热门文章

  1. 人体存在感应雷达应用,你知道多少?
  2. 第七头驴的故事--成功的故事不见得还会再现
  3. #考试酷#A6_Relational Logical Operators
  4. 超短线炒股:勿以善小而不为,勿以恶小而为之
  5. Copilot使用教程:让AI助手提升你的编程效率
  6. hashcat使用方法
  7. Steam流的中间方法
  8. Surf: Speed up robust feature的回顾和思考
  9. 天气预报文字版微信_微信里的励志天气预报(每日天气预报加励志)
  10. 企业内刊、纸质杂志怎么转型?5分钟解决数字化难题