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 yhx
ENV 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:$PATH
EXPOSE 80
CMD 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.jar
ports:#映射端口属性
- 9700:9700 #建议使用字符串格式,指定宿主机端口映射到本容器的端口
restart: on-failure #是否随docker服务启动重启
network_mode: "host" #设置网络模式 默认 bridge ,host 主机模式
# depends_on: # 取决于下面的镜像,也就是先启动下一个镜像,再启动这个镜像
# - crea-suytest-mobile
crea-suytest-mobile: # 第二个微服务
image: crea_cloud/crea-suytest-mobile:latest
container_name: crea-suytest-mobile
volumes:
- "/home/common-business/crea-suytest-project/logs:/log"
environment:
- "TZ=Asia/Shanghai"
- "encryption=false"
env_file:
- suytest.env
entrypoint: java -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/heap-dunp/crea-suytest-mobile.hprof -XX:-OmitStackTraceInFastThrow -jar /home/project/crea-suytest-mobile-1.0.0.jar
ports:
- 9701:9701
restart: on-failure
network_mode: "host"
crea-lottery: # 第三个微服务
image: crea_cloud/crea-lottery:latest
container_name: crea-lottery
volumes:
- "/home/common-business/crea-suytest-project/logs:/log"
environment:
- "TZ=Asia/Shanghai"
- "encryption=false"
env_file:
- suytest.env
entrypoint: java -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/heap-dunp/crea-lottery.hprof -XX:-OmitStackTraceInFastThrow -jar /home/project/crea-lottery-1.0.0.jar
ports:
- 9702:9702
restart: on-failure
network_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