Docker系列---网络模式 | Dockerfile | 参数讲解 | 详细说明

article/2025/5/19 10:04:15

网络模式 | Dockerfile

  • Docker 原生网络
  • Docker 网络图解
  • Docker 四种网络模式
    • Host 模式
    • Container模式
    • None模式
    • Bridge模式
  • Docker 网络自定义
    • 查看网络列表
    • 自定义网络固定IP
    • 暴露端口
    • 在宿主机环境执行容器内命令
    • systemctl 命令
  • Docker 镜像分层
  • Dockerfile 操作指令
    • 例:docker部署nginx

Docker 原生网络

在这里插入图片描述

lo0:回环网卡、TCP/IP网卡是否生效

virbr0 自身继承了一个虚拟化功能(KVM 架构),原生架构的一个虚拟化平台,安装了一个虚拟化平台之后就会自动安装虚拟网卡

docker 0 : 容器的网关,绑定物理网卡,负责做NAT 地址转换、端口映射,本身也是一个容器

ens33: 实体物理网卡

Docker 网络图解

在这里插入图片描述

Docker 四种网络模式

Host 模式

host模式 : -net=host 容器和宿主机共享Network namespace

host容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的NetworkNamespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。

使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT, host最大的优势就是网络性能比较好,但是dockerhost上已经使用的端口就不能再用了,网络的隔离性不好。

Container模式

container模式:-nat=containner:name or ID 容器和另外一个容器共享network namespace

这个模式指定新创建的容器和已经存在的一个容器共享一个network namespace,而不是和宿主机共享,新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定地容器共享Ip、端口范围等,同样,两个容器除了网络方面,其他的如文件系统、选程列表还是隔高的. (两个容器的进程可以通过lo0网卡设备通信

None模式

none模式: -net=none 容器有独立的Network namespace ,但并没有对其进行任何网络设置,如分配veth -pair 和网桥连接,配置IP 等

这种网络模式下客器只有lo回环网口,役有其他的网卡, none模式可以在容器创建时通过-netwokr=none 参数指定
这种类型的网络无法联网,但是封闭的网络能很好的保证容器的安全性

4.Bridge模式是docker的默认网络模式,不写-net参数,就是bridge模式。使用docker run-p时, docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables t nat-vn查看。

Bridge模式

Bridge:此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker虚拟网桥,通过docker0网桥及iptables.的net表配置与宿主机通信

当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。

从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备, Docker将veth pair设备的一端放在新创建的容器中,并命名为etho (容器的网卡) ,另一端放在主机中,以vethoxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。

在这里插入图片描述

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

Docker 网络自定义

查看网络列表

docker network ls 

在这里插入图片描述

自定义网络固定IP

docker network create --subnet=192.168.0.0/16 mynetwork

在这里插入图片描述
在这里插入图片描述

docker run -itd --name test1 --net mynetwork --ip 192.168.0.100 centos:latest /bin/bash

在这里插入图片描述

暴露端口

docker run -itd -p 3333:80 nginx /bin/bash
docker run -itd -P nginx /bin/bash

在这里插入图片描述

在宿主机环境执行容器内命令

docker exec -it 621200b180ba /bin/bash -c 'nginx'

在这里插入图片描述

在这里插入图片描述

systemctl 命令

进入容器没有systemct1命令解决:添加--privileged=true (指定此容器是否为特权容器) ,使用此参数,则不能用attach示例:
docker run -itd --name centostest --privileged=true centos /sbin/init
/sbin/init 内核启动时主动呼叫的第一个进程

在这里插入图片描述

# 批量删除容器
docker ps -a | awk '{print "docker rm " $1}' | bash
#批量删除"exit"状态的容器for i in `docker ps -a | grep -i exit | awk '{print $1}'`; do docker rm -f $i;done

Docker 镜像分层

Dockerfile 由多条指令构成,随着深入研究 Dockerfile 与镜像的关系,很快大家就会发现,Dockerfile 中的每一条指令都会对应于 Docker 镜像中的一层。

继续以如下 Dockerfile 为例:FROM centos:centos7		#指定新镜像所基于的镜像,用于创建镜像
ADD run.sh /			#将脚本添加至该镜像中,启动容器后就可以使用了
VOLUME /data			#在容器中创建挂载点(-v)
CMD ["./run.sh"] 		#启动该脚本/命令

通过 docker build 以上 Dockerfile 的时候,会在 ubuntu:14.04 镜像基础上,添加三层独立的镜像,依次对应于三条不同的命令。镜像示意图如下:

可以看出,镜像在生成的过程中是以分层的方式生成的:1.Dockerfile 中的每个指令都会创建一个新的镜像层(是一个临时的容器,执行完后将不再存在,再往后进行重新的创建与操作)
镜像层将被缓存和复用(后续的镜像层将基于前面的一层)
2.当 Dockerfile 的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了(后续操作必然更改前面的镜像层),那么对应的镜像层缓存就会失效(就会自动销毁)
3.某一层的镜像缓存失效之后,它之后的镜像层缓存就都会失效(第一层不成功,那么第二层也就再成功,相当于地基)
4.容器的修改并不会影响镜像,如果在某一层中添加一个文件,如果在下一层中就会删除它,镜像中依然会包含该文件

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

bootfs: docker底层依赖的库、内核==》负责与内核交互
base image (底包) :基础镜像(例如centos,debian)
images (只读) :固化了一个标准运行环境
container:容器层(读写层)
Dockerfile是由一组指令组成的文件
Dockerfile结构四部分:
基础镜像
信息维护者信息
镜像操作指令
容器启动时执行指令
Dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用以"#"号开头的注释

Dockerfile 操作指令

指令含义
FROM镜像指定新镜像所基于的镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令
MAINTAINER名字FROM指令,每创建一个镜像就需要一条FROM指令
RUN命令说明新镜像的维护人信息
CMD[ “要运行的程序”, "参数1,"参数2 "]在所基于的镜像上执行命令,并提交到新的镜像中
EXPOSE端口号指令启动容器时要运行的命令或者脚本, Dockerfile只能有一条CMD命令,如果指定多条则只能最后一条被执行
ENV环境变量变量值指定新镜像加载到Docker时要开启的端口
ADD源文件/目录目标文件/目录设置一个环境变量的值,会被后面的RUN使用
COPY源文件/目录目标文件/目录将源文件复制到目标文件,源文件要与Dockerfile位于相同目录中,或者是一个URL
VOLUME [ “目录”]在容器中创建一个挂载点
USER用户名/UID指定运行容器时的用户
WORKDIR路径为后续的RUN, CMD, ENTRYPOINT指定工作目录
ONBUILD命令指定所生成的镜像作为一个基础镜像时所要运行的命令
HEALTHCHECK健康检查

例:docker部署nginx

在这里插入图片描述

#Dockerfile文件内容
FROM centos:7MAINTAINER darkRUN yum -y install pcre-devel openssl-devel zlib-devel gcc gcc-c++ make cmakeRUN useradd -M -s /sbin/nologin nginxADD nginx-1.12.2.tar.gz /usr/local/srcWORKDIR /usr/local/src/nginx-1.12.2
RUN ./configure --prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-file-aio \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-http_flv_module \
--with-http_ssl_moduleRUN make && make installRUN ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
RUN ln -s /usr/local/nginx/conf/nginx.conf /etc/RUN rm -rf /lib/systemd/system/nginx.serviceADD nginx.service /lib/systemd/system/nginx.service
RUN chown nginx.nginx /lib/systemd/system/nginx.serviceRUN chmod 754 /lib/systemd/system/nginx.serviceEXPOSE 80
EXPOSE 443RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.confCMD ["/usr/local/nginx/sbin/nginx"]
#nginx.service文件内容
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecrReload=/bin/kill -s HUP $MAINPID
ExecrStop=/bin/ki11 -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
docker images  
docker run -d  7519376f540f 
docker inspect     d886baed0ac4     
curl 172.17.0.4:80

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


http://chatgpt.dhexx.cn/article/dUyb3knJ.shtml

相关文章

七、Docker网络模式详解

目录 一、docker网络概述1、docker网络实现的原理2.容器的端口映射1).端口映射2).四种端口映射3).端口映射演示(1).随机端口映射(-P)(2).指定端口映射(-p 宿主机端口:容器端口)(3).指定网卡随机端口映射(-p ::&#xf…

使用navicat远程连接mysql时报2059错误解决方法

navicat连接mysql时报2059错误解决方法 报错原因解决方案1、管理员权限打开cmd2、修改加密规则及密码3、退出,重启mysql 报错原因 这个错误出现的原因是在mysql8之前的版本中加密规则为mysql_native_password,而在mysql8以后的加密规则为caching_sha2_pa…

navicat2012连接MySQL时提示2059错误

出现2059这个错误的原因是在mysql8之前的版本中加密规则为mysql_native_password,而在mysql8以后的加密规则为caching_sha2_password。通过网络查找发现我们可以将mysql用户登录的加密规则修改为mysql_native_password。 解决方法: 1.打开cmd&#xff0…

MySQL8:关于进入navicat连接MySQL出现2059界面

一.进入navicat连接MySQL出现2059页面: 原因:MySQL8之前版本中加密规则为mysql_native_password,MySQL8以后的加密规则为caching_sha2_password. 解决:将mysql用户登录加密规则修改为mysql_native_password即可. 二.解决方案: …

2059-Authentication plugin‘caching_sha2_password‘cannot be loaded

2059-Authentication plugin’caching_sha2_password’cannot be loaded 原因 由于目前已有的客户端连接软件还不支持Mysql8新增加的加密方式:caching_sha2_password 老的加密验证方式:mysql_native_password 解决方式 1、打开MySQL 8.0 Command Lin…

sqlyog连接mysql报错2058或者Navicat连接报错2059

下载了mysql8.0版本&#xff0c;结果连接的时候报了一些错误&#xff0c;这里进行总结 下载了mysql8.0版本&#xff0c;结果连接的时候报了一些错误&#xff0c;这里进行总结1、sqlyog连接mysql报错2058或者Navicat连接报错20592、sqlyog连接mysql报错 :连接失败 localhost<…

MySql 8.0.11 客户端连接失败:2059 - Authentication plugin 'caching_sha2_password' cannot be loaded: ....

近期,换了新笔记本,重新安装了MySql数据库和客户端工具Navicat Premium 12。我是从官网上下载的MySql数据库&#xff0c; 版本为8.0.11&#xff0c;链接&#xff1a;https://dev.mysql.com/downloads/mysql/ 当数据库和客户端安装成功后&#xff0c;我使用客户端连接接数据库时…

Django数据迁移:django.db.utils.OperationalError: (2059, <NULL>) ----2059错误解决方案

数据库迁移&#xff1a; 迁移是Django同步你对模型所做更改到你的数据库模式的方式 python manage.py makemigrations 将应用下的models.py文件生成一个中间文件&#xff0c;并保存在migrations文件夹中 python manage.py migrate 执行迁移程序实现迁移&#xff0c;将每个应用…

mysql8版本2059报错解决方法

mysql由原来一直使用的5.6切换到8版本&#xff0c;本地安装完成后&#xff0c;使用命令可以正常连接&#xff0c;但是使用navicat一直报2059的错误&#xff0c;如下图&#xff1a; 问题原因&#xff1a; 由于在MySql8之前的版本&#xff0c;默认的加密规则是mysql_native_pass…

navicat premium连接数据库出现2059错误

安装navicat之后新建连接出现了2059的错误 打开doc窗口wind输入cmd打开 输入 mysql -u root -p 输入root用户的密码 选择数据库 输入 use mysql 查看加密的规则 输入 select Host,User,plugin from mysql.user; 加密方式是新的加密方式 更改回原来的加密方式 输入 A…

mysql 连接数据库时error 2059 解决

mysql 连接数据库时error 2059 解决 原因解决方法管理员运行cmd修改加密方式 原因 mysql8新版本发布&#xff0c;安装后出现2059错误。原因是在mysql8之前的版本中加密规则为mysql_native_password&#xff0c;而在mysql8以后的加密规则为caching_sha2_password。 所以通过命令…

虚拟机连接数据库报错2059

一、进入Navicat连接MySQL出现下面的2059界面二、解决办法 1.windowsR输入cmd进入页面 2.输入mysql -u root -p 然后输入密码进入数据库 3.输入use mysql 出现Database changed 4.输入select user,host from user; 目的为了查看user的root 对应host是什么 我的对应为% 5.输…

关于Navicat连接MySQL出现2059问题解决方法

一、进入Navicat连接MySQL出现下面的2059界面 原因&#xff1a;mysql8之前版本中加密规则为mysql_native_password&#xff0c;mysql8以后的加密规则为caching_sha2_password&#xff0c;将mysql用户登录加密规则修改为mysql_native_password即可&#xff01; 二、解决方案 1.…

2059 - Authentication plugin ‘caching_sha2_password‘ cannot be loaded:报错的解决办法

目录 一、报错说明 二、原因 三、解决方法 一、报错说明 在windows本地安装mysql之后&#xff0c;用Navicat连接&#xff0c;然后报错&#xff1a; 2059 - Authentication plugin caching_sha2_password cannot be loaded 二、原因 由于目前已有的客户端连接软件还不支持…

【C++】2059:【例3.11】买笔(信息学奥赛)

好了&#xff0c;今天的内容就是买笔了&#xff0c;内容的详细意思也就是根据输入的表示星期几的数字&#xff0c;对应输出它的英文名称。&#xff08;博主正在冲200粉丝&#xff0c;喜欢的赶紧关注&#xff01;&#xff01;&#xff01;&#xff09; 【题目描述及其目的】 20…

Navicat 连接 MySql 报错2059时的解决方法

My报错2059时的操作方法 当你使用navicat连接MySQL 的时候&#xff0c;会出现报错2059.如下图所示&#xff1a; 按照如下操作&#xff1a; 1&#xff1a;在电脑中搜索 MySQL 8.0 Command Line Client - Unicode 并打开 2&#xff1a;输入密码连接到数据库 3&#xff1a;输入…

Navicat连接MySql8+出现2059错误解决办法

今天使用Navicat连接mysql的时候报了2059的错误&#xff0c;为了解决这个看似不难的问题&#xff0c;我也是试了不少方法&#xff0c;在这里给大家分享下我的经验。 首先出现2059这个错误的原因是因为在mysql8之前的版本中加密规则为mysql_native_password。但是在mysql8以后的…

2059 - authentication plugin...错误解决方法

2059 - authentication plugin...错误解决方法 Navicat 连接MySQL数据库出现错误&#xff1a;2059 - authentication plugin caching_sha2_password的解决方法。 错误原因&#xff1a;MySQL新版本&#xff08;8以上版本&#xff09;的用户登录账户加密方式是【caching_sha2_p…

navicat链接数据库显示2059错误【解决】

文章目录 问题重述解决方法 问题重述 navicat链接数据库弹窗提示错误 2059 错误信息&#xff1a; 2059 - Authentication plugin ‘caching. sha2 password’ cannot be loaded: #X.4gv頗 首先看了内容可以大概分析是因为密码编码的问题。 在Mysql5.x的时候使用的密码加密验证…

Navicat 连接MySQL数据库出现错误:2059

文章目录 前言问题原因解决办法1.进入mysql客户端2.查看mysql加密方式3.查看本地mysql用户的信息4.查看本地mysql用户的信息5.重新使用navicat连接mysql 总结 前言 使用Navicat连接mysql时出现错误&#xff1a; 问题原因 MySQL新版本&#xff08;8以上版本&#xff09;的用户…