当前位置: 首页 > news >正文

面试知识点梳理及相关面试题(十一)-- 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 镜像相关命令

  1. 查看本地库镜像:docker images
  2. 查看远程库镜像:docker search tomcat
  3. 下载镜像:docker pull 镜像名字
  4. 查看镜像、容器、数据卷所占空间:docker system df
  5. 删除镜像:docker rmi 镜像名称/镜像id
  6. 导出镜像:docker save -o redis.tar redis
  7. 导入镜像: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 特点:

  1. 数据卷可在容器之间共享或重用数据
  2. 卷中的更改可以直接实时生效
  3. 数据卷中的更改不会包含在镜像的更新中
  4. 数据卷的生命周期一直持续到没有容器使用它为止
  5. 停止容器,在主机中添加文件,文件还是会同步到容器
  6. 查看数据卷是否挂载成功: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 基础知识

  1. 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  2. 指令按照从上到下,顺序执行
  3. #表示注释
  4. 每条指令都会创建一个新的镜像层并对镜像进行提交

7.2 docker执行dockerfile的大致流程

  1. docker从基础镜像运行一个容器
  2. 执行一条指令并对容器作出修改
  3. 执行类似dokcer commit的操作提交一个新的镜像层
  4. docker再基于刚提交的镜像运行一个新容器
  5. 执行dockerfile的下一条指令直到所有指令都执行完成

在这里插入图片描述

  1. dockerfile:需要定义一个dockerfile,dockerfile定义了进程需要的一切东西。dockefile涉及的内容包括执行代码或是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等
  2. docker镜像:再用dockerfile定义一个文件之后,docker build时会产生一个docker镜像,当运行docker镜像时会真正开始提供服务
  3. 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命令给覆盖了
        在这里插入图片描述
    • 和RUN的区别:
      • CMD是在docker run的时候运行
      • RUN是在docker build时运行
  • ENTRYPOINT:也是用来指定一个容器启动时要运行的命令。类似CMD指令,但是ENTRYPOINT不会被docker run后面的命令覆盖,而且这些命令行参数会被当做参数送给ENTRYPOINT指令指定的程序。

    • 两种写法:
      • exec 格式:ENTRYPOINT ["executable", "param1", "param2"]
      • shell 格式: ENTRYPOINT command param1 param2
    • 重点:
      • ENTRYPOINT 指定镜像的默认入口命令,该入口命令会在启动容器时作为根命令执行,所有其他传入值作为该命令的参数
      • ENTRYPOINT 的值可以通过 docker run --entrypoint 来覆盖掉
      • 只有 Dockerfile 中的最后一条 ENTRYPOINT 指令会起作用
    • ENTRYPOINT 和 CMD 联合使用:
      • 当指定了 ENTRYPOINT 后,CMD 的含义就发生了改变,不再是直接的运行其命令,而是将 CMD 的内容作为参数传给 ENTRYPOINT 指令
        换句话说实际执行时,会变成:<ENTRYPOINT> "<CMD>"
        在这里插入图片描述

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 用处:

  1. 容器间的互联和通信以及端口映射
  2. 容器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的三个步骤

  1. 编写Dockerfile定义各个微服务应用并构建出对应的镜像文件
  2. 使用docker-compose.yml定义一个完整的业务单元,安排好整体应用中的各个容器服务
  3. 最后,执行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和虚拟机的区别 容器不需要捆绑一整套操作系统&#xff0c;它只需要满足软件运行的最小内核就行了。 传统虚拟机技术是虚拟出一整套硬件后&#xff0c;在其上运行一个完成操作系统&#xff0c;在该系统上再运行所需应用进程容器内的应用进程直接运行于宿主的内核&am…...

k8s--services(微服务)

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

【Java开发】设计模式 01:单例模式

1 单例模式介绍单例模式&#xff08;Singleton Pattern&#xff09;是Java中最为基础的设计模式。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类&#xff0c;该类负责创建自己的对象&#xff0c;同时确保只有单个对…...

10、go工程化与标准库

目录一、用go mod管理工程二、包引入规则三、init调用链四、可见性五、标准库1 - 时间函数2 - 数学计算3 - I/O操作4 - 编码一、用go mod管理工程 初始化项目&#xff1a;go mod init $module_name&#xff0c;$module_name和目录名可以不一样。上述命令会生成go.mod文件 mod…...

【Selenium自动化测试】鼠标与键盘操作

在 WebDriver 中&#xff0c;与鼠标操作相关的方法都封装在ActionChains 类中&#xff0c;与键盘操作相关的方法都封装在Keys类中。下面介绍下这两个类中的常用方法。 鼠标操作 ActionChains类鼠标操作常用方法&#xff1a; context_click()&#xff1a;右击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. 组合总和

每天一题&#xff0c;防止痴呆题目示例分析思路1题解1分析思路2题解2&#x1f449;️ 力扣原文 题目 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形…...

【Linux】vi和vim编辑器

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

BIO,NIO,AIO

IO模型 用什么样的通道进行数据传输和接收&#xff0c;java支持3种io网络编程模式 BIO NIO AIO BIO 同步阻塞 一个客户端连接对应一个处理线程 BIO示例代码&#xff08;客户端和服务端&#xff09; package com.tuling.bio;import java.io.IOException; import java.net.So…...

代码随想录刷题-数组-有序数组的平方

文章目录有序数组的平方习题暴力排序双指针有序数组的平方 本节对应代码随想录中&#xff1a;代码随想录&#xff0c;讲解视频&#xff1a;有序数组的平方_哔哩哔哩_bilibili 习题 题目链接&#xff1a;977. 有序数组的平方 - 力扣&#xff08;LeetCode&#xff09; 给你一…...

【玩转c++】stack和queue的介绍和模拟实现

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

Linux order(文件、磁盘、网络、系统管理、备份压缩)

1. Linux 文件命令 -rwxrwxrwx chmod&#xff1a;change mode&#xff0c;用于&#xff08;文件所有者或 root &#xff09;变更用户(u:owner g:group o:other a:all)的权限 chmod [OPTION]… MODE[,MODE]… FILE… OPTION -R&#xff1a;递归修改more option&#xff1a;chmod…...

最详细的CentOS7安装Mysql数据库服务

1.查看是否安装mysql: rpm -qa | grep mysql如果有查出来东西&#xff0c;使用命令删除&#xff1a; rpm -e xxx2.检查是否有mysql用户组和mysql用户,没有就添加有就忽略&#xff1a; groups mysql 添加用户组和用户 groupadd mysql && useradd -r -g mysql mysql&a…...

【IoT】项目管理:如何做好端到端的项目管理?

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

渲染十万条数据就把你难住了?不存在的!

虚拟列表的使用场景如果我想要在网页中放大量的列表项&#xff0c;纯渲染的话&#xff0c;对于浏览器性能将会是个极大的挑战&#xff0c;会造成滚动卡顿&#xff0c;整体体验非常不好&#xff0c;主要有以下问题&#xff1a;页面等待时间极长&#xff0c;用户体验差CPU计算能力…...

编程学习的心路历程和困惑回顾

回首入行9年的经历&#xff0c;从大一开始学习C语言和数据结构&#xff0c;老师一直是在用IDE演示程序的编写和运行&#xff0c;我们也就一直在跟黑乎乎的命令行窗口打交道。 后来在一些课程的实验环节&#xff0c;接触到了一些别人编写好的工程代码&#xff0c;知道了Makefile…...

请介绍类加载过程,什么是双亲委派模型?

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

Navisworks编辑材质和Revit快速切换材质问题

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

Object对象键值的输出循序到底如何排列的?

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

气泡式水位计的安装方法详解

气泡水位计的安装实际上就是气管的安装&#xff0c;气管的安装是否正确将直接影响到仪器测量数据的结果&#xff0c;气泡水位计它由活塞泵产生的压缩空气流经测量管和气泡室&#xff0c;进入被测的水体中&#xff0c;测量管中的静压力与气泡室上的水位高度成正比。那么接下来就…...

求“二维随机变量的期望E(X)与方差D(X)”例题(一)

离散型 设随机变量(X,Y)的联合分布律为 X\Y0100.10.210.30.4 (1)求E(X) 先求x的边缘分布律&#xff0c;表格里x0的概率为0.10.2&#xff0c;于是我们可得 X01P0.30.7直接求E(X)即可&#xff0c;得到结果 (2)求E(XY) 直接x与y相乘就行。 记得别乘多了&#xff0c;别的算了又…...

MySQL 搞定行转列,列转行

行转列方法总结1、使用case…when…then2、使用SUM(IF()) 生成列3、使用SUM(IF()) 生成列 WITH ROLLUP 生成汇总行4、使用SUM(IF()) 生成列 UNION 生成汇总行,并利用 IFNULL将汇总行标题显示为 Total5、使用SUM(IF()) 生成列&#xff0c;直接生成汇总结果&#xff0c;不再利用…...

正点原子裸机开发之C语言点灯程序

一. 简介 本文针对 IMX6ULL 的裸机开发的&#xff08;即不带Linux操作系统的开发&#xff09;。 主要分两部分的工作&#xff1a; 1. 配置 C语言运行环境 2. C 语言编写及运行 二. 配置C语言运行环境 配置 C 语言运行环境的工作分 三部分。如下&#xff1a; 1. 设置…...

cv::阈值分割OTUS原理+代码

opencv库的阈值分割分为全局分割和局部分割全局分割&#xff1a;普通分割ret1,th1 cv2.threshold(img,127, 255, cv2.THRESH_BINARY) #127为阈值 #cv2.THRESH_BINARY |cv2.THRESH_BINARY_INV | cv2.THRESH_TRUNC|cv2.THRESH_TOZERO|cv2.THRESH_TOZERO_INV局部分割&#xff1a;…...

Postgresql-12.5 visual studio-2022 windows 添加pg工程并调试

pg内核学习&#xff0c;记录一下 文章目录安装包编译安装VS添加Postgresql工程调试源码安装包 &#xff08;1&#xff09;perl下载 https://www.perl.org/get.html &#xff08;2&#xff09;diff下载 http://gnuwin32.sourceforge.net/packages/diffutils.htm &#xff08;…...

长沙学院2023 第一次蓝桥训练题解

每道题都在洛谷上&#xff0c;每个题都有很详细的题解&#xff0c;可以先自行做&#xff0c;不会再看题解。 题目解析思路都写在代码中&#xff0c;中文题面就不单独解释题意了。 P2440 木材加工&#xff08;二分答案&#xff09; 链接&#xff1a;P2440 木材加工 解析 代码…...

云端Docker搭建ABY库以及本地CLion使用

文章目录ABY的搭建以及使用前言ABY库的下载、安装及测试CLion配置后续杂项项目改名使用其他的库最后ABY的搭建以及使用 前言 仅做记录&#xff0c;仅供参考&#xff0c;不同人有不同的使用方式命令手敲&#xff0c;可能有错&#xff0c;自己辨识勿问&#xff0c;我懂的也不多…...

ES6-箭头函数、解构赋值、对象简写

箭头函数特点 1、 (只有1个形参) 可以省略() 2、 {} 可以省略 只有一句代码 或 只有返回值的时候,省略return 3、arguments 不可用&#xff0c;arguments在没有形参的时候可以拿到调用函数拿在的实参 获取伪数组通过Array.from转为真数组。 4、 箭头函数没有this&#xff0c; …...

【CSS】CSS 背景设置 ② ( 背景位置 | 背景位置-方位值设置 )

文章目录一、背景位置1、语法说明2、注意事项二、背景位置-方位值设置1、效果展示2、完整代码示例一、背景位置 1、语法说明 如果 盒子的大小 大于 背景图片的大小 , 默认的 图片 位置是 左上角 ; 设置背景位置的 CSS 语法如下 : background-position : length length backgro…...

HTML 扫盲

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录前言HTML 结构快速生成代码框架HTML 常见标签注释标签标题标签: h1-h6段落标签&#xff1a;p换行标签&#xff1a;br格式化标签…...

项目中用到的责任链模式

目录 1.什么是责任链&#xff1f;它的原理是什么&#xff1f; 2.应用场景 ​3.项目中的应用 传送门&#xff1a;策略模式&#xff0c;工作中你用上了吗&#xff1f; 1.什么是责任链&#xff1f;它的原理是什么&#xff1f; 将请求的发送和接收解耦&#xff0c;让多个接收对象…...

C++复习笔记--STL的string容器和vector容器

1--string容器string 本质上是一个类&#xff0c;其不同于指针 char*&#xff0c;string 类的内部封装了 char*&#xff0c;用于管理字符串&#xff0c;是一个 char* 型的容器&#xff1b;1-1--string构造函数string 的构造函数原型&#xff1a;string(); // 创建一个空的字符串…...

第一章 软件项目管理概述

项目(Project)是为了创造一个唯一的产品或提供一个唯一的服务而进行的临时性的努力。项目的特征PMBOK(A guide to the Project management Body Of Knowledge:项目管理知识体系指南)五大过程组和十大知识领域从时间角度出发&#xff0c;项目管理分为五大过程组&#xff1a;启动…...

【Linux系统编程】06:共享内存

共享内存 OVERVIEW共享内存一、文件上锁flock二、共享内存1.关联共享内存ftok2.获取共享内存shmget3.绑定共享内存shmat4.绑定分离shmdt5.控制共享内存shmctl三、亲缘进程间通信1.共享内存写入与读取2.共享内存解绑与删除3.共享内存综合四、非亲缘进程间通信1.通过sleep同步2.通…...

【专项】112. 路径总和

112. 路径总和 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 叶子节点 …...

【数据结构】堆排序

堆是一种叫做完全二叉树的数据结构&#xff0c;可以分为大根堆&#xff0c;小根堆&#xff0c;而堆排序就是基于这种结构而产生的一种程序算法。大堆&#xff1a;每个节点的值都大于或者等于他的左右孩子节点的值小堆&#xff1a;每个结点的值都小于或等于其左孩子和右孩子结点…...

论文阅读笔记《GAMnet: Robust Feature Matching via Graph Adversarial-Matching Network》

核心思想 本文提出一种基于图对抗神经网络的图匹配算法&#xff08;GAMnet&#xff09;,使用图神经网络作为生成器分别生成源图和目标图的节点的特征&#xff0c;并用一个多层感知机作为辨别器来区分两个特征是否来自同一个图&#xff0c;通过对抗训练的办法提高生成器特征提取…...

数据安全—数据完整性校验

1、数据安全保障三要素即 保密性 完整性、可用性机密性&#xff1a;要求数据不被他人轻易获取&#xff0c;需要进行数据加密。完整性&#xff1a;要求数据不被他人随意修改&#xff0c;需要进行签名技术可用性&#xff1a;要求服务不被他人恶意攻击&#xff0c;需要进行数据校验…...

Java 最小路径和

最小路径和中等给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。说明&#xff1a;每次只能向下或者向右移动一步。示例 1&#xff1a;输入&#xff1a;grid [[1,3,1],[1,5,1],[4,2,1]]输出&…...

Flask+VUE前后端分离的登入注册系统实现

首先Pycharm创建一个Flask项目&#xff1a; Flask连接数据库需要下载的包&#xff1a; pip install -U flask-cors pip install flask-sqlalchemy Flask 连接和操作Mysql数据库 - 王滚滚啊 - 博客园 (cnblogs.com) sqlAlchemy基本使用 - 简书 (jianshu.com) FlaskVue前后端分…...

【Go】用Go在命令行输出好看的表格

用Go在命令行输出好看的表格前言正文生成Table表头设置插入行表格标题自动标号单元格合并列合并行合并样式设置居中设置数字自动高亮标红完整Demo代码结语前言 最近在写一些运维小工具&#xff0c;比如批量进行ping包的工具&#xff0c;实现不困难&#xff0c;反正就是ping&am…...

怎么处理消息重发的问题?

消息队列在消息传递的过程中&#xff0c;如果出现传递失败的情况&#xff0c;发送方会重试&#xff0c;在重试的过程中&#xff0c;可能会产生重复的消息。 消息重复的情况必然存在 关于传递消息时能够提供的服务质量标准&#xff0c;MQTT协议给出了三种不同的标准&#xff1…...

JVM 运行时数据区(数据区组成表述,程序计数器,java虚拟机栈,本地方法栈)

JVM 运行时数据区JVM 运行时数据区3.1运行时的数据区组成概述3.1.1程度计数器3.1.2java虚拟机栈3.1.3本地方法栈3.1.4java堆3.1.5方法区3.2程序计数器3.3java虚拟机栈3.4本地方法栈JVM 运行时数据区 堆,方法区(元空间) 主要用来存放数据 是线程共享的. 程序计数器,本地方法栈…...

Oracle ASM磁盘组配置、日常运维、故障处理等操作资料汇总

ASM&#xff08;自动存储管理&#xff09;在数据库中是非常重要的组成部分&#xff0c;它可以为磁盘提供统一的存储管理、提高磁盘访问的性能和可用性、简化管理复杂度&#xff0c;从而为数据库的运行提供更好的支持。这里就为大家整理了墨天轮数据社区上一些ASM相关基础知识、…...

java对象的创建与内存分配机制

文章目录对象的创建与内存分配机制对象的创建类加载检查分配内存初始化零值设置对象头指向init方法其他&#xff1a;指针压缩对象内存分配对象在栈上分配对象在Eden区中分配大对象直接分配到老年代长期存活的对象进入老年代对象动态年龄判断老年代空间分配担保机制对象的内存回…...

本地存储localStorage、sessionStorage

目录 一、localStorage 二、sessionStorage 三、本地存储处理复杂数据 一、localStorage 介绍 &#xff08;1&#xff09;数据存储在用户浏览器中 &#xff08;2&#xff09;设置、读取方便、甚至页面刷新不会丢失数据 &#xff08;3&#xff09;容量较大&#xff0c;se…...

JavaSE: 网络编程

1.1 概述java程序员面对统一的网络编程环境B/S 架构 和 C/S架构1.2 网络通信的两个要素通信双方的地址&#xff1a;ip 端口号网络通信协议&#xff1a;TCP/IP协议&#xff08;事实上的国际规则&#xff09;、OSI模型&#xff08;理想化&#xff09;1.3 Inet Address本地回环地…...

计算机图形学09:二维观察之点的裁剪

作者&#xff1a;非妃是公主 专栏&#xff1a;《计算机图形学》 博客地址&#xff1a;https://blog.csdn.net/myf_666 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录专栏推荐专栏系列文章序一、二维观察基本…...

2023Java 并发编程面试题

Java 并发编程 1、在 java 中守护线程和本地线程区别&#xff1f; java 中的线程分为两种&#xff1a;守护线程&#xff08;Daemon&#xff09;和用户线程&#xff08;User&#xff09;。任何线程都可以设置为守护线程和用户线程&#xff0c;通过方法Thread.setDaemon(boolon…...

CAD如何绘制A0/A1/A2/A3/A4图框?

在CAD制图时&#xff0c;设计师一般会使用企业的定制图框模板或者个人的特色图框模板&#xff0c;让设计方案更加标准化、规范化。对于新人设计师而言&#xff0c;完成CAD制图已经非常头疼了&#xff0c;图框的绘制更是手忙脚乱。那么是否有更加高效的方式来完成A0、A1、A2、A3…...