【自动化】使用docker容器化

使用docker容器化部署

相关文章

使用docker容器化部署


一、什么是Docker

Docker 是一种开源的平台即服务 (PaaS) 工具,用于在容器化环境中构建、部署和运行应用程序。它允许开发人员将应用程序及其所有依赖项打包到一个称为容器的可移植的虚拟化单元中。Docker 提供了一种轻量级、可移植、自动化的部署方式,使开发人员能够快速构建和交付应用程序,并且在不同的环境中保持一致性。

二、Docker 解决了什么问题

环境一致性问题:

在传统开发环境中,开发人员在不同的操作系统和环境中开发应用程序可能会导致环境不一致性问题。Docker 提供了容器化的解决方案,使得应用程序及其所有依赖项都可以打包到一个独立的容器中,从而实现了环境的一致性,无论在开发、测试还是生产环境中都能够以相同的方式运行。

依赖管理问题:

传统软件开发中经常会遇到依赖管理的问题,包括软件包版本冲突、安装依赖项困难等。Docker 允许将应用程序及其所有依赖项打包到一个容器中,使得依赖管理变得简单并且可重复。开发人员可以在 Docker 镜像中明确定义应用程序所需的依赖项,并且确保在任何环境中都能够一致地运行。

快速交付和部署问题:

传统的软件部署过程通常需要手动配置环境、安装依赖项,并且可能会因为环境差异导致部署失败。Docker 提供了轻量级、可移植的容器化解决方案,使得应用程序可以快速打包、交付和部署到任何支持 Docker 的环境中,大大加速了软件交付和部署的过程。

资源利用问题:

传统的虚拟化技术通常会占用大量的系统资源,包括内存和磁盘空间。相比之下,Docker 容器是轻量级的,共享主机的操作系统内核,可以更有效地利用系统资源,并且可以在同一台主机上运行数十甚至数百个容器,提高了资源利用率。

开发和运维团队之间的协作问题:

传统的软件开发和运维过程中,开发团队和运维团队之间可能存在沟通和协作问题。Docker 提供了统一的容器化平台,使得开发团队可以将应用程序打包成容器,交付给运维团队进行部署和管理,从而实现了开发和运维之间的协作和无缝衔接。

三、Docker 的一些关键概念和组件

容器(Container):

容器是 Docker 中最基本的构建单元。它是一个轻量级、独立、可执行的软件包,包含应用程序及其所有依赖项(如代码、运行时环境、系统工具、库等)。容器化使应用程序在不同的环境中都能够以相同的方式运行,无论是开发、测试还是生产环境。

镜像(Image):

镜像是用于创建容器的静态模板。它包含了完整的文件系统、运行时环境、应用程序代码和依赖项等。Docker 镜像是只读的,可以在不同的容器之间共享和重用,从而实现了快速部署和扩展。

Docker 仓库(Docker Registry):

Docker 仓库是用于存储、分享和管理 Docker 镜像的中央存储库。最常用的公共 Docker 仓库是 Docker Hub,开发人员可以在其中找到大量的官方和社区维护的镜像。除了 Docker Hub,还可以搭建私有 Docker 仓库来管理自己的镜像。

以上3点为核心

Docker 引擎(Docker Engine):

Docker 引擎是 Docker 的核心组件,负责管理容器的生命周期、构建和运行容器,以及提供与 Docker 守护进程通信的 API。Docker 引擎由两部分组成:Docker 守护进程(Docker Daemon)和 Docker 客户端(Docker Client)。

Docker Compose:

Docker Compose 是一个工具,用于定义和运行多容器的 Docker 应用程序。通过一个单独的 YAML 文件,可以配置应用程序的服务、网络和存储卷等,然后使用 Docker Compose 命令一键启动、停止和管理整个应用程序的多个容器。

Docker Swarm:

Docker Swarm 是 Docker 官方提供的容器编排和集群管理工具,用于在多个 Docker 主机上启动、管理和扩展容器化应用程序。它允许将多个 Docker 主机组成一个集群,通过集群中的管理节点(Manager Node)来调度容器的部署和运行。

Docker Kubernetes Service (DKS):

Docker Kubernetes Service 是 Docker 公司提供的托管 Kubernetes 服务,它将 Kubernetes 的强大容器编排功能与 Docker 引擎的易用性和便捷性相结合,为用户提供了一种简单、高效的方式来管理容器化应用程序。

四、Docker 与 虚拟化 的区别

实现方式:

  • Docker:Docker 使用 Linux 内核中的容器技术,通过将应用程序和其依赖项打包到一个容器中来创建独立的运行环境。Docker 容器与宿主操作系统共享内核,并且可以在较低的开销下快速启动和运行。
  • 虚拟化:虚拟化技术通过在物理服务器上运行虚拟机(VM)来创建独立的运行环境。每个虚拟机都有自己的操作系统和资源,通过虚拟化软件(如 VMware、VirtualBox、KVM 等)来管理和分配物理资源。

资源利用率:

  • Docker:由于 Docker 容器共享宿主操作系统的内核,因此 Docker 在资源利用率方面比较高。多个容器可以在同一台宿主机上运行,共享主机的内存、CPU 和存储资源,而不会产生额外的资源开销。
  • 虚拟化:虚拟化技术需要为每个虚拟机提供独立的操作系统和资源,因此在资源利用率方面相对较低。每个虚拟机都需要分配一定的内存、CPU 和存储资源,并且需要额外的资源来管理和运行虚拟化软件。

隔离性:

  • Docker:Docker 容器提供了较为轻量级的隔离性,容器之间共享主机的内核和一些系统资源,但通过命名空间和控制组等技术实现了一定程度的隔离。因此,Docker 容器之间可以更快速地通信,并且可以更轻松地实现微服务架构。
  • 虚拟化:虚拟机提供了更强的隔离性,每个虚拟机都运行在独立的环境中,并且有自己的操作系统和内核。虚拟机之间的通信需要经过网络层,相比 Docker 容器会慢一些。

应用场景:

  • Docker:Docker 主要用于构建、打包和部署应用程序,并且适用于容器化部署、持续集成和交付等场景。它能够快速部署和扩展应用,提高开发和运维效率。
  • 虚拟化:虚拟化技术适用于运行多个不同的操作系统和应用程序,以实现资源隔离和多租户支持。它常用于虚拟化服务器、数据中心、桌面虚拟化等场景。

五、Docker 与 Jenkins 的区别

用途:

  • Docker 是一个容器化平台,它允许开发人员将应用程序及其依赖项打包到一个称为容器的独立运行环境中。Docker 提供了一种标准化、可移植和可重复使用的方式来构建、交付和运行应用程序。

  • Jenkins 是一个持续集成和持续交付(CI/CD)工具,它用于自动化软件开发流程中的构建、测试和部署任务。Jenkins 提供了一个可扩展的平台,可以根据需要配置和定制不同的构建和部署流水线。

功能:

  • Docker 提供了一种轻量级、可移植和自包含的容器化解决方案,使得应用程序的构建、交付和部署变得更加简单和高效。它提供了一系列的命令和 API,允许开发人员在本地开发环境和生产环境中使用容器化应用程序。

  • Jenkins 主要用于构建、测试和部署软件项目,并提供了许多插件和集成工具来支持持续集成和持续交付流程。Jenkins 可以与其他工具(如 Docker、Kubernetes、Git 等)集成,从而实现自动化的构建、测试和部署任务。

角色:

  • Docker 更多地关注于应用程序的打包、交付和运行,它提供了一种标准化的容器化解决方案,使得应用程序在不同的环境中具有一致的运行行为。

  • Jenkins 更多地关注于软件开发过程中的持续集成和持续交付任务,它提供了一个可扩展的平台,可以配置和管理各种不同的构建和部署流水线。

六、安装Docker - 服务器

一键安装

1
# curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

启动

1
# sudo systemctl start docker

验证

1
2
3
4
// 拉取镜像
docker pull hello-world
// 运行镜像
docker run hello-world

“hello-world” 镜像是一个简单的测试镜像,它会打印一条消息并退出。它的目的是用来测试 Docker 是否能够正常工作以及网络连接是否正常。

如果一切正常,你应该能够在终端上看到一条消息,类似于:

1
2
3
4
[root@Jeffrey ~]# docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

启动镜像

1
2
[root@Jeffrey ~]# docker run --name hello-world-container -d -p 7562:80 hello-world
00421218366fdbab5f92ffdc3bbe3d436aa676756782ca0afb40b7d960c20021

创建一个名为 hello-world-container 的 Docker 容器,使用 hello-world 镜像,并将容器的端口 80 映射到主机的端口 7562 上,以便通过访问主机的端口 7562 来访问 hello-world 镜像提供的服务。

查看运行时的容器

1
2
3
[root@Jeffrey ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
00421218366f hello-world "/hello" 2 seconds ago Exited (0) 1 second ago hello-world-container

不出意外的话,它的STATUS是Exited

因为 hello-world 镜像的容器是一个特殊的示例容器,它只是用来验证 Docker 是否正确安装和配置。因此,容器内部的应用程序启动后会立即退出,这是正常行为。如果你想要让容器保持运行状态,你可以选择其他类型的镜像,并确保容器中运行的应用程序持续运行,不会立即退出。

七、安装Docker - 本地

window10环境

下载客户端

安装包地址:https://docs.docker.com/desktop/install/windows-install/

安装客户端

更新wsl

因为 Docker Desktop 在 Windows 上使用 WSL 2 进行容器的运行。WSL 是一个在 Windows 上运行 Linux 的子系统,而 WSL 2 则是 WSL 的第二个版本,它提供了更高的性能和更好的兼容性。

在安装 Docker Desktop 之前,你需要确保系统中已启用了 WSL 2,并且已安装了适当的 WSL 2 更新。

1
wsl --update

八、构建镜像

编写 Dockerfile

在你的项目根目录下创建一个名为 Dockerfile 的文件,这个文件将定义如何构建你的 Docker 镜像。在 Dockerfile 中,你需要指定基础镜像、安装依赖、复制项目文件、设置环境变量等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 使用 Node.js 镜像作为基础镜像
# Node.js 镜像是一个预先配置了 Node.js 运行时环境的 Docker 镜像,它包含了 Node.js 运行时和 npm 包管理工具,可以让你在容器中运行 Node.js 应用程序。
FROM node:14

# 设置工作目录
# 在 Dockerfile 中的 WORKDIR 指令用于设置容器中的工作目录,这个目录是容器内部的路径。它并不直接涉及到服务器上的目录,而是告诉 Docker 在容器内部创建一个指定的目录,并将后续的命令的执行路径设置为该目录。
WORKDIR /app

# 将 package.json 和 package-lock.json 复制到工作目录
COPY package*.json ./

# 安装项目依赖
RUN npm install

# 将整个项目复制到工作目录
COPY . .

# 构建 应用程序
RUN npm run build

# 暴露容器的 80 端口
EXPOSE 80

# 启动 服务
CMD ["npm", "run", "start"]

构建 Docker 镜像

在项目根目录下,使用 docker build 命令来构建 Docker 镜像。你需要指定一个名称和一个标签来标识你的镜像。

1
docker build -t vue-app .

在这个命令中,. 表示当前目录,Docker 将会在当前目录下查找名为 Dockerfile 的文件并根据其内容构建镜像。vue-app 是你给这个镜像取的名称,你可以根据需要将其替换为任何你喜欢的名称。

查看镜像

1
2
3
PS D:\codes\visual-front> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
vue-app latest ad0db0f0907a 2 minutes ago 1.94GB

运行镜像

1
2
PS D:\codes\react-ts-app> docker run -d -p 9000:3000 next-app
d3bb143ba9b2135ecf587e2d4e34e420b779074e955af311c27cd013feedb7c9

查看运行状态,成功了~

1
2
3
PS D:\codes\react-ts-app> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d3bb143ba9b2 next-app "docker-entrypoint.s…" 16 minutes ago Up 16 minutes 80/tcp, 0.0.0.0:9000->3000/tcp elated_lichterman

在docker客户端上也可以看到

保存本地镜像为文件

首先,你需要将本地的 Docker 镜像保存为一个文件。你可以使用 docker save 命令来实现:

1
docker save -o .\next-app.tar next-app

将 .\next-app.tar 替换为你想要保存的文件路径,next-app 替换为你要保存的镜像名称。

九、上传到服务器

将镜像文件上传到服务器

一旦你保存了镜像文件,你就可以使用任何文件传输工具(如 scp、rsync 等)将镜像文件上传到服务器。假设你已经将镜像文件上传到了服务器的 /app。

在服务器上加载镜像

在服务器上,你可以使用 docker load 命令来加载镜像文件:

1
docker load -i /app/next-app.tar

验证镜像是否已加载

运行 docker images 命令来验证镜像是否已经成功加载到服务器中。

1
docker images

启动镜像

1
2
[root@Jeffrey ~]# docker run -d -p 9000:3000 next-app
9031772a7033aa9b07fa055962ccf764685cdab82c0f6cc9ac3512f7e278c158

查看镜像

1
2
3
[root@Jeffrey ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
next-app latest 0febfcb26988 32 minutes ago 1.95GB

成功访问

十、Docker常用命令

镜像管理命令:

  • docker images: 列出本地所有的 Docker 镜像。
  • docker rmi <image_name>: 删除镜像。
  • docker pull <image_name>:<tag>: 从远程仓库拉取指定标签的镜像到本地。
  • docker build -t <image_name>:<tag> .: 在当前目录下的 Dockerfile 中构建镜像。

容器管理命令:

  • docker run :: 运行指定镜像的容器。
  • docker ps: 列出当前正在运行的容器。
  • docker ps -a: 列出所有的容器,包括运行中的和已停止的。
  • docker exec -it <container_id> <command>: 在运行中的容器内执行命令。
  • docker stop <container_id>: 停止运行中的容器。
  • docker rm <container_id>: 删除指定的容器。
  • docker container prune: 删除所有停止的容器。
  • docker logs <container_id>::查看容器运行的日志

仓库管理命令:

  • docker search <keyword>: 在 Docker Hub 上搜索镜像。
  • docker login: 登录到 Docker Hub 或其他 Docker 仓库。
  • docker logout: 从 Docker Hub 或其他 Docker 仓库注销。

镜像、容器、数据卷和网络的清理命令:

  • docker rmi <image_id>: 删除指定的镜像。
  • docker image prune: 删除未被使用的镜像。

系统信息与监控命令:

  • docker version: 显示 Docker 版本信息。
  • docker info: 显示 Docker 系统信息。

【自动化】使用docker容器化
https://www.cccccl.com/20240311/工程化/自动化/使用docker容器化部署/
作者
Jeffrey
发布于
2024年3月11日
许可协议