Docker使用(三)Docker底层分析

news2024/11/20 4:46:43

Docker使用(三)Docker底层分析

四、底层分析

1、Docker镜像原理
1.1 commit镜像

docker commit 提交容器成为一个新的副本

# 命令和git原理类似

docker commit -m=“提交的描述信息” -a=“作者” 容器id 目标镜像名:[TAG]

实操:

# 1、启动一个默认tomcat

# 2、发现这个默认的tomcat没有webapps应用,镜像的原因,官方镜像默认是没有的

# 3、自己copy 进去基本文件

# 4、将我们操作的容器通过commit提交为一个镜像

在这里插入图片描述

2、Docker容器数据卷
2.1 什么是容器数据卷

将应用和数据打包成一个镜像

需求:数据持久化

Mysql ,容器删除了,删库跑路。需求:数据存储在本地

总结一句话:数据卷,容器的持久化和同步操作!容器也是可以数据共享的。

============================================================================

2.2 使用容器数据卷

方式一:直接使用命令来挂载 -V

docker run -it -v 主机目录: 容器内目录

[root@localhost ~]# docker run -it -v /home/ceshi:/home centos /bin/bash

============================================================================

通过inspect查询容器状态

[root@localhost home]# docker inspect e4dcbd52904f

在这里插入图片描述

测试:

在这里插入图片描述

============================================================================

2.3 具名和匿名挂载

# 匿名挂载

-v 容器内路径

[root@localhost /]# docker run -d -P --name nginx01 -v /etc/nginx nginx

# 查看所有的volume的情况

[root@localhost /]# docker volume ls

在这里插入图片描述

这里发现,这种就是匿名挂载,我们在-v只写了容器内的路径,没有写容器外的路径!

# 具名挂载

# 通过 -v **卷名:**容器内路径

[root@localhost /]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx

5ed2d5cbdef110d9484b1fa0017fc83f5ae2d08b84f4628b38d0f383e890ae47

在这里插入图片描述

[root@localhost /]# docker volume ls

在这里插入图片描述

[root@localhost /]# docker volume inspect juming-nginx

在这里插入图片描述

可以看到,所有的docker容器内的卷,没有指定目录的情况下都是在:/var/lib/docker/volumes/XXX/_data,我们通过具名挂载可以方便的找到我们的一个卷,大多数情况下使用:具名挂载。

# 如何区分匿名挂载/具名挂载

-v 容器内路径 # 匿名挂载

-v 卷名:容器内路径 # 具名挂载

-v /宿主机路径:容器内路径 # 指定路径挂载

拓展:

# 通过 -v 容器内路径:ro rw 改变读写权限(这个权限是相对于容器说的)

ro readonly # 只读

rw readwrite # 读写

[root@localhost /]# docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx:rw nginx

# ro 只要看到ro 说明这个路径只能通过宿主机来操作,容器内是无法操作的。

============================================================================

2.4 初始数据卷之Dockerfile

[root@localhost ~]# cd /home

# 建立一个测试文件夹

[root@localhost home]# mkdir docker_test_volume

# 建立一个dockefile1文件,名字可以随机,每个命令就是docker镜像的一层

[root@localhost docker_test_volume]# vim dockefile1

在这里插入图片描述

# build

[root@localhost docker_test_volume]# docker build -f dockefile1 -t cheristhuan/centos:1.0 .

在这里插入图片描述

# 运行刚刚镜像

[root@localhost docker_test_volume]# docker run -it c9e468f74ddf /bin/bash

在这里插入图片描述

3、Dockerfile
3.1 介绍

构建步骤:

1、编写一个dockerfile文件

2、docker build 构建成为一个镜像

3、docker run 运行镜像

4、docker push 发布镜像(DockerHub、阿里云镜像仓库)

在这里插入图片描述

============================================================================

3.2 构建过程

基础知识:

1、每个保留关键字(指令)都必须是大写字母;

2、执行从上到下顺序执行;

3、#表示注释

4、每一个指令都会创建提交一个新的镜像层,并提交。

在这里插入图片描述

​ dockerfile是面向开发的,我们以后发布项目,做镜像,就需要编写dockerfile文件,逐渐成为企业交付的标准,必须要掌握。

**步骤:**开发、部署、运维…缺一不可

步骤1、DockerFile:构建文件,定义了一切的步骤,源代码;

步骤2、DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品;

步骤3、Docker容器:容器就是镜像运行起来提供服务器

============================================================================

3.3 常见构建命令

FROM # 1、基础镜像,一切从这里开始构建

MAINTAINER # 2、镜像是谁写的(告诉别人,是你创造的它),建议格式:姓名+邮箱

RUN # 3、镜像构建的时候需要运行的命令(在命令前面加上RUN,即你想要让它做什么用)

ADD # 4、步骤:tomcat镜像,这个tomcat压缩包!添加内容(COPY文件,会自动解压的,往它内部放点东西)

WORKDIR # 5、镜像的工作目录

VOLUME # 6、 挂载的目录

EXPOSE # 7、 暴露端口配置

CMD # 8、指定这个容器启动的时候要运行的命令,只有最后一个会生效, 可被替代

ENTRYPOINT # 9、指定这个容器启动的时候要运行的命令,可以追加命令

ONBUILD # 10、当构建一个被继承 DockerFile这个时候就会运行ONBUILD的指令,触发指令

COPY # 11、类似ADD,将文件拷贝到镜像中

ENV # 12、构建的时候设置环境变量

============================================================================

3.4 实战

Docker Hub 中99%的镜像都是 从这个基础镜像过来的 FROM scratch,然后配置需要的软件和配置来进行构建:

在这里插入图片描述

4、Docker网络
4.1 理解Docker0

# 清除全部容器和镜像

[root@localhost ~]# docker rm -f $(docker ps -aq)

[root@localhost ~]# docker rmi -f $(docker images -aq)

# 测试 得到一个eth0@if533

[root@localhost ~]# docker run -d -P --name tomcat01 tomcat

[root@localhost ~]# docker exec -it tomcat01 ip addr

在这里插入图片描述

[root@localhost ~]# ping 172.17.0.2

在这里插入图片描述

是可以ping的通的docker容器内部

# 思考

1、我们每启动一个docker容器,docker就会给docker容器分配一个ip,就会有一个网卡docker0桥接模式,使用的技术是evth-pair技术!

在这里插入图片描述

结论:

​ tomcat01 和 tomcat02是公用的一个路由器,docker0,所有的容器在不指定网络的情况下,都是docker0路由的。

在这里插入图片描述

Docker中的所有的网络接口都是虚拟的,虚拟的转发效率高!(内网传递文件),只要容器删除,对应网桥一对就没有了。

============================================================================

4.2 自定义网络

网络模式:

bridge:桥接 docker(默认)

none:不配置网络

host:和宿主机共享网络

container:容器网络连通(用的少,局限很大)

测试:

# 我们直接启动的命令 --net bridge ,而这个就是我们的docker0

docker run -d -P --name tomcat01 tomcat

docker run -d -P --name tomcat01** --net bridge** tomcat

# 我们可以自定义一个网络!

# --driver bridge 默认桥接模式

# --subnet 192.168.0.0/16 子网

# --gateway 192.168.0.1 网关

[root@localhost ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

在这里插入图片描述

自己的网络建立好了:

在这里插入图片描述

测试:

[root@localhost ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat

[root@localhost ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat

在这里插入图片描述

在这里插入图片描述

[root@localhost ~]# docker exec -it tomcat-net-01 ping tomcat-net-02

可以ping的通

============================================================================

4.3 网络连通

在这里插入图片描述

在这里插入图片描述

当前

在这里插入图片描述

#测试 tomcat01(docke0网卡) —> mynet(自定义网卡mynet)

#连通之后就是将tomcat01 放到了mynet网络下?

#一个容器2个ip地址 【阿里云 公网ip 私网ip】

[root@localhost ~]# docker network connect mynet tomcat01

然后,查询下

[root@localhost ~]# docker network inspect mynet

在这里插入图片描述

在这里插入图片描述

执行[root@localhost ~]# docker inspect tomcat01

在这里插入图片描述

测试通不通:[root@localhost ~]# docker exec -it tomcat01 ping tomcat-net-01

在这里插入图片描述

[root@localhost redis_my_net]# docker exec -it tomcat-net-01 ping tomcat01

在这里插入图片描述

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

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

相关文章

【并查集】模版

【模板】并查集 - 洛谷 #include <bits/stdc.h> using namespace std; const int N2e59; int a[N]; int Find(int x) {if(xa[x]){return x;}else{a[x]Find(a[x]);return a[x];} } void push(int x,int y) {a[Find(x)]Find(y);return ; } int main() {int n,m; cin>>…

kubernetes部署集群

kubernetes部署集群 集群部署获取镜像安装docker[集群]阿里仓库下载[集群]集群部署[集群]集群环境配置[集群]关闭系统Swap[集群]安装Kubeadm包[集群]配置启动kubelet[集群]配置master节点[master]配置使用网络插件[master]node加入集群[node]后续检查[master]测试集群 集群部署…

【C语言进阶篇】数据在内存中的存储

目录 1.大小端字节序和字节序判断 2.浮点数在内存中的存储与读取 2.1 浮点数在内存中的存储 2.2 浮点数在内存中的读取 在前面的学习中&#xff0c;我们知道内存被划分为一个个小的内存单元&#xff0c;数据就是存储在这些内存单元中的。那么&#xff0c;具体是如何存储的&am…

ADC 架构 IV :Σ-Δ 型 ADC 高级概念和应用

目录 简介 高阶环路考量 数字滤波器对多路复用应用的意义 多级噪声整形 (MASH) Σ-Δ 转换器 总结 简介 上节已论述了 Σ-Δ 型 ADC 的基本原理。本教程将介绍一些更高级的概念&#xff0c;包括 空闲音、多位 Σ-Δ、MASH、带通 Σ-Δ&#xff0c;并提出一些示例应用。 简…

HarmonyOS NEXT星河版——还是Android上套个壳吗?

这真的是我2024年听过最搞笑的话,就在前几天&#xff0c;居然还有人说鸿蒙OS就是安卓套个壳&#xff0c;简直无语&#xff01; 你敢相信&#xff1f;就在前几天&#xff0c;我还听到有人说&#xff1a;鸿蒙os就是安卓上套一个壳。唉&#xff0c;我真是无语了。 哎&#xff0c…

<机器学习初识>——《机器学习》

目录 一、人工智能概述 1 人工智能应用场景 2 人工智能发展必备三要素 3 人工智能、机器学习和深度学习 二、人工智能发展历程 1 人工智能的起源 1.1 图灵测试 1.2 达特茅斯会议 2 发展历程 三、 人工智能主要分支 1 主要分支介绍 1.1 分支一&#xff1a;计算机视觉…

SRPC快速入门 - Sogou基于Workflow的自研RPC框架

什么是rpc RPC&#xff08;Remote Procedure Call&#xff09;&#xff0c;远程过程调用&#xff0c;它把网络交互类比为client调用server上的函数。RPC 的主要功能目标是让构建分布式计算&#xff08;应用&#xff09;更容易&#xff0c;在提供强大的远程调用能力时不损失本地…

【SQL Server】实验八 综合设计

1 实验目的 了解和掌握数据库设计的有关理论和方法。可以灵活运用数据库设计方法设计一个中小型规模的数据库。 2 实验内容 2.1 数据库概念模型设计 进行需求分析。设计数据库概念模型&#xff0c;画出E-R图。 2.2 数据库逻辑模型设计 根据数据库概念模型设计数据库的逻…

第七节:使用SMB发布Web前端程序

一、概述 一直以来&#xff0c;多数人都使用Apache、IIS、Tomcat等开源或商业Web服务器来运行Web程序&#xff0c;各种参数太多&#xff0c;与我们简单易用逻辑相左。所以在架构设计的时候&#xff0c;我们也在考虑&#xff0c;我们公司的Web程序是否能运行在SMB中&#xff0c;…

【AI】用iOS的ML(机器学习)创建自己的AI App

用iOS的ML(机器学习)创建自己的AI App 目录 用iOS的ML(机器学习)创建自己的AI App机器学习如同迭代过程CoreML 的使用方法?软件要求硬件开始吧!!构建管道:设计和训练网络Keras 转 CoreML将模型集成到 Xcode 中结论推荐超级课程: Docker快速入门到精通Kubernetes入门到…

Windows服务器部署多台Redis

适用于Windows服务器部署多台redis&#xff0c;同时将Redis注册成服务设置自动。 文章目录 前言一、上传离线安装包二、解压并启动Redis总结 前言 redis其实并不很好适用于Windows服务器&#xff0c;一般最好的情况下还是建议使用Linux服务器进行部署&#xff0c;当然如果一定…

6、Design Script之列表

Range 在DesignScript中,Range是从起点到终点的一系列数字,使用指定的步距(间距类型),并有以下的初始化方法: start..end..step; start..end..#amount; start..end..~approximate; Range可以是数字的,也可以是字母的。 字母范围因大小写而异。 开始,结束. .#数量范围(…

自学rabbitmq入门到精通

交换机的fault &#xff08;发布与订阅模式&#xff09; 因为消息是由生产者发送给excahnge&#xff0c;exchange发送给队列&#xff0c; 然后由队列发送给消费者的。 展示使用图形化界面使用fanout模式。 创建交换机 然后创建三个队列&#xff0c;绑定对应的交换机&#xff…

[vscode]使用cmake时将命令行参数传递给调试目标

一、简介 本文介绍了在vscode中使用cmake工具时&#xff0c;如何传递参数给编译目标的方法。 前提&#xff1a;使用vscodecmake编译C/C程序。 二、方法 在.vscode/目录下新建settings.json文件&#xff0c;并将待传底的参数写在 cmake.debugConfig里。 下面介绍了一个示例&a…

【AIGC调研系列】通义灵码与copilot的对比

通义灵码与GitHub Copilot的对比主要集中在几个方面&#xff1a;代码编写能力、免费性、操作界面和适配性。 首先&#xff0c;在代码编写能力上&#xff0c;虽然GitHub Copilot在整体上要强于通义灵码&#xff0c;但通义灵码的能力也不算弱&#xff0c;并且在某些特定的小类任…

P6安装:安装P6提示1433端口无效

错误描述 尝试运行 Microsoft SQL Server 2005 的 Primavera P6 数据库时&#xff0c;遇到以下错误&#xff1a; SQLServerException: The TCP/IP connection to the host [name], port 1433 has failed. Error: “Connection refused: connect. Verify the connection prope…

Lock4J分布式锁

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 简介 lock4j是一个分布式锁组件,其提供了多种不同的支持以满足不同性能…

非空约束

oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 非空约束 所谓的非空约束&#xff0c;指的是表中的某一个字段的内容不允许为空。如果要使用非空约束&#xff0c;只需要在每个列的后面利用“NOT NULL”声明即可 -- 删除数…

《科学之友》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答&#xff1a;问&#xff1a;《科学之友》是什么级别的期刊呢&#xff1f; 答&#xff1a;省级&#xff1b;主管单位&#xff1a;山西省科学技术协会&#xff1b;主办单位&#xff1a;山西科技新闻出版传媒集团有限责任公司 问&#xff1a;《科学之友》是正规期刊吗&a…

法国巴黎交易所股票清单列表数据API接口

# Restful API https://tsanghi.com/api/fin/stock/XPAR/list?token{token}更新时间&#xff1a;收盘后3~4小时。 更新周期&#xff1a;每天。 请求方式&#xff1a;GET。 # 测试&#xff1a;返回不超过10条数据&#xff08;2年历史&#xff09; https://tsanghi.com/api/fin/…