今天来介绍一下 Docker,Docker 是一个开源的容器化平台,它能够帮助开发者将应用程序及其依赖项打包到一个独立的、可移植的容器中,从而实现了快速部署、可移植性和可扩展性。
作为一种轻量级的虚拟化技术,与传统的虚拟机相比,Docker 容器不需要运行完整的操作系统,而是共享主机操作系统的内核。这使得容器更加高效,快速,并且占用更少的资源。
Docker 提供了一组工具和平台来创建、部署和管理容器化应用程序。其中最核心的概念是 Docker 镜像和 Docker 容器。在 ubuntu 中可以直接通过下面的命令进行 Docker 的安装和验证
apt-get install docker
docker version
为了使用 Docker 镜像是必不可少的,其中镜像是一个只读文件,其中包含了运行应用程序所需的一切:代码、运行时环境、库文件、依赖项等等。镜像可以通过 Dockerfile 来定义。
下面这是一个 Dockerfile 的样例
FROM ubuntu:latest
WORKDIR /
CMD ["bash"]
Docker 具有以下优点:
- 快速部署:Docker 容器可以快速启动和停止,确保应用程序的快速部署和扩展。
- 可移植性:Docker 容器可以在不同的平台和环境中运行,保持一致的运行环境,避免了因为环境差异导致的问题。
- 环境隔离:每个容器都是隔离的,相互之间不会产生冲突。这样可以避免应用程序间的依赖问题,并增强了安全性。
- 资源利用率:Docker 能够有效地利用系统资源,减少硬件和资源的浪费。
总而言之,Docker 提供了一种先进的容器化技术,使得应用程序的开发、测试和部署变得更加简单、快速和可靠。它具有广泛的应用场景,包括微服务架构、持续集成/持续交付、多租户环境等等。
下面通过构建一个 go 项目的 Docker 镜像来进行说明
FROM golang:latest as builder
ARG TARGETOS
ARG TARGETARCH
WORKDIR /workspace
COPY go.mod go.mod
COPY go.sum go.sum
COPY project project
RUN go mod download
RUN CGO_ENABLED=0 GOOS=${TARGETOS:-linux} GOARCH=${TARGETARCH} go build -a -o manager project/main.go
FROM gcr.io/distroless/static:nonroot
WORKDIR /
COPY --from=builder /workspace/manager .
USER 65532:65532
ENTRYPOINT ["/manager"]
当我们拿到一个 Dockerfile 时,我们需要关注其中的各个指令,以理解它是如何构建镜像的。
首先,我们看到 FROM 关键字,它指定了基础镜像。这个基础镜像包含了我们的应用程序所依赖的操作系统和运行环境。
接下来是一系列的指令,比如 ARG、WORKDIR、COPY 和 RUN。这些指令的目的是配置环境、设置工作目录、复制文件,并在容器中执行命令。
在提供的示例中,第一个 FROM 使用了 golang:latest 作为基础镜像。它设置了参数 TARGETOS 和 TARGETARCH,然后将当前目录下的所有文件复制到容器的 project 目录中。接着,它通过 RUN 执行 go mod download 和 go build 命令,编译项目。
第二个 FROM 使用了 gcr.io/distroless/static 作为基础镜像。它将第一个阶段(上一个 FROM 到 RUN 之间的内容)构建好的可执行文件复制到容器的根目录,并设置了 ENTRYPOINT,指定容器启动时要运行的命令。
docker build -t <username>/<repo>:<tag>
docker push <username>/<repo>:<tag>
最后,我们使用 docker build 命令构建镜像,并使用 docker push 命令将镜像推送到自己的仓库。
这种多阶段构建的方式可以减小最终镜像的体积,因为在第二个阶段中只包含了构建好的可执行文件,而不是整个开发环境。这样可以提高部署效率和镜像传输速度。
通过这样的实战演练,我们便可以了解到 Docker 的基本概念、Dockerfile 的用法以及如何构建和打包。通过合理使用 Docker,以后就可以实现快速、可靠且可移植的应用程序部署。