介绍
Docker 是一种开源的容器化技术,它允许开发者将应用程序及其依赖项打包到一个轻量级、可移植的容器中,然后在任何支持Docker的系统上运行。下面我会用一个简单的比喻来解释Docker。
想象一下,你是一位厨师,你需要在不同的厨房(不同的计算机环境)里制作同一道菜(应用程序)。在没有Docker的情况下,你需要确保每个厨房都有正确的食材(应用程序的依赖项),比如特定的香料、油和锅。这可能会很复杂,因为不同的厨房可能有不同的设备和食材,所以你在一个地方能做,换一个地方就可能做不出来。
Docker 就像是一个魔法盒子,你可以在其中准备这道菜所需的一切。这个盒子里包括了你需要的所有食材和烹饪工具,而且这个盒子是标准化的,可以在任何地方使用,只要那个地方有支持这种盒子的架子(Docker运行环境)。这样,无论你走到哪里,只要你带上这个魔法盒子,你就可以在任何厨房里做出这道菜,而且味道和在你自己的厨房里做的一样。
在Docker中,这个“魔法盒子”被称为容器(Container),而制作这个盒子的过程称为容器化(Containerization)。容器里包含了应用程序的所有依赖项,比如特定的库、系统工具、运行时环境等,甚至包括你的应用程序代码。当你把这个容器带到任何安装了Docker的计算机上时,它都可以快速、一致地运行你的应用程序。
Docker的优点
Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。
1、快速,一致地交付您的应用程序
Docker 允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。
容器非常适合持续集成和持续交付(CI / CD)工作流程,请考虑以下示例方案:
- 您的开发人员在本地编写代码,并使用 Docker 容器与同事共享他们的工作。
- 他们使用 Docker 将其应用程序推送到测试环境中,并执行自动或手动测试。
- 当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中,以进行测试和验证。
- 测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。
2、响应式部署和扩展
Docker 是基于容器的平台,允许高度可移植的工作负载。Docker 容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。
Docker 的可移植性和轻量级的特性,还可以使您轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。
3、在同一硬件上运行更多工作负载
Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker 非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情。
Docker架构
Docker 包括三个基本概念:
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类。
Docker安装请参考其他详细博客,因为每个人的操作系统,系统配置,需求可能不同。
基础使用
- -i: 交互式操作。
- -t: 终端。
Docker Dockerfile
什么是 Dockerfile?
Dockerfile 是一个文本文件,包含了构建 Docker 镜像的所有指令。
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
通过定义一系列命令和参数,Dockerfile 指导 Docker 构建一个自定义的镜像。
1.
FROM
指令用于指定基础镜像,这是构建新镜像的起点。每个 Dockerfile 都必须以FROM
指令开始。FROM ubuntu:20.04
2.
RUN
指令用于执行命令行命令,这些命令会在镜像中执行,并将其结果(变更)作为新的镜像层保存。它通常用于安装软件包或执行其他安装任务。RUN apt-get update && apt-get install -y \ nginx \ curl
3.
CMD
指令用于设置容器的默认执行命令。它有三种主要形式:
- shell 形式:直接执行命令。
- exec 形式:推荐的方式,使用 JSON 格式执行命令。
- 默认参数:为命令提供默认参数
CMD ["nginx", "-g", "daemon off;"]
4.
ENTRYPOINT
与CMD
类似,但它用于设置容器启动时的入口点。ENTRYPOINT
可以与CMD
结合使用,CMD
中的内容将作为参数传递给ENTRYPOINT
。设置 supervisord 作为容器的入口点,并传递配置文件路径作为参数。ENTRYPOINT ["/usr/bin/supervisord"] CMD ["-c", "/etc/supervisor/supervisord.conf"]
5.
COPY
和ADD
指令这两个指令都用于将文件从构建上下文(通常是 Dockerfile 所在的目录)复制到镜像中。
COPY
用于复制新文件。ADD
可以解压缩 tar 压缩文件。
COPY
将当前目录(构建上下文)中的所有文件复制到容器的/app
目录中,而ADD
将source.tar.gz
文件解压缩到/app
目录中。COPY . /app ADD source.tar.gz /app
6.
ENV
用于设置环境变量,这些变量在构建过程中和容器运行时都可用。设置了一个名为NODE_ENV
的环境变量,值为production
。ENV NODE_ENV production
7.
ARG
用于定义构建时的变量,这些变量可以在 Dockerfile 中的其他指令中使用。定义了一个VERSION
变量,如果构建时没有指定,它将默认为latest
。ARG VERSION=latest FROM ubuntu:${VERSION}
8.
VOLUME
用于定义挂载点,这些挂载点在容器运行时可以与外部存储挂载。创建了一个挂载点/var/www
,可以用于持久化数据。VOLUME /var/www
9.
EXPOSE
用于声明容器运行时监听的端口。指示容器在 80 端口上提供服务。EXPOSE 80
10.
USER
用于指定运行容器时的用户名或 UID。指示容器以nobody
用户身份运行。USER nobody
11.
WORKDIR
用于设置容器内的当前工作目录。将容器内的当前工作目录设置为/app
。WORKDIR /app
12.
ONBUILD
用于设置当所创建的镜像作为其他镜像的基础镜像时,自动执行的指令。指示任何基于此镜像的后续构建都将执行COPY . /app
指令。ONBUILD COPY . /app
构建和使用dockerfile
编写完 Dockerfile 后,你可以使用以下命令构建镜像:
docker build -t my-image-name .
构建完成后,你可以使用以下命令运行容器:
docker run -d -p 8080:80 my-image-name
这将启动一个容器,将容器的 80 端口映射到宿主机的 8080 端口。
通过这些指令,你可以定制 Docker 镜像以满足你的应用程序或服务的需求。