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转移。

相关推荐
南猿北者1 小时前
docker容器
docker·容器
二十雨辰1 小时前
[linux]docker基础
linux·运维·docker
黑叶白树2 小时前
简单的签到程序 python笔记
笔记·python
@小博的博客2 小时前
C++初阶学习第十弹——深入讲解vector的迭代器失效
数据结构·c++·学习
time never ceases2 小时前
使用docker方式进行Oracle数据库的物理迁移(helowin/oracle_11g)
数据库·docker·oracle
幸运超级加倍~2 小时前
软件设计师-上午题-15 计算机网络(5分)
笔记·计算机网络
南宫生2 小时前
贪心算法习题其四【力扣】【算法学习day.21】
学习·算法·leetcode·链表·贪心算法
懒惰才能让科技进步3 小时前
从零学习大模型(十二)-----基于梯度的重要性剪枝(Gradient-based Pruning)
人工智能·深度学习·学习·算法·chatgpt·transformer·剪枝
love_and_hope3 小时前
Pytorch学习--神经网络--搭建小实战(手撕CIFAR 10 model structure)和 Sequential 的使用
人工智能·pytorch·python·深度学习·学习
Chef_Chen3 小时前
从0开始学习机器学习--Day14--如何优化神经网络的代价函数
神经网络·学习·机器学习