Docker私人学习笔记
俗话说“好记性不如烂笔头”,编程的海洋如此的浩大,养成做笔记的习惯是成功的一步!
此笔记主要是antlr4.13版本的笔记,并且笔记都是博主自己一字一字编写和记录,有错误的地方欢迎大家指正。
一、基础概念:
1、docker是基于Go语言实现的开源容器项目。诞生于2013年年初,最初发起者是dotCloud公司。docker开源后受到业界广泛的关注与参与,目前已有80
多个相关开源组件项目,逐渐形成了围绕docker容器的完整生态体系。
官方网站:https://www.docker.com/
官方文档:https://docs.docker.com/
官方仓库:https://hub.docker.com/ 账号密码:cat4416/guowenjie 邮箱:565335545@qq.com
中文学习教程:https://www.runoob.com/docker/docker-tutorial.html
源代码:https://github.com/docker
2、docker在开发和运维中的优势:
(1)更快速的交付和部署。
(2)更高效的资源利用。
(3)更轻松的迁移和扩展。
(4)更简单的更新管理。
3、docker的三大核心概念:
(1)docker镜像:类似于虚拟机镜像,是一个只读的模板。类似于java类文件。
(2)docker容器:是基于镜像创建的的应用运行实例。类似于生成的java对象。
(3)docker仓库:类似于代码仓库,用于集中存放镜像文件的仓库中心。
4、docker的特点:
(1)环境的标准化。
(2)隔离性。
(3)可以快速创建和销户。
5、数据卷是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于linux的mount行为。
数据卷可以在容器之间共享和重用,并且修改后会立马生效,数据卷的更新不会影响镜像。
6、Dockerfile是由一行行指令语句组成,指令又分为配置指令和操作指令。
7、容器与应用是同生共死的关系,启动容器就是启动主进程,当容器中指定的应用终结时,容器也会自动停止,此时容器处于stopped状态。
故需要注意有使用伪终端交互时,不能使用exit命令终止终端交互,应使用Ctrl+p+q快捷键退出方式。
8、禁止在docker环境下使用sudo命令来提升权限,因为sudo命令会在当前进程下,创建子进程来执行对应的命令。
与docker容器只有一个主进程的要求相背离,并且宿主机向改容器发送信号量时,变为被sudo进程收了,而不是sudo后面对应的命令。
应该为使用gosu工具来代替,此工具在提升权限的同时,在当前线程下执行对应的命令,使得容器继续保持一个主进程。
9、默认情况下,创建容器时,如果不知道网络,则默认为bridge网桥模式,容器与宿主机直接可以直接通过网桥进行通信,但是如果外网需要
访问容器,必须经过宿主机的ip,同时还需要创建容器时主动暴露映射端口,否则外网无法访问容器。但是宿主机可以直接访问容器没有暴露
的服务和端口,不需要容器额外声明暴露。
二、基础功能:
1、从Docker Hub网站上获取镜像,直接执行命令:docker pull Name[:TAG],
例如 docker pull ubuntu:18.04。如果不指定TAG,则默认会选择latest标签,即下载仓库的最新版本镜像。
如果不用官方的仓库获取,也可以指定注册服务器的地址。例如 docker pull index.tenxcloud.com/docker_library/node
2、相同的镜像文件只能会有一个,相同的容器也只能有一个,但是一个镜像可以有生成多个容器。
镜像是否相同:是根据 镜像名称+版本号 来判断的。容器是否相同:是根据容器ID来判断的。
3、容器与应用是同生共死的关系,当容器中指定的应用终结时,容器也会自动停止,此时容器处于stopped状态。
故需要注意有使用伪终端交互时,不能使用exit命令终止终端交互,应使用Ctrl+p+q快捷键进行不停止退出方式。
4、配置镜像源加速(使用国内镜像来加快docker的镜像访问):
(1)具体配置可参考https://docs.docker.com/engine/reference/commandline/dockerd/。
(2)创建并配置docker的守护进程:vim /etc/docker/daemon.json
{
"registry-mirrors":["http://hub-mirror.c.163.com"]
}
(3)重新加载配置使其生效:systemctl daemon-reload
(4)重启docker: systemctl restart docker
5、docker的linux版本安装参考:https://docs.docker.com/engine/install/centos/#install-using-the-repository
6、docker的命令参数,可以用=或者空格来赋值参数,比如 --network=host 或者为 --network host 都是一样的意思。
三、使用笔记:
1、docker常用操作命令:
(1)查看当前linux系统下有哪些docker镜像文件:docker images ,可以加 --filter 过滤。
(2)查看当前运行的docker镜像:docker ps ,如果需要查看全部容器(包括已经停止的),可以加 -a,如果需要查看容器大小,加上 --size
(3)进入运行的镜像环境: docker exec -it 《镜像CONTAINER ID》 /bin/bash
(4)给镜像增加别名和打标签:docker tag 《镜像名:版本》 《新别名:版本》
(5)查看镜像详细信息:docker inspect 《镜像名:版本》 或者查看容器或则数据卷 《容器名》、《数据卷名》
(6)在镜像仓库中搜索镜像: docker search 《keyword》
(7)删除本地镜像:docker rmi 《镜像名:版本》 如果镜像有运行中的容器,删除会报错,可以加 -f 强行删除
(8)删除容器:docker rm 《容器ID》
(9)清除镜像遗留文件或未使用的镜像: docker image prune
(10)根据镜像生成容器实例并运行: docker run 《镜像ID》
(11)启动已存在的容器: docker start 《容器ID》,如果容器本身是运行状态,则忽略。
(12)镜像创建:用commit、import和build三种形式的子命令。
(13)存出和载入:docker save -o 和 docker load -i
(14)上传镜像到仓库中心:docker push 《镜像名:版本》 相对应的拉取镜像用 docker pull 《镜像名:版本》
(15)查看docker信息:docker info
(16)查看docker的镜像层:docker history 《镜像名:版本》
2、创建镜像:
(1)基于已有容器创建(对于在容器环境定制化后进行多机部署非常实用):
命令:docker commit [options] 《container》 《repository:tag》
示例:docker commit -m "me added a new file" -a "Cat" 9ca1fdd53ac0 mytestubuntun:1.0
说明:-m 表示提交信息, -a表示作者, 9ca1fdd53ac0是容器id,mytestubuntun:1.0 是新镜像的名称和标签。
(2)基于本地模板导入:
命令:docker import [options] 《repository:tag》
说明:导入一个镜像,可以使用OpenVZ提供的模板来导入,或者用其他已导出的镜像模板来创建。
(3)基于Dockerfile创建:
命令:docker build
说明:创建镜像最常见的方式。Dockerfile是一个文本文件,利用给定的指令扫描基于某个父镜像来创建新镜像。
3、存出和载入镜像:
(1)存出镜像:
命令:docker save -o 《镜像文件名称》 《repository:tag》
示例:docker save -o ubuntu_latest.tar ubuntu:latest
说明:导出的ubuntu_latest.tar镜像文件默认保存到当前目录下,可以将此文件分享和传输到其他机器使用。
(2)载入镜像:
命令:docker load -i 《镜像文件》
示例:docker load -i ubuntu_latest.tar 或者 ocker load < ubuntu_latest.tar
说明:导入成功后,可以使用docker images命令镜像查看,和原镜像一致。如果重复导入不会生效,相同镜像只会有一个。
4、容器操作:
(1)创建容器:
命令:docker create 《repository:tag》
示例:docker create -it ubuntu:latest
说明:根据ubuntu:lates镜像创建容器,并且容器是处于停止状态,需要通过start命令启动。
常用options选项:
-d, --detach=true|false 是否后台运行容器,默认为false
--expose=[] 指定容器会暴露出来的端口或端口范围
-i, --interactive=true|false 保持标准输入打开,默认为false
-t, --tty=true|false 是否分配一个伪终端,默认为false
-p, --public=[] 指定如何映射到本地主机端口。小字母p用法为 宿主机端口号:容器端口号。 大字母P用法为 宿主机端口号随机:容器里应用使用的端口
--rm=true|false 容器退出后是否自动删除,不能跟-d同时使用
--name="" 指定容器的别名
-m, --memory="" 限制容器内应用使用的内存,单位可以是b、k、m或g
--ulimit=[] 限制最大文件数、最大进程数等
-e 设置容器内的环境变量
--link name:alias 链接到其他容器
(2)启动容器:
命令:docker start 《容器ID》
(3)创建并启动容器:
命令:docker run 《repository:tag》
示例: docker run -it ubuntu:latest /bin/bash
示例: docker run -d ubuntu:latest
说明:根据 ubuntu:latest镜像创建容器并用交互模式+守护态启动容器,可以使容器一直在后台运行不停止。
如果退出后容器也停止,可以使用start重新进行启动。具体的可选参数可参考create命令。
常用示例: docker run -d -p 8081:8080 --privileged=true --name mytomcat tomcat:8.0.52
说明:根据 ubuntu:latest镜像创建容器并用交互模式+守护态启动容器,可以使容器一直在后台运行不停止。
端口号映射,小字母p用法为 宿主机端口号:容器端口号。 大字母P用法为 宿主机端口号随机:容器里应用使用的端口。
--privileged表示容器拥有特权,比如操作内核模块,修改网卡MAC地址等。
常用示例: docker run --name mysqldb -e MYSQL_ROOT_PASSWORD=admin -d mysql:5.7
docker run -d -p 8081:8080 --name web --link mysqldb:datadb tomcat:8.0.52
说明:根据 ubuntu:latest镜像创建容器并用交互模式+守护态启动容器,可以使容器一直在后台运行不停止。
-e是设置容器内的环境变量,此处是设置mysql的root用户的密码。在创建并启动好mysql的容器后,然后再
创建web应用容器,并直接与mysql容器相连接,相当于容器之间建立了虚拟通道,使其不再需要经过宿主机来通信。
可以进入web容器内部,查看/etc/hosts文件来确认容器链接关系。
(4)查看容器输出:
命令:docker logs 《容器ID》
示例:docker logs 9ca1fdd53ac0
常用options选项:
--details 打印详细信息
-f 持续保持输出
(5)重启容器:
命令:docker restart 《容器ID》
(6)暂停容器:
命令:docker pause 《容器ID》
(7)取消暂停容器:
命令:docker unpause 《容器ID》
(8)清除已停止的容器:
命令:docker container prune
说明:会清除所有的已停止容器
(9)进入容器:
命令:docker exec 《容器ID》 或者用 docker attach 《容器ID》
示例:docker exec -it 9ca1fdd53ac0
说明:当使用-d守护态运行容器后,无法查看容器中的信息,也无法进行操作,此时就可以使用exec进入容器内部操作。加上参数 -u root 可以获得容器root权限。
使用attach比较简单方便,但是会导致多个窗口的显示都是一样的,都是同一个窗口视图,同时还依赖于容器创建指定时的执行命令。
常用options选项:
-d, --detach:在容器中后台执行命令
-i, --interactive=true|false 保持标准输入打开,默认为false
-t, --tty=true|false 是否分配一个伪终端,默认为false
(10)删除容器:
命令:docker rm 《容器ID》
说明:删除容器。默认情况下只能删除已停止运行的容器。
常用options选项:
-f, --force:是否强行终止并删除一个运行中的容器
(11)导出容器:
命令:docker export 《容器ID》
示例: docker export -o test_container_ubuntu.tar
说明:导出容器,不管容器是否运行均可导出。导出文件保存到当前目录下并命名为test_container_ubuntu.tar
常用options选项:
-e, --output:指定导出的容器文件名称
(12)导入容器变成镜像:
命令:docker import 《容器文件》 《repository:tag》
示例:docker import test_container_ubuntu.tar myubuntu:V1.0+
说明:容器文件导入后只能变为镜像文件,不能直接是变为容器。和docker load载入镜像命令非常相似。
但是容器文件导入后会丢失历史记录和元数据,载入镜像记录更完整,体积更大。
(13)查看容器内的进程:
命令:docker top 《容器ID》
说明:会打印出容器内的进程信息,包括PID、用户、时间、命令等。
(14)查看容器的统计信息:
命令:docker stats 《容器ID》
说明:会打印出容器的CPU、内存、存储、网络使用等统计信息。
(15)复制文件到容器:
命令:docker cp 《宿主机文件》 《容器ID》:《容器路径》
示例:docker cp main_content.txt f850abc5c7e7:/home
说明:将宿主机的main_content.txt拷贝到容器的home目录下。
(16)查看端口映射:
命令:docker port 《容器ID》
说明:查看容器端口与宿主机的映射关系。
(17)退出容器:
说明:exit 命令 实际是终止终端,同时因为应用已停止,导致容器也停止。
如果是想退出容器但是不停止,可以用 Ctrl+p+q 快捷键。
(18)停止容器:
命令: stop 停止命令,先发送终止信号,10秒后发送kill信号,给容器用于保存临时资源的时间,推荐此方式来停止容器。
命令: kill 杀死命令,直接发送kill信号
(19)容器CPU限制:
命令: docker run --cpu-period=100000 --cpu-quota 20000 《repository:tag》
说明:在创建并启动容器的时候,控制cpu在100000微秒时间内,设定CPU的占用上限为20%。
可以在容器里执行 dd if=/dev/zero of=/dev/null & 执行空文件复制测试CPU的使用吞吐量。
另外可以使用--cpu-shares 选项来设定容器的CPU占用权重。
(20)容器内存限制:
命令:docker run --memory 200M --memory-swap=200M 《repository:tag》
说明:在创建并启动容器的时候,控制内存使用的最大为200M,交换分区的容量也为200M。
(21)容器磁盘限制:
命令:docker run --blkio-weight 600 《repository:tag》
说明:在创建并启动容器的时候,磁盘的读写权重为600,注意默认容器磁盘权重为500。
如果需要限制磁盘使用的空间大小,可为每个容器创建一个单独的用户,然后设置每个用户的磁盘使用空间量。
5、数据卷操作:
(1)创建数据卷:
命令:docker volume create 《options》 《数据卷名称》
示例:docker volume create -d local test
说明:在docker的默认目录/var/lib/docker/volumes 路径下,创建test目录。
(2)列出已有数据卷:
命令:docker volume ls
说明:查看已存在的数据卷
(3)清理无用数据卷:
命令:docker volume prune
说明:清理无用的数据卷
(4)删除指定数据卷:
命令:docker volume rm 《数据卷名称》
说明:删除指定的数据卷
(5)使用现有数据卷:
命令:docker run --mount type=《数据卷类型》, source=《源目录》, destination=《容器目录》 myubuntu:V1.0
示例:docker run --mount type=volume, source=/test, destination=/mytest myubuntu:V1.0
(5)创建容器并指定数据卷
命令:docker run -v 《宿主机目录》:《容器目录》
示例:docker run -it -v /home/docker_demo:/home:rw --name testmount myubuntu:V1.0 /bin/bash
说明:根据myubuntu:V1.0镜像创建容器,并将宿主机的/home/docker_demo目录挂载到容器的/home目录下(注意源文件是共用的,容器会自动创建目录),
拥有rw读写权限(默认也为rw,ro则为只读),同时用虚拟终端模式交互。
(6)查看数据卷信息:
命令:docker inspect 《数据卷id》
示例:docker inspect vuetclfddcon
说明:查看vuetclfddcon数据卷的信息,可以看到厂家时间,挂载宿主机的路径等信息。
四、Dockerfile的使用:
1、Dockerfile文件是由一行行的指令构成,指令基础知识如下:
(1)每条保留字指令都必须为大写字母且跟随至少一个参数。
(2)指令安装上到下,顺序执行。
(3)指令的注释采用#符号。
(4)每条指令的执行都会创建一个新的镜像层。
2、通常使用自定义的Dockerfile创建镜像的过程如下:
(1)新建一个目录/root/dockertest作为上下文目录,一般情况下Dockerfile都放到此目录(或者通过-f选项来执行路径)。
(2)新建和编写Dockerfile文件。通常都是在一个基础镜像上面加工改进而来的。
(3)用docker build命令创建新镜像放到本地镜像仓库(命令示例 docker build -t test:6 .)。
(4)使用run命令将新镜像运行起来。
3、简单的Dockerfile文件编写参考:
ARG VERSION=7
FROM centos:${VERSION}
LABEL desc=gwj_df date="2022-11-16"
ENV APP_VERSION=1.1.0
ENV PATH $PATH:/usr/local/bin11
VOLUME ["/votest1","votest2"]
WORKDIR /home/abc/
ONBUILD RUN mkdir mydir
RUN echo "hellow word" > readme.txt
EXPOST 8080
CMD ["/bin/bash"]
4、Dockerfile文件常用指令:
(1)ARG定义创建镜像过程中的临时变量。 ARG <name> [=<default value>] 定义并指定默认值。使用${}来读取变量值。
当镜像编译成功后,变量将不再存在。可以使用 docker build --build-arg <参数名>=<值>来覆盖文件配置。
(2)FROM指定所创建镜像的基础镜像,即在某基础镜像上进行增加自定义的指令。
如nginx、redis、mysql、centos等基础服务或系统的基础镜像基础上构建。
(3)LABEL指令可以为生成的镜像添加元数据标签信息。LABEL <key>=<value> <key>=<value> 的格式,=号左右两边不要有空格。
每个LABEL标签都会生成一个镜像层,建议将多个标签合并在一个指令。创建镜像后可以通过docker inspect 查看标签信息。
另外可以用docker image --filter "label=<key>=<value>"来方便查询镜像。
(4)EXPOST暴露容器运行时的监听端口给外部的宿主机。EXPOSE <端口号>
该指令只是起到声明作用,通过宿主机暴露出去时还是需要通过-p参数来映射。
(5)ENV指定环境变量。在镜像生成过程中或启动的容器中都会存在此环境变量。注意与ARG的区别是,ARG是临时的变量,后续容器中不会存在。
注意如果同一行里面进行更改变量和赋值,是优先做了赋值操作后再更改变量。可以使用 docker run --env <参数名>=<值>来覆盖文件配置。
(6)CMD容器启动后执行的命令。如果在使用run命令的时候,有指定命令,则会覆盖Dockerfiile文件里面CMD定义的命令。
多个CMD则最后一个命令生效。shell格式为 CMD echo "docker so easy", exce格式为 CMD["echo","docker so easy"]。
如果当前Dockerfile里面没定义CMD命令,则会默认使用父镜像文件的CMD命令。可以使用 docker run <执行命令> 来覆盖文件配置。
(7)ENTRYPOINT命令,与CMD命令相似,都是指定容器启动后执行的命令。通常和CMD结合起来使用,ENTRYPOINT命令指定命令,
CMD则变为指定执行命令的参数。多个ENTRYPOINT则最后一个命令生效。可以使用 docker run --entrypoint 来覆盖文件配置。
(8)VOLUME创建一个数据卷挂载点。在容器启动后,就自动创建好文件里编写的挂载点。
例如 VOLUME ["/vuetclfddcon"] 则会在容器里的根目录下创建vuetclfddcon目录,挂载在宿主机的默认docker数据卷目录下的一个uuid文件夹下。
(9)WORKDIR指定工作目录。如果该目录不存在,会自动创建。后面的指令工作目录都将会在此目录下,包括docker run启动后也是在此目录下。
可以使用docker run -w 参数覆盖文件配置。
(10)USER切换用户。默认容器的初始用户为root用户,通过USER命令进行切换,并影响后面的镜像层,比如RUN、ENTRYPOINT、CMD等命令的执行身份。
注意切换的用户必须已经存在的,否则无法切换。通常切换用户不建议使用USER命令,而是借助第三方工具gosu来执行。
(11)ONBUILD是一个特殊指令,他后面跟的是其他指令,而这些指令在当前镜像构建时并不会执行,而是在以当前镜像为基础镜像,去构建下一级镜像时
才被执行。唯有此指令是为帮助别人定制镜像而准备的。格式为 ONBUILD <其他指令> 。
(12)HEALTHCHECK健康检查指令,用于判断容器主进程的服务状态是否正常,后面跟CMD命令。当镜像指定了HEALTHCHECK指令后,启动容器时初始状态为starting,
检查成功后变为healthy,如果连续失败则变为unhealthy。支持的选项为 --interval=<间隔秒,默认30秒> --timeout=<时长秒,默认30秒> --retries=<次数,默认3次>。
(13)RUN执行命令指令,默认使用的是终端的/bin/sh -C 来执行shell脚本。当指令较长时,可以使用\来换行。例如(&&表示前面命令执行成功后执行,||表示执行失败时执行):
RUN apt-get install -y libsnappy-dev zliblg-dev libbz2-dev \
&& rm -rf /var/cache/apt
(14)COPY复制文件命令,将本地宿主机上的目录,复制到新的一层的镜像内的位置,构建后的镜像和启动的容器都会存在此文件,可以使用通配符同时拷贝多个文件。
格式为 COPY <源宿主机路径> <容器目标路径>。容器目标路径的目录不需要先创建,在构建的时候如果不存在会自动创建,另外源文件的元数据信息都会保留,
比如读、写、文件变更等时间。
注意:<源宿主机路径> 是在当前编译Dockerfile文件目录的上下文目录下的相对路径。如果无法找到则会去/var/lib/docker/tmp/临时目录下读取文件。
故建议是将需要拷贝的文件放到与Dockerfile文件同级目录里,使用相对路径拷贝。
(15)ADD复制文件命令,与COPY命令性质基本一致,在COPY基础上增加了一些功能,比如ADD <源路径> 可以是一个URL地址,docker引擎会视图去下载链接文件到目标路径。
另外使用ADD命令的源路径是一个tar压缩文件的话,会自动解压文件到目标路径去。
5、特殊的虚拟镜像scratch,表示空白的镜像。接下来所写的指令作为镜像层的第一层,不以任何操作系统为基础,直接将可执行文件复制到镜像。
类似contos,ubuntu等镜像都是使用空白镜像。
五、Docker网络:
1、操作docker的网络,均通过命令 docker network 《选项》 来执行。
2、通过执行命令来查看docker的网络:
(1)查看docker的网络:docker network ls
(2)如果要查看完整的网络id:docker network ls --no-trunc
(3)过滤驱动:docker network ls --filter driver=bridge
3、创建网络: docker network create 《网络名》 默认创建的网络为bridge模式。
4、查看网络信息: docker network inspect 《网络名》
5、删除网络: docker network rm 《网络名》
6、将正在运行的容器连接到网络:docker network connect 《网络名》 《容器名》
7、断开容器的网络连接:docker network disconnect 《网络名》 《容器名》
8、将正在运行的容器连接到网络(指定容器ip):docker network connect --ip 《容器ip》《网络名》 《容器名》
9、启动时将容器连接到网络:docker run -itd --network=《网络名》 《即将启动的容器》
10、删除所有无用的网络:docker network prune
11、网络模式:
(1)bridge:为每一个容器分配、设置IP等,并将容器连接到docker0的虚拟网桥。
(2)host:容器不会虚拟出自己的网卡、IP等,而是使用宿主机的IP和端口。
(3)none:容器有自己独立的Network namespace,但是没有进行任何的相关配置,网络也只有一个回环地址。
(4)container:和一个指定的容器共享IP端口范围等。
(5)用户自定义网络:通过定义自己的网络,同一个网络的容器彼此可见。docker run -network mynet 《repository:tag》
12、概念说明:在安装docker后,会自动创建bridge桥接网络,并且在网卡上创建的虚拟网卡名称为docker0,此docker0相当于交换机,用于宿主机与容器进行通信。
默认情况下,容器之间可以通过ip进行ping通,但是如果通过容器名称则不通,此时可以通过创建自定义网络,然后将需要通信的容器都加入到此网络中,
就可以通过容器名称来通信,用于代替官方即将过期的--link 联通方式。
六、实战操作:
1、部署redis服务(单节点):
步骤一:查询redis镜像,docker search redis 推荐使用官方镜像,即OFFICIAL为OK的则为redis官方提供的镜像。
步骤二:下载redis镜像,docker pull redis:7.0.5 具体有哪些版本,可以通过浏览 https://hub.docker.com/_/redis 网页查看Supported tags and respective Dockerfile links。
步骤三:编写定制化的redis.conf文件,放在/home/docker_demo/redis目录下。
步骤四:创建容器并启动。docker run --name myredis -d -p 7000:7000 -v /home/docker_demo/redis:/usr/local/etc/redis/conf/ redis:7.0.5 redis-server /usr/local/etc/redis/conf/redis.conf
步骤五:查看启动日志 docker logs 《容器id》。
步骤六:使用redis的客户端连接查看 docker run -it redis:7.0.5 redis-cli -h 《宿主机ip》 -p 7000
附加:redis容器使用的系统为debian操作系统,如果想要在线安装软件,首先需要更新apt安装工具,执行命令 apt-get update,等待更新成功后,就可以进行安装软件。
例如安装ps进程查看工具,可以使用 apt-get install -y procps
例如安装ifconfig网络查看工具,可以使用 apt-get install -y net-tools
例如安装ip查看工具,可以使用 apt-get install -y iproute2
例如安装vim查看工具,可以使用 apt-get install -y vim
例如安装文件上传工具,可以使用 apt-get install -y lrzsz
例如安装keepalived高可用性工具,可以使用(如果加-y需要--force-yes) apt-get install keepalived
如果想安装加速,可以配置国内镜像163安装源(在/etc/apt/sources.list.d/目录下增加163.list配置,配置后需要执行apt-get update)。
2、部署redis服务(使用cluster官方集群):
步骤一:下载redis镜像,docker pull redis:7.0.5
步骤二:创建自定义网络 docker network create --subnet=172.18.0.0/16 myredisnet
步骤三:创建容器并启动(集群要求至少3个主节点,如果要从节点则共需要6个节点):
docker run --name myredis01 -d -p 7010:6379 --net=myredisnet --ip=172.18.0.3 -v /home/docker_demo/redis/cluster:/usr/local/etc/redis/conf/ redis:7.0.5 redis-server /usr/local/etc/redis/conf/redis.conf
docker run --name myredis02 -d -p 7011:6379 --net=myredisnet --ip=172.18.0.4 -v /home/docker_demo/redis/cluster:/usr/local/etc/redis/conf/ redis:7.0.5 redis-server /usr/local/etc/redis/conf/redis.conf
docker run --name myredis03 -d -p 7012:6379 --net=myredisnet --ip=172.18.0.5 -v /home/docker_demo/redis/cluster:/usr/local/etc/redis/conf/ redis:7.0.5 redis-server /usr/local/etc/redis/conf/redis.conf
docker run --name myredis04 -d -p 7013:6379 --net=myredisnet --ip=172.18.0.6 -v /home/docker_demo/redis/cluster:/usr/local/etc/redis/conf/ redis:7.0.5 redis-server /usr/local/etc/redis/conf/redis.conf
docker run --name myredis05 -d -p 7014:6379 --net=myredisnet --ip=172.18.0.7 -v /home/docker_demo/redis/cluster:/usr/local/etc/redis/conf/ redis:7.0.5 redis-server /usr/local/etc/redis/conf/redis.conf
docker run --name myredis06 -d -p 7015:6379 --net=myredisnet --ip=172.18.0.8 -v /home/docker_demo/redis/cluster:/usr/local/etc/redis/conf/ redis:7.0.5 redis-server /usr/local/etc/redis/conf/redis.conf
步骤四:进入其中一台redis的容器内部 docker exec -it myredis01 bash
然后再容器内部执行命令创建集群组合 redis-cli --cluster create 172.18.0.3:6379 172.18.0.4:6379 172.18.0.5:6379 172.18.0.6:6379 172.18.0.7:6379 172.18.0.8:6379 --cluster-replicas 1
然后会列出master和slave节点分别是哪几个,并且要求输入 yes进行确认。
步骤五:执行 redis-cli -c 以集群方式进入redis的客户端后,执行 cluster info 可以查看到集群的节点信息。
附加:
(1)执行keys * 时查看的只是当前指定重定向后的某台服务器的key集合,如果想看全部集群的key,可以执行命令(172.18.0.5:6379是其中一个集群节点即可)
redis-cli -c --cluster call 172.18.0.5:6379 keys \*
(2)在cluster集群搭建好后,后期想扩容redis节点,可以执行命令:
增加master节点:redis-cli --cluster add-node ${要添加的节点地址} ${集群中任意地址}
示例:redis-cli --cluster add-node 172.18.0.9:6379 172.18.0.3:6379
增加slave节点:redis-cli --cluster add-node ${要添加的节点信息} ${集群中任意地址} --cluster-slave --cluster-master-id ${对应master节点的ID}
示例:redis-cli --cluster add-node 172.18.0.10:6379 172.18.0.3:6379 --cluster-slave --cluster-master-id a8d04103c8679311267e40de3152b091e56a0148
给新增节点分配槽位:redis-cli --cluster reshard ${集群中任意地址} --cluster-from {原节点ID} --cluster-to {目标节点ID} --cluster-slots {槽位数} --cluster-yes
示例:redis-cli --cluster reshard 172.18.0.3:6379 --cluster-from 89b0db9c15cd453e1c6f48040691bad405154229 --cluster-to a8d04103c8679311267e40de3152b091e56a0148 --cluster-slots 2500 --cluster-yes
3、部署percona数据库服务(使用keepalived+haproxy+pxc集群):
附加:percona数据库是基于mysql的基础上做了增强型的二次开发的开源数据库,pxc集群模式是官方提供的,所有节点的数据节点是通过同步复制的方式进行。
4、部署java应用:
方式一:拉取java镜像,docker pull java:8 然后运行此容器,然后将java应用传输到此目录下并运行,从而提供web服务。
方式二:基于java镜像文件,自己编写Dockerfile文件(主要是将自己的java应用通过数组卷方式挂载容器里),生成镜像文件,然后启动运行。
5、部署web前端项目(使用nginx):
步骤一:查询nginx镜像,docker search nginx 推荐使用官方镜像,即OFFICIAL为OK的则为redis官方提供的镜像。
步骤二:下载nginx镜像,docker pull nginx:1.11.8 具体有哪些版本,可以通过浏览https://hub.docker.com/_/nginx/tags 网页查看。
步骤三:创建/home/docker_demo/vue_tclfdd文件夹,编写定制化的nginx.conf文件,放在/home/docker_demo/vue_tclfdd/conf目录下。
步骤四:在/home/docker_demo/vue_tclfdd目录下,将h5前端项目tclfdd拷贝到此目录下。
步骤五:创建Dockerfile文件继承nginx镜像进行编写(也可以不需要Dockerfile文件,直接用nginx镜像)。
步骤六:编译生成镜像文件 docker build -t ng_tclfdd:7.0 .
步骤七:创建容器并启动。docker run --name mynginx -d -p 9523:9523 --privileged=true ng_tclfdd:7.0
6、web前端高可用部署(使用keepalived冗余nginx):
步骤一:进入已经部署了nginx的容器(容器必须是有privileged权限) docker exec -it mynginx bash
步骤二:nginx镜像默认使用的是debian系统,更新安装工具进行在线安装软件。执行apt-get update
步骤三:在线安装keepalived。执行 apt-get install keepalived
步骤四:进入/etc/keepalived目录,创建keepalived.conf文件,并写入相关配置信息,官网配置说明地址:https://www.keepalived.org/manpage.html。
步骤五:启动keepalived服务。执行 service keepalived start 输出 [....] Starting keepalived: keepalived. ok 则表示启动成功。
启动成功后,注意需要关注容器占用的磁盘大小,如果磁盘占用不断增大,说明keepalived存在兼容问题,需要先停止此服务,
将容器内的/var/log权限放开 执行 chmod -R 777 /var/log,或者将宿主机的keepalived给安装上去,再启动容器的此服务。
步骤六:在宿主机上安装keepalived服务,将容器的虚拟vip与宿主机的vip做映射,使得外网可通过宿主机vip来转发到容器vip访问,实现容器nginx的高可用。
执行在线安装 yum install keepalived ,安装成功后进入/etc/keepalived目录,创建keepalived.conf文件,并写入相关配置信息。
步骤七:启动宿主机的keepalived服务,执行 service keepalived start,可在 /var/log/messages 日志下查看服务输出。启动成功后,就可以通过
宿主机的vip来访问。
附加:
(1)keepalived是基于lvs来通过虚拟ip访问的。其原理就是通过虚拟ip转移到可用服务器,保持高可用。
手工给网卡创建虚拟ip地址:ifconfig ens192:1 10.0.17.247 netmask 255.255.255.0 up
手工删除网卡的虚拟ip地址:ip addr del 10.0.17.247 dev ens192:1
(2)由于keepalived的启动没写入到docker的CMD命令内,如果容器被重启,需要进入容器再执行启动keepalived服务。
(3)上面的搭建keepalived高可用,没有额外写检测nginx服务是否可用的脚本,由于nginx启动后是容器主进程命令,故如果nginx宕机, 容器也基本会死掉,keepalived也会停掉,被其他容器keepalived检测到将vip转移。
相关文章:
Docker私人学习笔记
俗话说“好记性不如烂笔头”,编程的海洋如此的浩大,养成做笔记的习惯是成功的一步! 此笔记主要是antlr4.13版本的笔记,并且笔记都是博主自己一字一字编写和记录,有错误的地方欢迎大家指正。 一、基础概念:…...
谷粒商城实战笔记-233~235-商城业务-认证服务-单点登录流程-原理
文章目录 一,场景二,单点登录流程 一,场景 包含以下三节的内容: 一,233-商城业务-认证服务-单点登录流程-1二,233-商城业务-认证服务-单点登录流程-2三,233-商城业务-认证服务-单点登录流程-3…...
机器学习在旅游业的革新之旅
机器学习在旅游业的革新之旅 随着科技的飞速发展,尤其是人工智能(AI)技术的广泛应用,各个行业都迎来了前所未有的变革。其中,旅游业作为全球经济的重要支柱之一,更是受益匪浅。机器学习(Machin…...
OpenCTI:开源网络威胁情报平台
OpenCTI 是一个开源平台,旨在帮助组织管理其网络威胁情报 (CTI) 数据和可观察数据。 该平台由 Filigran 开发,使用基于 STIX2 标准的知识模式构建数据。 它采用现代 Web 应用程序架构,配备 GraphQL API 和用户友好的前端。 OpenCTI 与 MIS…...
linux shell 脚本 let 数学计算
linux shell 脚本 let 数学计算 http://www.codebaoku.com/it-shell/ let命令中的算术表达式必须用双引号括起来,以避免解释器对特殊字符进行处理。 在变量的计算中,不需要使用$符号来表示变量, #!/bin/shweek_daydate %u echo $week_day…...
mp3和mp4的区别是什么?怎么把mp3转成mp4?(全)
在生活中我们或多或少会听到“mp3”和“mp4”,那么什么是mp3和mp4呢?mp3和mp4的区别是什么?mp3是一种音频压缩技术,旨在在不显著牺牲音质的前提下减小音频文件的体积,使其适用于音乐和其他音频内容的存储与传输。相比之…...
合并params和query参数
场景:三级分类只有query参数,搜索框使用params参数。为了解决这个问题,文中在typeNav的index.vue和Head/index.vue分别进行了判断和处理,确保在不同的路径下合并params和query参数能正确合并并传递。 如何当点击联动框时跳转到se…...
[数据集][目标检测]工程机械车辆检测数据集VOC+YOLO格式3189张10类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):3189 标注数量(xml文件个数):3189 标注数量(txt文件个数):3189 标注…...
构建域名服务器-BIND:Linux端的安装过程及配置文件详解
文章目录 构建域名服务器工具-BINDBIND的安装BIND配置文件详解1. /etc/named.conf:2. /etc/named.rfc1912.zones:3. /var/named/named.localhost:4./etc/logrotate.d/named5./etc/named.iscdlv.key6./etc/named.root.key7./etc/rndc.conf8./e…...
linux查询目录文件基础操作
基础命令 展示所有目录 ls 长格式列出(显示文件权限、所有者、大小和最后修改时间): ls -l 忽略大小写查询 ls | grep -i name 查找特定名称的文件: find /path/to/search -name "filename" 忽略大小写查找文件&#…...
搭建TestBench,收藏这几条基本框架就够了
Verilog功能模块HDL设计完成后,并不代表设计工作的结束,还需要对设计进行进一步的仿真验证。掌握验证的方法,即如何调试自己的程序非常重要。在RTL逻辑设计中,要学会根据硬件逻辑来写测试程序即写Testbench。Verilog测试平台是一个…...
怎么利用住宅代理提高数据抓取效率
在大数据时代,数据抓取已经是从互联网收集数据的关键手段,得到了广泛的应用。不论是网络营销、电商平台、或者是新闻网站,数据抓取都可以帮助企业或者是个人收集到大量的数据。但是随着反爬虫技术的不断发展,传统的爬虫方法已经不…...
c#中的ManuaResetEvent
在C#中,ManualResetEvent 是一个同步事件,用于线程间通信。它允许一个或多个等待的线程等待某个事件的发生。当事件被设置为已发生(或称为“信号”)状态时,所有等待的线程都会被释放,并且可以继续执行。 以…...
EE trade:黄金投资的利弊与要点
黄金投资作为一种相对传统的投资途径,存在着特定的优势与风险。接下来详细剖析一下黄金投资的优缺点。 1、黄金投资的优点 有效对抗通货膨胀 在通货膨胀时期,黄金往往能有出色的表现,其价值通常会上升,如此一来便能够为投资者提…...
数据仓库模型评估的标准
面试中,肯定有数仓同学被问到:数据模型如何去评估、如何优化,那今天就聊一聊这个话题。 基本概念 模型:表达的是某一个主题、某一个业务过程,赋值业务价值,最终落地还是一个建表的过程 数仓模型…...
121231
实打实大苏打...
【机器学习】逻辑回归原理(极大似然估计,逻辑函数Sigmod函数模型详解!!!)
目录 🍔 逻辑回归应用场景 🍔 极大似然估计 2.1 为什么要有极大似然估计? 2.2 极大似然估计步骤 2.3 极大似然估计的例子 🍔 Sigmod函数模型 3.1 逻辑斯特函数的由来 3.2 Sigmod函数绘图 3.3 进一步探究-加入线性回归 3…...
网络热门编程项目导学:黑马点评
本文作者:程序员鱼皮 免费编程学习 - 编程导航网:https://www.code-nav.cn 大家好,我是鱼皮。 之前已经给大家分享了三个全栈项目,比如瑞吉外卖什么的,这几个项目都是侧重于带大家学习框架的运用、以及一些简单的业务…...
如何在本地和远程删除 Git 分支?
如何在本地和远程删除 Git 分支? 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科班出身,就职于医疗科技公司,热衷分享知识,武汉城市开发者社区主理人 擅长.n…...
08 STM32 DMA
DMA 协助CPU,完成数据转运工作。 两个程序: DMA数据转运,DMAAD多通道 DMA数据转运,将使用DMA,进行存储器到存储器的数据转运,也就是把一个数组里面的数据,复制到另一个数组里。 定义一个数组D…...
LLM之基于llama-index部署本地embedding与GLM-4模型并初步搭建RAG(其他大模型也可,附上ollma方式运行)
前言 日常没空,留着以后写 llama-index简介 官网:https://docs.llamaindex.ai/en/stable/ 简介也没空,以后再写 注:先说明,随着官方的变动,代码也可能变动,大家运行不起来,可以进…...
Python 异步爬虫:高效数据抓取的现代武器
标题:“Python 异步爬虫:高效数据抓取的现代武器” 在当今信息爆炸的时代,网络爬虫已成为数据采集的重要工具。然而,传统的同步爬虫在处理大规模数据时往往效率低下。本文将深入探讨如何使用 Python 实现异步爬虫,以提…...
【数据结构算法经典题目刨析(c语言)】使用数组实现循环队列(图文详解)
💓 博客主页:C-SDN花园GGbond ⏩ 文章专栏:数据结构经典题目刨析(c语言) 目录 一.题目描述 二.解题思路 1.循环队列的结构定义 2.队列初始化 3.判空 4.判满 5.入队列 6.出队列 7.取队首元素 8.取队尾元素 三.完整代码实…...
PTA L1-005 考试座位号
L1-005 考试座位号(15分) 每个 PAT 考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位。正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生…...
软件测试3333
禅道? 学习正则表达式 目标: 能说出软件测试缺陷判定标准 能说出项目中缺陷的管理系统 能使用Excel对于缺陷进行管理 能使用工具管理缺陷 一、用例执行 说明:用例执行不通过,执行结果与用例的期望结果不一致(含义&…...
JJJ:结构体定义中常加的后缀:attribute ((packed))
__attribute__ ((packed)): 的作用就是告诉编译器取消结构体在编译过程中的优化对齐,按照实际占用字节数进行对齐,是GCC特有的语法。这个功能是跟操作系统没关系,跟编译器有关 在GCC下:struct my{ char ch; int a;} sizeof(int)4…...
【HTML】DOCTYPE作用
<!DOCTYPE html> DOCTYPE是document type(文档类型)的缩写。是HTML5中一种标准通用标记语言的文档类型声明,告诉浏览器文档的类型,便于解析文档。不同渲染模式会影响浏览器对CSS代码甚至JS脚本的解析。它必须声明在第一行。…...
STM32学习记录-04-EXTI外部中断
1 中断系统 (1)中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续…...
Android Studio 动态表格显示效果
最终效果 一、先定义明细的样式 table_row.xml <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_h…...
Python 全栈系列264 使用kafka进行并发处理
说明 暂时考虑的场景是单条数据处理特别复杂和耗时的场景。 场景如下: 要对一篇文档进行实体处理,然后再对实体进行匹配。在这个过程当中,涉及到了好几部分服务: 1 实体识别服务2 数据库查询服务3 es查询服务 整个处理包成了服…...
xampp 开发网站/公司网站推广费用
Substring with Concatenation of All Words 比较复杂的一题,首先是要明确用滑块的概念来解决,始终保持L集合中的字符串在滑块中都只出现了一次,当然设置一个总计数count,当cout等于L集合长度时,即使找了一段符合要求的…...
北京建设工程交易信息网站/百度自动点击器怎么用
投屏技术已经被大量用在身边的产品, 比如电视投屏, 投影仪, 视频会议产品中. 在iOS平台外的其他平台中都已经有非常成熟的标准和实现. 但在封闭的苹果iOS和Mac系统中, 苹果使用私有的Airplay协议进行多屏互动, 只开放给自己生态中的产品. 对此相关技术限制比较严格,…...
国外网站制作/百度平台推广的营销收费模式
你能够轻松地配置 Plasma 桌面并且使用它大量方便且节省时间的特性来加速你的工作,拥有一个能够帮助你而非阻碍你的桌面环境。-- Nick Congleton众所周知,KDE 的 Plasma 是 Linux 下最强大的桌面环境之一。它是高度可定制的,并且看起来也很棒…...
杭州网站建设培训班/百度免费下载安装百度
JAVA方法和本地方法 原地址http://blog.sina.com.cn/s/blog_5b9b4abe01016zw0.html JAVA中有两种方法:JAVA方法和本地方法 JAVA方法是由JAVA编写的,编译成字节码,存储在class文件中本地方法是由其它语言编写的,编译成和处理器相关…...
做网站会遇到什么问题/有没有好用的网站推荐
展开全部1、奇数项求和2、偶数项求和3、平方求和在数学上,斐波那契数列以如下被以32313133353236313431303231363533e78988e69d8331333431366339递推的方法定义:F(1)1,F(2)1, F(n)F(n-1)F(n-2)(n>3,n∈N*)在现代物理、准晶体结…...
ngix安装wordpress的伪静态/seo短期课程
你好,欢迎来到第 29 课时,从这一课时开始我们进入“Flink 实时统计 PV、UV”项目的学习。本课时先介绍实时统计项目的背景、架构设计和技术选型。 背景 PV(Page View,网站的浏览量)即页面的浏览次数,一般用来衡量网站用户访问的网页数量。我们可以简单地认为,一个用户…...