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

一、简介

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)来实现容器产生的数据持久化和共享。

3、docker和虚拟机的区别?

-Docker容器虚拟机
技术原理共享操作系统内核,隔离用户空间模拟硬件和操作系统,隔离整个操作系统
资源占用较少的内存和存储空间较多的内存和存储空间
启动速度快速启动较慢的启动
硬件资源访问直接访问宿主机的硬件资源通过Hypervisor模拟硬件资源
运行环境特定的应用程序或服务可以运行不同的操作系统和应用程序
灵活性容易部署和迁移较难部署和迁移
安全性低一些较高一些

二、网络

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系统运维指南》

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Add-in Express for Microsoft Office and Delphi Crack

Add-in Express for Microsoft Office and Delphi Crack 适用于Microsoft Office和Delphi VCL的Add-in Express使您能够在几次点击中为Microsoft Office开发专业插件。它生成基于COM的项目&#xff0c;这些项目包含Microsoft Office外接程序或智能标记的所有必要功能&#xff0…

React实现关键字高亮

先看效果&#xff1a; 实现很简单通过以下这个函数&#xff1a; highLight (text, keyword ) > {return text.split(keyword).flatMap(str > [<span style{{ color: red, fontWeight: bold }}>{keyword}</span>, str]).slice(1);}展示某段文本时调用该函数…

Matlab进阶绘图第25期—三维密度散点图

三维密度散点图本质上是一种特征渲染的三维散点图&#xff0c;其颜色表示某一点所在区域的密度信息。 除了作图&#xff0c;三维密度散点图绘制的关键还在于密度的计算。 当然&#xff0c;不管是作图还是密度的计算&#xff0c;这些在《Matlab论文插图绘制模板》和《Matlab点…

k8s资源管理方法详解(陈述式、声明式)

目录 一&#xff1a;陈述式资源管理方法 二&#xff1a; 基本信息查看 1、查看信息 2、创建 3、删除 4、service 的 type 类型 三&#xff1a;项目实例 1、创建 kubectl create命令 2、发布 kubectl expose命令 3、在 node 节点上操作&#xff0c;查看负载均衡端…

Celery嵌入工程的使用

文章目录 1.config 1.1 通过app.conf进行配置1.2 通过app.conf.update进行配置1.3 通过配置文件进行配置1.4 通过配置类的方式进行配置2.任务相关 2.1 任务基类(base)2.2 任务名称(name)2.3 任务请求(request)2.4 任务重试(retry) 2.4.1 指定最大重试次数2.4.2 设置重试间隔时间…

Mac终端利器:Homebrew + iTerm2 + Oh My Zsh 教程

引言 前段时间调整了一下 iTerm2 的环境&#xff0c;感觉比以前好看多了&#xff0c;并且更加高效&#xff0c;这里做一个记录&#xff0c;希望能给大家一些启发。 工具介绍 brew&#xff1a;Mac OS 下强大的包管理工具。iTerm2&#xff1a;iTerm2是 Mac OS 终端的替代品&am…

Detecting Everything in the Open World: Towards Universal Object Detection

1. 论文简介 论文题目《Detecting Everything in the Open World: Towards Universal Object Detection》发表情况&#xff0c;CVPR2023[论文地址][https://arxiv.org/pdf/2303.11749.pdf][代码地址][https://github.com/zhenyuw16/UniDetector] 2.背景与摘要 本文旨在解决通…

Crowd-Robot Interaction 论文阅读

论文信息 题目&#xff1a;Crowd-Robot Interaction:Crowd-aware Robot Navigation with Attention-based Deep Reinforcement Learning 作者&#xff1a;Changan Chen, Y uejiang Liu 代码地址&#xff1a;https://github.com/vita-epfl/CrowdNav 来源&#xff1a;arXiv 时间…

Spring集成Seata

Seata的集成方式有&#xff1a; 1. Seata-All 2. Seata-Spring-Boot-Starter 3. Spring-Cloud-Starter-Seata 本案例使用Seata-All演示&#xff1a; 第一步&#xff1a;下载Seata 第二步&#xff1a;为了更好看到效果&#xff0c;我们将Seata的数据存储改为db 将seata\sc…

【IMX6ULL驱动开发学习】04.应用程序和驱动程序数据传输和交互的4种方式:非阻塞、阻塞、POLL、异步通知

一、数据传输 1.1 APP和驱动 APP和驱动之间的数据访问是不能通过直接访问对方的内存地址来操作的&#xff0c;这里涉及Linux系统中的MMU&#xff08;内存管理单元&#xff09;。在驱动程序中通过这两个函数来获得APP和传给APP数据&#xff1a; copy_to_usercopy_from_user …

电脑自动关机是什么原因?1分钟弄懂!

“好奇怪啊&#xff0c;我在使用电脑时&#xff0c;电脑总是莫名其妙就会自动关机&#xff0c;有时候我文件都来不及保存。这是为什么呢&#xff1f;有什么解决方法吗&#xff1f;” 电脑自动关机是一个令人头疼的问题&#xff0c;可能会对我们的工作和生活带来影响。电脑自动关…

数组相关练习

数组练习 将数组转化成字符串数组拷贝求数组元素的平均值查找数组中指定元素(顺序查找)二分查找冒泡排序数组逆序 将数组转化成字符串 import java.util.Arrays;public class Text1 {public static void main(String[] args) {int[] arr {5, 6, 4, 2};System.out.println(Arr…

电商数据获取:网络爬虫还是付费数据接口?

随着电商行业的迅速发展&#xff0c;对电商数据的需求也越来越大。在获取电商数据时&#xff0c;常常面临一个选择&#xff1a;是自己编写网络爬虫进行数据爬取&#xff0c;还是使用现有的付费数据接口呢&#xff1f;本文将从成本、可靠性、数据质量等多个角度进行分析&#xf…

【果树农药喷洒机器人】Part1:研究现状分析以及技术路线介绍

本专栏介绍&#xff1a;付费专栏&#xff0c;持续更新机器人实战项目&#xff0c;欢迎各位订阅关注。 关注我&#xff0c;带你了解更多关于机器人、嵌入式、人工智能等方面的优质文章&#xff01; 文章目录 一、项目背景二、国内外研究现状2.1 国内研究现状2.2 国外研究现状 三…

C语言内嵌汇编

反编译&#xff08;二进制文件或者so库&#xff09; objdump --help objdump -M intel -j .text -ld -C -S out > out.txt #显示源代码同时显示行号, 代码段反汇编-M intel 英特尔语法-M x86-64-C:将C符号名逆向解析-S 反汇编的同时&#xff0c;将反汇编代码和源代码交替显…

Python自动化测试用例:如何优雅的完成Json格式数据断言

目录 前言 直接使用 优化 封装 小结 进阶 总结 资料获取方法 前言 记录Json断言在工作中的应用进阶。 直接使用 很早以前写过一篇博客&#xff0c;记录当时获取一个多级json中指定key的数据&#xff1a; #! /usr/bin/python # coding:utf-8 """ aut…

3分钟创建新生分班查询二维码,无需技术、0成本

作为教师&#xff0c;我们深知分班是一项极其重要的任务&#xff0c;需要综合考虑学生的性格、能力和兴趣等多个方面&#xff0c;以确保每个学生都能够获得最佳的学习环境和成绩。在本文中&#xff0c;我将分享一种便捷的方式来告知家长有关分班录取情况的方法。 通常&#xf…

2. 软件需求 面向对象分析

目录 1. 软件需求 1.1 需求分类 1.2 需求获取 1.3 需求分析 2. 面向对象分析&#xff08;OOA&#xff09; 2.1 统一建模语言 UML 2.2 用例模型 2.2.1 用例图的元素 2.2.2 识别参与者 2.2.3 合并需求获得用例 2.2.4 细化用例描述 2.3 分析模型 2.3.1 定义概念类 …

深入JVM - JIT分层编译技术与日志详解

深入JVM - JIT分层编译技术与日志详解 文章目录 深入JVM - JIT分层编译技术与日志详解1. 背景简介2. JIT 编译器2.1. 客户端版本的编译器: C12.2. 服务端版本的编译器: C22.3. Graal JIT 编译器 3. 分层编译技术(Tiered Compilation)3.1. 汇聚两种编译器的优点3.2. 精准优化(Ac…

Redis内网主从节点搭建

Redis内网主从节点搭建 1、文件上传2、服务安装3、服务启动4、配置主从复制 1、文件上传 内网环境手动上传gcc-c、redis.tar文件 2、服务安装 # 解压 unzip gcc-c.zip unzip gcc_rpm.zip tar -zxvf redis-6.2.13.tar.gz# 安装 cd gcc_rpm/ rpm -ivh *.rpm --nodeps --force…