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…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...