一、镜像分层

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会有差别。

docker镜像安装使用rpm docker镜像里面安装软件_阿里云

(3) 镜像创建过程:

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

docker镜像安装使用rpm docker镜像里面安装软件_docker_02

(4) 容器层:

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

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

docker镜像安装使用rpm docker镜像里面安装软件_容器_03

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镜像安装使用rpm docker镜像里面安装软件_docker_04

② 登录自己的公有仓库:

docker镜像安装使用rpm docker镜像里面安装软件_docker_05

③ 上传镜像:

docker push bean445/centos7.6

docker镜像安装使用rpm docker镜像里面安装软件_阿里云_06

查看公有仓库:

docker镜像安装使用rpm docker镜像里面安装软件_docker_07

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

docker pull bean445/centos7.6

docker镜像安装使用rpm docker镜像里面安装软件_mysql_08

docker镜像安装使用rpm docker镜像里面安装软件_阿里云_09

2、私有仓库

(1) 搭建私有仓库:

docker pull registry

docker镜像安装使用rpm docker镜像里面安装软件_mysql_10

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

① 服务器运行私有仓库:

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

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

● 查看容器:

docker镜像安装使用rpm docker镜像里面安装软件_阿里云_11

② 客户机修改镜像名:

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

docker镜像安装使用rpm docker镜像里面安装软件_阿里云_12

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

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

docker镜像安装使用rpm docker镜像里面安装软件_容器_13

systemctl daemon-reload

systemctl restart docker

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

docker push 192.168.198.130:5000/hello-world

docker镜像安装使用rpm docker镜像里面安装软件_docker镜像安装使用rpm_14

3、阿里云仓库:

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

① 创建镜像仓库:

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

选择并创建命名空间;

docker镜像安装使用rpm docker镜像里面安装软件_阿里云_15

选择并创建镜像仓库;

docker镜像安装使用rpm docker镜像里面安装软件_docker_16

docker镜像安装使用rpm docker镜像里面安装软件_阿里云_17

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

docker镜像安装使用rpm docker镜像里面安装软件_阿里云_18

docker镜像安装使用rpm docker镜像里面安装软件_docker镜像安装使用rpm_19

③ 查看阿里云仓库:

docker镜像安装使用rpm docker镜像里面安装软件_阿里云_20

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

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

三、容器数据卷

1、概念:

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

docker镜像安装使用rpm docker镜像里面安装软件_docker镜像安装使用rpm_21

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

2、特点:

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

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

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

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

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

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

docker镜像安装使用rpm docker镜像里面安装软件_容器_22

② 容器挂载数据卷:

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

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

docker镜像安装使用rpm docker镜像里面安装软件_mysql_23

● 挂载到多个容器上:

docker镜像安装使用rpm docker镜像里面安装软件_docker镜像安装使用rpm_24

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

docker镜像安装使用rpm docker镜像里面安装软件_容器_25

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

docker镜像安装使用rpm docker镜像里面安装软件_docker镜像安装使用rpm_26

(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

docker镜像安装使用rpm docker镜像里面安装软件_mysql_27

查看首页:ip+端口

docker镜像安装使用rpm docker镜像里面安装软件_阿里云_28

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

docker镜像安装使用rpm docker镜像里面安装软件_mysql_29

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

docker镜像安装使用rpm docker镜像里面安装软件_docker镜像安装使用rpm_30

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

(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

docker镜像安装使用rpm docker镜像里面安装软件_阿里云_31

② 在 /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

docker镜像安装使用rpm docker镜像里面安装软件_docker_32

② 在 /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镜像安装使用rpm docker镜像里面安装软件_阿里云_33

② 进入从服务器:

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;

docker镜像安装使用rpm docker镜像里面安装软件_阿里云_34

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

start slave;

docker镜像安装使用rpm docker镜像里面安装软件_mysql_35

⑥ 主从同步测试:

docker镜像安装使用rpm docker镜像里面安装软件_docker镜像安装使用rpm_36

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