Docker 精通:面向初学者和专业人士的综合指南

2025-05-28

Docker 精通:面向初学者和专业人士的综合指南

Docker 是一个强大的平台,它简化了在轻量级、可移植的容器中创建、部署和管理应用程序的过程。它允许开发人员将应用程序及其依赖项打包成一个标准化单元,以实现无缝开发和部署。Docker 增强了不同环境之间的效率、可扩展性和协作能力,使其成为现代软件开发和 DevOps 实践的必备工具。
我们将深入探讨 Docker 的各个方面,从安装和配置到掌握镜像、存储、网络和安全。

安装和配置

以下是在 CentOS 和 Ubuntu 上安装 Docker 社区版 (CE) 的基本指南。
在 CentOS 上安装 Docker CE

  • 安装所需的软件包:
    sudo yum install -y () device-mapper-persistent-data lvm2

  • 添加 Docker CE yum 存储库:
    sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

  • 安装 Docker CE 软件包:
    sudo yum install -y docker-ce-18.09.5 docker-ce-cli-18.09.5 containerd.io

  • 启动并启用 Docker 服务: 将用户添加到 Docker 组,以授予用户运行 Docker 命令的权限。下次登录后,该用户即可访问 Docker。
    sudo systemctl start docker
    sudo systemctl enable docker


    sudo usermod -a -G docker

在 Ubuntu 上安装 Docker CE

  • 安装所需的软件包:
    sudo apt-get update
    sudo apt-get -y install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

  • 添加 Docker 仓库的 GNU Privacy Guard(GPG)密钥:
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

  • 添加 Docker Ubuntu 存储库:
    sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable

  • 安装软件包:
    sudo apt-get install -y docker-ce=5:18.09.5~3-0~ubuntu-bionic docker-ce-cli=5:18.09.5~3-0~ubuntu-bionic containerd.io
    将用户添加到 Docker 组,以授予用户运行 Docker 命令的权限。下次登录后,该用户即可访问 Docker。
    sudo usermod -a -G docker

选择存储驱动程序
存储驱动程序是一种可插拔的驱动程序,用于处理容器的内部存储。CentOS 和 Ubuntu 系统的默认驱动程序是 overlay2。
要确定当前的存储驱动程序:
docker info | grep "Storage"
选择其他存储驱动程序的一种方法是将--storage-driver标志传递给 Docker 守护进程。推荐使用守护进程配置文件来设置存储驱动程序。

  • 创建或编辑守护进程配置文件:
    sudo vi /etc/docker/daemon.json

  • 添加存储驱动程序值:
    "storage-driver": "overlay2"
    记住在任何更改后重新启动 Docker,然后检查状态。
    sudo systemctl restart docker
    sudo systemctl status docker

运行容器
docker run IMAGE[:TAG] [COMMAND] [ARGS]
IMAGE:指定运行容器的镜像。
COMMAND and ARGS:在容器内运行命令。
TAG:指定镜像标签或版本
-d:以分离模式运行容器。
--name NAME:为容器提供指定的名称,而不是通常随机分配的名称。
--restart RESTART:指定 Docker 何时自动重启容器。

  • no (default):永远不要重新启动容器。
  • on-failure:仅当容器失败(以非零退出代码退出)时。
  • always:无论成功还是失败,始终重新启动容器。
  • unless-stopped:无论成功还是失败,始终重新启动容器,并在守护进程启动时重新启动,除非手动停止容器。

-p HOST_PORT: CONTAINER_PORT:发布容器的端口。HOST_PORT 是主机上监听的端口,到该端口的流量会映射到容器的 CONTAINER_PORT。:
--memory MEMORY设置内存使用的硬限制。
--memory-reservation MEMORY: 设置内存使用的软限制。

docker run -d --name nginx --restart unless-stopped -p 8080:80 --memory 500M --memory-reservation 256M nginx:latest

管理正在运行的容器的一些命令是::
docker ps列出正在运行的容器。
docker ps -a:列出所有容器,包括已停止的容器。
docker container stop [alias: docker stop]:停止正在运行的容器。
docker container start [alias: docker start]:启动已停止的容器。
docker container rm [alias: docker rm]:删除容器(必须先停止)

升级 Docker 引擎
停止 Docker 服务:
sudo systemctl stop docker
安装所需版本的 docker-ce 和 docker-ce-cli:
sudo apt-get install -y docker-ce=<new version> docker-ce-cli=<new version>
验证当前版本
docker version

图像创建、管理和注册

镜像是一个可执行包,包含运行容器所需的所有软件。
使用镜像运行容器:使用以下命令
docker run IMAGE
下载镜像:
docker pull IMAGE
docker image pull IMAGE

镜像和容器使用分层文件系统。每层仅包含与前一层的差异。
使用以下方式查看镜像中的文件系统层:
docker image history IMAGE
Dockerfile 是一个定义一系列指令并用于构建镜像的文件。

# Use the official Nginx base image
FROM nginx:latest

# Set an environment variable
ENV MY_VAR=my_value

# Copy custom configuration file to container
COPY nginx.conf /etc/nginx/nginx.conf

# Run some commands during the build process
RUN apt-get update && apt-get install -y curl

# Expose port 80 for incoming traffic
EXPOSE 80

# Start Nginx server when the container starts
CMD ["nginx", "-g", "daemon off;"]
Enter fullscreen mode Exit fullscreen mode

构建镜像:
docker build -t TAG_NAME DOCKERFILE_LOCATION
Dockerfile 指令::
FROM指定用于正在构建的 Docker 镜像的基础镜像。它定义镜像的起点,可以是 Docker Hub 或私有镜像仓库中提供的任何有效镜像。
ENV:设置镜像内的环境变量。这些变量在构建过程和容器运行时均可访问。
COPY or ADD:将文件和目录从构建上下文(Dockerfile 所在的目录)复制到镜像中。COPY 通常适用于简单的文件复制,而 ADD 支持解压档案等附加功能。
RUN:在构建过程中执行命令。您可以使用 RUN 安装依赖项、运行脚本或执行任何其他必要的任务。
EXPOSE:通知 Docker 容器将在运行时监听指定的网络端口。它不会将端口发布到主机或使容器可从外部访问。
CMD or ENTRYPOINT:指定从镜像启动容器时要运行的命令。CMD 提供可以覆盖的默认参数,而 ENTRYPOINT 指定不能被覆盖的命令。
WORKDIR:设置任何后续 RUN、CMD、ENTRYPOINT、COPY 或 ADD 指令的工作目录。
STOPSIGNAL:设置用于停止容器进程的自定义信号。
HEALTHCHECK:设置 Docker 守护程序将用来检查容器是否健康的命令

Dockerfile 中的多阶段构建是一种用于创建更高效​​、更小的 Docker 镜像的技术。它需要在 Dockerfile 中定义多个阶段,每个阶段都有各自的一组指令和依赖项。
以下 Dockerfile 包含多阶段构建定义:

# Build stage
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /app

# Copy and restore project dependencies
COPY *.csproj .
RUN dotnet restore

# Copy the entire project and build
COPY . .
RUN dotnet build -c Release --no-restore

# Publish the application
RUN dotnet publish -c Release -o /app/publish --no-restore

# Runtime stage
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS runtime
WORKDIR /app
COPY --from=build /app/publish .

# Expose the required port
EXPOSE 80

# Set the entry point for the application
ENTRYPOINT ["dotnet", "YourApplication.dll"]
Enter fullscreen mode Exit fullscreen mode

管理镜像
镜像管理的一些关键命令包括:
​​列出系统镜像:
docker image ls
列出系统镜像(包括中间镜像):
docker image ls -a
获取镜像的详细信息:
docker image inspect <IMAGE>
删除镜像: 只有当没有容器或其他镜像标签引用镜像时,才会删除该镜像。查找并删除悬空或未使用的镜像:
docker rmi <IMAGE>
docker image rm <IMAGE>
docker image rm -f <IMAGE>


docker image prune

Docker 注册表
Docker 注册表用作存储和共享 Docker 镜像的集中存储库。Docker Hub 是 Docker 管理的默认、公开可用的注册表。通过利用注册表镜像,我们可以免费设置和管理我们自己的私有注册表。
运行一个简单的注册表:
docker run -d -p 5000:5000 --restart=always --name registry registry:2
将镜像上传到注册表:
docker push <IMAGE>:<TAG>
从注册表下载镜像:
docker pull <IMAGE>:<TAG>
登录注册表:
docker login REGISTRY_URL
有两种使用不受信任或自签名证书连接到私有注册表的身份验证方法:
安全:这涉及将注册表的公共证书添加到 /etc/docker/certs.d/ 目录。
不安全:此方法需要将注册表添加到 daemon.json 文件中的 insecure-registries 列表中,或使用 --insecure-registry 标志将其传递给 dockerd。

存储和卷
存储驱动程序控制如何在 Docker 主机上存储和管理镜像和容器。Docker 支持多种存储驱动程序,采用可插拔架构。overlay2
适用于所有 Linux 发行版;
fuse-overlayfs:仅适用于运行 Rootless Docker(非 Ubuntu 或 Debian 10)
;vfs:用于测试目的,以及无法使用写时复制文件系统的情况。

存储模型
*文件系统存储:*

  • 数据以常规文件的形式存储在主机磁盘上
  • 高效利用内存
  • 写入密集型工作负载效率低下
  • 由 overlay2 使用

块存储:

  • 使用特殊的块存储设备将数据存储在块中
  • 高效处理写入密集型工作负载
  • 由 btrfs 和 zfs 使用

对象存储:

  • 将数据存储在基于外部对象的存储中
  • 应用程序必须设计为使用基于对象的存储。
  • 灵活且可扩展。

配置 overlay2 存储驱动程序
停止 Docker 服务:
sudo systemctl stop docker
创建或编辑守护进程配置文件:
sudo vi /etc/docker/daemon.json
添加/编辑存储驱动程序值:
"storage-driver": "overlay2"
请记住在任何更改后重新启动 Docker,然后检查状态。
sudo systemctl restart docker
sudo systemctl status docker

Docker 卷
Docker 上有两种不同类型的数据挂载:
绑定挂载:将主机上的特定目录挂载到容器。它对于在容器和主机之间共享配置文件和其他数据很有用。
命名卷:将目录挂载到容器,但 Docker 动态控制卷在磁盘上的位置。
有不同的语法可用于向容器添加绑定挂载或卷:
-v 语法 _
绑定挂载:源以正斜杠“/”开头,这使其成为绑定挂载。
docker run -v /opt/data:/tmp nginx
命名卷:源只是一个字符串,这意味着这是一个卷。如果不存在具有提供名称的卷,它将自动创建。
docker run -v my-vol:/tmp nginx
_--mount 语法

绑定挂载:
docker run --mount source=/opt/data,destination=/tmp nginx
命名卷:
docker run --mount source=my-vol,destination=/tmp nginx
我们可以将同一个卷挂载到多个容器,允许它们共享数据。我们也可以自己创建和管理卷,而无需运行容器。

一些常见且有用的命令::
docker volume create VOLUME创建卷。
docker volume ls:列出卷。
docker volume inspect VOLUME:检查卷。
docker volume rm VOLUME:删除卷。

图像清理
检查 Docker 的磁盘使用情况:
docker system df
docker system df -v
删除未使用或悬空的图像:
docker image prune
docker image prune -a

Docker 网络

Docker 容器网络模型 (CNM) 是一个概念模型,描述了 Docker 网络的组件和概念。Docker
CNM 有多种实现:
沙盒:一个独立的单元,包含与单个容器相关的所有网络组件。
端点:将一个沙盒连接到一个网络。
网络:一组可以相互通信的端点。网络驱动程序:一个可插入的驱动程序,提供 CNM 的特定实现。IPAM
驱动程序:提供 IP 地址管理。分配和指定 IP 地址。

内置网络驱动程序
Host:此驱动程序将容器直接连接到主机的网络堆栈。它不提供容器之间或容器与主机之间的隔离。
docker run --net host nginx
Bridge:此驱动程序使用虚拟桥接接口在同一主机上运行的容器之间建立连接。Overlay:此驱动程序使用路由网格连接多个 Docker 主机之间的容器,通常在 Docker Swarm 中。MACVLAN:此驱动程序将容器直接连接到主机的网络接口,但使用特殊配置来提供隔离。None:此驱动程序提供沙盒隔离,但不提供容器之间或容器与主机之间的网络连接的任何实现。
docker network create --driver bridge my-bridge-net
docker run -d --network my-bridge-net nginx


docker network create --driver overlay my-overlay-net
docker service create --network my-overlay-net nginx


docker network create -d macvlan --subnet 192.168.0.0/24 --gateway 192.168.0.1 -o parent=eth0 my-macvlan-net
docker run -d --net my-macvlan-net nginx


docker run --net none -d nginx

创建 Docker Bridge 网络
这是默认驱动程序。因此,任何未指定驱动程序而创建的网络都将是桥接网络。
创建桥接网络。
docker network create my-net
在桥接网络上运行容器。
docker run -d --network my-net nginx

默认情况下,同一网络上的容器和服务只需使用其容器或服务名称即可相互通信。Docker 提供了网络 DNS 解析功能,以实现此功能。
提供网络别名可以为容器或服务提供额外的名称,以便访问它们。
docker run -d --network my-net --network-alias my-nginx-alias nginx

当必须与 Docker 网络交互时,一些有用的命令是::
docker network ls列出网络。
docker network inspect NETWORK:检查网络。
docker network connect CONTAINER NETWORK:将容器连接到网络。
docker network disconnect CONTAINER NETWORK:断开容器与网络的连接。
docker network rm NETWORK:删除网络。

创建 Docker 覆盖网络
创建覆盖网络:
docker network create --driver overlay NETWORK_NAME
创建使用该网络的服务:
docker service create --network NETWORK_NAME IMAGE

网络故障排除
查看容器日志:
docker logs CONTAINER
查看服务所有任务的日志:
docker service logs SERVICE
查看 Docker 守护进程日志:
sudo jounralctl -u docker

我们可以使用 nicolaka/netshoot 镜像进行网络故障排除。它包含各种实用的网络相关工具。我们可以将一个容器注入另一个容器的网络沙盒中进行故障排除。
docker run --network container:CONTAINER_NAME nicolaka/netshoot

配置 Docker 以使用外部 DNS
在 daemon.json 中为 Docker 容器设置系统范围的默认 DNS: 为单个容器设置 DNS。
{
"dns": ["8.8.8.8"]
}


docker run --dns 8.8.4.4 IMAGE

安全

签名镜像并启用 Docker Content Trust
Docker Content Trust (DCT) 是一项功能,允许我们在运行镜像之前对其进行签名并验证签名。通过设置环境变量启用 Docker Content Trust:
DOCKER_CONTENT_TRUST=1
如果镜像未签名,或者在启用 Docker Content Trust 的情况下签名无效,系统将不会运行它们。
使用以下命令签名并推送镜像:
docker trust sign
如果 DOCKER_CONTENT_TRUST=1,docker push 会在推送镜像之前自动对其进行签名。

默认 Docker 引擎安全性
基本 Docker 安全概念:
Docker 使用命名空间将容器进程彼此隔离,并与主机隔离。这可以防止攻击者在成功控制一个容器后影响或控制其他容器或主机。Docker
守护进程必须以 root 权限运行。在允许任何人与守护进程交互之前,请务必注意这一点。root 权限可用于获取整个主机的访问权限。Docker
利用 Linux 功能为容器进程分配精细的权限。例如,监听低端口(低于 1024)通常需要进程以 root 权限运行,但 Docker 利用 Linux 功能允许容器在无需 root 权限的情况下监听 80 端口。

保护 Docker 守护进程 HTTP 套接字
为 Docker 服务器生成证书颁发机构和服务器证书。

openssl genrsa -aes256 -out ca-key.pem 4096` 

`openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem -subj "/C=US/ST=Texas/L=Keller/O=Linux Academy/OU=Content/CN=$HOSTNAME" openssl genrsa -out server-key.pem 4096 `

`openssl req -subj "/CN=$HOSTNAME" -sha256 -new -key server-key.pem -out server.csr \ echo subjectAltName = DNS:$HOSTNAME,IP:,IP:127.0.0.1 >> extfile.cnf `

`echo extendedKeyUsage = serverAuth >> extfile.cnf `

`openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf`
Generate client certificates:
`openssl genrsa -out key.pem 4096 

openssl req -subj '/CN=client' -new -key key.pem -out client.csr 

echo extendedKeyUsage = clientAuth > extfile-client.cnf 

openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \
-CAcreateserial -out cert.pem -extfile extfile-client.cnf
Enter fullscreen mode Exit fullscreen mode

在证书文件上设置适当的权限:
chmod -v 0400 ca-key.pem key.pem server-key.pem chmod -v 0444 ca.pem server-cert.pem cert.pem
将 Docker 主机配置为使用 tlsverify 模式和之前创建的证书:

sudo vi /etc/docker/daemon.json

{
 "tlsverify": true,
 "tlscacert": "/home/user/ca.pem",
 "tlscert": "/home/user/server-cert.pem",
 "tlskey": "/home/user/server-key.pem"
 }
Enter fullscreen mode Exit fullscreen mode

编辑 Docker 服务文件,查找以 ExecStart 开头的行并更改 -H。
sudo vi /lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd -H=0.0.0.0:2376 --containerd=/run/containerd/containerd.sock

sudo systemctl daemon-reload
sudo systemctl restart docker
将 CA 证书和客户端证书文件复制到客户端机器。
在客户端机器上,配置客户端以安全地连接到远程 Docker 守护进程:
mkdir -pv ~/.docker
cp -v {ca,cert,key}.pem ~/.docker
export DOCKER_HOST=tcp://:2376 DOCKER_TLS_VERIFY=1
测试连接:
docker version

结论

总而言之,掌握 Docker 可以简化安装、配置、镜像管理、存储、网络和安全,从而彻底改变您的开发工作流程。本指南将为您提供必要的知识和实践技能,使您能够高效地构建、交付和运行应用程序。充分利用 Docker 的强大功能,将您的容器管理提升到新的水平。

文章来源:https://dev.to/theyasirr/docker-mastery-a-compressive-guide-for-beginners-and-pros-2p18
PREV
Vue 开发人员必须知道的 8 个秘密
NEXT
构建 React 项目的更好方法