Docker 是一种流行的容器化平台,提供了一种轻量级且可移植的方式来打包和运行应用程序。它允许开发人员创建独立环境,可以在不同的平台上进行一致部署和管理。
1. 理解 Docker 概念
Docker
是一个用于打包、部署和管理在容器中运行的应用程序的平台。容器是一种将资源(如内存、CPU、存储)与底层操作系统隔离开来的方法。每个容器都有自己的隔离环境,可以在其中执行代码,而不会干扰主机上的其他进程。
- Docker
镜像
是创建容器的蓝图。它们包含运行应用程序或服务所需的全部必要指令和文件,以便在容器化环境中运行。
Dockerfile
是定义如何创建 Docker 镜像的文本文件。它们使用 FROM
、RUN
、COPY
等命令逐步构建镜像。
- Docker
registry
是一个用于存储和分发 Docker 镜像的存储库。
- Docker
容器
是 Docker 镜像在主机上运行的实例。它执行由镜像定义的应用程序,对来自系统其他部分的访问提供隔离。
Docker Compose
是一个用于定义和运行多容器应用程序的工具。它使用 YAML 文件来配置服务(容器)及其依赖项。
Docker 卷
是一种用于在容器之间或与主机之间共享数据的存储机制。卷允许你即使在容器被销毁后仍保留数据,从而可以跨多个容器轻松共享数据。
Docker 群集模式
允许你将多个 Docker 主机管理成一个集群。你可以在群集中的节点上部署服务,然后让 Docker 管理资源分配和容器位置。
Docker 网络
是用于将容器彼此连接或连接到主机的一个隔离网络。它提供了在容器之间进行安全通信,而无需在主机上公开端口。
Docker Machine
允许你配置和管理 Docker 主机,无论它们是物理机、虚拟机(例如,在云中)还是在其他 Docker 容器内运行的容器。
Docker Hub
是一个在线存储库,允许将 Docker 镜像与他人共享。它是最大的公共注册表之一,但你也可以使用私有注册表来存储和分发你自己的镜像。
Dockerfile
是一个文本文件,其中包含构建 Docker 镜像所需的所有命令。在使用 docker build
命令构建镜像时,Dockerfile 被用作输入。
- 容器是轻量级、临时性和可移植的应用程序运行时环境。它们提供与主机和其他容器的隔离,允许你在一台主机上运行多个容器,而不会发生干扰。
Docker Desktop
是一个应用程序,允许你在 Windows 或 macOS 上运行 Docker,它提供对 Docker CLI(命令行界面)和 GUI 工具的访问,以便管理镜像和容器。
Docker Compose 文件
是用于使用 Docker Compose 定义和配置多容器应用程序的 YAML 文件。它定义了服务、卷、网络以及应用程序运行所需的其他资源。
2. 安装 Docker
3. 运行你的第一个容器
-
启动一个终端/命令提示符。
-
从 Docker Hub 拉取预构建的镜像,例如,docker pull nginx
。
-
使用拉取的镜像运行容器:docker run -it --rm nginx
。
-
打开 Web 浏览器并导航到 localhost:80
以查看默认 Nginx 欢迎页面。
4. 构建你自己的镜像
- 创建一个空文件夹并在你的终端中导航到它。
- 创建一个
Dockerfile
。这是一个包含如何构建我们的镜像的指令的文件。在这种情况中,我们将使用一个简单的 Dockerfile,它从一个基本的 Go 基础镜像开始并将我们的源代码复制到其中:
1
2
3
4
5
6
7
8
9
10
11
|
# syntax=docker/dockerfile:1
FROM golang:alpine AS builder
WORKDIR /go/src/github.com/user/my-app
COPY . ./
RUN go mod init my-app
RUN go build -o /bin/my-app
FROM alpine:latest
WORKDIR /root/
COPY --from=builder /bin/my-app /root/
CMD ["./my-app"]
|
- 使用以下内容创建一个
main.go
文件(一个简单的 “Hello world” 程序):
1
2
3
4
5
|
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
|
- 使用以下命令构建 Docker 镜像:
1
|
docker build -t my-golang-app .
|
- 使用以下命令从该镜像运行容器:
1
|
docker run my-golang-app
|
你应该会看到 “Hello, World!” 打印在你的终端中作为输出。如果一切正常,你现在有一个包含你的 Go 应用的工作的 Docker 镜像。你可以将它推送到注册表或在本地使用它进行开发和测试。
5. 管理容器
-
docker start/stop/restart: 启动、停止或重新启动容器。
-
docker exec: 在正在运行的容器内执行命令。
-
docker attach: 连接到正在运行的容器的控制台。
-
docker logs: 查看容器的日志。
-
docker rm: 移除一个已停止的容器。
6. 使用 Docker Compose
- 在项目目录中创建一个
docker-compose.yml
文件。你将在其中定义构成你的应用程序的服务,以及支持它们所需的任何卷或网络。
- 示例
docker-compose.yml
文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
version: "3"
services:
gateway:
image: "my_registry/gateway:latest"
ports:
- "80:8080"
depends_on:
- auth
- post
auth:
image: "my_registry/auth:latest"
post:
image: "my_registry/post:latest"
|
此配置定义了三个服务:gateway
、auth
和 post
。每个服务使用不同的镜像。gateway
服务还将端口 80 暴露在主机上,而其他两个服务不会将任何端口暴露给外界。请注意,gateway
服务依赖于 auth
和 post
服务,确保在它之前启动这两个服务。
- 使用适当的
Dockerfile
为每个服务创建 Docker 镜像。你可以使用多阶段构建或为每个服务创建单独的镜像。
- 使用
docker compose up -d
运行你的应用程序,这将启动 docker-compose.yml
文件中定义的所有服务。
- 通过向端口 80 上的 gateway 服务发送请求来测试你的应用程序。Docker Compose 将管理容器之间的网络连接,允许你与每个服务通信,就像它们在本地运行一样。
7. 常用命令
- 从 Dockerfile 构建镜像(假设你在包含 Dockerfile 的目录中):
1
|
$ docker build -t my-image .
|
- 基于现有镜像运行容器(例如,nginx):
1
|
$ docker run -d --name webserver -p 80:80 nginx
|
- 列出所有正在运行的容器:
- 停止一个或多个正在运行的容器:
1
|
$ docker stop <container_id>
|
- 启动一个已停止的容器:
1
|
$ docker start <container_id>
|
- 移除一个容器(必须先停止容器):
1
|
$ docker rm <container_id>
|
- 从 Docker Hub 拉取镜像:
1
|
$ docker pull <image_name>:<tag>
|
- 列出本地机器上的所有镜像:
- 从本地机器移除镜像(请注意,如果其他镜像正在使用它们,这不会移除底层层):
1
|
$ docker rmi <image_id>
|
- 使用新名称或标签标记现有镜像:
1
|
$ docker tag <original_image>:<tag> <new_name>:<tag>
|
- 将镜像推送到 Docker Hub(确保你已登录):
1
|
$ docker push <image_name>:<tag>
|
- 登录 Docker Hub:
1
2
3
4
|
$ docker login
Username: <your_username>
Password: ***********
Login Succeeded
|
- 退出 Docker Hub:
这些是一些在使用 Docker 镜像和容器时可能会用到的常用命令。如果需要了解有关特定 Docker 概念或命令的更多信息,可以查看官方Docker 文档。