参考视频地址:40分钟的Docker实战攻略,一期视频精通Docker。感谢作者的辛苦付出。
本文是Docker学习相关视频笔记(一)与Docker学习相关视频笔记(二)的后续

4、Docker命令

4.8 Docker 网络

4.8.1 桥接模式

docker网络默认是bridge,也就是桥接模式,所有的容器默认都连接到这个网络,每个容器都分配了一个内部IP地址,一般是172.17开头的,在这个内部子网里面,容器可以通过内部IP地址互相访问,但容器网络与宿主机的网络是隔离的,
在这里插入图片描述
我们可以使用docker network create创建出子网,默认情况下创建出来的子网,也是属于桥接模式的一种,然后可以指定容器加入不同的子网,同一个子网的容器可以互相通信,而跨子网则不可以通信。
在这里插入图片描述

创建子网,还有一个好处是,同一个子网的容器,可以使用容器的名字互相访问,而不必使用内部IP地址。
在这里插入图片描述
我们来试一下,首先第一个命令创建一个叫做network1的子网,第二个命令创建并且运行一个MONGODB的容器,我们看到这里使用–network指定它加入子网一,启动MONGODB的时候,没有使用-p参数进行端口映射,也就是使用宿主机是没法访问到这个MONGODB的,我们先把它启动起来,
在这里插入图片描述
接下来启动一个叫做mongo express的容器,这个容器就是MONGODB的网页客户端,同样的把它加入到子网一里面,因为跟MONGODB属于同一个子网,所以它们之间是可以互相访问的,mongo express上面做了端口映射,我们注意到这里传了一个环境变量,这里没有传数据库容器在子网的IP地址,而是直接把名字告诉了他。
在这里插入图片描述
在浏览器输入服务器的IP地址,端口8081,
在这里插入图片描述
第一次访问的时候要登录一下,
在这里插入图片描述
这样成功登录进来,
在这里插入图片描述
我们可以创建数据库,数据库里面可以做查询,可以做新增等等等等的功能。
我们来看一下网络的拓扑结构,两个容器分配在同一个子网里面,它们可以互相通信,这里注意到我启动第二个容器mongo express的时候,没有告诉第二个容器,关于第一个容器在子网里面的IP地址,而是仅仅告诉了他第一个容器的名字,借助于docker内部的DNS机制,通过名字就可以在子网内进行互相的访问。
在这里插入图片描述
在这里插入图片描述
我们来看一下它的效果,这里我进入到第二个容器mongo express里面,然后在容器里面执行这个命令,ping后面接的是第一个容器的名字,我们看到这里打印出来了第一个容器的IP地址,换句话说,docker子网内部有一个DNS机制,可以把名字转换成IP地址。
在这里插入图片描述
接下来我又做了一个端口映射,让浏览器可以访问到mongo express,然后mongo express又可以通过内部子网访问到MONGODB,这样达成最终的效果,这样我们就看到了默认的桥接模式,还有创建子网的桥接模式。
在这里插入图片描述

4.8.2 host模式

接下来我们看另外一种网络模式,另外一种常见的网络是host模式,docker容器直接共享宿主机的网络,容器直接使用宿主机的IP地址,而且无需-p参数进行端口映射,容器内的服务直接运行在宿主机的端口上,通过宿主机的IP和端口就能访问到容器,host模式可以解决一些非常棘手的网络问题。
在这里插入图片描述
我们来使用host模式启动一个nginx,这里在启动参数加上–network,后面host,我们没有进行端口映射
在这里插入图片描述
在浏览器直接访问服务器的IP地址,加端口80就可以访问到Nginx,
在这里插入图片描述
我们进入容器内看一下它的IP地址,在容器内部查看IP地址,
在这里插入图片描述
我们需要装一些工具,首先apt update,然后装这个工具,apt install ip router2,然后就可以查IP地址了,ip addr show,
在这里插入图片描述
我们看到容器内显示的IP地址,主要是这个内网IP地址,跟我在云服务器的控制面板上看的内网IP地址,是一模一样的。从这个例子可以看出,docker容器使用host模式,它直接共享了宿主机的网络空间。

4.8.2 host模式

最后一种docker网络是None模式,也就是不联网,
在这里插入图片描述
docker network list展示出所有docker网络,首先有默认的桥接模式,host模式,还有None模式,最后一个是我们刚才创建的子网,当然这个子网也是属于桥接网络的一种,这三种默认网络是不能删除的,我们可以使用命令docker network remove命令,删除自定义的子网,比如把它删除掉,再使用list命令就看不到刚才的子网了。
在这里插入图片描述

4.9 Docker compose

有些时候,一个完整的应用可能是很多部分组成的,比如前端后端数据库等等,这时候怎么用docker把它们容器化呢,我们可以很自然的想到,把这些模块都打包在一起,做成一个巨大的容器。但这样只要有一个模块发生了故障,比如后端出现了内存泄漏,整个容器都有可能崩溃,并且可伸缩性差。如果想给系统扩容,只能把整个大容器再复制一份,而做不到针对某和模块的精准性扩容,多应用的最佳实践是,把每一个模块都打包成一个独立的容器,不过这样使用多容器增加了很多的使用成本,因为我们想创建多个容器,就得多次执行docker run,还得把它们之间的网络配置好,尝试管理这些容器的时候,很多地方都会出错,这时候一个容器编排技术就很有用,也就是docker compose。
docker compose使用YML文件管理多个容器,里面列出了容器之间是如何创建,以及如何协同工作的,我们可以简单的把docker compose文件理解成,一个或者多个的docker run命令,按照特定的格式列到了一个文件里面。
在这里插入图片描述
这是刚才视频里面展示的,使用docker命令创建MONGOD,比喻mongo express的例子,我们先创建一个子网,然后创建mongo dB和mongo express两个容器,并且把它们加入子网,右侧展示出的是对应的docker compose文件的写法,左右两边有非常工整的对应关系。
右侧最顶级的是services元素,每个服务也就是一个service都对应一个容器,左侧的杠杠内幕,也就是容器名在右侧就变成了service名,左侧的镜像名在右侧写在了image后面,也表示镜像名,接下来左边的杠E参数对应右边的environment,都是环境变量的意思,左侧的杠V对应右侧的volume,也就是挂载卷,左侧的杠P对应右边的pose,也就是端口映射,左右两边唯一一点区别,就是左边自定义了一个子网network1而右边没有,因为docker会为每一个compose文件,都自动创建一个子网,同一个compose文件里面,定义的所有容器都会自动加入同一个子网,不用我们操心。
docker compose 还有一个额外功能是,可以自定义容器的启动顺序,比如我们可以在mongo express下面加上depend on,他的意思是这个mongo express容器依赖数据库,所以程序会先把mongo dB的容器启动起来,再去启动mongo express的容器。
在这里插入图片描述
在AI时代也不用我们写docker compose文件了,我们只需要把想要执行的docker命令告诉AI,然后让它生成一个等价的docker compose文件就可以了。
在这里插入图片描述
我们来实战一下,首先使用vi命令,在服务器上创建一个docker compose文件,
在这里插入图片描述
把文件内容粘贴过来保存一下,
在这里插入图片描述
然后我们执行docker compose up,这样就是启动这个文件里面定义的所有容器,同样的我们可以在后面接杠D让它在后台运行,我们看到这个命令做了两件事,首先他创建了一个子网,然后创建了两个容器,这个容器的名字跟我们在compose文件里面,定义的service名字不太一样,它在前面加了一个前缀,还加了一个编号,用来更加方便的管理,我们执行docker PS命令,可以看到正在运行的容器.
在这里插入图片描述
在浏览器访问服务器的IP地址加端口8081。看到mongo express就在正常运行了,我们可以新增数据库等等做各种操作。
在这里插入图片描述
刚才我们看了compose up命令,与它相反的就是compose down,这个命令会停止并且删除容器,
在这里插入图片描述
我们使用docker ps -a看到容器不但被停止了,也被删除了。如果我们只想停止,但是不想删除容器,我们可以执行docker compose stop命令,这个命令只停止不删除,然后我们执行docker compose start命令,就可以把刚才stop命令停止的容器再启动起来。
在这里插入图片描述
如果容器已经在运行了,我们重复执行compose up命令,并不会启动新的容器,它没有任何的效果,我们执行docker compose命令的时候,它会自动识别当前目录,下面严格叫做docker compose的这个文件,如果我们把这个文件改一个名字,让它变成一个非标准的文件名,这样再使用docker compose命令,它就识别不到了,对于这种非标准的文件名,我们可以在docker compose后面接一个杠F,杠F指的是file,也就是指定文件名,接下来我们把非标准的文件名指定给它,当然这个文件名也可以在其他的目录下面,使用杠F命令就可以识别到对应的文件好,docker compose的内容就这么多,还是非常容易掌握的。
在这里插入图片描述
docker compose是一个轻量级的容器编排技术,它适合个人使用单机运行,对于企业级服务器集群大规模的容器编排需求,那就需要另外一个软件Kubernetes登场,Kubernetes的功能非常的复杂,这个有机会我们再聊。

5、总结

本期视频我们
(1)先介绍了docker的核心概念,主要有容器镜像,还有镜像仓库
(2)演示了如何在linux windows,还有Mac电脑上安装docker,
(3)使用docker pull命令下载镜像,以及如何配置镜像站,解决下载镜像的网络问题
(4)接下来我们使用docker run命令创建并且运行了容器,介绍了docker run命令的几个重要参数:-p端口映射,-v挂载卷,-e设置环境变量等等,
(5)接下来介绍了如何进入容器内部进行调试,然后我们还看了docker的几种网络,分别是bridge模式,创建子网,host模式与NN模式,
(6)我们学习了什么是docker file,如何使用docker file创建镜像,以及如何把镜 像推送到docker hub上面,
(7)视频的最后,我们还介绍了一种轻量级的容器编排技术,Docker compose

这就是本期视频的全部内容了。

参考视频地址:40分钟的Docker实战攻略,一期视频精通Docker。感谢作者的辛苦付出。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RK3568笔记九十五:基于FFmpeg和Qt实现简易视频播放器

若该文为原创文章,转载请注明原文出处。 一、开发环境 1、硬件:正点原子ATK-DLRK3568 2、QT: 5.14.2 3、系统: buildroot 二、实现功能 使用ffmpeg音视频库软解码实现视频播放器 支持打开多种本地视频文件(如mp4,mov,avi等) 视频播放支持实时开始,暂停,继续播放 采…

【LLM】Kimi-K2模型架构(MuonClip 优化器等)

note Kimi K2 的预训练阶段使用 MuonClip 优化器实现万亿参数模型的稳定高效训练,在人类高质量数据成为瓶颈的背景下,有效提高 Token 利用效率。MuonClip Optimizer优化器,解决随着scaling up时的不稳定性。Kimi-K2 与 DeepSeek-R1 架构对比…

Vue基础(25)_组件与Vue的内置关系(原型链)

了解组件与Vue的内置关系前,我们需要回顾js原型链基础知识:1、构造函数构造函数是一种特殊的方法,用于创建和初始化一个新的对象。它们是使用 new 关键字和函数调用来创建对象的。构造函数实际上只是一个普通的函数,通常以大写字母…

kafka中生产者的数据分发策略

在 Kafka 中,生产者的数据分发策略决定了消息如何分配到主题的不同分区。在 Python 中,我们通常使用 kafka-python 库来操作 Kafka,下面详细讲解其数据分发策略及实现代码。一、Kafka 生产者数据分发核心概念分区(Partition&#…

【动态规划算法】斐波那契数列模型

一. (1137.)第N个泰波那契数(力扣)1.1动态规划的算法流程 对于初学者来讲学术上的概念晦涩难懂,将用通俗易懂的方式带来感性的理解. 1.状态表示dp表(一维或二维数组)里面的值所表示的含义 从哪获取? 1.题目要求,如本题 2.题目没有明确说明的情况下做题经验的累积 3.分析问题的…

Odoo 18 PWA 全面掌握:从架构、实现到高级定制

本文旨在对 Odoo 18 中的渐进式网络应用(Progressive Web App, PWA)技术进行一次全面而深入的剖析。本文的目标读者为 Odoo 技术顾问、高级开发人员及解决方案架构师,旨在提供一份权威的技术参考,以指导 PWA 相关的实施项目与战略…

Binary Classifier Optimization for Large Language Model Alignment

2025.acl-long.93.pdfhttps://aclanthology.org/2025.acl-long.93.pdf 1. 概述 在生产环境中部署大型语言模型(LLMs)时,对齐LLMs一直是一个关键因素,因为预训练的LLMs容易产生不良输出。Ouyang等人(2022)引入了基于人类反馈的强化学习(RLHF),该方法涉及基于单个提示的…

在CentOS上以源码编译的方式安装PostgreSQL

下载目录:PostgreSQL: File Browser,我使用的PostgreSQLv17.5。Linux系统:CentOS Linux release 7.9.2009 (Core) 安装依赖包和工具链(必须且重要!) yum groupinstall "Development Tools" -y yu…

Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现沙滩小人检测识别(C#代码UI界面版)

Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现沙滩小人检测识别(C#代码UI界面版)工业相机使用YoloV8模型实现沙滩小人检测识别工业相机通过YoloV8模型实现沙滩小人检测识别的技术背景在相机SDK中获取图像转换图像的代码分析工业相机图像转换…

Ubuntu服务器安装与运维手册——操作纯享版

本手册汇总了从硬件预配置、Ubuntu 安装、网络与服务配置,到 Windows/macOS 访问共享、MySQL 初始化的完整流程,便于今后运维参考。 目录 环境与硬件概览BIOS/UEFI 设置制作与启动安装介质Ubuntu 24.04 LTS 安装流程静态 IP 配置(netplan&am…

【Nginx】Nginx进阶指南:解锁代理与负载均衡的多样玩法

在Web服务的世界里,Nginx就像是一位多面手,它不仅能作为高性能的Web服务器,还能轻松胜任代理服务器、负载均衡器等多种角色。今天,我们就来深入探索Nginx的几个常见应用场景,通过实际案例和关键配置解析,带…

原创-锐能微82xx系列电能计量芯片软件驱动开发与精度校准流程完全指南

引言 电能计量芯片的软件驱动开发是整个计量系统的核心,它直接决定了计量精度、系统稳定性和功能完整性。锐能微82xx系列电能计量芯片凭借其强大的数字信号处理能力和丰富的功能特性,为开发者提供了灵活的软件开发平台。本文将详细介绍82xx系列芯片的软…

如何使用 Apache Ignite 作为 Spring 框架的缓存(Spring Cache)后端

这份文档是关于 如何使用 Apache Ignite 作为 Spring 框架的缓存(Spring Cache)后端,实现方法级别的缓存功能。 这和前面我们讲的 Spring Data Ignite 是两个不同的概念。我们先明确区别,再深入理解。🔁 一、核心区别…

Android 超大图片、长图分割加载

在Android开发中,处理大图片的加载是一个常见且重要的问题,尤其是在需要显示高分辨率图片时。大图片如果不正确处理,可能会导致内存溢出或应用性能下降。下面是一些常用的策略和技术来优化大图片的加载:1. 使用图片压缩库a. Glide…

Linux:理解操作系统

文章目录数据流动操作系统数据流动 软件运行,必须先加载到内存,本质要把磁盘上的文件 加载到内存。 我们写的算法是处理存储器里面的数据,数据就是文件,我们自己写的可执行文件。 图中QQ就是软件,加载内存后进行下一步…

【每日一错】PostgreSQL的WAL默认段大小

文章目录题目扩展学习WAL工作原理流程图题目 扩展学习 WAL(Write Ahead Log)预写日志: WAL是PostgreSQL先写日志、后写数据的机制,用来防止数据丢失、提升数据恢复能力。 流程: 事务先写日志文件(WAL&…

Visual Studio Code 使用指南 (2025年版)

Visual Studio Code (VS Code) 是一款由微软开发的免费、开源、跨平台的现代化轻量级代码编辑器,凭借其强大的核心功能、丰富的扩展生态系统以及高度可定制性,已成为全球数百万开发者的首选工具。本指南旨在帮助您快速上手 VS Code,掌握其核心…

【Java】JVM虚拟机(java内存模型、GC垃圾回收)

一、Java内存模型(JMM)JMM(Java Memory Model,Java 内存模型)是 Java 虚拟机规范中定义的一种抽象概念,用于规范 Java 程序中多线程对共享内存的访问规则,解决可见性、原子性和有序性问题&#…

二叉树算法之【二叉树的层序遍历】

目录 LeetCode-102题 LeetCode-102题 给定二叉树的根节点root&#xff0c;返回其节点值的层序遍历&#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 class Solution {public List<List<Integer>> levelOrder(TreeNode root) {// checkif (r…

uniapp+vue3——通知栏标题纵向滚动切换

介绍 取巧&#xff0c;使用纵向轮播实现 <!-- 通知栏 --> <view class"noticeBox" v-if"notice.length>0"><image src"/static/images/index/noticeIcon.png" mode"aspectFill"></image><swiper class&…