面试知识点梳理及相关面试题(十一)-- docker
1. Docker和虚拟机的区别
容器不需要捆绑一整套操作系统,它只需要满足软件运行的最小内核就行了。
- 传统虚拟机技术是虚拟出一整套硬件后,在其上运行一个完成操作系统,在该系统上再运行所需应用进程
- 容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便
- 每个容器之间互相隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源
与传统的虚拟机相比,docker优势体现在启动速度快,占用体积小
2. docker为什么比虚拟机更快
- docker有着比虚拟机更少的抽象层
- docker利用的是宿主机的内核,而不需要加载操作系统OS内核
3. docker三要素:镜像、容器、仓库
3.1 镜像
是一个只读的模板,一个文件。镜像可以用来创建Docker容器,一个镜像可以创建很多容器。
它也相当于一个root文件系统。比如官方镜像centos7就包含了完成的一套centos7最小系统的root文件系统。
又等同于容器的‘源代码’,docker镜像文件类似于java的类模板,而docker容器实例类似于java中new出来的实例对象
3.2 容器
容器是用镜像创建的运行实例,是一个服务。
就像java中的类和实例对象一样,镜像是静态的定义,容器是镜像运行时的实体。
容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
可以把容器看做一个简单的linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
3.3 仓库
是集中存放镜像文件的地方。
docker公司提供的官方registry被称为docker hub,存放各种镜像模板的地方。
4. docker相关命令
4.1 帮助启动类命令:
# 启动docker
systemctl start docker
# 停止docker
systemctl stop docker
# 重启docker
systemctl restart docker
# 查看docker状态
systemctl status docker
# 开机启动
systemctl enable docker
# 查看docker概要信息
docker info
# 查看docker总体帮助文档
docker --help
# 查看docker命令帮助文档
docker 具体命令 --help
4.2 镜像相关命令
- 查看本地库镜像:
docker images
- 查看远程库镜像:
docker search tomcat
- 下载镜像:
docker pull 镜像名字
- 查看镜像、容器、数据卷所占空间:
docker system df
- 删除镜像:
docker rmi 镜像名称/镜像id
- 导出镜像:
docker save -o redis.tar redis
- 导入镜像:
docker load -i redis.tar
4.3 容器相关命令:
4.3.1 启动容器
docker run [options] images [command] [arg...]
options可选参数:
- –name:为容器指定一个名称
- -d:后台运行容器并返回容器id,也即启动守护式容器(后台运行)
- -i:以交互模式运行容器,通常与-t同时使用
- -t:为容器重新分配一个伪输入终端,通常与-i同时使用,也即启动交互式容器(前台有伪终端,等待交互)
- -P:随机端口映射
- -p:指定端口映射
4.3.1.1 端口映射:
比如我们想访问redis,但是redis在docker内部,所以我们必须通过一个端口访问docker,docker拿着这个端口对应的端口去内部访问。
写-p 6379:6380
,就是docker内部redis暴露的端口是6380,而宿主机对外暴露的端口是6379,要想访问docker内的redis,我们需要访问宿主机的6379端口
4.3.1.2 交互式终端启动:
可以进入到启动的容器内部
[root@yhx ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest ba6acccedd29 5 months ago 72.8MB
hello-world latest feb5d9fea6a5 5 months ago 13.3kB
[root@yhx ~]# docker run -it ubuntu /bin/bash
root@7a24369c5aa1:/# ls
bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var# 给容器指定名称
[root@yhx ~]# docker run --name=myU1 ubuntu
4.3.2 罗列所有正在运行的容器
docker ps [options]
options可选项:
- -a:罗列当前所有正在运行的容器+历史上运行过的
- -l:显示最近创建的容器
- -n:显示最近n个创建的容器
- -q:静默模式,只显示容器编号
4.3.3 退出容器
如何从容器内部退出?
- exit:run进入容器,exit退出,容器停止
- ctrl+p+q:run进入容器,ctrl+p+q退出,容器不停止
[root@yhx ~]# docker run -it --name=myU2 ubuntu
root@74bc8360c83d:/# exit
exit
[root@yhx ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@yhx ~]# docker run -it --name=myU3 ubuntu
root@0de743d939f5:/#
[root@yhx ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0de743d939f5 ubuntu "bash" 8 seconds ago Up 7 seconds myU3
[root@yhx ~]#
4.3.4 重启、停止、删除容器
# 重启容器
docker restart id/容器名
# 停止容器
docker stop id/容器名
# 强制停止容器
docker kill id/容器名
# 删除已经停止的容器
docker rm 容器名称/id
# 强制删除容器
docker rm -f 容器名称/id
4.3.5 启动守护式容器
docker run -d 容器名
我们尝试启动一下centos镜像:
[root@yhx docker]# docker run -d --name=centos8 centos
3debce674ad8a24f55adef4c874b09a13d5c9b7517eddd5ab39edee46c187c93
[root@yhx docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3debce674ad8 centos "/bin/bash" 3 seconds ago Exited (0) 2 seconds ago centos8
[root@yhx docker]#
通过docker ps -a
命令我们可以看到已经停止的容器。
于是疑惑产生了, -d 是保证容器在后台运行,为什么我的容器停止运行了呢?
前面提到过, docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
中有一个 COMMAND 参数,容器启动后会执行 COMMAND命令,它的默认值为 /bin/bash。也就是说容器在后台启动成功后,执行了 COMMAND 命令后直接关闭了。
了解到该原理后,我们可以通过在 docker run -d 后增加一个驻留在进程中长期运行的命令就可以保证容器不关闭了。
[root@yhx docker]# docker run -d --name=centos9 centos tail -f /dev/null
8da9a8358b679f83dac1a8a98b8620e60d37e3c1b8680483bd3448e4de1f12b5
[root@yhx docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8da9a8358b67 centos "tail -f /dev/null" 3 seconds ago Up 2 seconds centos9
3debce674ad8 centos "/bin/bash" 3 minutes ago Exited (0) 3 minutes ago centos8
[root@yhx docker]#
4.3.6 查询容器内部信息
# 查看容器日志
docker logs 容器id
# 查看容器内运行的进程
docker top 容器id
# 查看容器内部细节
docker inspect 容器id
4.3.7 进入正在运行的容器并以命令行交互
# 重新进入正在运行的容器
docker exec -it 容器id bashShell
# 重新进入正在运行的容器, 不建议使用
docker attach 容器id
区别:
- attach直接进入容器启动命令的终端,不会启动新的进程,用exit退出,会导致容器的停止
- exec是在容器中打开新的终端,并且可以启动新的进程,用exit退出,不会导致容器的停止
4.3.8 文件在容器与主机中互相拷贝
# 从容器中转出
docker cp 容器id:容器目录地址 主机目录地址
# 例
docker cp 371ce72fa7f5:/usr/local/a.txt /home/aaa.txt
4.3.9 导入和导出容器
- export导出容器:将容器的内容留作为一个tar归档文件,备份容器
- import导入容器:从tar包中的内容创建一个新的文件系统再导入为镜像
# 导出
docker export 容器id > 文件名.tar
# 导入
cat 文件名.tar | docker import -镜像用户/镜像名:版本号
[root@yhx ~]# docker export 1be58e734dc9 > a.tar
[root@yhx ~]# ls
a.tar
[root@yhx ~]# cat a.tar | docker import - a/a
sha256:c4b611df9300f0cddbfe0a1fb61cd4fabc40bf8c7478b7bfbb5d5c5a83b23477
[root@yhx ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
a/a latest c4b611df9300 11 seconds ago 109MB
redis latest 7614ae9453d1 2 months ago 113MB
ubuntu latest ba6acccedd29 5 months ago 72.8MB
hello-world latest feb5d9fea6a5 5 months ago 13.3kB
[root@yhx ~]#
4.3.10 commit制作镜像
docker commit 提交容器副本使之成为一个新的镜像
docker commit -m="提交的描述信息" -a="作者" 容器id 要创建的目标镜像名:[标签名]
进入ubuntu的镜像,可以看到目前不带vim命令:
root@a893f307cfa1:/# vim lib
bash: vim: command not found
安装vim:
apt-get update
apt-get -y install vim
提交我们具备vim命令的ubuntu容器:
[root@yhx ~]# docker commit -m="with vim" -a="yhx" a893f307cfa1 with-vim/with-vim:1.0
sha256:9b6363fb0c60770935be5327e94c19c0ae550bc478a8df7ef4c1978f34ad3e77
[root@yhx ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
with-vim/with-vim 1.0 9b6363fb0c60 6 seconds ago 175MB
a/a latest c4b611df9300 About an hour ago 109MB
tomcat latest fb5657adc892 2 months ago 680MB
redis latest 7614ae9453d1 2 months ago 113MB
ubuntu latest ba6acccedd29 5 months ago 72.8MB
hello-world latest feb5d9fea6a5 5 months ago 13.3kB
[root@yhx ~]#
接下来启动我们新建的镜像,就可以包括vim功能了
5. 分层镜像
从远程仓库拉去tomcat,可以看到镜像是一层一层下载的:
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统叫UnionFS。
5.1 UnionFS文件系统
是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件盒目录。
5.2 docker的分层文件系统
-
bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs。这一层与我们典型的linux系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
-
rootfs(root file system),在bootfs之上。包含的就是典型linux系统中的/dev、/bin、/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如ubuntu、centos等。
为什么平常我们虚拟机的centos好几个G,而docker才200M?
对于一个精简的os,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就行了。
5.3 好处
可以共享资源,方便复制迁移,方便复用。
比如说有多个镜像都从相同的base镜像构建而来,那么Docker Host只需在磁盘上保存一份base镜像;同时内存中也只需加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
docker中的镜像分层,支持通过扩展现有的镜像,创建新的镜像。类似java继承于一个base基础类,自己再按需扩展。
新镜像是从base镜像一层一层叠加生成的。没安装一个软件,就在现有镜像的基础上增加一层。
6.容器数据卷
6.1 定义:
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因为能够绕过union file system提供一些用于持续存储或共享数据的特性。
卷的设计目的就是数据持久化,完全独立于容器的生命周期,因为docker不会在容器删除时删除其挂载的数据卷。
6.2 作用:将容器数据备份到主机
将容器的重要数据备份持久化到主机中,防止不小心删除容器导致数据丢失
6.3 特点:
- 数据卷可在容器之间共享或重用数据
- 卷中的更改可以直接实时生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
- 停止容器,在主机中添加文件,文件还是会同步到容器
- 查看数据卷是否挂载成功:
docker inspect 容器id
6.4 命令:-v参数:
docker run [其他的一些可选参数] -v /宿主机绝对路径目录:/容器内目录 --privileged=true 镜像名
例:
# 其中-d -p不多说
# -v代表将后面‘:’前面的路径即宿主机的路径和‘:’后面的路径即容器内的路径实现了数据共享
# --privileged=true表示放开权限
# registry表示启动后的容器名
docker run -d -p 5000:5000 -v /zzyyuser/myregistry:/tmp/registry --privileged=true registry
默认情况,即不指定关联路径的时候,仓库被创建在容器的/var/lib/registry目录下。
此处建议自行用容器卷映射,方便宿主机联调。
6.5 设置容器卷读写规则
# rw:可读可写
# ro:只读即read only,宿主机可以写入数据,容器只能读取,不能修改目录内容
# 如果不加,默认是rw即可读可写
docker run -it --privileged=true -v /宿主机目录:/容器内目录:rw/ro 镜像名
6.6 卷的继承和共享
容器1完成和宿主机的映射,容器2继承容器1的卷:
docker run -it --privileged=true --volumes-from 容器1 --name 容器2 ubuntu
[root@yhx ~]# docker run -it --privileged=true --volumes-from u1 --name u2 ubuntu
root@fd1b6d17de39:/# cd /tmp/
root@fd1b6d17de39:/tmp# ls
docker_data
root@fd1b6d17de39:/tmp# cd docker_data/
root@fd1b6d17de39:/tmp/docker_data# ls
study.txt
root@fd1b6d17de39:/tmp/docker_data#
如果容器1挂了,会不会对容器2造成影响?
答案是不会,所以我的理解虽然这里是继承,但是继承的只是配置,也就是容器2已经直接连到了宿主机。
7. dockerfile
dockerfile是用来构建docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。
7.1 基础知识
- 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
- 指令按照从上到下,顺序执行
- #表示注释
- 每条指令都会创建一个新的镜像层并对镜像进行提交
7.2 docker执行dockerfile的大致流程
- docker从基础镜像运行一个容器
- 执行一条指令并对容器作出修改
- 执行类似dokcer commit的操作提交一个新的镜像层
- docker再基于刚提交的镜像运行一个新容器
- 执行dockerfile的下一条指令直到所有指令都执行完成
- dockerfile:需要定义一个dockerfile,dockerfile定义了进程需要的一切东西。dockefile涉及的内容包括执行代码或是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等
- docker镜像:再用dockerfile定义一个文件之后,docker build时会产生一个docker镜像,当运行docker镜像时会真正开始提供服务
- docker容器:容器是直接提供服务的
7.3 相关关键字
-
FROM:基础镜像,当前新镜像是基于哪个镜像的,制定一个已经存在的镜像作为模板,第一条必是from
-
MAINTAINER:镜像维护者的姓名和邮箱地址
-
RUN:容器构建时需要执行的命令。run是在docker build时运行。两种格式:
- shell格式
- exec格式
-
EXPOSE:当前容器对外暴露的端口
-
WORKDIR:指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点。即通过
docker run -it 镜像id
启动后,进入到容器内部后的目录地址 -
USER:指定该镜像以什么样的用户去执行,如果不指定,默认是root
-
ENV:用来在构建镜像过程中,设置环境变量。比如设置
ENV MY_PATH /usr/mytest
,这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面置顶了环境变量前缀一样;也可以在其他指令中直接使用这些环境变量。接着就可以直接使用WORKDIR $MY_PATH
-
VOLUME:容器数据卷,用于数据保存和持久化工作
-
ADD:将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
-
COPY:类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置
-
CMD:CMD指令的格式和RUN相似
- 两种格式:
- shell格式:CMD <命令>
- exec格式:CMD [“可执行文件”,“参数1”,“参数2”,…]
- 参数列表格式:CMD [“参数1”,“参数2”,…],在置顶了ENTRYPOINT指令后,用CMD指定具体的参数
- dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
- 比如如果我们在启动tomcat的时候,在run后面加上/bin/bash,就会导致启动失败,因为我们的/bin/bash命令把原有的run命令给覆盖了
- 比如如果我们在启动tomcat的时候,在run后面加上/bin/bash,就会导致启动失败,因为我们的/bin/bash命令把原有的run命令给覆盖了
- 和RUN的区别:
- CMD是在docker run的时候运行
- RUN是在docker build时运行
- 两种格式:
-
ENTRYPOINT:也是用来指定一个容器启动时要运行的命令。类似CMD指令,但是ENTRYPOINT不会被docker run后面的命令覆盖,而且这些命令行参数会被当做参数送给ENTRYPOINT指令指定的程序。
- 两种写法:
- exec 格式:
ENTRYPOINT ["executable", "param1", "param2"]
- shell 格式:
ENTRYPOINT command param1 param2
- exec 格式:
- 重点:
- ENTRYPOINT 指定镜像的默认入口命令,该入口命令会在启动容器时作为根命令执行,所有其他传入值作为该命令的参数
- ENTRYPOINT 的值可以通过 docker run --entrypoint 来覆盖掉
- 只有 Dockerfile 中的最后一条 ENTRYPOINT 指令会起作用
- ENTRYPOINT 和 CMD 联合使用:
- 当指定了 ENTRYPOINT 后,CMD 的含义就发生了改变,不再是直接的运行其命令,而是将 CMD 的内容作为参数传给 ENTRYPOINT 指令
换句话说实际执行时,会变成:<ENTRYPOINT> "<CMD>"
- 当指定了 ENTRYPOINT 后,CMD 的含义就发生了改变,不再是直接的运行其命令,而是将 CMD 的内容作为参数传给 ENTRYPOINT 指令
- 两种写法:
7.4 自定义dockerfile
先pull官方版本centos镜像,拉下来的镜像并不包含vim,ifconfig,jdk8等内容,我们希望自己能制作一个镜像并拥有以上功能。
下载一个jdk和Dockerfile放在一起
7.4.1 编写Dockerfile文件
# 最新的centos8不维护了有些问题,这里用的centos7
FROM centos:7.2.1511
MAINTAINER yhxENV MYPATH /usr/local
WORKDIR $MYPATH# 安装vim编辑器
RUN yum -y install vim
# 安装ifconfig命令及查看网络ip
RUN yum -y install net-tools
#安装java17及lib库
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把jdk添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-17_linux-x64_bin.tar.gz /usr/local/java
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk-17.0.2
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jarL$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATHEXPOSE 80CMD echo $MYPATH
CMD echo "success .......OK"
CMD /bin/bash
7.4.2 构建
# 注意后面有个点
# 此时t:--target string Set the target build stage to build.
docker build -t 新镜像名称:TAG .# 此处:
[root@yhx studyDockerfile]# docker build -t centosjava17:1.0 .
7.5 项目中打包微服务jar包为镜像
使用docker的maven插件:
<plugin><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>0.4.13</version><configuration><!--指定远程 docker api地址--><dockerHost>http://192.168.0.237:2375</dockerHost><!--指定生成的镜像名--><imageName>materials_center/comm-public</imageName><!--指定标签--><imageTags><imageTag>latest</imageTag></imageTags><!-- 表示项目根目录,即包含pom.xml文件的目录--><!-- 指定 Dockerfile 路径 ${project.basedir}:项目根路径下--><dockerDirectory>${pom.basedir}</dockerDirectory><dockerCertPath>E:\134client</dockerCertPath>
<!-- <dockerCertPath>E:\client</dockerCertPath>-->
<!-- <dockerCertPath>E:\ideaWork\materialsCenter\docker-client-key</dockerCertPath>--><resources><resource><targetPath>/</targetPath><directory>${project.build.directory}</directory><include>${project.build.finalName}.jar</include></resource></resources></configuration>
</plugin>
# 基础镜像使用
FROM openjdk:8u212-jre
# 将jar包添加到容器中的指定目录下
COPY cwms-1.0.0.jar /home/logistics-cloud/project/cwms-1.0.0.jar
#设置系统编码
ENV LANG C.UTF-8
ENTRYPOINT ["java", "-Xmx1256m", "-jar", "/home/logistics-cloud/project/cwms-1.0.0.jar"]
8. docker网络
docker启动后,会产生一个名为docker0的虚拟网桥
8.1 用处:
- 容器间的互联和通信以及端口映射
- 容器ip变动时可以通过服务名直接网络通信而不受影响
8.2 docker的三大网络模式
8.2.1 bridge:用的最多
为每个容器分配、设置ip等,并将容器连接到一个docker0;
虚拟网桥,默认为该模式
Docker服务默认会创建一个docker0网桥(其中有一个docker0的内部接口),该桥接网络的名称为docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。Docker默认指定了docker0接口的IP地址和子网掩码,让主机和容器之间可以通过相互通信。
说明:
8.2.2 host:
容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口与外界进行通信,不再需要额外进行NAT转换
说明
8.2.3 none:几乎不会用
容器有独立的NetWork namespace,但并没有对其进行任何网络设置,如分配veth pair和网桥连接、IP等
禁用网络功能,只有lo标识(就是127.0.0.1表示本地循环)
在none模式下,并不为docker容器进行任何网络配置。也就是说,这个docker容器没有网卡、ip、路由等信息,只有一个lo,需要我们自己为docker容器添加网卡、配置ip等
8.2.4 container:
新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP,端口范围等
两个容器除了网络方面,其他的如文件系统,进程列表等还是隔离的。
9. docker-compose容器编排
docker-comppse是docker官方的开源项目,负责实现对docker容器集群的快速编排。
Compose是Docker公司推出的一个工具软件,可以管理多个Docker容器组成一个应用。你需要定义一个YAML格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器
9.1 使用compose的三个步骤
- 编写Dockerfile定义各个微服务应用并构建出对应的镜像文件
- 使用docker-compose.yml定义一个完整的业务单元,安排好整体应用中的各个容器服务
- 最后,执行docker-compose up命令来启动并运行整个应用程序,完成一键部署上线
9.2 compose文件相关命令
9.3 示例:
解析第一个服务的编写,等同于我们单独启动的命令:
docker run -d -p 9700:9700 -v /home/common-business/crea-suytest-project/logs:/log
--network host --name crea-suytest crea_cloud/crea-suytest:latest
# docker-compose 版本,现在我们基本上都用3
version: '3'services: #本工程的服务配置列表crea-suytest: #spring boot的服务名,服务名自定义image: crea_cloud/crea-suytest:latest #指定基于crea_cloud/integrity-admin:latest镜像为基础镜像来构建镜像# build: #基于Dockerfile文件构建镜像时使用的属性# context: . #代表当前目录,也可以指定绝对路径[/path/test/Dockerfile]或相对路径[../test/Dockerfile],尽量放在当前目录,便于管理# dockerfile: Dockerfile #指定Dockerfile文件名。如果context指定了文件名,这里就不用本属性了container_name: crea-suytest #spring boot服务启动后实例的名称volumes: #挂载属性- "/home/common-business/crea-suytest-project/logs:/log"# command: # 容器启动后默认执行的命令 主要目的是在执行容器时提供默认值。这些将在入口点之后被附加到入口的参数。# - "--crea-monitor-admin=192.168.0.61"#- "--crea-gateway=192.168.0.61"#- "--nacos.url=192.168.0.61:8001"#- "--mysql.url=192.168.0.63"#- "--redis.url=192.168.0.63"#- "--redis.password=qwer123!@#."#- "--mysql.username=db_manager"#- "--mysql.password=db_manager_crea"#- "--mysql.port=3306"#- "--fastdfs.url=192.168.0.243"#- "--rabbitmq.url=192.168.0.63"#- "--storage.url=192.168.0.243"#- "--server.url=192.168.0.61"#- "--seata.url=192.168.0.61"environment:#设置容器的环境变量- "TZ=Asia/Shanghai" #这里设置容器的时区为亚洲上海 解决了容器的时区问题- "encryption=false"env_file: #这个文件可以设置 Compose 的变量,在 docker-compose.yml 中可以定义一个专门存放变量的文件 运行容器时,Compose 文件中定义的环境变量优先- suytest.env#类似于CMD指令的功能,用于为容器指定默认的运行程序,从而使得容器像是一个单独的可执行文件entrypoint: java -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/heap-dunp/crea-suytest.hprof -XX:-OmitStackTraceInFastThrow -jar /home/project/crea-suytest-1.0.0.jarports:#映射端口属性- 9700:9700 #建议使用字符串格式,指定宿主机端口映射到本容器的端口restart: on-failure #是否随docker服务启动重启 network_mode: "host" #设置网络模式 默认 bridge ,host 主机模式 # depends_on: # 取决于下面的镜像,也就是先启动下一个镜像,再启动这个镜像# - crea-suytest-mobilecrea-suytest-mobile: # 第二个微服务image: crea_cloud/crea-suytest-mobile:latestcontainer_name: crea-suytest-mobilevolumes:- "/home/common-business/crea-suytest-project/logs:/log"environment:- "TZ=Asia/Shanghai"- "encryption=false"env_file:- suytest.enventrypoint: java -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/heap-dunp/crea-suytest-mobile.hprof -XX:-OmitStackTraceInFastThrow -jar /home/project/crea-suytest-mobile-1.0.0.jarports:- 9701:9701restart: on-failurenetwork_mode: "host"crea-lottery: # 第三个微服务image: crea_cloud/crea-lottery:latestcontainer_name: crea-lotteryvolumes:- "/home/common-business/crea-suytest-project/logs:/log"environment:- "TZ=Asia/Shanghai"- "encryption=false"env_file:- suytest.enventrypoint: java -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/heap-dunp/crea-lottery.hprof -XX:-OmitStackTraceInFastThrow -jar /home/project/crea-lottery-1.0.0.jarports:- 9702:9702restart: on-failurenetwork_mode: "host"
其中的suytest.env文件是相关连接配置:
[root@localhost crea-suytest-project]# cat suytest.env
crea-monitor-admin=192.168.0.61
crea-gateway=192.168.0.61
nacos.url=192.168.0.61:8001
mysql.url=192.168.0.63
redis.url=192.168.0.63
redis.password=123
mysql.username=123
mysql.password=123
mysql.port=3306
fastdfs.url=192.168.0.243
rabbitmq.url=192.168.0.63
storage.url=192.168.0.243
相关文章:

面试知识点梳理及相关面试题(十一)-- docker
1. Docker和虚拟机的区别 容器不需要捆绑一整套操作系统,它只需要满足软件运行的最小内核就行了。 传统虚拟机技术是虚拟出一整套硬件后,在其上运行一个完成操作系统,在该系统上再运行所需应用进程容器内的应用进程直接运行于宿主的内核&am…...

k8s--services(微服务)
文章目录一、k8s网络通信service和iptables的关系二、services1.简介2.默认3.IPVS模式的service4.clusterip5.headless6.从外部访问service的三种方式(1)nodeport(2)loadbalancer7.metallb一、k8s网络通信 k8s通过CNI接口接入其他…...

【Java开发】设计模式 01:单例模式
1 单例模式介绍单例模式(Singleton Pattern)是Java中最为基础的设计模式。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对…...

10、go工程化与标准库
目录一、用go mod管理工程二、包引入规则三、init调用链四、可见性五、标准库1 - 时间函数2 - 数学计算3 - I/O操作4 - 编码一、用go mod管理工程 初始化项目:go mod init $module_name,$module_name和目录名可以不一样。上述命令会生成go.mod文件 mod…...
【Selenium自动化测试】鼠标与键盘操作
在 WebDriver 中,与鼠标操作相关的方法都封装在ActionChains 类中,与键盘操作相关的方法都封装在Keys类中。下面介绍下这两个类中的常用方法。 鼠标操作 ActionChains类鼠标操作常用方法: context_click():右击double_click()&…...
自定义javax.validation校验枚举类
枚举类单一情况 package com.archermind.cloud.phone.dto.portal.external.validation.validator;import com.archermind.cloud.phone.dto.portal.external.validation.constraints.EnumValidation; import lombok.extern.slf4j.Slf4j;import javax.validation.ConstraintVali…...

[Java·算法·中等]LeetCode39. 组合总和
每天一题,防止痴呆题目示例分析思路1题解1分析思路2题解2👉️ 力扣原文 题目 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形…...

【Linux】vi和vim编辑器
目录主题主题 三种常见模式: 正常模式 以vim 打开一个档案就直接进入一般模式了(这是默认的模式)。在这个模式中,你可以使用[上下左右]按键来移动光标,你可以使用『删除字符』或『删除整行』来处理档案内容,也可以使用「复制、…...

BIO,NIO,AIO
IO模型 用什么样的通道进行数据传输和接收,java支持3种io网络编程模式 BIO NIO AIO BIO 同步阻塞 一个客户端连接对应一个处理线程 BIO示例代码(客户端和服务端) package com.tuling.bio;import java.io.IOException; import java.net.So…...
代码随想录刷题-数组-有序数组的平方
文章目录有序数组的平方习题暴力排序双指针有序数组的平方 本节对应代码随想录中:代码随想录,讲解视频:有序数组的平方_哔哩哔哩_bilibili 习题 题目链接:977. 有序数组的平方 - 力扣(LeetCode) 给你一…...

【玩转c++】stack和queue的介绍和模拟实现
本期主题:list的讲解和模拟实现博客主页: 小峰同学分享小编的在Linux中学习到的知识和遇到的问题小编的能力有限,出现错误希望大家不吝赐stack的介绍和使用1.1.stack的介绍1. stack是一种容器适配器,专门用在具有后进先出操作的上…...

Linux order(文件、磁盘、网络、系统管理、备份压缩)
1. Linux 文件命令 -rwxrwxrwx chmod:change mode,用于(文件所有者或 root )变更用户(u:owner g:group o:other a:all)的权限 chmod [OPTION]… MODE[,MODE]… FILE… OPTION -R:递归修改more option:chmod…...

最详细的CentOS7安装Mysql数据库服务
1.查看是否安装mysql: rpm -qa | grep mysql如果有查出来东西,使用命令删除: rpm -e xxx2.检查是否有mysql用户组和mysql用户,没有就添加有就忽略: groups mysql 添加用户组和用户 groupadd mysql && useradd -r -g mysql mysql&a…...

【IoT】项目管理:如何做好端到端的项目管理?
今天主要来谈谈项目管理这个话题。 首先来看一个我在网络上看到的一个关于项目管理的案例或者是段子。 将项目管理的作用及意义非常直观地展示了出来。 有一个植树搞绿化的企业,在公司内部设置有五个部门,分别是: 运输部门;挖坑部…...

渲染十万条数据就把你难住了?不存在的!
虚拟列表的使用场景如果我想要在网页中放大量的列表项,纯渲染的话,对于浏览器性能将会是个极大的挑战,会造成滚动卡顿,整体体验非常不好,主要有以下问题:页面等待时间极长,用户体验差CPU计算能力…...
编程学习的心路历程和困惑回顾
回首入行9年的经历,从大一开始学习C语言和数据结构,老师一直是在用IDE演示程序的编写和运行,我们也就一直在跟黑乎乎的命令行窗口打交道。 后来在一些课程的实验环节,接触到了一些别人编写好的工程代码,知道了Makefile…...

请介绍类加载过程,什么是双亲委派模型?
第23讲 | 请介绍类加载过程,什么是双亲委派模型? Java 通过引入字节码和 JVM 机制,提供了强大的跨平台能力,理解 Java 的类加载机制是深入 Java 开发的必要条件,也是个面试考察热点。 今天我要问你的问题是࿰…...

Navisworks编辑材质和Revit快速切换材质问题
一、如何在Navisworks2016中编辑材质 初次使用NW2016-2017时发现,原来用于创建编辑材质的小地球不见了,如图1所示,在各大技术群里求助没有回应,度娘搜索也总是摇头。 经过仔细排查可能出现的地方,终于找到了可以编辑材…...

Object对象键值的输出循序到底如何排列的?
1.日常摸鱼看八股 今天又是复习八股文的一天,发现还是彻底懂得原理才好和面试官吹牛批呀。 接着来看看我chat大宝贝的回答: 在现代浏览器中,Object 对象的键值输出循序是比较稳定的,通常是按照如下顺序输出: 所有的数…...

气泡式水位计的安装方法详解
气泡水位计的安装实际上就是气管的安装,气管的安装是否正确将直接影响到仪器测量数据的结果,气泡水位计它由活塞泵产生的压缩空气流经测量管和气泡室,进入被测的水体中,测量管中的静压力与气泡室上的水位高度成正比。那么接下来就…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...