【云原生 | Docker】Docker核心概念 应用上手最佳流程
🤵♂️ 个人主页: @AI_magician
📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。
👨💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!🐱🏍
🙋♂️声明:本人目前大学就读于大二,研究兴趣方向人工智能&硬件(虽然硬件还没开始玩,但一直很感兴趣!希望大佬带带)
该文章收录专栏
[✨— 《深入解析机器学习:从原理到应用的全面指南》 —✨]
核心概念
Docker 是一个开源的容器化平台,它在过去几年中取得了巨大的成功和广泛的应用。以下是 Docker 的发展历史和其使用的编程语言 Go 的相关信息:
-
Docker 的起源:
Docker 最初由 Solomon Hykes 在2013年创建,并在 Docker 公司(前身为 dotCloud)的支持下进行开发和推广。Docker 的设计目标是提供一种轻量级、便携式的容器化解决方案,以简化应用程序的部署和管理。 -
Docker 的早期版本:
Docker 最早的版本是基于 Linux 容器(LXC)技术开发的,它利用 Linux 内核的容器功能,实现了应用程序的隔离和资源管理。不过,这种实现方式存在一些限制和不足,因此 Docker 团队决定在 Docker 0.9 版本中引入自己的容器引擎,即 Docker Engine(后来被称为 Docker Daemon)。 -
Go 语言的选择:
Docker 团队选择使用 Go 作为开发 Docker 引擎的编程语言。Go 是由 Google 开发的一种静态类型、编译型语言,具有高效、简洁和并发编程的特性。选择 Go 作为开发语言使得 Docker 具备了良好的性能、可移植性和易于扩展的特点。 -
Docker 的快速发展:
Docker 在推出之后迅速获得了开发者和运维人员的关注,并在容器领域迅速崛起。Docker 引入了容器镜像和容器注册表的概念,使得应用程序的打包、分发和部署变得更加简单和可靠。Docker 提供了丰富的命令行工具和 API,以及各种生态系统工具和服务,进一步扩展了其功能和应用场景。 -
开源和社区发展:
Docker 从一开始就采用了开源模式,并建立了一个活跃的社区。这使得开发者和用户能够贡献代码、提出问题、分享经验,并为 Docker 的发展做出贡献。Docker 社区不断推动技术的创新和改进,推出了许多有用的工具和项目,如 Docker Compose、Docker Swarm 和 Kubernetes 等。 -
Docker 的生态系统:
Docker 生态系统已经变得非常庞大和丰富,涵盖了各种工具、服务和项目。除了核心的 Docker 引擎和工具链外,还有许多第三方软件和服务提供商构建在 Docker 之上,为用户提供了更多的功能和集成选项。
以下是 Docker 的一些关键概念和组件:
-
镜像(Image):Docker 镜像是一个只读的模板,包含了运行应用程序所需的一切,包括代码、运行时环境、库文件、依赖项等。镜像可以用作创建容器的基础。
-
容器(Container):容器是从镜像创建的运行实例。每个容器都是一个隔离的环境,包含了运行应用程序所需的所有内容。容器可以被启动、停止、删除,并且可以与其他容器进行通信。
-
Docker 引擎(Docker Engine):Docker 引擎是 Docker 的核心组件,负责管理容器的生命周期,包括创建、运行、停止和删除容器。它还提供了与 Docker 守护进程通信的 API。
-
Docker Compose:Docker Compose 是一个用于定义和运行多个容器的工具。通过编写一个 YAML 文件来定义应用程序的服务、网络和卷等配置,然后使用 Docker Compose 命令来启动、停止和管理整个应用程序的容器群。
-
Docker Hub:Docker Hub 是一个公共的 Docker 镜像仓库,可以在其中找到大量的官方和社区维护的镜像。开发者可以将自己的镜像推送到 Docker Hub 中,也可以从中拉取所需的镜像。
Docker 的优势包括:
- 轻量级和可移植性:Docker 容器相对较小且独立于宿主操作系统,可以在不同的环境中以相同的方式运行,提供了良好的可移植性。
- 简化部署和扩展:通过 Docker 镜像,开发者可以轻松地部署和扩展应用程序,无需担心环境差异和依赖项问题。
- 高效资源利用:Docker 利用操作系统层的虚拟化技术,可以在单个主机上运行多个容器,并共享主机的内核,提供了更高的资源利用率。
- 简化开发流程:开发者可以在容器中构建和测试应用程序,并将容器作为开发环境进行交付,确保开发和生产环境的一致性。
Dockfile概念
Dockerfile 是用于定义和构建 Docker 镜像的文本文件。它包含一系列指令,用于描述如何构建镜像、安装依赖、配置环境等。
以下是一些常见的 Dockerfile 指令和示例用法:
-
FROM:指定基础镜像,即构建新镜像所基于的镜像。例如,使用
FROM ubuntu:latest
指定以最新版本的 Ubuntu 作为基础镜像。 -
RUN:在镜像中执行命令。可以用于安装软件包、运行脚本等。例如,使用
RUN apt-get update && apt-get install -y package
安装软件包。 -
COPY 和 ADD:用于将文件或目录复制到镜像中。COPY 用于复制本地文件或目录到镜像,而 ADD 不仅可以复制文件和目录,还可以解压压缩文件和远程 URL。例如,使用
COPY app.py /app/
将本地的 app.py 文件复制到镜像的 /app/ 目录下。 -
WORKDIR:设置工作目录,指定后续命令的工作路径。例如,使用
WORKDIR /app
设置工作目录为 /app。 -
ENV:设置环境变量。可以用于配置容器的运行环境。例如,使用
ENV PATH=/usr/local/bin:$PATH
设置环境变量 PATH。 -
EXPOSE:声明容器运行时需要监听的端口。例如,使用
EXPOSE 80
声明容器将监听80端口。 -
CMD 和 ENTRYPOINT:设置容器启动时要执行的命令。CMD 可以设置默认的容器启动命令,而 ENTRYPOINT 则可以定义容器的入口点。例如,使用
CMD ["python", "app.py"]
设置容器默认执行的命令为运行 app.py。
通过编写 Dockerfile,开发者可以定义应用程序的构建过程、运行环境和启动命令等,使得应用程序可以在不同的 Docker 环境中以相同的方式运行。使用 Dockerfile,可以实现快速、可重复和可扩展的镜像构建过程。
接着通过 Dockerfile 构建镜像并运行容器的流程如下:
-
编写 Dockerfile:创建一个文本文件,并命名为 Dockerfile。在 Dockerfile 中,按照一定的语法规则编写一系列指令,描述镜像的构建过程、运行环境和启动命令等。
-
构建镜像:使用
docker build
命令来构建镜像。在命令行中进入 Dockerfile 所在目录,并执行以下命令:docker build -t <image_name> . ``` 其中,`<image_name>` 是你要为镜像指定的名称,可以根据需要自定义。`.` 表示当前目录,即 Dockerfile 所在的目录。 在构建过程中,Docker 将按照 Dockerfile 中的指令逐步执行,并在每个指令的基础上创建一个镜像层。每个镜像层都包含了该指令所引入的更改和新增内容。
-
运行容器:构建完成后,可以使用
docker run
命令来运行容器,并基于构建的镜像创建新的容器实例。执行以下命令:docker run <image_name> ``` ``<image_name>` 是你构建的镜像的名称。 运行该命令后,Docker 将创建一个新的容器实例,并在容器内部执行 Dockerfile 中指定的启动命令。
此外,还有许多其他的 Dockerfile 指令和用法,可以根据具体需求进行深入学习和探索。Docker 官方提供了详细的文档和示例,供开发者参考和学习使用。
Docker-compose
在Docker中使用./mysql/data:/var/lib/mysql
进行挂载,可以将MySQL数据目录挂载到主机上的特定目录。这样做的好处是,即使容器被删除或重新创建,MySQL的数据仍然保留在主机上,从而实现数据的持久化。
当您使用这种方式挂载MySQL数据目录时,表数据应该是可以同步的。因为表数据实际上存储在MySQL数据目录中的文件中,而挂载操作将主机上的目录与容器中的目录关联起来。因此,对于MySQL容器中的表数据的更改将在主机上的相应文件中进行反映,反之亦然。
但是,需要注意以下几点:
-
确保MySQL容器和主机上的目录结构一致。如果MySQL容器内部的数据目录结构与主机上的数据目录结构不匹配,可能会导致数据同步的问题。
-
确保MySQL容器和主机上的目录权限正确设置。MySQL容器需要对数据目录具有适当的读写权限,以便能够正确读取和写入数据。
-
在将数据目录挂载到主机上之前,确保MySQL容器已经停止运行,以避免对数据目录的并发访问问题。
总的来说,通过将MySQL数据目录挂载到主机上,您可以实现数据的持久化,并且表数据应该可以在容器和主机之间同步。但是,在实际操作中,仍然需要注意目录结构和权限等方面的设置,以确保数据的正确同步和访问。
🤞到这里,如果还有什么疑问🤞
🎩欢迎私信博主问题哦,博主会尽自己能力为你解答疑惑的!🎩
🥳如果对你有帮助,你的赞是对博主最大的支持!!🥳