docker镜像分层、仓库、容器数据卷与常用软件安装

news2024/11/28 23:42:03

一、镜像分层

1、镜像概念:

镜像是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,将应用程序和配置依赖打包好行成一个可交付的运行环境,这个打包好的运行环境就是image镜像文件。

2、镜像分层:

(1) 联合文件系统 (UnionFS):

Union 文件系统,是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时将不同目录挂载到同一个虚拟文件系统下。

UnionFS系统是Docker镜像的基础,镜像可以通过分层来进行集成,基于基础镜像可以制作具体的应用镜像。

① UnionFS 允许将多个文件系统层 (例如基础操作系统层、应用程序层、配置层) 以一种逻辑方式组合,用户可以看到一个单一的文件系统视图;

② 写时复制 (Copy-on-Write):当对 UnionFS 中的文件系统进行修改时,这些修改不会直接影响原始文件系统层。UnionFS 使用写时复制机制,将修改视为一次提交,写入新的层中,保持了原始层的不变性。

(2) bootfs 和 rootfs:

① 在Docker镜像的最底层是引导文件系统bootfs,包含boot加载器和内核。

② rootfs (root file system),在bootfs之上,包含的就是典型Linux系统中的 /dev、/proc、/bin、/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu、CentOS等,对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以。

● 对于不同的Linux发行版,bootfs基本是一致的,可以共用;rootfs会有差别。

(3) 镜像创建过程:

Docker支持扩展现有镜像,创建新的镜像。新镜像是从base镜像一层一层叠加生成的。镜像分层的一个最大好处就是共享资源,方便复制迁移,方便复用。

(4) 容器层:

当容器启动时,一个新的可写层将被加载到镜像的顶部,这一层通常被称为容器层,容器层之下的都叫镜像层。

只有容器层是可写的,容器层下面的所有镜像层都是只读的,所有对容器的改动,无论添加、删除、还是修改文件都只会发生在容器层中。

3、commit 命令:

(1) 作用:commit 命令用于将容器的当前状态保存为一个新的镜像,并且可以以此为基础来创建新的容器。

(2) 语法:

docker commit -m="描述信息" -a="作者" 容器ID 创建的目标镜像名:[标签名]

二、docker 搭建仓库

1、公有仓库

(1) 上传镜像至公有仓库:

公有仓库地址:Docker Hub https://hub.docker.com

① 修改镜像名:

docker tag centos7.6:latest bean445/centos7.6

② 登录自己的公有仓库:

③ 上传镜像:

docker push bean445/centos7.6

查看公有仓库:

(2) 其他节点拉取镜像:

docker pull bean445/centos7.6

2、私有仓库

(1) 搭建私有仓库:

docker pull registry

(2) 私有仓库传输镜像:

① 服务器运行私有仓库:

docker run --name registry_server -d -p 5000:5000 registry

容器名:registry_server ;镜像名:registry ;端口映射:5000

● 查看容器:

② 客户机修改镜像名:

docker tag hello-world:latest 192.168.198.130:5000/hello-world

③ 修改客户机的配置文件:

vim /usr/lib/systemd/system/docker.service

● 指定私有Registry地址:

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry 192.168.198.130:5000

systemctl daemon-reload

systemctl restart docker

④ 客户机将本地镜像推送到私有仓库:

docker push 192.168.198.130:5000/hello-world

3、阿里云仓库:

(1) 本地镜像发布到阿里云:

① 创建镜像仓库:

选择“产品” “容器” “容器镜像服务”, 点击“管理控制台”,选择“个人实例”;

选择并创建命名空间;

选择并创建镜像仓库;

② 根据操作指南将镜像推送到阿里云:

③ 查看阿里云仓库:

(2) 从阿里云仓库拉取镜像:

docker pull registry.cn-hangzhou.aliyuncs.com/bean666kj/beancentos:[镜像版本号]

三、容器数据卷

1、概念:

容器数据卷是 Docker 中用于持久化存储数据的机制,它允许容器与宿主机或其他容器之间共享数据,并且可以在容器之间持久化存储和共享信息。

● 语法:docker run -it --privileged=true -v /宿主机目录:/容器内目录 镜像名

2、特点:

① 数据卷可在容器之间共享和重用数据;

② 数据卷中的更改可以实时生效;

③ 数据卷的更改不会包含在镜像的更新中;

④ 数据卷的生命周期一直持续到没有容器使用它为止。

3、容器使用宿主数据卷:

① 创建数据卷并写入数据:

② 容器挂载数据卷:

● docker run --name nginx1 -d -v /webroot:/usr/share/nginx/html nginx

将主机上的 /webroot 目录挂载到容器 nginx1 中的 /usr/share/nginx/html 目录

● 挂载到多个容器上:

③ 修改数据卷,容器上的数据也会修改:

4、读写映射规则:

① 默认宿主机与容器对文件都有读写权限:

docker run -it --privileged=true -v /宿主机目录:/容器内目录:rw 镜像名

② 限制容器对文件只有读取权限 (宿主机仍然可读可写):

docker run -it --privileged=true -v /宿主机目录:/容器内目录:ro 镜像名

5、容器卷的继承:

容器2继承容器1的卷规则:

docker run -it --privileged=true --volumes-from 容器1 --name 容器2 镜像名

● 容器1挂了并不影响容器2与宿主机之间的关联 (相当于一主二从)

四、docker 常用软件安装

1、安装 tomcat:

(1) 拉取镜像:docker pull tomcat

(2) 创建容器实例:

docker run -d -p 8080:8080 --name t1 tomcat

(3) 访问首页:

① 进入容器:

docker exec -it 60464c80190f /bin/bash

② 修改tomcat首页访问文件:

rm -r webapps

mv webapps.dist webapps

查看首页:ip+端口

2、安装 mysql:

(1) mysql 挂载容器数据卷:

① 启动容器:

docker run -d -p 3306:3306 \

                --privileged=true \

                -v /app/mysql/log:/var/log/mysql \

                -v /app/mysql/data:/var/lib/mysql \

                -v /app/mysql/conf:/etc/mysql \

                -e MYSQL_ROOT_PASSWORD=123456\

                --name mysql \

                mysql:5.7

● -v /app/mysql/log:/var/log/mysql:将主机上的/app/mysql/log目录挂载到容器内的/var/log/mysql目录,用于存储 MySQL 的日志文件。

● -v /app/mysql/data:/var/lib/mysql:将主机上的/app/mysql/data目录挂载到容器内的/var/lib/mysql目录,用于存储 MySQL 的数据文件。

● -v /app/mysql/conf:/etc/mysql:将主机上的/app/mysql/conf目录挂载到容器内的/etc/mysql目录,用于存储 MySQL 的配置文件。

② 登录数据库并创建数据:

docker exec -it mysql /bin/bash

宿主机路径下已同步数据:

删除数据库容器再创建,数据依然存在。

(2) mysql 主从配置:

主服务器配置:

① 创建主服务器容器实例:

docker run -p 3307:3306 \

                --name mysql-master \

                --privileged=true \

                -v /app/mysql-master/log:/var/log/mysql \

                -v /app/mysql-master/data:/var/lib/mysql \

                -v /app/mysql-master/conf:/etc/mysql \

                -e MYSQL_ROOT_PASSWORD=123456 \

                -d mysql:5.7

② 在 /app/mysql-master/conf/ 下创建 my.cnf:

[mysqld]

## 设置server_id, 同一个局域网中需要唯一

server_id=101

## 指定不需要同步的数据库名称

binlog-ignore-db=mysql

## 开启二进制日志功能

log-bin=mall-mysql-bin

## 设置二进制日志使用内存大小(事务)

binlog_cache_size=1M

## 设置使用的二进制日志格式(mixed,statement,row)

binlog_format=mixed

## 二进制日志过期清理时间。默认值为0,表示不自动清理

expire_logs_days=7

## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断

## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致

slave_skip_errors=1062

重启 master 实例:docker restart mysql-master

③ 进入主服务器创建数据同步用户:

create user 'slave'@'%' identified by '123456';

grant replication slave, replication client on *.* to 'slave'@'%';

flush privileges;

从服务器配置:

① 创建从服务器容器实例:

docker run -p 3308:3306 \

                --name mysql-slave \

                --privileged=true \

                -v /app/mysql-slave/log:/var/log/mysql \

                -v /app/mysql-slave/data:/var/lib/mysql \

                -v /app/mysql-slave/conf:/etc/mysql \

                -e MYSQL_ROOT_PASSWORD=123456\

                -d mysql:5.7

② 在 /app/mysql-slave/conf/ 下创建 my.cnf:

[mysqld]

## 设置server_id, 同一个局域网内需要唯一

server_id=102

## 指定不需要同步的数据库名称

binlog-ignore-db=mysql

## 开启二进制日志功能,以备slave作为其它数据库实例的Master时使用

log-bin=mall-mysql-slave1-bin

## 设置二进制日志使用内存大小(事务)

binlog_cache_size=1M

## 设置使用的二进制日志格式(mixed,statement,row)

binlog_format=mixed

## 二进制日志过期清理时间。默认值为0,表示不自动清理

expire_logs_days=7

## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断

## 如:1062错误是指一些主键重复,1032是因为主从数据库数据不一致

slave_skip_errors=1062

## relay_log配置中继日志

relay_log=mall-mysql-relay-bin

## log_slave_updates表示slave将复制事件写进自己的二进制日志

log_slave_updates=1

## slave设置只读(具有super权限的用户除外)

read_only=1

重启 slave 实例:docker restart mysql-slave

进行主从同步:

① 主服务器中查看主从同步状态:

show master status;

② 进入从服务器:

docker exec -it mysql-slave /bin/bash

③ 从数据库配置主从复制:

change master to master_host='192.168.xxx.xxx',master_user='slave',master_password='123456',master_port=3307,master_log_file='mall-mysql-bin.000001',master_log_pos=769,master_connect_retry=30;

④ 从服务器查看主从同步状态:

show slave status \G;

⑤ 从服务器开启主从同步:

start slave;

⑥ 主从同步测试:

3、安装 redis:

① 在宿主机下新建目录:

mkdir -p /app/redis

② 创建并修改配置文件:

vim /app/redis/redis.conf

# bind 127.0.0.1

protected-mode no

daemonize no

appendonly yes

③ 启动 redis 容器:

将自定义的配置文件挂载到 redis 容器,并用指定的配置文件来启动容器

docker run -d -p 6379:6379 --name redis1 --privileged=true \

                        -v /app/redis/redis.conf:/etc/redis/redis.conf \

                        -v /app/redis/data:/data \

                        redis\

                        redis-server /etc/redis/redis.conf

附:redis 配置文件:Redis configuration | Redis

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

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

相关文章

额,收到阿里云给的赔偿了!

众所周知,就在刚过去不久的11月12号,阿里云突发了一次大规模故障,影响甚广。 以至于连咱们这里评论区小伙伴学校的洗衣机都崩了(手动doge)。 这么关键的双11节点,这么多热门业务和产品,这么大规…

Python面试破解:return和yield的细腻差别

更多Python学习内容:ipengtao.com 大家好,我是涛哥,今天为大家分享 Python面试破解:return和yield的细腻差别,全文3000字,阅读大约10钟。 在Python的函数编程中,return和yield是两个常用的关键词…

在Mysql中,什么是回表,什么是覆盖索引,索引下推?

一、什么是回表查询? 通俗的讲就是,如果索引的列在 select 所需获得的列中(因为在 mysql 中索引是根据索引列的值进行排序的,所以索引节点中存在该列中的部分值)或者根据一次索引查询就能获得记录就不需要回表&#x…

IELTS学习笔记_grammar_新东方

参考: 新东方 田静 语法 目录: 导学简单句… x.1 导学 学语法以应用为主。 基础为:单词,语法 进阶为:听说读写译,只考听说读写。 words -> chunks -> sentences, chunks(语块的重要…

Linux MTR(My TraceRoute)command

Internet上有许多小型网络测试工具:Ping、Traceroute、Dig、Host等。 但是,这些工具的功能都比较单一。今天会给大家分享一个包含ping和traceroute功能的工具:MTR 文章目录 什么是MTR?MTR可以提供哪些功能Linux MTR可用选项Linux MTR用法推荐…

智能优化算法应用:基于鸡群算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于鸡群算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于鸡群算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.鸡群算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

使用vue-admin-template时,需要注意的问题,包括一定要去除mock.js注释

在使用vue-admin-template等前端框架时,如果你没有打算用他们的mock数据,在生产环境下一定要注释mock引用的代码,虽然它没有被调用,但是如果你不注释,就会被打包进去。 找到main.js,看如下代码&#xff1a…

Node.js下载安装教程

一、下载安装包 1、百度网盘自提链接: 链接:https://pan.baidu.com/s/1Bbw895MtUgjlfZylPHCCxw 提取码:x89v 2、进入官网下载 https://nodejs.org/zh-cn/download/ 选择对应版本,我这里选的windows64位版本 二、安装程序 1、…

seurat读取不同数据格式以创建Seurat单细胞对象

挖掘GEO公共单细胞数据集时,会遇到常见各种单细胞测序数据格式。现总结如下,方便自己日后调用,以创建Seurat对象 (1)barcodes.tsv.gz、features.tsv.gz、matrix.mtx.gz (2)表达矩阵 &#xff08…

60V 72V 输入 输出5V 2A 内置MOS 降压芯片 ESOP8封装

60V 72V 输入 输出5V 2A 内置MOS 降压芯片 SC9102 ESOP8封装

FL Studio水果软件21.1新版!新增Hyper Chorus插件及自动更新功能

我们很高兴地宣布在去年12月发布重大版本更新后,FL Studio在2023年8月正式更新到21.1版。本次更新虽然只是维护性质,但我们还是为大家带来了一些全新的功能,包括通过钢琴卷中的音阶捕捉和自定义音符工具,引入更快、更有创意的音符…

echarts修改tooltip默认的圆点图标为其他样式

业务需求,默认是圆点,需要把线的由圆点改为线 红色线是理论,点是历史理论,绿色线是实际, 点是历史实际,在series里的顺序也是这样排的。 打印出来的params里的marker就是圆点,改这段代码就可以了…

【用unity实现100个游戏之17】从零开始制作一个类幸存者肉鸽(Roguelike)游戏3(附项目源码)

文章目录 本节最终效果前言近战武器控制近战武器生成升级增加武器伤害和数量查找离主角最近的敌人子弹预制体生成子弹发射子弹参考源码完结 本节最终效果 前言 本节紧跟着上一篇,主要实现武器功能。 近战武器 新增Bullet,子弹脚本 public class Bull…

医疗器械企业升级路:直连客户盘活存量,布局出海寻求增量

随着随着医疗各领域VBP(带量采购)的稳步推进以及医疗机构DRG/DIP(按疾病诊断相关分组/病种分值支付)的深化应用,降本增效和精细化管理已经成为医院管理者的头等大事。 这也在倒逼医疗器械厂商提升管理水平和营销效率。…

Springboot的excel导出

这里导出excel用到的是 阿里巴巴的easyexcel 1、首先导入依赖 <!--alibaba easyexcel--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.6</version> </dependency> 2、…

IWDG和WWDG HAL库+cubeMX

一.IWDG 1.原理 启用IWDG后&#xff0c;LSI时钟会自动开启 2.IWDG溢出时间计算 3.IWDG配置步骤 4.HAL库相关函数介绍 HAL_IWDG_Init //使能IWDG&#xff0c;设置预分频系数和重装载值等 HAL_IWDG_Refresh //把重装载寄存器的值重载到计数器中&#xff0c;喂狗typedef str…

解决苹果手机iphone手机强制重启

强制关机&#xff1a; 方法1.同时按住左侧的&#xff0c;- 键中的一个和右侧的电源键 方法2.点击桌面的悬浮键–设备–更多–重新启动

华住三季报:韧性增长超预期,夯实可持续发展底座

美股研究社获悉&#xff0c;2023年11月27日&#xff0c;华住集团2023年第三季度业绩发布会在线上举行。受华住三季度财报向好表现&#xff0c;多家证券公司给予买入评级。中信证券认为&#xff0c;本季度华住集团国内外RevPAR修复优于前期指引上限、净开店数优于预期。且华住集…

JAVA面向对象三大特征

1.面向对象的三大特征包括封装、继承和多态。 封装&#xff1a;封装是指将数据和操作数据的方法绑定起来&#xff0c;外界对数据的访问只能通过已定义的接口。这种特性有两层含义&#xff0c;一层是将属性和行为看成一个密不可分的整体&#xff0c;将这两者封装在一个对象中&a…

【虚拟机】Docker基础 【一】

1.1.部署MySQL 首先&#xff0c;我们利用Docker来安装一个MySQL软件&#xff0c;大家可以对比一下之前传统的安装方式&#xff0c;看看哪个效率更高一些。 如果是利用传统方式部署MySQL&#xff0c;大概的步骤有&#xff1a; 搜索并下载MySQL安装包上传至Linux环境编译和配置…