docker命令

一、引言


1.1 环境不一致

我本地运行没问题啊:由于环境不一致,导致相同的程序,运行结果却不一致。

1.2 隔离性

哪个哥们又写死循环了,怎么这么卡:在多用户的操作系统下,会因为其他用户的操作失误影响到你自己编些的程序。

一个系统可以部署多个应用,只要应用中某一个业务(线程) 发生了死循环,此时会占用大量cpu 资源

此时其他应用也会造成影响

解决以上问题,就要将应用隔离开来,没有应用分配一部分 cpu 内存 网卡 等计算资源,应用之间互不影响

1.3 弹性伸缩

淘宝在双11的时候,用户量暴增:需要很多很多的运维人员去增加部署的服务器,运维成本过高的问题。

比如现在 qps 1000

平时 1000 2个tomcat

双11 5000 10个tomcat 临时增加 8个tomcat (需要安装8台服务器,并部署)

如果有一种方式可以一键拓展 8台服务器====》此时就可以使用docker k8s

双十一以后 1500 3个tomcat 此时需要收缩服务器 也可以一键完成

1.4 学习成本

学习一门技术,得先安装啊:学习每一门技术都要先安装相应的软件,但是还有他所依赖的各种环境,安装软件成本快高过学习成本啦。

快速的安装软件

为什么我们学习docker?

便于我们快速的安装软件

二、Docker介绍


2.1 Docker的由来

一帮年轻人创业,创办了一家公司,2010年的专门做PAAS平台。但是到了2013年的时候,像亚马逊,微软,Google都开始做PAAS平台。到了2013年,公司资金链断裂,不得不倒闭,于是将公司内的核心技术对外开源,核心技术就是Docker。由于开源了Docker,到了2014年的时候,得到了C轮的融资 $4000W,2015年的时候,得到了D轮的融资.$9500W。于是公司开始全神贯注的维护Docker。

Docker本质上就是一个虚拟化工具,可以将一个宿主机 虚拟化为多个微小的系统(进程级别)

和 vmware 很相似,但是更加的轻量级

Docker主要作者-所罗门

1586340594252

Docker的作者已经离开了维护Docker的团队

1586340639934

2.2 Docker的思想
  • 集装箱:会将所有需要的内容放到不同的集装箱中,谁需要这些环境就直接拿到这个集装箱就可以了

    集装箱:依赖的环境 + 可以运行的软件

  • 标准化:

    • 运输的标准化:Docker有一个码头,所有上传的集装箱都放在了这个码头上,当谁需要某一个环境,就直接指派去搬运这个集装箱就可以了。

    • 命令的标准化:Docker提供了一些列的命令,帮助我们去获取集装箱等等操作。

    • 提供了REST的API:衍生出了很多的图形化界面,Rancher。

  • 隔离性:Docker在运行集装箱内的内容时,会在Linux的内核中,单独的开辟一片空间,这片空间不会影响到其他程序。

wpsDED6.tmp.jpg

以下下概念必须牢记

  • 镜像:就是集装箱

    镜像 == 集装箱 === 依赖的环境+ 软件 本质上是一个镜像文件

  • 容器:运行起来的镜像

    容器,就是镜像运行起来 相当一个进程,所以容器是有生命的

  • 中央仓库|注册中心:超级码头,上面放的就是集装箱

    中央仓库存放的 就是集装箱

镜像:镜像是docker的前置条件,就比如你需要电脑上安装一个app,前提是你得去软件中心下载它所对应的exe安装包;如果你要在docker中你需要构建一个mysql容器,那么你得先准备一个mysql镜像;

容器::容器是从镜像创建的应用运行实例,容器之间是相互隔离、互不可见、互不影响,可以分别将其启动、开始、停止、删除;每个容器都有唯一的标识ID,只需要操作id或者名称加版本就可以;

仓库: 类似代码仓库,是集中存放 Docker 镜像文件的地方。最大的公开仓库是官方提供的 Docker Hub,其中存放着数量庞大的镜像供我们下载使用。国内也有不少云服务提供商也提供了仓库的本地源,为我们提供稳定的国内访问。我们创建好自有镜像后就可以使用 push 命令将它上传到指定的公有或者私有仓库。这样其他人就可以在另外一台机器上下载并使用该镜像,这很像 Git 代码仓库的管理与使用方式。

举例说明:

我需要盖一座别墅,于是我找设计人员设计结构、运输原材料、建筑工人盖房子等等一系列操作,花了很长时间才盖好;住了一段时间,我想去海边住,我还想要现在这种结构和布局,那么又得按照原来的方式找设计人员设计结构、运输原材料、建筑工人盖房子等等一系列操作,这时候出现一个魔法师,他可以将我的别墅复制一份做成镜像,到了海边,我就用这个镜像复制一套别墅,直接入住。
​
回归实际开发运维环境中,别墅就是一套系统,盖房的过程就是项目部署过程(安装mysql/postgres、jdk、redis、nginx、中间件、配置各种环境等等),但是每部署一套系统都需要重复步骤,很花费精力和时间,而且还需要考虑版本兼容问题; 那么我们就用docker来解决这个问题;用docker部署好之后,只需要重新拉取镜像随便复制一份就可以,不用再关注版本、兼容、部署等问题。

三、Docker的安装


3.1 下载Docker依赖的环境

想安装Docker,需要先将依赖的环境全部下载,就像Maven依赖JDK一样

yum -y install yum-utils device-mapper-persistent-data lvm2
#这个命令是在Linux系统中使用yum包管理器安装一些必要的工具和程序。
#具体来说,yum -y install 是用于安装软件包的命令,yum-utils、device-mapper-persistent-data #和 lvm2 是要安装的软件包名。

3.2 指定Docker镜像源

默认下载Docker回去国外服务器下载,速度较慢,我们可以设置为阿里云镜像源,速度更快

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3.3 安装Docker

依然采用yum的方式安装

yum makecache fast
#yum makecache fast是在基于 RPM 包的Linux系统(如 CentOS、RHEL 等)中使用 Yum 包管理器的一个命令。这个命令的主要作用是更新 Yum 的缓存。
​
yum -y install docker-ce
#是一个用于在基于Red Hat的系统(如CentOS)上安装Docker社区版(Docker CE)的命令

3.4 启动Docker并测试

安装成功后,需要手动启动,设置为开机自启,并测试一下Docker

启动docker 服务

[root@iZbp1j6fkea3l6uzex533aZ ~]# systemctl start docker
​

配置docker 开机自启动

[root@iZbp1j6fkea3l6uzex533aZ ~]# systemctl enable docker
​

测试docker

# 测试
docker run hello-world
docker run hello-world 是一个 Docker 命令,用于运行一个名为 hello-world 的 Docker 容器。这个命令首先会在本地查找 hello-world 镜像,如果没有找到,Docker 会自动从 Docker Hub 上下载这个镜像,然后运行这个镜像,输出 "Hello from Docker!" 并退出。
这个命令通常用于验证 Docker 是否正确安装,并可以正常运行。
如果你想要执行这个命令,你需要先安装 Docker。安装完成后,打开命令行或终端,输入 docker run hello-world 并回车

image-20231228112741161

四、Docker的中央仓库【重点

中央仓库:就是存放docker 镜像的网站

###


在自己的机器中配置 阿里云的docker 镜像仓库

1.创建文件件

[root@iZbp1j6fkea3l6uzex533aZ ~]# mkdir -p /etc/docker

2.创建 /etc/docker/daemon.json

[root@iZbp1j6fkea3l6uzex533aZ ~]# vim /etc/docker/daemon.json

{
"registry-mirrors": ["https://66zydtxx.mirror.aliyuncs.com"]
}

image-20231228114332288

3.重置docker

[root@iZbp1j6fkea3l6uzex533aZ ~]# systemctl daemon-reload
[root@iZbp1j6fkea3l6uzex533aZ ~]# systemctl restart docker 

五、镜像的操作【重点

镜像 == 集装箱 === 运行的环境 + 软件 ,本质上是镜像文件

本地镜像仓库如何定位一个镜像?

  • 镜像名+版本

  • 镜像id

5.2 查看本地全部镜像

查看本地已经安装过的镜像信息,包含标识,名称,版本,更新时间,大小

docker images

image-20231228114947803

5.3 删除本地镜像

镜像会占用磁盘空间,可以直接手动删除,表示通过查看获取

docker rmi 镜像的标识     #删除没有容器占用的镜像
docker rmi -f 镜像的标识   # 强制删除镜像(不管容器是否有占用镜像)

[root@iZbp1j6fkea3l6uzex533aZ ~]# docker rmi hello-world:latest
Error response from daemon: conflict: unable to remove repository reference "hello-world:latest" (must force) - container e36f54fc1f00 is using its referenced image d2c94e258dcb
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker rmi -f hello-world:latest
#它会试图删除名为 "hello-world" 标签为 "latest" 的镜像。
Untagged: hello-world:latest
Untagged: hello-world@sha256:ac69084025c660510933cca701f615283cdbb3aa0963188770b54c31c8962493
Deleted: sha256:d2c94e258dcb3c5ac2798d32e1249e42ef01cba4841c2234249495f87264ac5a
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

image-20231228115420576

5.1拉去镜像

从中央仓库拉取镜像到本地

docker pull 镜像名称[:tag]

# 举个栗子:docker pull daocloud.io/library/tomcat:8.5.15-jre8

[root@iZbp1j6fkea3l6uzex533aZ ~]# docker pull hello-world:latest


latest: Pulling from library/hello-world
2db29710123e: Pull complete 
Digest: sha256:2498fce14358aa50ead0cc6c19990fc6ff866ce72aeb5546e1d59caac3d0d60f
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest
[root@iZbp1j6fkea3l6uzex533aZ ~]# 
[root@iZbp1j6fkea3l6uzex533aZ ~]# 
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED       SIZE
hello-world   latest    feb5d9fea6a5   2 years ago   13.3kB

5.4 镜像的导入导出

如果因为网络原因可以通过硬盘的方式传输镜像,虽然不规范,但是有效,但是这种方式导出的镜像名称和版本都是null,需要手动修改

将本地的镜像导出

docker save -o 导出的路径 镜像id/镜像名:版本

[root@iZbp1j6fkea3l6uzex533aZ ~]# docker images
REPOSITORY                   TAG           IMAGE ID       CREATED       SIZE
hello-world                  latest        feb5d9fea6a5   2 years ago   13.3kB
centos                       latest        5d0da3dc9764   2 years ago   231MB
daocloud.io/library/tomcat   8.5.15-jre8   b8dfe9ade316   6 years ago   334MB
daocloud.io/library/mysql    5.7.4         aa5364eb3d85   9 years ago   252MB
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker  save -o  hello.tar.gz  feb5d9fea6a5
[root@iZbp1j6fkea3l6uzex533aZ ~]# ls d
-  b_backup.txt  hello.tar.gz  jdk-8u211-linux-x64.tar.gz  test  test2  test5  testzip

加载本地的镜像文件

docker load -i 镜像文件
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker rmi feb5d9fea6a5
Untagged: hello-world:latest
Untagged: hello-world@sha256:2498fce14358aa50ead0cc6c19990fc6ff866ce72aeb5546e1d59caac3d0d60f
Deleted: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412
Deleted: sha256:e07ee1baac5fae6a26f30cabfe54a36d3402f96afda318fe0a96cec4ca393359
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker images
REPOSITORY                   TAG           IMAGE ID       CREATED       SIZE
centos                       latest        5d0da3dc9764   2 years ago   231MB
daocloud.io/library/tomcat   8.5.15-jre8   b8dfe9ade316   6 years ago   334MB
daocloud.io/library/mysql    5.7.4         aa5364eb3d85   9 years ago   252MB
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker load -i  hello.tar.gz
e07ee1baac5f: Loading layer  14.85kB/14.85kB
Loaded image ID: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker images
REPOSITORY                   TAG           IMAGE ID       CREATED       SIZE
<none>                       <none>        feb5d9fea6a5   2 years ago   13.3kB
centos                       latest        5d0da3dc9764   2 years ago   231MB
daocloud.io/library/tomcat   8.5.15-jre8   b8dfe9ade316   6 years ago   334MB
daocloud.io/library/mysql    5.7.4         aa5364eb3d85   9 years ago   252MB
[root@iZbp1j6fkea3l6uzex533aZ ~]# 

image-20231228143406116

修改镜像名称 docker tag 镜像id 新镜像名称:版本

[root@iZbp1j6fkea3l6uzex533aZ ~]# docker images
REPOSITORY                   TAG           IMAGE ID       CREATED       SIZE
<none>                       <none>        feb5d9fea6a5   2 years ago   13.3kB
centos                       latest        5d0da3dc9764   2 years ago   231MB
daocloud.io/library/tomcat   8.5.15-jre8   b8dfe9ade316   6 years ago   334MB
daocloud.io/library/mysql    5.7.4         aa5364eb3d85   9 years ago   252MB
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker tag  feb5d9fea6a5  hello-world:v1 
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker images
REPOSITORY                   TAG           IMAGE ID       CREATED       SIZE
hello-world                  v1            feb5d9fea6a5   2 years ago   13.3kB
centos                       latest        5d0da3dc9764   2 years ago   231MB
daocloud.io/library/tomcat   8.5.15-jre8   b8dfe9ade316   6 years ago   334MB
daocloud.io/library/mysql    5.7.4         aa5364eb3d85   9 years ago   252MB
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker run  hello-world:v1

image-20231228143630944

六、容器操作【重点

容器:运行起来的镜像,他是有生命的,相当于 一个进程

6.1 运行容器

运行容器需要制定具体镜像,如果镜像不存在,会直接下载

# 简单操作
docker run 镜像的标识|镜像名称[:tag]

# 常用的参数
docker run -d -p 宿主机端口:容器端口 --name 容器名称 镜像的标识|镜像名称[:tag]
# -d:代表后台运行容器
# -p 宿主机端口:容器端口:为了映射当前Linux的端口和容器的端口
# --name 容器名称:指定容器的名称
docker run  --name tomcat  -p 8089:8080     daocloud.io/library/tomcat:8.5.15-jre8

image-20231228144240584

原理解析:

image-20231228144758714

6.2 查看正在运行的容器

查看全部正在运行的容器信息

docker ps [-qa]
# -a:查看全部的容器,包括没有运行
# -q:只查看容器的标识

docker ps -a

docker ps   #查看所有正在运行的容器 

image-20231228145153526

[root@iZbp1j6fkea3l6uzex533aZ ~]# docker ps  -a  #查看所有容器,包含停止的容器

image-20231228145354406

[root@iZbp1j6fkea3l6uzex533aZ ~]# docker ps -q  #查看所有运行的容器id
997d09e216b9
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker ps -aq  #查看所有容器的id 
997d09e216b9
cc38f347fc5e
e36f54fc1f00
[root@iZbp1j6fkea3l6uzex533aZ ~]# 
6.3 查看容器日志

查看容器日志,以查看容器运行的信息

docker logs -f 容器id
# -f:可以滚动查看日志的最后几行

[root@iZbp1j6fkea3l6uzex533aZ ~]# docker logs -f tomcat    都是查看容器的日志

[root@iZbp1j6fkea3l6uzex533aZ ~]# docker logs -f 997d09e216b9

image-20231228145815614

6.4 进入容器内容部

可以进入容器内部进行操作

docker exec -it 容器id/容器名   bash

[root@iZbp1j6fkea3l6uzex533aZ ~]# docker exec  -it 997d09e216b9  bash  #都可以进入容器内部
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker exec  -it tomcat  bash

image-20231228150158831

####

6.5 复制内容到容器

将宿主机的文件复制到容器内部的指定目录

docker cp 文件名称 容器id:容器内部路径
docker cp anaconda-ks.cfg 7dc71755d22c:/usr/local/tomcat/

[root@iZbp1j6fkea3l6uzex533aZ ~]# ls
-  b_backup.txt  hello.tar.gz  jdk-8u211-linux-x64.tar.gz  test  test2  test5  testzip
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker cp  b_backup.txt  tomcat:/usr/local/tomcat
Successfully copied 2.05kB to tomcat:/usr/local/tomcat
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker exec -it tomcat bash
root@997d09e216b9:/usr/local/tomcat# ls
LICENSE  NOTICE  RELEASE-NOTES	RUNNING.txt  b_backup.txt  bin	conf  include  lib  logs  native-jni-lib  temp	webapps  work
root@997d09e216b9:/usr/local/tomcat# exit
exit
[root@iZbp1j6fkea3l6uzex533aZ ~]# 

6.6 重启&启动&停止&删除容器

容器的启动,停止,删除等操作,后续经常会使用到

docker  run  镜像名:版本           # 创建 并启动一个容器

# 重新启动容器   仅仅启动容器,并没有创建
docker restart 容器id/容器名


# 启动停止运行的容器  仅仅启动容器,并没有创建
docker start 容器id/容器名 




# 停止指定的容器(删除容器前,需要先停止容器)
docker stop 容器id


删除容器

# 删除指定容器    只能删除停止的容器   
docker rm 容器id/容器名 


# 删除全部容器
docker rm $(docker ps -qa)
#删除运行中的容器
docker rm -f  7dc71755d22c

删除停止的容器

[root@iZbp1j6fkea3l6uzex533aZ ~]# docker ps -a
CONTAINER ID   IMAGE                                    COMMAND             CREATED          STATUS                      PORTS                                       NAMES
997d09e216b9   daocloud.io/library/tomcat:8.5.15-jre8   "catalina.sh run"   29 minutes ago   Up 56 seconds               0.0.0.0:8089->8080/tcp, :::8089->8080/tcp   tomcat
cc38f347fc5e   hello-world:v1                           "/hello"            35 minutes ago   Exited (0) 35 minutes ago                                               nice_nobel
e36f54fc1f00   d2c94e258dcb                             "/hello"            4 hours ago      Exited (0) 4 hours ago                                                  practical_wright
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker rm nice_nobel
nice_nobel
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker ps -a
CONTAINER ID   IMAGE                                    COMMAND             CREATED          STATUS                   PORTS                                       NAMES
997d09e216b9   daocloud.io/library/tomcat:8.5.15-jre8   "catalina.sh run"   29 minutes ago   Up About a minute        0.0.0.0:8089->8080/tcp, :::8089->8080/tcp   tomcat
e36f54fc1f00   d2c94e258dcb                             "/hello"            4 hours ago      Exited (0) 4 hours ago                                               practical_wright
[root@iZbp1j6fkea3l6uzex533aZ ~]# 

强制删除正在运行的容器

[root@iZbp1j6fkea3l6uzex533aZ ~]# docker ps -a
CONTAINER ID   IMAGE                                    COMMAND             CREATED          STATUS                   PORTS                                       NAMES
997d09e216b9   daocloud.io/library/tomcat:8.5.15-jre8   "catalina.sh run"   29 minutes ago   Up About a minute        0.0.0.0:8089->8080/tcp, :::8089->8080/tcp   tomcat
e36f54fc1f00   d2c94e258dcb                             "/hello"            4 hours ago      Exited (0) 4 hours ago                                               practical_wright
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker rm tomcat
Error response from daemon: You cannot remove a running container 997d09e216b9c764ee751a074a03c70ef85d3b119d4c610164b38254e066da30. Stop the container before attempting removal or force remove
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker rm -f tomcat
tomcat
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND    CREATED       STATUS                   PORTS     NAMES
e36f54fc1f00   d2c94e258dcb   "/hello"   4 hours ago   Exited (0) 4 hours ago             practical_wright

image-20231228151300652

删除所有容器

[root@iZbp1j6fkea3l6uzex533aZ ~]# docker rm -f $(docker ps -aq)
e36f54fc1f00
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

注意事项
  • 容器的名字不可以重复

  • 多个容器不可映射同一个宿主机端口

[root@iZbp1j6fkea3l6uzex533aZ ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker run  --name tomcat  -p 8089:8080  -d   daocloud.io/library/tomcat:8.5.15-jre8
0e1fba8ffa01609b388a9c2a0863e66db79ccab7da5ff10b0d67cdc7bd929922
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker ps -a
CONTAINER ID   IMAGE                                    COMMAND             CREATED         STATUS         PORTS                                       NAMES
0e1fba8ffa01   daocloud.io/library/tomcat:8.5.15-jre8   "catalina.sh run"   4 seconds ago   Up 3 seconds   0.0.0.0:8089->8080/tcp, :::8089->8080/tcp   tomcat
[root@iZbp1j6fkea3l6uzex533aZ ~]# 
[root@iZbp1j6fkea3l6uzex533aZ ~]# 
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker run  --name tomcat  -p 8089:8080  -d   daocloud.io/library/tomcat:8.5.15-jre8
docker: Error response from daemon: Conflict. The container name "/tomcat" is already in use by container "0e1fba8ffa01609b388a9c2a0863e66db79ccab7da5ff10b0d67cdc7bd929922". You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker ps -a
CONTAINER ID   IMAGE                                    COMMAND             CREATED              STATUS              PORTS                                       NAMES
0e1fba8ffa01   daocloud.io/library/tomcat:8.5.15-jre8   "catalina.sh run"   About a minute ago   Up About a minute   0.0.0.0:8089->8080/tcp, :::8089->8080/tcp   tomcat
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker run  --name tomcat2  -p 8089:8080  -d   daocloud.io/library/tomcat:8.5.15-jre8
bdc7ec5f59f971f8d77174d1cee05dcbaccaa7c8e65b3d0029271c72c64bfc6f
docker: Error response from daemon: driver failed programming external connectivity on endpoint tomcat2 (dab800bc30067b244a47b139f761959ac32acc846692218c40a2983f1a600586): Bind for 0.0.0.0:8089 failed: port is already allocated.
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker ps -a
CONTAINER ID   IMAGE                                    COMMAND             CREATED          STATUS         PORTS                                       NAMES
bdc7ec5f59f9   daocloud.io/library/tomcat:8.5.15-jre8   "catalina.sh run"   44 seconds ago   Created                                                    tomcat2
0e1fba8ffa01   daocloud.io/library/tomcat:8.5.15-jre8   "catalina.sh run"   2 minutes ago    Up 2 minutes   0.0.0.0:8089->8080/tcp, :::8089->8080/tcp   tomcat
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker rm tomcat2
tomcat2
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker run  --name tomcat2  -p 8080:8080  -d   daocloud.io/library/tomcat:8.5.15-jre8
ad9930b05cd24e18c42cd1da83dc3b32422a72bc4fa31a83ef6164651bae4cb7
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker ps -a
CONTAINER ID   IMAGE                                    COMMAND             CREATED         STATUS         PORTS                                       NAMES
ad9930b05cd2   daocloud.io/library/tomcat:8.5.15-jre8   "catalina.sh run"   4 seconds ago   Up 4 seconds   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   tomcat2
0e1fba8ffa01   daocloud.io/library/tomcat:8.5.15-jre8   "catalina.sh run"   3 minutes ago   Up 3 minutes   0.0.0.0:8089->8080/tcp, :::8089->8080/tcp   tomcat
[root@iZbp1j6fkea3l6uzex533aZ ~]# 

image-20231228163341794

七、Docker应用


7.1 Docker安装Tomcat

运行Tomcat容器

docker run -d -p 8080:8080 --name tomcat daocloud.io/library/tomcat:8.5.15-jre8

7.2 Docker安装MySQL

运行MySQL容器

docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root daocloud.io/library/mysql:5.7.4


-d 后台运行
 -p 3306:3306  宿主机端口3306 映射到 mysql容器3306
 --name mysql  设置容器的名字
  -e MYSQL_ROOT_PASSWORD=root     设置mysql 超级管理的密码是root 

[root@iZbp1j6fkea3l6uzex533aZ ~]# docker ps -a
CONTAINER ID   IMAGE                                    COMMAND             CREATED         STATUS         PORTS                                       NAMES
ad9930b05cd2   daocloud.io/library/tomcat:8.5.15-jre8   "catalina.sh run"   4 minutes ago   Up 4 minutes   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   tomcat2
0e1fba8ffa01   daocloud.io/library/tomcat:8.5.15-jre8   "catalina.sh run"   8 minutes ago   Up 7 minutes   0.0.0.0:8089->8080/tcp, :::8089->8080/tcp   tomcat
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root daocloud.io/library/mysql:5.7.4
99b2c785e487e11bc6bbbcfdda1f56e8dfd1832fe36e03bd17f562f09eb6bb18
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker ps -a
CONTAINER ID   IMAGE                                    COMMAND                  CREATED          STATUS          PORTS                                       NAMES
99b2c785e487   daocloud.io/library/mysql:5.7.4          "/entrypoint.sh mysq…"   25 seconds ago   Up 24 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp   mysql
ad9930b05cd2   daocloud.io/library/tomcat:8.5.15-jre8   "catalina.sh run"        4 minutes ago    Up 4 minutes    0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   tomcat2
0e1fba8ffa01   daocloud.io/library/tomcat:8.5.15-jre8   "catalina.sh run"        8 minutes ago    Up 8 minutes    0.0.0.0:8089->8080/tcp, :::8089->8080/tcp   tomcat
[root@iZbp1j6fkea3l6uzex533aZ ~]# 

image-20231228163855281

八、数据卷【重点

数据卷:就是一种特殊的文件夹,他的作用就是完成宿主机文件 和 容器内部文件之间一一映射 ,达到的目的就是用户访问修改宿主机文件 就可以实时 同步到 容器的文件中

image-20231228164448338

数据卷分类:

  • 创建的数据卷

  • 普通的文件夹(非/root)

数据卷

前提条件

[root@iZbp1j6fkea3l6uzex533aZ ~]# docker rm -f $(docker ps -aq)  #清空所有容器

8.1 创建数据卷

创建数据卷之后,默认会存放在一个目录下 /var/lib/docker/volumes/数据卷名称/_data

docker volume create 数据卷名称

image-20231228165002057

####

[root@iZbp1j6fkea3l6uzex533aZ ~]# docker volume create vdata1
vdata1
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker volume create vdata2
vdata2
[root@iZbp1j6fkea3l6uzex533aZ ~]# 

8.3 查看全部数据卷

查看全部数据卷信息

docker volume ls

[root@iZbp1j6fkea3l6uzex533aZ ~]# docker volume ls
DRIVER    VOLUME NAME
local     84390a58e347214034ce7fbcebcb0799794eacc41d0de131140e7adec5c5d5a8
local     vdata1
local     vdata2

8.2 查看数据卷详情

查看数据卷的详细信息,可以查询到存放路径,创建时间等等

docker volume inspect 数据卷名称

[root@iZbp1j6fkea3l6uzex533aZ ~]# docker volume inspect vdata1

image-20231228165314134

8.4 删除数据卷

删除指定数据卷

docker volume rm 数据卷名称
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker volume ls
DRIVER    VOLUME NAME
local     84390a58e347214034ce7fbcebcb0799794eacc41d0de131140e7adec5c5d5a8
local     vdata1
local     vdata2
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker volume rm vdata2
vdata2
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker volume ls
DRIVER    VOLUME NAME
local     84390a58e347214034ce7fbcebcb0799794eacc41d0de131140e7adec5c5d5a8
local     vdata1
[root@iZbp1j6fkea3l6uzex533aZ ~]# 

8.5 容器映射数据卷的使用
# 通过数据卷名称映射
docker run -v 数据卷名称:容器内部的路径 镜像id/镜像名 

docker run -v vdata1:/usr/local/tomcat/conf -d -p 8089:8080 --name tomcat daocloud.io/library/tomcat:8.5.15-jre8

[root@iZbp1j6fkea3l6uzex533aZ ~]# 
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker run -v vdata1:/usr/local/tomcat/conf -d -p 8089:8080 --name tomcat daocloud.io/library/tomcat:8.5.15-jre8
3cb4db05358896ae3694041bc79aca4ae705ce374ef0bb27af480838e2d5ec53
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker ps -a
CONTAINER ID   IMAGE                                    COMMAND             CREATED         STATUS         PORTS                                       NAMES
3cb4db053588   daocloud.io/library/tomcat:8.5.15-jre8   "catalina.sh run"   5 seconds ago   Up 5 seconds   0.0.0.0:8089->8080/tcp, :::8089->8080/tcp   tomcat
[root@iZbp1j6fkea3l6uzex533aZ ~]# 
[root@iZbp1j6fkea3l6uzex533aZ ~]# 
[root@iZbp1j6fkea3l6uzex533aZ ~]# ls /var/lib/docker/volumes/vdata1/_data/
Catalina         catalina.properties  jaspic-providers.xml  logging.properties  tomcat-users.xml  web.xml
catalina.policy  context.xml          jaspic-providers.xsd  server.xml          tomcat-users.xsd
[root@iZbp1j6fkea3l6uzex533aZ ~]# cd /var/lib/docker/volumes/vdata1/_data/
[root@iZbp1j6fkea3l6uzex533aZ _data]# 
[root@iZbp1j6fkea3l6uzex533aZ _data]# 
[root@iZbp1j6fkea3l6uzex533aZ _data]# 
[root@iZbp1j6fkea3l6uzex533aZ _data]# ls
Catalina         catalina.properties  jaspic-providers.xml  logging.properties  tomcat-users.xml  web.xml
catalina.policy  context.xml          jaspic-providers.xsd  server.xml          tomcat-users.xsd
[root@iZbp1j6fkea3l6uzex533aZ _data]# touch a.txt
[root@iZbp1j6fkea3l6uzex533aZ _data]# vim a.txt 
[root@iZbp1j6fkea3l6uzex533aZ _data]# 
[root@iZbp1j6fkea3l6uzex533aZ _data]# ls
a.txt     catalina.policy      context.xml           jaspic-providers.xsd  server.xml        tomcat-users.xsd
Catalina  catalina.properties  jaspic-providers.xml  logging.properties    tomcat-users.xml  web.xml
[root@iZbp1j6fkea3l6uzex533aZ _data]# docker exec -it tomcat bash
#进入内部的shell
root@3cb4db053588:/usr/local/tomcat# cd  conf/
root@3cb4db053588:/usr/local/tomcat/conf# ls
Catalina  catalina.policy      context.xml	     jaspic-providers.xsd  server.xml	     tomcat-users.xsd
a.txt	  catalina.properties  jaspic-providers.xml  logging.properties    tomcat-users.xml  web.xml
root@3cb4db053588:/usr/local/tomcat/conf# cat a.txt 
hello world
root@3cb4db053588:/usr/local/tomcat/conf# 

image-20231228170221877

普通的文件夹作为数据卷
docker run -it -v /tmp/conf:/soft centos /bin/bash

-v /tmp/conf:/soft  将宿主机文件夹 映射到 容器内部文件夹 

[root@iZbp1j6fkea3l6uzex533aZ ~]# docker run -it -v /tmp/conf:/soft centos /bin/bash
[root@f63e0cfee361 /]# 
[root@f63e0cfee361 /]# 
[root@f63e0cfee361 /]# 
[root@f63e0cfee361 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  soft  srv	sys  tmp  usr  var
[root@f63e0cfee361 /]# cd soft/
[root@f63e0cfee361 soft]# ls
[root@f63e0cfee361 soft]# touch a.txt
[root@f63e0cfee361 soft]# vim a.txt 
bash: vim: command not found
[root@f63e0cfee361 soft]# vi a.txt 
[root@f63e0cfee361 soft]# 
[root@f63e0cfee361 soft]# exit
exit
[root@iZbp1j6fkea3l6uzex533aZ ~]# ls /tmp/conf/
a.txt
[root@iZbp1j6fkea3l6uzex533aZ ~]# cat /tmp/conf/a.txt 
6666
[root@iZbp1j6fkea3l6uzex533aZ ~]# 

image-20231228170821950

九. Docker-Compose【重点


Docker-Compose: 作用就是对docker 命令的再次封装, 目的就是可以让我们一次性启动/停止 多个容器,并且维护容器之间的依赖关系

1.安装

1.下载docker-compose

image-20231229094735193

2.上传到liux

image-20231229094924619

3.设置权限

[root@iZbp1j6fkea3l6uzex533aZ ~]# ls
-  b_backup.txt  docker-compose-Linux-x86_64  hello.tar.gz  jdk-8u211-linux-x64.tar.gz  test  test2  test5  testzip
[root@iZbp1j6fkea3l6uzex533aZ ~]# mv docker-compose-Linux-x86_64 docker-compose
[root@iZbp1j6fkea3l6uzex533aZ ~]# ls
-  b_backup.txt  docker-compose  hello.tar.gz  jdk-8u211-linux-x64.tar.gz  test  test2  test5  testzip
[root@iZbp1j6fkea3l6uzex533aZ ~]# chmod 777 docker-compose 
[root@iZbp1j6fkea3l6uzex533aZ ~]# ls -l
total 206264
drwxr-xr-x 2 root root      4096 Dec 27 11:18 -
-rwxr-xr-x 1 root root        12 Dec 27 16:57 b_backup.txt
-rwxrwxrwx 1 root root  16168192 Dec 29 09:49 docker-compose
-rw------- 1 root root     23040 Dec 28 14:31 hello.tar.gz
-rw-r--r-- 1 root root 194990602 Dec 28 10:17 jdk-8u211-linux-x64.tar.gz
drwxrwxr-x 3 root root      4096 Dec 27 15:57 test
drwxr-xr-x 3 root root      4096 Dec 27 15:59 test2
drwxr-xr-x 5 root root      4096 Dec 27 15:50 test5
drwxr-xr-x 3 root root      4096 Dec 27 16:05 testzip
[root@iZbp1j6fkea3l6uzex533aZ ~]# 

4.配置docker-compose 环境变量

移动docker-compose 文件

[root@iZbp1j6fkea3l6uzex533aZ ~]# mv docker-compose /usr/local/bin
[root@iZbp1j6fkea3l6uzex533aZ ~]# ls /usr/local/bin/
chardetect  cloud-init      docker-compose  easy_install-3.6  jsondiff   jsonpointer
cloud-id    cloud-init-per  easy_install    easy_install-3.8  jsonpatch  jsonschema

配置环境变量

[root@iZbp1j6fkea3l6uzex533aZ ~]# vim /etc/profile

image-20231229095436476

让环境变量生效

[root@iZbp1j6fkea3l6uzex533aZ ~]# source /etc/profile

测试

[root@iZbp1j6fkea3l6uzex533aZ ~]# docker-compose 

2 Docker-Compose管理MySQL和Tomcat容器

docker-compose 命令在执行时,要求当前命令行必须有对应的docker-compose.yaml 文件,docker-compose 命令执行必须依赖 docker-compose.yaml 去获取需要执行的镜像

yml文件以key: value方式来指定配置信息

多个配置信息以换行+缩进的方式来区分

在docker-compose.yml文件中,不要使用制表符

前提条件

[root@iZbp1j6fkea3l6uzex533aZ test]# docker rm -f $(docker ps -aq)
da6ed10e92fe
f63e0cfee361
[root@iZbp1j6fkea3l6uzex533aZ test]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

1.创建docker-compose.yaml

[root@iZbp1j6fkea3l6uzex533aZ ~]# pwd
/root
[root@iZbp1j6fkea3l6uzex533aZ ~]# mkdir java2313
[root@iZbp1j6fkea3l6uzex533aZ ~]# cd java2313/
[root@iZbp1j6fkea3l6uzex533aZ java2313]# mkdir test
[root@iZbp1j6fkea3l6uzex533aZ java2313]# cd test/
[root@iZbp1j6fkea3l6uzex533aZ test]# pwd
/root/java2313/test
root@iZbp1j6fkea3l6uzex533aZ test]# vim docker-compose.yaml 

version: '3.1'
services:
  mysql:           # 服务的名称
    restart: always   # 代表只要docker启动,那么这个容器就跟着一起启动
    image: daocloud.io/library/mysql:5.7.4  # 指定镜像路径
    container_name: mysql  # 指定容器名称
    ports:
      - 3306:3306   #  指定端口号的映射
    environment:
      MYSQL_ROOT_PASSWORD: root   # 指定MySQL的ROOT用户登录密码
      TZ: Asia/Shanghai        # 指定时区
    volumes:
     - /opt/docker_mysql_tomcat/mysql_data:/var/lib/mysql   # 映射数据卷
  tomcat:
    restart: always
    image: daocloud.io/library/tomcat:8.5.15-jre8
    container_name: tomcat
    ports:
      - 8080:8080
    environment:
      TZ: Asia/Shanghai
    volumes:
      - /opt/docker_mysql_tomcat/tomcat_webapps:/usr/local/tomcat/webapps
      - /opt/docker_mysql_tomcat/tomcat_logs:/usr/local/tomcat/logs

image-20231229103511933

2.使用docker-compose 启动多个容器

前台启动多个容器

[root@iZbp1j6fkea3l6uzex533aZ test]# ls
docker-compose.yaml

[root@iZbp1j6fkea3l6uzex533aZ test]# docker-compose  up   #前台启动

image-20231229104237538

查看由docker-compose.yaml管理的容器

[root@iZbp1j6fkea3l6uzex533aZ ~]# cd java2314/test/
[root@iZbp1j6fkea3l6uzex533aZ test]# ls
docker-compose.yaml
[root@iZbp1j6fkea3l6uzex533aZ test]# docker-compose ps

image-20231229104452243

  1. 开启|关闭|重启已经存在的由docker-compose维护的容器 docker-compose start|stop|restart

[root@iZbp1j6fkea3l6uzex533aZ test]# docker-compose stop
Stopping mysql  ... done
Stopping tomcat ... done
[root@iZbp1j6fkea3l6uzex533aZ test]# docker-compose restart
Restarting mysql  ... done
Restarting tomcat ... done
[root@iZbp1j6fkea3l6uzex533aZ test]# docker-compose ps
 Name               Command               State                    Ports                  
------------------------------------------------------------------------------------------
mysql    /entrypoint.sh mysqld --da ...   Up      0.0.0.0:3306->3306/tcp,:::3306->3306/tcp
tomcat   catalina.sh run                  Up      0.0.0.0:8080->8080/tcp,:::8080->8080/tcp
[root@iZbp1j6fkea3l6uzex533aZ test]# 
  1. 查看日志 docker-compose logs -f

[root@iZbp1j6fkea3l6uzex533aZ test]# docker-compose logs -f

  1. 关闭并删除容器 docker-compose down

[root@iZbp1j6fkea3l6uzex533aZ test]# docker-compose down
Stopping mysql  ... done
Stopping tomcat ... done
Removing mysql  ... done
Removing tomcat ... done
Removing network test_default
[root@iZbp1j6fkea3l6uzex533aZ test]# 
[root@iZbp1j6fkea3l6uzex533aZ test]# 
[root@iZbp1j6fkea3l6uzex533aZ test]# 
[root@iZbp1j6fkea3l6uzex533aZ test]# 
[root@iZbp1j6fkea3l6uzex533aZ test]# docker-compose ps
Name   Command   State   Ports
------------------------------

image-20231229105204703

十、dockerc-compose 的应用

前提条件 删除所有容器

[root@iZbp1j6fkea3l6uzex533aZ test]# docker rm -f $(docker ps -aq)
6a4d4656b4b1
[root@iZbp1j6fkea3l6uzex533aZ test]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

1.使用docker-compose 安装redis单机版
  1. 创建配置文件

[root@iZbp1j6fkea3l6uzex533aZ java2313]# pwd
/root/java2313
[root@iZbp1j6fkea3l6uzex533aZ java2313]# mkdir  redis01
[root@iZbp1j6fkea3l6uzex533aZ java2313]# cd redis01/
[root@iZbp1j6fkea3l6uzex533aZ redis01]# vim docker-compose.yaml
version: '3.1'
services:
  redis:
    image: daocloud.io/library/redis:5.0.7
    restart: always
    container_name: redis
    environment:
      - TZ=Asia/Shanghai
    ports:
      - 6379:6379

2.启动

[root@iZbp1j6fkea3l6uzex533aZ redis01]# docker-compose up

3.新建一个终端测试

[root@iZbp1j6fkea3l6uzex533aZ ~]# docker ps
CONTAINER ID   IMAGE                             COMMAND                  CREATED          STATUS          PORTS                                       NAMES
7b113eed6954   daocloud.io/library/redis:5.0.7   "docker-entrypoint.s…"   17 seconds ago   Up 16 seconds   0.0.0.0:6379->6379/tcp, :::6379->6379/tcp   redis
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker exec -it redis bash
root@7b113eed6954:/data# ls
root@7b113eed6954:/data# redis-cli 
127.0.0.1:6379> set a  1
OK
127.0.0.1:6379> get a
"1"
127.0.0.1:6379> 

image-20231229113037268

2.配置redis的持久化机制
RDB

RDB:其实就是redis每隔一段时间,会将redis整个内存的数据,生成一个镜像文件,redis重启时加载镜像文件到磁盘

RDB是Redis默认的持久化机制

  • RDB持久化文件,速度比较快,而且存储的是一个二进制的文件,传输起来很方便。

  • RDB持久化的时机:

    save 900 1:在900秒内,有1个key改变了,就执行RDB持久化。

    save 300 10:在300秒内,有10个key改变了,就执行RDB持久化。

    save 60 10000:在60秒内,有10000个key改变了,就执行RDB持久化。

  • RDB无法保证数据的绝对安全。

AOF

AOF机制:就是redis 所有增删改命令的执行 都会记录到aof 日志中,redis再次启动时,就会读取aof中的命令,重新执行一遍到redis 内存

AOF持久化机制默认是关闭的,Redis官方推荐同时开启RDB和AOF持久化,更安全,避免数据丢失。

  • AOF持久化的速度,相对RDB较慢的,存储的是一个文本文件,到了后期文件会比较大,传输困难。

  • AOF持久化时机。

    appendfsync always:每执行一个写操作,立即持久化到AOF文件中,性能比较低。 appendfsync everysec:每秒执行一次持久化。 appendfsync no:会根据你的操作系统不同,环境的不同,在一定时间内执行一次持久化。

  • AOF相对RDB更安全,推荐同时开启AOF和RDB。

实战

前提条件关闭redis单机版

[root@iZbp1j6fkea3l6uzex533aZ redis01]# docker-compose down
Removing redis ... done
Removing network redis01_default
[root@iZbp1j6fkea3l6uzex533aZ redis01]# 

1.创建redis 配置文件

[root@iZbp1j6fkea3l6uzex533aZ java2313]# pwd
/root/java2313
[root@iZbp1j6fkea3l6uzex533aZ java2313]# ls
redis01  test
[root@iZbp1j6fkea3l6uzex533aZ java2313]# mkdir redis02
[root@iZbp1j6fkea3l6uzex533aZ java2313]# cd redis02
[root@iZbp1j6fkea3l6uzex533aZ redis02]# ls
[root@iZbp1j6fkea3l6uzex533aZ redis02]# vim docker-compose.yaml

version: '3.1'
services:
  redis:
    image: daocloud.io/library/redis:5.0.7
    restart: always
    container_name: redis
    environment:
      - TZ=Asia/Shanghai
    ports:
      - 6379:6379
    volumes:
      - ./conf/redis.conf:/usr/local/redis/redis.conf
    command: ["redis-server","/usr/local/redis/redis.conf"]

2.在当前文件夹创建 /conf/redis.conf

[root@iZbp1j6fkea3l6uzex533aZ redis02]# mkdir conf
[root@iZbp1j6fkea3l6uzex533aZ redis02]# vim conf/redis.conf

# 配置rdb
save 300 10
#开启aof
appendonly yes
appendfsync always

3.启动

 

4新创建窗口进入redis

image-20231229114844989

image-20231229115152236

3.配置redis的集群模式

为什么需要redis的集群模式?

1.解决redis的单点故障问题

2.提高redis数据的高可靠

3.还可提高redis的集群容量

redis的集群模式有哪些?
  • 主从模式

  • 哨兵模式

  • 去中心化

主从模式

一台主节点redis负责读写,多个从节点负责只读

image-20231229144825860

实战

前提将原有redis 停止

[root@iZbp1j6fkea3l6uzex533aZ redis02]# docker-compose down
Stopping redis ... done
Removing redis ... done
Removing network redis02_default

1.创建docker-compose.yaml

[root@iZbp1j6fkea3l6uzex533aZ redis02]# cd ../
[root@iZbp1j6fkea3l6uzex533aZ java2313]# pwd
/root/java2313
[root@iZbp1j6fkea3l6uzex533aZ java2313]# mkdir redis03
[root@iZbp1j6fkea3l6uzex533aZ java2313]# cd redis0
redis01/ redis02/ redis03/ 
[root@iZbp1j6fkea3l6uzex533aZ java2313]# cd redis03/
[root@iZbp1j6fkea3l6uzex533aZ redis03]# vim docker-compose.yaml

version: "3.1"
services:
  redis1:
    image: daocloud.io/library/redis:5.0.7
    restart: always
    container_name: redis1
    environment:
      - TZ=Asia/Shanghai
    ports:
      - 7001:6379
    volumes:
      - ./conf/redis1.conf:/usr/local/redis/redis.conf
    command: ["redis-server","/usr/local/redis/redis.conf"]
  redis2:
    image: daocloud.io/library/redis:5.0.7
    restart: always
    container_name: redis2
    environment:
      - TZ=Asia/Shanghai
    ports:
      - 7002:6379
    volumes:
      - ./conf/redis2.conf:/usr/local/redis/redis.conf
    links:
      - redis1:master
    command: ["redis-server","/usr/local/redis/redis.conf"]
  redis3:
    image: daocloud.io/library/redis:5.0.7
    restart: always
    container_name: redis3
    environment:
      - TZ=Asia/Shanghai
    ports:
      - 7003:6379
    volumes:
      - ./conf/redis3.conf:/usr/local/redis/redis.conf
    links:
      - redis1:master
    command: ["redis-server","/usr/local/redis/redis.conf"]

image-20231229145206754

2.创建redis1conf

[root@iZbp1j6fkea3l6uzex533aZ redis03]# mkdir conf
[root@iZbp1j6fkea3l6uzex533aZ redis03]# vim conf/redis1.conf

save 300 10
#开启aop
appendonly yes
appendfsync always

3.创建 redis2.conf redis3.conf

[root@iZbp1j6fkea3l6uzex533aZ redis03]# vim conf/redis2.conf
[root@iZbp1j6fkea3l6uzex533aZ redis03]# vim conf/redis3.conf

save 300 10
#开启aop
appendonly yes
appendfsync always
# redis2和redis3从节点配置
replicaof master 6379

4.启动主从模式

docker-compose up

5.新开启一个窗口测试

[root@iZbp1j6fkea3l6uzex533aZ ~]# cd java2313/redis03
[root@iZbp1j6fkea3l6uzex533aZ redis03]# ls
conf  docker-compose.yaml
[root@iZbp1j6fkea3l6uzex533aZ redis03]# docker-compose ps
 Name               Command               State                    Ports                  
------------------------------------------------------------------------------------------
redis1   docker-entrypoint.sh redis ...   Up      0.0.0.0:7001->6379/tcp,:::7001->6379/tcp
redis2   docker-entrypoint.sh redis ...   Up      0.0.0.0:7002->6379/tcp,:::7002->6379/tcp
redis3   docker-entrypoint.sh redis ...   Up      0.0.0.0:7003->6379/tcp,:::7003->6379/tcp
[root@iZbp1j6fkea3l6uzex533aZ redis03]# docker exec -it redis1 bash
root@b8ed5c4e979b:/data# redis-cli 
127.0.0.1:6379> set a 1
OK
127.0.0.1:6379> get a
"1"
127.0.0.1:6379> exit
root@b8ed5c4e979b:/data# exit
exit
[root@iZbp1j6fkea3l6uzex533aZ redis03]# docker exec -it redis2 bash
root@6cfe045a8480:/data# redis-cli 
127.0.0.1:6379> get a
"1"
127.0.0.1:6379> exit
root@6cfe045a8480:/data# exit
exit
[root@iZbp1j6fkea3l6uzex533aZ redis03]# 

image-20231229150033552

哨兵模式

哨兵模式一般都有2n+1(3)台机器组成,一台主节点负责读写,其余节点负责只读

image-20231229154127186

去中心化模式

去中心化模式,就是集群中有多个主节点,每个主节点负责一部分的key的存储 一般是3主3从 4主4从

image-20231229155323046

实战

前提停止以前redis

[root@iZbp1j6fkea3l6uzex533aZ redis03]# docker-compose down

1.创建docker-compoose

[root@iZbp1j6fkea3l6uzex533aZ redis03]# cd ../
[root@iZbp1j6fkea3l6uzex533aZ java2313]# pwd
/root/java2313
[root@iZbp1j6fkea3l6uzex533aZ java2313]# mkdir redis04

[root@iZbp1j6fkea3l6uzex533aZ java2313]# cd redis04
[root@iZbp1j6fkea3l6uzex533aZ redis04]# vim docker-compose.yaml
[root@iZbp1j6fkea3l6uzex533aZ redis04]# vim docker-compose.yaml
[root@iZbp1j6fkea3l6uzex533aZ redis04]# 
[root@iZbp1j6fkea3l6uzex533aZ redis04]# 
[root@iZbp1j6fkea3l6uzex533aZ redis04]# ls
[root@iZbp1j6fkea3l6uzex533aZ redis04]# vim docker-compose.yaml

version: "3.1"
services:
  redis1:
    image: daocloud.io/library/redis:5.0.7
    restart: always
    container_name: redis1
    environment:
      - TZ=Asia/Shanghai
    ports:
      - 7001:7001
      - 17001:17001
    volumes:
      - ./conf/redis1.conf:/usr/local/redis/redis.conf
    command: ["redis-server","/usr/local/redis/redis.conf"]
  redis2:
    image: daocloud.io/library/redis:5.0.7
    restart: always
    container_name: redis2
    environment:
      - TZ=Asia/Shanghai
    ports:
      - 7002:7002
      - 17002:17002
    volumes:
      - ./conf/redis2.conf:/usr/local/redis/redis.conf
    command: ["redis-server","/usr/local/redis/redis.conf"]  
  redis3:
    image: daocloud.io/library/redis:5.0.7
    restart: always
    container_name: redis3
    environment:
      - TZ=Asia/Shanghai
    ports:
      - 7003:7003
      - 17003:17003
    volumes:
      - ./conf/redis3.conf:/usr/local/redis/redis.conf
    command: ["redis-server","/usr/local/redis/redis.conf"]  
  redis4:
    image: daocloud.io/library/redis:5.0.7
    restart: always
    container_name: redis4
    environment:
      - TZ=Asia/Shanghai
    ports:
      - 7004:7004
      - 17004:17004
    volumes:
      - ./conf/redis4.conf:/usr/local/redis/redis.conf
    command: ["redis-server","/usr/local/redis/redis.conf"]  
  redis5:
    image: daocloud.io/library/redis:5.0.7
    restart: always
    container_name: redis5
    environment:
      - TZ=Asia/Shanghai
    ports:
      - 7005:7005
      - 17005:17005
    volumes:
      - ./conf/redis5.conf:/usr/local/redis/redis.conf
    command: ["redis-server","/usr/local/redis/redis.conf"]  
  redis6:
    image: daocloud.io/library/redis:5.0.7
    restart: always
    container_name: redis6
    environment:
      - TZ=Asia/Shanghai
    ports:
      - 7006:7006
      - 17006:17006
    volumes:
      - ./conf/redis6.conf:/usr/local/redis/redis.conf
    command: ["redis-server","/usr/local/redis/redis.conf"]  

image-20231229155844421

2.配置 六台redis的配置文件

[root@iZbp1j6fkea3l6uzex533aZ redis04]# mkdir conf
[root@iZbp1j6fkea3l6uzex533aZ redis04]# cd conf/
[root@iZbp1j6fkea3l6uzex533aZ conf]# vim redis1.conf

redis1.conf

# redis.conf
# 指定redis的端口号
port 7001
# 开启Redis集群
cluster-enabled yes
# 集群信息的文件
cluster-config-file nodes-7001.conf
# 集群的对外ip地址 linux ip
cluster-announce-ip 192.168.12.128
# 集群的对外port
cluster-announce-port 7001
# 集群的总线端口
cluster-announce-bus-port 17001

批量修改 redis2.conf ---redis6.conf

[root@iZbp1j6fkea3l6uzex533aZ conf]# cp redis1.conf  redis2.conf 
[root@iZbp1j6fkea3l6uzex533aZ conf]# cp redis1.conf  redis3.conf 
[root@iZbp1j6fkea3l6uzex533aZ conf]# cp redis1.conf  redis4.conf 
[root@iZbp1j6fkea3l6uzex533aZ conf]# cp redis1.conf  redis5.conf 
[root@iZbp1j6fkea3l6uzex533aZ conf]# cp redis1.conf  redis6.conf 
[root@iZbp1j6fkea3l6uzex533aZ conf]# 
[root@iZbp1j6fkea3l6uzex533aZ conf]# vim redis2.conf 
[root@iZbp1j6fkea3l6uzex533aZ conf]# vim redis3.conf 
[root@iZbp1j6fkea3l6uzex533aZ conf]# vim redis4.conf 
[root@iZbp1j6fkea3l6uzex533aZ conf]# vim redis5.conf 
[root@iZbp1j6fkea3l6uzex533aZ conf]# vim redis6.conf 

image-20231229160510331

3.启动redis 集群

[root@iZbp1j6fkea3l6uzex533aZ conf]# cd ../
[root@iZbp1j6fkea3l6uzex533aZ redis04]# docker-compose up

4.新建窗口构建集群

[root@iZbp1j6fkea3l6uzex533aZ ~]# cd java2313/redis04
[root@iZbp1j6fkea3l6uzex533aZ redis04]# docker-compose ps
 Name               Command               State                                          Ports                                        
--------------------------------------------------------------------------------------------------------------------------------------
redis1   docker-entrypoint.sh redis ...   Up      0.0.0.0:17001->17001/tcp,:::17001->17001/tcp, 6379/tcp,                             
                                                  0.0.0.0:7001->7001/tcp,:::7001->7001/tcp                                            
redis2   docker-entrypoint.sh redis ...   Up      0.0.0.0:17002->17002/tcp,:::17002->17002/tcp, 6379/tcp,                             
                                                  0.0.0.0:7002->7002/tcp,:::7002->7002/tcp                                            
redis3   docker-entrypoint.sh redis ...   Up      0.0.0.0:17003->17003/tcp,:::17003->17003/tcp, 6379/tcp,                             
                                                  0.0.0.0:7003->7003/tcp,:::7003->7003/tcp                                            
redis4   docker-entrypoint.sh redis ...   Up      0.0.0.0:17004->17004/tcp,:::17004->17004/tcp, 6379/tcp,                             
                                                  0.0.0.0:7004->7004/tcp,:::7004->7004/tcp                                            
redis5   docker-entrypoint.sh redis ...   Up      0.0.0.0:17005->17005/tcp,:::17005->17005/tcp, 6379/tcp,                             
                                                  0.0.0.0:7005->7005/tcp,:::7005->7005/tcp                                            
redis6   docker-entrypoint.sh redis ...   Up      0.0.0.0:17006->17006/tcp,:::17006->17006/tcp, 6379/tcp,                             
                                                  0.0.0.0:7006->7006/tcp,:::7006->7006/tcp            

进入任意一条redis 集权节点执行创建集群命令

root@9e97ea43e121:/data# redis-cli --cluster create 121.41.51.18:7001 121.41.51.18:7002 121.41.51.18:7003 121.41.51.18:7004 121.41.51.18:7005 121.41.51.18:7006 --cluster-replicas 1

--cluster create 以集群模式创建
--cluster-replicas 1 集权副本数是1 

image-20231229161141196

image-20231229161326212

5.测试

root@9e97ea43e121:/data# redis-cli -c -h 121.41.51.18 -p 7001
121.41.51.18:7001> set a 1
-> Redirected to slot [15495] located at 121.41.51.18:7003
OK
121.41.51.18:7003> get a
"1"
121.41.51.18:7003> exit
root@9e97ea43e121:/data# exit
exit
[root@iZbp1j6fkea3l6uzex533aZ redis04]# docker exec -it redis2 bash
root@4ed539c99c70:/data# redis-cli -c -h 121.41.51.18 -p 7002   #-c 集群模式  -h 表示ip
121.41.51.18:7002> get a
-> Redirected to slot [15495] located at 121.41.51.18:7003
"1"
121.41.51.18:7003> 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值