一、引言
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主要作者-所罗门 |
---|
Docker的作者已经离开了维护Docker的团队 |
---|
2.2 Docker的思想
集装箱:会将所有需要的内容放到不同的集装箱中,谁需要这些环境就直接拿到这个集装箱就可以了
集装箱:依赖的环境 + 可以运行的软件
标准化:
运输的标准化:Docker有一个码头,所有上传的集装箱都放在了这个码头上,当谁需要某一个环境,就直接指派去搬运这个集装箱就可以了。
命令的标准化:Docker提供了一些列的命令,帮助我们去获取集装箱等等操作。
提供了REST的API:衍生出了很多的图形化界面,Rancher。
隔离性:Docker在运行集装箱内的内容时,会在Linux的内核中,单独的开辟一片空间,这片空间不会影响到其他程序。
以下下概念必须牢记
镜像:就是集装箱
镜像 == 集装箱 === 依赖的环境+ 软件 本质上是一个镜像文件
容器:运行起来的镜像
容器,就是镜像运行起来 相当一个进程,所以容器是有生命的
中央仓库|注册中心:超级码头,上面放的就是集装箱
中央仓库存放的 就是集装箱
镜像:镜像是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 并回车
四、Docker的中央仓库【重点
】
中央仓库:就是存放docker 镜像的网站
###
Docker官方的中央仓库:这个仓库是镜像最全的,但是下载速度较慢。
国内的镜像网站:网易蜂巢,daoCloud等,下载速度快,但是镜像相对不全。
在公司内部会采用私服的方式拉取镜像,需要添加配置,
阿里云生成自己的加速地址
在自己的机器中配置 阿里云的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"] }
3.重置docker
[root@iZbp1j6fkea3l6uzex533aZ ~]# systemctl daemon-reload [root@iZbp1j6fkea3l6uzex533aZ ~]# systemctl restart docker
五、镜像的操作【重点
】
镜像 == 集装箱 === 运行的环境 + 软件 ,本质上是镜像文件
本地镜像仓库如何定位一个镜像?
-
镜像名+版本
-
镜像id
5.2 查看本地全部镜像
查看本地已经安装过的镜像信息,包含标识,名称,版本,更新时间,大小
docker images
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
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 ~]#
修改镜像名称 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
六、容器操作【重点
】
容器:运行起来的镜像,他是有生命的,相当于 一个进程
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
原理解析:
6.2 查看正在运行的容器
查看全部正在运行的容器信息
docker ps [-qa] # -a:查看全部的容器,包括没有运行 # -q:只查看容器的标识 docker ps -a
docker ps #查看所有正在运行的容器
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker ps -a #查看所有容器,包含停止的容器
[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
6.4 进入容器内容部
可以进入容器内部进行操作
docker exec -it 容器id/容器名 bash
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker exec -it 997d09e216b9 bash #都可以进入容器内部 [root@iZbp1j6fkea3l6uzex533aZ ~]# docker exec -it tomcat bash
####
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
删除所有容器
[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 ~]#
七、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 ~]#
八、数据卷【重点
】
数据卷:就是一种特殊的文件夹,他的作用就是完成宿主机文件 和 容器内部文件之间一一映射 ,达到的目的就是用户访问修改宿主机文件 就可以实时 同步到 容器的文件中
数据卷分类:
-
创建的数据卷
-
普通的文件夹(非/root)
数据卷
前提条件
[root@iZbp1j6fkea3l6uzex533aZ ~]# docker rm -f $(docker ps -aq) #清空所有容器
8.1 创建数据卷
创建数据卷之后,默认会存放在一个目录下 /var/lib/docker/volumes/数据卷名称/_data
docker volume create 数据卷名称
####
[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
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#
普通的文件夹作为数据卷
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 ~]#
九. Docker-Compose【重点
】
Docker-Compose: 作用就是对docker 命令的再次封装, 目的就是可以让我们一次性启动/停止 多个容器,并且维护容器之间的依赖关系
1.安装
1.下载docker-compose
2.上传到liux
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
让环境变量生效
[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
2.使用docker-compose 启动多个容器
前台启动多个容器
[root@iZbp1j6fkea3l6uzex533aZ test]# ls docker-compose.yaml [root@iZbp1j6fkea3l6uzex533aZ test]# docker-compose up #前台启动
查看由docker-compose.yaml管理的容器
[root@iZbp1j6fkea3l6uzex533aZ ~]# cd java2314/test/ [root@iZbp1j6fkea3l6uzex533aZ test]# ls docker-compose.yaml [root@iZbp1j6fkea3l6uzex533aZ test]# docker-compose ps
-
开启|关闭|重启已经存在的由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]#
-
查看日志 docker-compose logs -f
[root@iZbp1j6fkea3l6uzex533aZ test]# docker-compose logs -f
-
关闭并删除容器 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 ------------------------------
十、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单机版
-
创建配置文件
[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>
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
3.配置redis的集群模式
为什么需要redis的集群模式?
1.解决redis的单点故障问题
2.提高redis数据的高可靠
3.还可提高redis的集群容量
redis的集群模式有哪些?
-
主从模式
-
哨兵模式
-
去中心化
主从模式
一台主节点redis负责读写,多个从节点负责只读
实战
前提将原有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"]
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]#
哨兵模式
哨兵模式一般都有2n+1(3)台机器组成,一台主节点负责读写,其余节点负责只读
去中心化模式
去中心化模式,就是集群中有多个主节点,每个主节点负责一部分的key的存储 一般是3主3从 4主4从
实战
前提停止以前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"]
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
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
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>