《Linux运维实战:Docker基础总结》

news2024/12/24 8:01:22

一、简介

1、docker的基本结构是什么,包含哪些组件?

docker的基本机构是c/s模式,即客户端/服务端模式。 由docker客户端和docker守护进程组成。docker客户端通过命令行或其它工具使用docker sdk与docker守护进程通信,发送容器管理请求。docker守护进程接收并处理请求,调用docker引擎执行容器的创建、运行、停止等操作。docker守护进程接收并处理请求,调用docker引擎执行容器的创建、运行、停止等操作。docker引擎还负责与docker仓库交互、搜索、上传镜像。docker仓库是一个存储镜像的服务,可以是公有的或私有的。

在这里插入图片描述

2、docker为什么需要存储以及是如何工作的?

docker需要存储是因为容器本身是无状态的,也就是说,容器中的数据在容器停止或删除时会丢失,对于一些需要持久化或共享数据的应用来说是不可接收的。例如数据库、配置文件、日志等等。因此容器提供了存储驱动( overlay2、fuse-overlayfs、btrfs、zfs、vfs、devicemapper)和挂载方式( volumes、bind mounts、tmpfs mounts)来实现容器产生的数据持久化和共享。


二、网络

2.1、网络模式

1、host模式

简单的说,就是使用宿主机的网络配置。

2、bridge模式

bridge是docker中默认的网络模式,此模式会为每一个容器分配Network Namespace、设置ip等,并将主机上的容器连接到一个虚拟网桥上。

3、container模式

指定新创建的容器与一个已经存在的容器共享一个Network Namespace,而不是与宿主机共享。

4、none模式

在这个模式下,docker容器拥有自己的Network Namespace,但是并不会为docker容器进行任何网络配置,也就是说,这个docker容器没有网卡、ip、路由等信息,需要手动为docker容器添加网卡、配置ip等。


2.2、网络原理

Docker网络原理,主要包括: 容器之间通信和容器访问外网

1、容器之间通信
在这里插入图片描述

Docker服务启动后,会生成一个docker0网桥,每起一个容器,docker0网桥会为容器一个可用的ip地址。网桥docker0采用桥接模式,并使用veth-pair技术 (veth-pair就是一对虚拟网络设备接口,成对出现,一端连接着协议,一端彼此相连,正因为这个特性,veth-pair充当一个桥梁,连接各种虚拟网络设备)。这样就使得容器和容器之间是可以相互ping通的。

2、容器访问外网
在这里插入图片描述

docker0是虚拟出来的网桥,因此是无法被外部网络访问,所以需要在运行容器时通过-p参数将容器的端口映射到宿主机的端口上。 实际上docker采用NAT的方式,将容器的内部服务端口与宿主机上的某一个端口进行绑定,使得宿主机外部可以将网络报文发送到容器

这里的关键是NAT,查看宿主机上的iptables规则

iptables -t nat -S

如下图所示:
在这里插入图片描述
在NAT表中,有这么一条规则:-A POSTROUTING -s 172.17.0.0/24 ! -o docker0 -j MASQUERAD,其含义就是: 如果docker0网桥收到来自172.17.0.0/24网段外出包,把它交给MASQUERAD处理,而MASQUERAD的处理方式就是将包的源地址替换成宿主机上的ip地址发送出去,做为一次源地址转换(SNAT)


2.3、容器互联

1、同主机不同网段之间的容器互联
在这里插入图片描述

正常情况下,两个不同网段之间的容器是不能相互ping通的,如上图所示,网段为172.17的容器与网段为172.29网段的容器不能互相ping通。

# 使用以下命令连通不在同一个网段下的Docker容器,将容器加入到需要互通的网络中
docker network connect 网络名称 容器名称

使用如下图中所示的命令,就可以
在这里插入图片描述


2、跨主机之间的容器互联

在这里插入图片描述

在 Docker 中,每个容器都有自己的网络命名空间,这意味着每个容器都拥有自己的IP地址和网络接口。默认情况下,Docker使用桥接网络模式,将容器连接到一个共享网桥。这种方式适用于在单个主机上运行多个容器的情况。然而,在分布式环境中,可能需要将容器连接到不同的主机上,并进行跨主机通信。 为实现跨主机通信,Docker 提供了多种网络连接方式,包括 Overlay 网络、MacVLAN 网络和第三方网络插件。这些网络连接方式可以扩展 Docker 的网络功能,使容器能够在跨主机环境中相互通信

1、 docker提供了overlay网络驱动,它可以在不同的docker主机之间创建虚拟网络,使得容器可以通过ip和端口进行通信。使用overlay网络,可以将多个docker主机上的容器连接到一个虚拟网络中,并且它们可以像在同一个主机上一样进行通信。使用overlay网络可以在不同主机上创建跨主机的容器连接,便于构建分布式引用或跨多个主机进行负载均衡。要使用overlay网络,需要在每个docker主机上启用swarm模式,并创建一个swarm集群,然后创建一个overlay网络,并将容器加入到该网络中。

2、通过 直接路由的方式的方式实现跨主机的docker容器通信。

3、除了Docker内置的Overlay网络和 MacVLAN 网络,还有许多第三方网络插件可用于实现跨主机通信。这些插件提供了更丰富的网络功能和配置选项。 常见的第三方网络插件包括Calico、Weave、Flannel 、openvswitch等。安装和配置这些网络插件可以参考它们的官方文档。


三、存储

3.1、存储驱动

docker容器使用存储驱动程序来管理容器文件系统和镜像。Docker提供了6种不同的存储驱动程序:overlay2、fuse-overlayfs、btrfs、vfs、vfs、devicemapper。

1、overlay2

overlay2驱动是所有当前指的Linux发行版的首选存储驱动程序,不需要额外的配置。

2、fuse-overlayfs

fuse-overlayfs驱动仅使用于在不支持rootless overlay2的主机上运行rootles docker。在Ubuntu和Debian 10上,是支持rootless overlay2的,因此不需要使用fuse-overlayfs驱动。在这些系统中,overlay2可以直接在rootlesss模式下使用。

3、btrfs and zfs

btrfs and vfs存储驱动程序允许高级选项,例如创建快照,但需要更多的维护和设置。

4、vfs

vfs存储驱动程序用于测试目的,以及不能使用写时复制文件系统的情况,此存储驱动程序性能比较差,通常不建议用于生产环境。

5、devicemapper

devicemapper驱动使用Linux内核体统的设备映射功能,它可以创建逻辑卷来作为容器的文件系统。devicemapper驱动可以提供较高的性能和较强的数据隔离性。

您的操作系统和内核可能不支持每个驱动程序,例如aufs仅在ubuntu和debian上受支持,并且可能需要安装额外的软件包。而btrfs仅在您的操作系统使用btrfs作为存储才受到支持。

Linux发行版推荐存储驱动程序可选择存储驱动程序
Ubuntuoverlay2devicemapper、zfs、vfs
Debianoverlay2devicemapper、vfs
Centosoverlay2devicemapper、zfs、vfs
Fedoraoverlay2devicemapper、zfs、vfs
SLES 15overlay2devicemapper、vfs
RHELoverlay2devicemapper、vfs

总结:

1、devicemapper存储驱动程序已弃用,并将在以后的版本中删除,建议devicemapper存储驱动用户迁移到overlay2。
2、vfs存储驱动仅适用于测试目的,生产环境不建议使用。
3、根据您的发行版本,你可能有其它存储驱动程序,例如btrfs,对于这个特定用例可能具有优势,但需要额外的设置和人工维护,因此不推荐用于常见场景。

对于docker来说,后备文件系统是/var/lib/docker所在的文件系统,一些存储驱动程序只用于特定的后备文件系统

Storege driverSupported backing filesystems
Overlay2xfs with ftype=1,ext4
fuse-overlayfsany filesystem
devicemapperdirect-lvm
btrfsbtrfs
zfszfs
vfsany filesystem

3.2、挂载方式

docker提供了三种方式将数据从宿主机挂载到docker容器中,分别为:volumes、bind mounts、tmpfs

1、volumes是在宿主机文件系统的一个路径,默认情况下统一的父路径是 /var/lib/docker/volumes/,非Docker进程不能修改这个路径下面的文件,所以说volumes是容器数据持久存储数据最安全的一种方式。


2、bind mounts可以将文件存储在宿主机文件系统的任何路径


3、tmpfs 只存储在宿主机的内存中,不会写入到宿主机文件系统中,不会持久化存储。



四、Dockerfile

这里使用二进制mongodb文件来实现如何构建镜像及创建容器?这里已经提前下载好了mongodb二进制文件。

[root@localhost dockerfile]# ll
total 204564
-rw-r--r--. 1 root root      1123 Aug  7 09:49 Dockerfile
-rw-r--r--. 1 root root       147 Jul 27  2021 mongodb.conf
drwxr-xr-x. 3 root root        91 Jul 27  2021 mongodb-linux-x86_64-rhel70-3.2.22

1、mongodb.conf文件内容如下所示:

vim mongodb.conf
dbpath = /data/usr/mongodb/data
logpath = /data/usr/mongodb/logs/mongodb.log
port = 27017
fork = false
bind_ip=0.0.0.0
auth = true
maxConns=20000

2、Dockerfile文件内容如下所示:

vim Dockerfile
FROM centos:7.6.1810
MAINTAINER dongchengjueshen@lvm.com
RUN yum install nc -y && \
    yum install vim -y && \
    yum install net-tools -y && \
    yum install curl -y 
RUN mkdir -p /data/usr
ADD mongodb-linux-x86_64-rhel70-3.2.22 /data/usr/mongodb
RUN mkdir /data/usr/mongodb/{data,logs}
ENV PATH /data/usr/mongodb/bin:$PATH
EXPOSE 27017
WORKDIR /data/usr/mongodb/bin/
COPY mongodb.conf .
CMD /data/usr/mongodb/bin/mongod -f mongodb.conf

3、使用docker build构建镜像

docker build -t mongodb:3.2.22 .

4、docker-compose文件如下所示:

version: '2'
services:
  mongodb:
    image: mongodb:3.2.22
    hostname: mongo-single
    container_name: mongo-single
    ports:
      - 0.0.0.0:17000:27017
    healthcheck:
      test: ["CMD","nc","-z","localhost","27017"]
      interval: 30s
      timeout: 10s
      retries: 3
    volumes:
      - "/data/basic-data/mongo-single/data/backup:/data/backup"
      - "/data/basic-data/mongo-single/data/restore:/data/restore"
      - "/data/basic-data/mongo-single/data/config:/data/config"
      - "/data/basic-data/mongo-single/data/db:/data/usr/mongodb/data"
      - "/data/basic-data/mongo-single/data/logs:/data/usr/mongodb/logs"
    tty: true
    restart: always
    networks:
      - default_bridge    
networks:
  default_bridge:
    external: true 

如下图所示::
在这里插入图片描述


五、常用命令

1、仓库相关

docker search $KEY_WORD              # 查找镜像
docker pull $REGISTRY:$TAG           # 获取镜像
docker push $IMAGE_NAME:$IMAGE_TAG   # 推送镜像到仓库,需要先登录
docker login $REGISTRY_URL           # 登录仓库
docker logout $REGISTRY_URL          # 退出仓库
docker info                          # 显示Docker详细的系统信息,可查看仓库地址
docker --help                        # 显示Docker的帮助信息

2、容器相关

docker attach $CONTAINER_ID  # 启动一个已存在的docker容器
docker stop $CONTAINER_ID    # 停止docker容器
docker start $CONTAINER_ID   # 启动docker容器
docker restart $CONTAINER_ID # 重启docker容器
docker kill $CONTAINER_ID    # 强制关闭docker容器
docker pause $CONTAINER_ID   # 暂停容器
docker unpause $CONTAINER_ID # 恢复暂停的容器
docker rename $CONTAINER_ID  # 重新命名docker容器
docker rm $CONTAINER_ID      # 删除容器
docker logs $CONTAINER_ID    # 查看docker容器运行日志,确保正常运行
docker inspect $CONTAINER_ID # 查看container的容器属性,比如ip等等
docker port $CONTAINER_ID    # 查看container的端口映射
docker top $CONTAINER_ID     # 查看容器中正在运行的进程
docker commit $CONTAINER_ID $NEW_IMAGE_NAME:$NEW_IMAGE_TAG # 将容器保存为镜像
docker ps -a                 # 查看所有容器
docker stats                 # 查看容器的资源使用情况

3、镜像相关

docker images                      # 查看本地镜像
docker rmi $IMAGE_ID               # 删除本地镜像
docker inspect $IMAGE_ID           # 查看镜像详情
docker save $IMAGE_ID > 文件路径   # 保存镜像为离线文件
docker save -o 文件路径 $IMAGE_ID  # 保存镜像为离线文件
docker load < 文件路径             # 加载文件为docker镜像
docker load -i 文件路径            # 加载文件为docker镜像
docker tag $IMAGE_ID $NEW_IMAGE_NAME:$NEW_IMAGE_TAG  # 修改镜像TAG
docker run 参数 $IMAGE_ID $CMD     # 运行一个镜像
docker history $IMAGE_ID           # 显示镜像每层的变更内容

六、防火墙

《Linux运维总结:基于Centos系统使用iptables为docker容器配置防火墙策略》
《Linux运维总结:基于Centos系统使用firewalld为docker容器配置防火墙策略》


总结:整理不易,如果对你有帮助,可否点赞关注一下?

更多详细内容请参考:《Linux运维篇:Linux系统运维指南》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/850718.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SaaS系统相比传统软件,为何数据更安全?

随着云计算、5G等技术的不断进步&#xff0c;SaaS行业步入了快速发展的阶段&#xff0c;应用场景也日趋多元化。预计2023年底&#xff0c;中国SaaS行业市场规模将达到555.1亿元。 中研网对于SaaS发展态势预测这样评价&#xff1a; 当前&#xff0c;我国在多个维度上具备发展 S…

Mysql主从搭建 基于DOCKER

创建目录 #主节点目录 mkdir -p /home/data/master/mysql/#从节点目录 mkdir -p /home/data/slave/mysql/创建配置文件 # 主节点配置 touch /home/data/master/mysql/my.cnf# 从节点配置 touch /home/data/slave/mysql/my.cnf编辑配置文件 主节点配置文件 vim /home/data/m…

【ChatGPT】自我救赎

ChatGPT辅助学习C之【在C中如果大数据类型转小数据类型会发生什么呢?】&#xff0c;今天问ChatGPT一个问题&#xff0c;让它解析下面这个C程序&#xff1a; #include <iostream> #include <cstdio> using namespace std; int main() {int a;long long b532165478…

haproxy基本编译环境部署

前提&#xff1a;haproxy支持基于lua实现功能扩展&#xff08;需要安装比较新的lua语言&#xff0c;方便进行haproxy编译&#xff09;。 wget http://www.lua.org/ftp/lua-5.3.5.tar.gz lua -v # 检查环境 yum list lua # 查看可以安装环境 同时还需要gcc&#xff0c;gcc-c&…

rocketMq消息队列详细使用与实践整合spring

文章目录 一、RocketMQ原生API使用1、测试环境搭建2、RocketMQ的编程模型3、RocketMQ的消息样例3.1 基本样例3.2 顺序消息3.3 广播消息3.4 延迟消息3.5 批量消息3.6 过滤消息3.7 事务消息3.8 ACL权限控制 二、SpringBoot整合RocketMQ1、快速实战2、其他更多消息类型&#xff1a…

CSS实现图像填充文字

效果如下 具体代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>CSS图像填充文字</title><style>.text {background-image: url(./imgs/1.webp);/* 一定要让背景透明&#xff0c;这样后面的背…

Linux使用mount挂载

authordaisy.skye的博客_CSDN博客-嵌入式,Qt,Linux领域博主 格式化分区 sudo mkfs -t ext4 /dev/mmcblk0p1 格式化分区 实际使用中推荐这个&#xff0c;它是 mkfs 命令的个变种&#xff0c;可以自动识别文件系统类型为 ext4&#xff0c;并使用 ext4 文件系统的默认参数来创建…

【源码篇】ArrayList源码解析

文章目录 ArrayList源码解析1、ArrayList简介2、ArrayList继承关系2.1 Seralizable接口2.2 Cloneable接口2.3 RandomAccess接口 3、源码解析3.1 构造方法源码解析3.1.1 无参构造源码解析3.1.2 有参构造源码解析 3.2 add方法源码解析3.2.1 add(E e)方法源码解析3.2.2 add(int in…

Azure通过自动化账户实现对资源变更

Azure通过自动化账户实现对资源变更 创建一个自动化账户第一种方式 添加凭据&#xff08;有更改资源权限的账户&#xff0c;没有auth认证情况&#xff09;创建一个Runbook&#xff0c;测试修改 AnalysisServices 定价层设置定时任务&#xff1a;开始定时任务&#xff1a; 第二种…

Redis基础 (三十八)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、概述 1.1 NoSQL 1.2 Redis 二、安装 2.1 安装方式 &#xff1a; 三、目录结构 3.1 rpm -ql redis 3.2 /etc/redis.conf 主配置文件 3.3 /var/lib/redis …

【MATLAB第68期】基于MATLAB的LSTM长短期记忆网络多变量时间序列数据多步预测含预测未来(非单步预测)

【MATLAB第68期】基于MATLAB的LSTM长短期记忆网络多变量时间序列数据多步预测含预测未来&#xff08;非单步预测&#xff09; 输入前25个时间&#xff0c;输出后5个时间 一、数据转换 1、原始数据 5列时间序列数据&#xff0c;70行样本 705 数据矩阵结构 2、数据转换 将…

MySQL的查询方法

单表查询 素材&#xff1a; 表名&#xff1a;worker-- 表中字段均为中文&#xff0c;比如 部门号 工资 职工号 参加工作 要求&#xff1a; 1、显示所有职工的基本信息。 2、查询所有职工所属部门的部门号&#xff0c;不显示重复的部门号。 3、求出所有职工的人数。 4、…

Unity之ShaderGraph 节点介绍 数学节点

数学 高级Absolute&#xff08;绝对值&#xff09;Exponential&#xff08;幂&#xff09;Length&#xff08;长度&#xff09;Log&#xff08;对数&#xff09;Modulo&#xff08;余数&#xff09;Negate&#xff08;相反数&#xff09;Normalize&#xff08;标准化矢量&…

11_Pulsar Adaptors适配器、kafka适配器、Spark适配器

2.3. Pulsar Adaptors适配器 2.3.1.kafka适配器 2.3.2.Spark适配器 2.3. Pulsar Adaptors适配器 2.3.1.kafka适配器 Pulsar 为使用 Apache Kafka Java 客户端 API 编写的应用程序提供了一个简单的解决方案。 在生产者中, 如果想不改变原有kafka的代码架构, 就切换到Pulsar的…

C#之控制台版本得贪吃蛇

贪吃蛇小时候大家都玩过&#xff0c;具体步骤如下: 1.给游戏制造一个有限得空间。 2.生成墙壁&#xff0c;小蛇碰撞到墙壁或者咬到自己的尾巴&#xff0c;游戏结束。 3.生成随机的食物。 4.吃掉食物&#xff0c;增加自身的体长&#xff0c;并生成新的食物。 具体代码如下&…

一文解决JWT相同签名不匹配问题【JWT signature does not match locally computed signature.】

今天做项目的时候&#xff0c;涉及到一个支付记账的功能&#xff0c;想着不能将这些金额数据显示暴露的通过常规的请求体封装来进行传输&#xff0c;想着要是被中途抓包修改了不就麻烦了&#xff0c;所以考虑到这种安全性的需求&#xff0c;就利用上了JWT来进行数据的封装传递&…

IO学习-消息队列

1&#xff0c;要求用消息队列实现AB进程间的对话 a,A进程先发送一句话给B进程&#xff0c;B进程接收后打印。 b,B进程回复一句话给A进程&#xff0c;A进程接收后打印。 c,重复a,b步骤&#xff0c;当收到quit后要结束进程。 A进程 B进程 运行结果&#xff1a; 2&#xff0c;…

力扣 494. 目标和

题目来源&#xff1a;https://leetcode.cn/problems/target-sum/description/ C题解&#xff08;来源代码随想录&#xff09;&#xff1a;将该问题转为01背包问题。 假设加法的总和为x&#xff0c;那么减法对应的总和就是sum - x。所以我们要求的是 x - (sum - x) target。x …

学会RabbitMQ的延迟队列,提高消息处理效率

系列文章目录 手把手教你&#xff0c;本地RabbitMQ服务搭建&#xff08;windows&#xff09; 消息队列选型——为什么选择RabbitMQ RabbitMQ灵活运用&#xff0c;怎么理解五种消息模型 RabbitMQ 能保证消息可靠性吗 推或拉&#xff1f; RabbitMQ 消费模式该如何选择 死信是什么…

[CVPR-23-Highlight] Magic3D: High-Resolution Text-to-3D Content Creation

目录 Abstract Background: DreamFusion High-Resolution 3D Generation Coarse-to-fine Diffusion Priors Scene Models Coarse-to-fine Optimization NeRF optimization Mesh optimization Experiments Controllable 3D Generation Personalized text-to-3D Prom…