Docker 使用Go 编程语言编写 ,并利用 Linux 内核的多个特性来提供其功能。 Docker 使用一种叫namespaces的技术来提供隔离的工作空间,即所谓的容器。当您运行容器时,Docker 会为该容器创建一组命名空间。
概念
容器
容器本质是个进程,他能够隔离开计算机上的其他组件,比如说开发的环境,编程语言的不同版本,而且完全不依赖计算机上的任何依赖项;这是利用了内核命名空间和 cgroups。他有以下几个特点:
- 自包含:每个容器都具有其运行所需的一切,并且不依赖于主机上任何预安装的依赖项。
- 隔离:由于容器是独立运行的,因此它们对主机和其他容器的影响很小,从而提高了应用程序的安全性。
- 独立:每个容器都是独立管理的。删除一个容器不会影响其他容器。
- 可移植:容器可以在任何地方运行!在您的开发机器上运行的容器将在数据中心或云中的任何地方以相同的方式工作。
容器跟虚拟机非常相似,但是虚拟机是十分臃肿的,虚拟机拥有完整的操作系统,拥有自己的内核、硬件驱动程序、程序和应用程序。只要启动了虚拟机,就会划分好硬件资源,其他进程都无法使用。而容器只是一个独立的进程,其中包含运行所需的所有文件。如果您运行多个容器,它们都共享同一个内核,这样您就可以在更少的基础设施上运行更多的应用程序。
镜像
容器镜像是一个标准化包,其中包含运行容器所需的所有文件、二进制文件、库和配置。他有两个原则:
- 图像是不可变的。图像一旦创建,就无法修改。您只能创建新图像或在其上添加更改。
- 容器镜像由层组成。每层代表一组文件系统更改,包括添加、删除或修改文件。
镜像中的分层理论上可以分成以下几层:
- 第一层添加了基本命令和包管理器,例如 apt。
- 第二层安装 Python 运行时和 pip 用于依赖项管理。
- 第三层复制应用程序的具体要求.txt文件。
- 第四层安装该应用程序的特定依赖项。
- 第五层复制应用程序的实际源代码。
与上方说明顺序相反,从下往上对应1 2 3 4 5
注册表与存储库
当我们希望镜像与他人分享的时候,就可以使用镜像仓库,可以是公有的也可以是私有的;注册表就是存储和管理容器镜像的集中位置,存储库就是存储镜像实体的位置。
Docker Compose
使用 Docker Compose,您可以在单个 YAML 文件中定义所有容器及其配置。如果您将此文件包含在代码存储库中,则克隆存储库的任何人都可以使用单个命令启动并运行。
构建镜像
这里用SpringBoot项目作为应用程序,首先创建一个SpringBoot项目:略…
其次,在项目根目录下准备文件Dockerfile,写入一下信息:
# 使用官方的 OpenJDK 作为基础镜像
FROM openjdk:11-jre-slim
# 设置工作目录
WORKDIR /app
# 将打包好的 Spring Boot JAR 文件复制到容器中
COPY build/libs/docker-demo-0.0.1-SNAPSHOT.jar /app
# 暴露 Spring Boot 应用程序的端口
EXPOSE 8080
# 定义容器启动命令
CMD ["java", "-jar", "docker-demo-0.0.1-SNAPSHOT.jar"]
随后执行命令构建Image:docker build -t {ImageName} .
本地测试运行Image: docker run -p 8080:8080 {ImageName}
当镜像有了之后就是启动启动就行,这时候就可以去docker desktop上看看启动的容器