目录

Docker 简明教程

Docker 是一种流行的容器化平台,提供了一种轻量级且可移植的方式来打包和运行应用程序。它允许开发人员创建独立环境,可以在不同的平台上进行一致部署和管理。

1. 理解 Docker 概念

  1. Docker 是一个用于打包、部署和管理在容器中运行的应用程序的平台。容器是一种将资源(如内存、CPU、存储)与底层操作系统隔离开来的方法。每个容器都有自己的隔离环境,可以在其中执行代码,而不会干扰主机上的其他进程。
  2. Docker 镜像是创建容器的蓝图。它们包含运行应用程序或服务所需的全部必要指令和文件,以便在容器化环境中运行。
  3. Dockerfile 是定义如何创建 Docker 镜像的文本文件。它们使用 FROMRUNCOPY 等命令逐步构建镜像。
  4. Docker registry 是一个用于存储和分发 Docker 镜像的存储库。
  5. Docker 容器是 Docker 镜像在主机上运行的实例。它执行由镜像定义的应用程序,对来自系统其他部分的访问提供隔离。
  6. Docker Compose 是一个用于定义和运行多容器应用程序的工具。它使用 YAML 文件来配置服务(容器)及其依赖项。
  7. Docker 卷是一种用于在容器之间或与主机之间共享数据的存储机制。卷允许你即使在容器被销毁后仍保留数据,从而可以跨多个容器轻松共享数据。
  8. Docker 群集模式允许你将多个 Docker 主机管理成一个集群。你可以在群集中的节点上部署服务,然后让 Docker 管理资源分配和容器位置。
  9. Docker 网络是用于将容器彼此连接或连接到主机的一个隔离网络。它提供了在容器之间进行安全通信,而无需在主机上公开端口。
  10. Docker Machine 允许你配置和管理 Docker 主机,无论它们是物理机、虚拟机(例如,在云中)还是在其他 Docker 容器内运行的容器。
  11. Docker Hub 是一个在线存储库,允许将 Docker 镜像与他人共享。它是最大的公共注册表之一,但你也可以使用私有注册表来存储和分发你自己的镜像。
  12. Dockerfile 是一个文本文件,其中包含构建 Docker 镜像所需的所有命令。在使用 docker build 命令构建镜像时,Dockerfile 被用作输入。
  13. 容器是轻量级、临时性和可移植的应用程序运行时环境。它们提供与主机和其他容器的隔离,允许你在一台主机上运行多个容器,而不会发生干扰。
  14. Docker Desktop 是一个应用程序,允许你在 Windows 或 macOS 上运行 Docker,它提供对 Docker CLI(命令行界面)和 GUI 工具的访问,以便管理镜像和容器。
  15. Docker Compose 文件是用于使用 Docker Compose 定义和配置多容器应用程序的 YAML 文件。它定义了服务、卷、网络以及应用程序运行所需的其他资源。

2. 安装 Docker

3. 运行你的第一个容器

  1. 启动一个终端/命令提示符。

  2. 从 Docker Hub 拉取预构建的镜像,例如,docker pull nginx

  3. 使用拉取的镜像运行容器:docker run -it --rm nginx

  4. 打开 Web 浏览器并导航到 localhost:80 以查看默认 Nginx 欢迎页面。

4. 构建你自己的镜像

  1. 创建一个空文件夹并在你的终端中导航到它。
  2. 创建一个 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"]
  1. 使用以下内容创建一个 main.go 文件(一个简单的 “Hello world” 程序):
1
2
3
4
5
package main
import "fmt"
func main() {
    fmt.Println("Hello, World!")
}
  1. 使用以下命令构建 Docker 镜像:
1
docker build -t my-golang-app .
  1. 使用以下命令从该镜像运行容器:
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

  1. 在项目目录中创建一个 docker-compose.yml 文件。你将在其中定义构成你的应用程序的服务,以及支持它们所需的任何卷或网络。
  2. 示例 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"

此配置定义了三个服务:gatewayauthpost。每个服务使用不同的镜像。gateway 服务还将端口 80 暴露在主机上,而其他两个服务不会将任何端口暴露给外界。请注意,gateway 服务依赖于 authpost 服务,确保在它之前启动这两个服务。

  1. 使用适当的 Dockerfile 为每个服务创建 Docker 镜像。你可以使用多阶段构建或为每个服务创建单独的镜像。
  2. 使用 docker compose up -d 运行你的应用程序,这将启动 docker-compose.yml 文件中定义的所有服务。
  3. 通过向端口 80 上的 gateway 服务发送请求来测试你的应用程序。Docker Compose 将管理容器之间的网络连接,允许你与每个服务通信,就像它们在本地运行一样。

7. 常用命令

  1. 从 Dockerfile 构建镜像(假设你在包含 Dockerfile 的目录中):
1
$ docker build -t my-image .
  1. 基于现有镜像运行容器(例如,nginx):
1
$ docker run -d --name webserver -p 80:80 nginx
  1. 列出所有正在运行的容器:
1
$ docker ps
  1. 停止一个或多个正在运行的容器:
1
$ docker stop <container_id>
  1. 启动一个已停止的容器:
1
$ docker start <container_id>
  1. 移除一个容器(必须先停止容器):
1
$ docker rm <container_id>
  1. 从 Docker Hub 拉取镜像:
1
$ docker pull <image_name>:<tag>
  1. 列出本地机器上的所有镜像:
1
$ docker images
  1. 从本地机器移除镜像(请注意,如果其他镜像正在使用它们,这不会移除底层层):
1
$ docker rmi <image_id>
  1. 使用新名称或标签标记现有镜像:
1
$ docker tag <original_image>:<tag> <new_name>:<tag>
  1. 将镜像推送到 Docker Hub(确保你已登录):
1
$ docker push <image_name>:<tag>
  1. 登录 Docker Hub:
1
2
3
4
$ docker login
Username: <your_username>
Password: ***********
Login Succeeded
  1. 退出 Docker Hub:
1
$ docker logout

这些是一些在使用 Docker 镜像和容器时可能会用到的常用命令。如果需要了解有关特定 Docker 概念或命令的更多信息,可以查看官方Docker 文档