Docker架构
Client 客户端
Docker
是一个客户端-服务器(C/S)架构程序。Docker
客户端只需要向Docker
服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。Docker
提供了一个命令行工具Docker
以及一整套RESTful API
。你可以在同一台宿主机上运行Docker
守护进程和客户端,也可以从本地的Docker
客户端连接到运行在另一台宿主机上的远程Docker
守护进程。
Host 主机(Docker 引擎)
一个物理或者虚拟的机器用于执行Docker
守护进程和容器。
Image 镜像
什么是Docker
镜像?简单的理解,Docker
镜像就是一个Linux
的文件系统(Root FileSystem)
,这个文件系统里面包含可以运行在Linux
内核的程序以及相应的数据。
通过镜像启动一个容器,一个镜像就是一个可执行的包,其中包括运行应用程序所需要的所有内容:包含代码,运行时间,库,环境变量和配置文件等。
Docker 把 App 文件打包成为一个镜像,并且采用类似多次快照的存储技术,可以实现:
- 多个
App
可以共用相同的底层镜像(初始的操作系统镜像); App
运行时的IO
操作和镜像文件隔离;- 通过挂载包含不同配置/数据文件的目录或者卷(Volume),单个
App
镜像可以用来运行无数个不同业务的容器。
Container 容器
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
Docker | 面向对象 |
---|---|
镜像 | 类 |
容器 | 对象 |
镜像分层
Docker 支持通过扩展现有镜像,创建新的镜像。实际上,Docker Hub
中99%
的镜像都是通过在base
镜像中安装和配置需要的软件构建出来的。
从上图可以看到,新镜像是从base
镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层。
镜像分层最大的一个好处就是共享资源。比如说有多个镜像都从相同的base
镜像构建而来,那么Docker Host
只需在磁盘上保存一份base
镜像;同时内存中也只需加载一份base
镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
如果多个容器共享一份基础镜像,当某个容器修改了基础镜像的内容,比如/etc
下的文件,这时其他容器的/etc
是不会被修改的,修改只会被限制在单个容器内。这就是容器Copy-on-Write
特性。
Volume 数据卷
实际上我们的容器就好像是一个简易版的操作系统,只不过系统中只安装了我们的程序运行所需要的环境,前边说到我们的容器是可以删除的,那如果删除了,容器中的程序产生的需要持久化的数据怎么办呢?容器运行的时候我们可以进容器去查看,容器一旦删除就什么都没有了。
所以数据卷就是来解决这个问题的,是用来将数据持久化到我们宿主机上,与容器间实现数据共享,简单的说就是将宿主机的目录映射到容器中的目录,应用程序在容器中的目录读写数据会同步到宿主机上,这样容器产生的数据就可以持久化了,比如我们的数据库容器,就可以把数据存储到我们宿主机上的真实磁盘中。
Registry 注册中心
Docker
用Registry
来保存用户构建的镜像。Registry
分为公共和私有两种。Docker
公司运营公共的Registry
叫做Docker Hub
。用户可以在Docker Hub
注册账号,分享并保存自己的镜像。
Docker
公司提供了公共的镜像仓库https://hub.docker.com
(Docker 称之为 Repository)提供了庞大的镜像集合供使用。
一个Docker Registry
中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。
通常,一个仓库会包含同一个软件不同版本的镜像,而标签对应该软件的各个版本。我们可以通过<仓库名>:<标签>
的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以latest
作为默认标签。
Docker常用命令
官方文档:https://docs.docker.com/reference
镜像命令
#查看内核版本
docker -r
#查看docker版本
docker -v
#查看镜像
docker images
#搜索镜像
docker search java:8
#拉取镜像
docker pull java:8
#删除镜像
docker rmi 镜像id
docker rmi java:8
#镜像推送远端
1、tag修改推送镜像名称
docker tag openjdk:8 远端分组名/openjdk:8
2、push
docker push 远端分组名/openjdk:8
Dockerfile编写
# 基于哪个镜像
From java:8
#声明端口
EXPOSE 8080
#指定工作路径-对容器内部
WORKDIR /opt/dockerwork
# 复制文件到容器
COPY microservice‐eureka‐server‐1.0.0.jar /opt/dockerwork/app.jar
# 配置容器启动后执行的命令
ENTRYPOINT ["java","‐jar","/opt/dockerwork/app.jar"]
根据Dockerfile构建镜像
docker build -t microservice‐eureka‐server:1.0.0 .
-t:指定创建的目标镜像名
.:dockerfile所在文件目录,一般把镜像和Dockerfile放在同一目录下
::指定镜像版本号
执行build命令后docker images 可以查看到对应的镜像
容器启动
docker run -d -v /opt/log:/opt/log -v /opt/db:/opt/db -p 8090:8080 microservice‐eureka‐server:1.0.0
-d:后台运行
-v:挂载 宿主目录:容器目录
-p 映射端口 宿主机:容器端口
容器其他命令
#查看启动容器
docker ps
#查看所有容器
docker ps -a
#停止
docker stop 容器id
#启动
docker start 容器id
#重启
docker restart 容器id
#删除,要先停止再删除
docker rm 容器id
#查看容器信息
docker inspect 容器id
#查看容器日志
docker container log 容器id
#进入容器
docker exec -it 容器id /bin/bash
镜像拷贝
#源
#windows
docker save 镜像id> d://home/jdk.tar
#linux
docker save 镜像id> /opt/jdk.tar
#目标主机
docker load --input D:\jdk.tar
docker load --input jdk.tar
#重命名
docker tag 镜像id jdk:8
#镜像反推dockerfile,百度下
docker-compose.yml
version: '3.8'
services:
microservice‐eureka: #指定服务名
image: microservice‐eureka‐server:1.0.0 #指定镜像名称
build: ./eureka #指定Dockfile所在路径
ports:
‐ "8761:8761" #指定端口映射
expose:
‐ 8761 #声明容器对外暴露的端口
启动
docker-compose up
#后台启动
docker-compose up -d
#关闭
docker-compose down
参考:http://doc.ruoyi.vip/ruoyi-cloud/cloud/dokcer.html