一、镜像分层
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