My page title

Docker笔记

Docker简介

Docker 是一个开源的容器化平台,它允许开发者将应用及其依赖环境打包到一个轻量级、可移植的容器中,然后可以在任何支持Docker的机器上运行。Docker 使用 Linux 容器(LXC)技术,但提供了比传统容器更加易用的工作流和用户界面。

Docker的主要特点

  • 轻量级:Docker 容器共享宿主机的内核,不需要像虚拟机那样模拟整个操作系统。
  • 可移植性:容器可以在任何安装了Docker的机器上运行,无需担心环境差异。
  • 自动化部署:Docker 通过 Dockerfile 来自动化构建容器镜像,简化部署流程。
  • 版本控制和组件重用:Docker Hub 和其他注册中心可以用来分享和存储容器镜像。
  • 微服务架构:Docker 容器非常适合微服务架构,每个服务可以独立部署和扩展。

Docker安装

Docker 的安装过程会根据你使用的操作系统而有所不同。以下是在一些常见操作系统上安装 Docker 的基本步骤:

对于 Ubuntu/Debian 系统:

  1. 更新软件包列表
sudo apt-get update
  1. 安装 Docker 的依赖项
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
  1. 添加 Docker 的官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  1. 添加 Docker 仓库
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  1. 再次更新软件包列表
sudo apt-get update
  1. 安装 Docker CE(社区版)
sudo apt-get install -y docker-ce

对于 CentOS/RHEL 系统:

  1. 安装所需的软件包
sudo yum install -y yum-utils
  1. 设置 Docker 仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  1. 安装 Docker CE
sudo yum install docker-ce docker-ce-cli containerd.io

对于 Fedora 系统:

  1. 安装 Docker
sudo dnf -y install docker-ce docker-ce-cli containerd.io

对于 openSUSE 系统:

  1. 安装 Docker
sudo zypper install docker-ce

对于 Arch Linux 系统:

  1. 安装 Docker
sudo pacman -Syu docker

对于 Windows 或 macOS:

  • 你可以从 Docker 官网下载 Docker Desktop 版本,然后按照安装向导进行安装。

通用步骤:

  • 启动 Docker 服务
    sudo systemctl start docker
    
  • 验证 Docker 是否正确安装
    sudo docker run hello-world
    

这个 hello-world 测试会下载一个测试镜像并在容器中运行它,如果安装正确,它会打印一条消息说它正在 Docker 容器中运行。

请注意,根据你的系统配置和安全设置,你可能需要将用户添加到 docker 组,以便无需 sudo 来运行 Docker 命令:

sudo usermod -aG docker your-username

然后重新登录或重启以应用更改。

以上步骤应该在大多数情况下有效,但请根据你的具体系统环境和版本,查看 Docker 官方文档以获取最新的安装指南和详细步骤。

Docker使用场景

  1. 持续集成和持续部署(CI/CD):Docker 可以自动化构建、测试和部署流程。
  2. 本地开发环境:开发者可以使用 Docker 快速搭建一致的开发环境。
  3. 应用部署:Docker 可以简化应用的部署流程,确保在不同环境中的一致性。
  4. 微服务架构:Docker 容器适合运行微服务,每个服务可以独立部署和扩展。
  5. 多环境一致性:确保开发、测试和生产环境的一致性。
  6. 资源利用和隔离:Docker 容器共享宿主机资源,同时提供良好的隔离性。
  7. 快速扩展和弹性:容器可以快速启动和停止,适合需要快速扩展的场景。

Docker 的特点和用途:

  • 容器化平台:Docker 提供了一种轻量级的方式来打包应用及其依赖,创建容器。
  • 快速部署:Docker 容器可以在几秒钟内启动,适合快速迭代和部署。
  • 跨平台:Docker 容器可以在多种操作系统上运行,实现应用的跨平台部署。
  • 版本控制和组件重用:Docker Hub 和其他注册中心可以用来分享和存储容器镜像。
  • 单机使用:Docker 主要用于单机环境,虽然可以手动或通过脚本管理多个容器,但并不是为大规模集群设计。

Kubernetes 的特点和用途:

  • 容器编排平台:Kubernetes 提供了自动化的容器部署、扩展和管理功能。
  • 集群管理:Kubernetes 能够在集群中运行和管理成千上万的容器,提供高可用性、自动扩展和负载均衡。
  • 服务发现和负载均衡:Kubernetes 可以自动分配IP地址,并且可以在容器之间自动分配负载。
  • 自动部署和回滚:Kubernetes 支持声明式部署,可以自动回滚到之前的版本,如果更新出现问题。
  • 存储和网络管理:Kubernetes 提供了持久化存储和网络策略,确保应用的存储需求和网络安全。

Docker 与 Kubernetes 的关系:

  • 互补性:Docker 可以作为 Kubernetes 中的容器运行时,但 Kubernetes 支持多种容器运行时,如 containerd、CRI-O 等。
  • 集成:Docker 容器可以被 Kubernetes 管理,利用 Kubernetes 的编排能力来部署、扩展和管理 Docker 容器。
  • 生态:Docker 生态系统中的许多工具和实践可以与 Kubernetes 集成,形成完整的云原生技术栈。

Docker 与 Kubernetes 的区别:

  • 设计目标:Docker 旨在简化容器的创建和运行,而 Kubernetes 旨在简化容器的管理和编排。
  • 使用范围:Docker 适用于单机或小规模容器管理,Kubernetes 适用于大规模容器集群。
  • 复杂性:Docker 相对简单,易于上手;Kubernetes 功能强大,但学习曲线较陡峭。
  • 社区和支持:Docker 由 Docker Inc. 支持,Kubernetes 由 Cloud Native Computing Foundation (CNCF) 支持,拥有庞大的社区。

总结来说,Docker 是构建容器的工具,而 Kubernetes 是管理这些容器的系统。它们可以一起工作,形成强大的云原生应用部署和管理解决方案。

Docker和虚拟机的区别

Docker 容器和虚拟机(VM)是两种不同的技术,它们都旨在简化软件的部署和管理,但它们在实现方式和用途上有一些关键的区别:

  1. 操作系统级别 vs 应用级别
  • 虚拟机:在虚拟机中,每个 VM 都运行一个完整的操作系统(OS)以及在其上运行的应用程序。VM 是在宿主机操作系统上通过虚拟化技术模拟出的完整的计算机系统。
  • Docker 容器:Docker 容器直接运行在宿主机的操作系统上,共享宿主机的内核,容器内运行的是应用程序及其依赖环境,但不包括完整的操作系统。
  1. 启动速度
  • 虚拟机:启动虚拟机通常需要数分钟,因为它需要加载整个操作系统和应用程序。
  • Docker 容器:容器几乎可以瞬间启动,因为它们不需要加载操作系统,只需加载应用程序和其依赖。
  1. 资源占用
  • 虚拟机:每个虚拟机都需要分配独立的内存和存储资源,这可能导致资源浪费。
  • Docker 容器:容器共享宿主机的内核和资源,通常更高效地利用系统资源。
  1. 性能开销
  • 虚拟机:由于需要模拟整个硬件环境,虚拟机可能会有更高的性能开销。
  • Docker 容器:容器与宿主机共享内核,减少了性能开销,提供接近原生的性能。
  1. 可移植性
  • 虚拟机:虚拟机的可移植性依赖于虚拟机管理程序和宿主机操作系统的兼容性。
  • Docker 容器:容器提供了更好的可移植性,因为它们不依赖于特定的操作系统或硬件架构。
  1. 隔离性
  • 虚拟机:虚拟机提供了强大的隔离性,每个 VM 运行在自己的独立环境中。
  • Docker 容器:容器也提供了隔离性,但相比虚拟机,它们共享宿主机的内核,隔离级别较低。
  1. 管理和编排
  • 虚拟机:虚拟机通常通过虚拟机管理程序(如 VMware 或 Hyper-V)进行管理。
  • Docker 容器:Docker 提供了一套完整的工具集,包括 Docker Engine、Docker Compose 和 Docker Swarm,用于容器的创建、管理和编排。
  1. 使用场景
  • 虚拟机:适用于需要运行多个完整操作系统的场景,如开发和测试不同操作系统的应用。
  • Docker 容器:适用于需要快速部署、扩展和管理应用程序的场景,特别是微服务架构。

总结来说,Docker 容器提供了一种更轻量级、更快速、更高效的应用部署方式,而虚拟机则提供了更完整的系统隔离。选择使用哪种技术取决于具体的应用需求和场景。

Docker基本使用

  • 运行容器
    docker run -d -p 80:80 --name webserver nginx
    

    这条命令会在后台启动一个名为 webserver 的 Nginx 容器,并将容器的 80 端口映射到宿主机的 80 端口。
  • 查看容器列表
    docker ps
    
  • 停止容器
    docker stop webserver
    
  • 查看容器日志
    docker logs webserver
    
  • 进入容器
    docker exec -it webserver /bin/bash
    
  • 构建镜像
    docker build -t myimage .
    
  • 推送镜像到 Docker Hub
    docker push myusername/myimage
    

Docker 和 Kubernetes 都是现代云原生技术中的重要工具,它们在容器化和应用部署方面扮演着关键角色,但它们的功能和使用场景有所不同。

常用的 docker run 参数

docker run 是 Docker 命令行中用于创建和启动容器的命令。它支持许多参数,用于定制容器的运行方式。以下是一些常用的 docker run 参数:

  • -d:以守护进程模式运行容器(后台运行)。
  • --name:为容器指定一个名称。
  • -e--env:设置环境变量。
  • -P:启用端口的随机分配。
  • -p--publish:端口映射,将容器内部的端口映射到宿主机的端口。
  • -v--volume:挂载卷,将宿主机的目录挂载到容器内部。
  • --mount:更高级的挂载语法,用于挂载卷、临时文件系统或远程卷。
  • -w--workdir:指定容器内部的工作目录。
  • --restart:设置容器的重启策略。
  • --rm:容器退出时自动清理容器文件系统。
  • --network:指定容器连接的网络。
  • --add-host:添加一个主机名到容器的 /etc/hosts 文件中。
  • --cpus:限制容器可以使用的 CPU 数量。
  • --memory-m:设置容器可以使用的内存限制。
  • --cpuset:设置容器可以使用的 CPU 核心。
  • --gpus:指定容器可以使用的 GPU 设备。
  • --ipc:设置 IPC 命名空间。
  • --uts:设置 UTS 命名空间。
  • --user-u:指定运行容器的用户名或 UID。
  • --group-add:添加用户到附加的组。
  • --privileged:以特权模式运行容器,容器将拥有更多的权限。
  • --cap-add--cap-drop:添加或删除容器的 Linux 能力。
  • --read-only:使容器的根文件系统为只读模式。
  • --entrypoint:覆盖容器的默认入口点。
  • --command-c:覆盖容器的默认命令。
  • --init:运行一个 init 系统来处理信号。
  • --tty-t:分配一个伪终端。
  • --interactive-i:即使没有附加,也保持 STDIN 打开。

这些参数可以组合使用,以满足不同的需求。例如,以下命令以守护进程模式运行一个名为 my_container 的容器,将宿主机的 8080 端口映射到容器的 80 端口,并挂载一个卷:

docker run -d --name my_container -p 8080:80 -v my_volume:/path/in/container some-image

使用 docker run --help 可以查看所有可用的参数和它们的详细说明。

Docker 网络

Docker 自定义网络允许你定义容器之间如何相互连接和通信。以下是关于 Docker 自定义网络的一些详细说明:

网络类型

Docker 提供了几种网络类型,每种类型适用于不同的场景:

  1. 桥接网络(Bridge)
  • 默认网络类型,适合大多数容器间通信需求。
  • 容器在同一桥接网络中可以互相通信,不同网络的容器不能直接通信。
  1. 覆盖网络(Overlay)
  • 用于跨主机的容器通信。
  • 常用于多节点的 Docker 集群。
  1. 主机网络(Host)
  • 容器共享主机的网络命名空间。
  • 容器内的网络配置与宿主机相同。
  1. 无网络(None)
  • 容器没有分配网络,完全隔离。
  1. Macvlan 网络
  • 允许容器拥有独立的 MAC 地址。
  • 容器看起来像宿主机上的物理设备。
  1. 插件网络
  • 第三方插件提供的网络类型。

创建网络

使用 docker network create 命令创建自定义网络。例如,创建一个桥接网络:

docker network create --driver bridge my-bridge-network

配置网络

创建网络时,可以指定多种配置选项:

  • 子网(Subnet):定义网络的 IP 范围。
  • 网关(Gateway):网络的默认网关。
  • IP 范围(IP Range):容器 IP 的分配范围。
  • DNS:指定 DNS 服务器地址。

例如,创建一个具有特定子网和网关的网络:

docker network create \
  --driver bridge \
  --subnet 192.168.1.0/24 \
  --gateway 192.168.1.1 \
  my-bridge-network

连接容器到网络

创建容器时,使用 --network 选项将其连接到自定义网络:

docker run -d --name my-container --network my-bridge-network my-image

如果容器已经创建,可以使用 docker network connect 命令将其连接到网络:

docker network connect my-bridge-network my-existing-container

断开容器与网络的连接

使用 docker network disconnect 命令将容器从网络中断开连接:

docker network disconnect my-bridge-network my-container

查看网络信息

使用 docker network inspect 命令查看网络的详细信息,包括连接的容器:

docker network inspect my-bridge-network

删除网络

当网络不再需要时,使用 docker network rm 命令删除它:

docker network rm my-bridge-network

使用覆盖网络

覆盖网络允许跨主机的容器通信。创建覆盖网络时,需要指定一个网络名称和附加的配置选项:

docker network create --driver overlay --attachable my-overlay-network

连接到覆盖网络的容器可以分布在不同的 Docker 节点上,并且能够相互通信。

安全性

自定义网络可以提高容器间的通信安全性,通过限制哪些容器可以相互通信,减少潜在的攻击面。

网络策略

Docker 还支持网络策略,允许你定义更细粒度的访问控制规则,例如允许或拒绝特定容器间的流量。

通过这些自定义网络的功能,你可以构建复杂的容器化应用,同时保持高度的灵活性和安全性。

Docker 自定义网络

Docker 允许用户创建自定义网络,以便容器之间可以相互通信。自定义网络可以是桥接网络、主机网络、覆盖网络或无网络。以下是创建和使用 Docker 自定义网络的基本步骤:

  1. 创建网络: 使用 docker network create 命令创建一个新的网络。你可以指定网络的名称和驱动程序。例如:
docker network create --driver bridge my-custom-network
  1. 查看网络: 使用 docker network ls 查看所有可用的网络。
  2. 连接容器到网络: 创建容器时,可以使用 docker run 命令的 --network 选项将容器连接到特定的网络。例如:
docker run -d --name my-container --network my-custom-network my-image
  1. 查看网络中的容器: 使用 docker network inspect 命令查看网络中连接的容器。例如:
docker network inspect my-custom-network
  1. 断开容器与网络的连接: 如果需要将容器从网络中断开连接,可以使用 docker network disconnect 命令。例如:
docker network disconnect my-custom-network my-container
  1. 删除网络: 当不再需要某个网络时,可以使用 docker network rm 命令删除它。例如:
docker network rm my-custom-network
  1. 使用不同的网络驱动: Docker 支持多种网络驱动,例如 bridgeoverlaymacvlan 等。根据你的需求选择合适的网络驱动。
  2. 配置网络选项: 创建网络时,可以指定各种选项,如子网、网关等。例如:
docker network create --subnet 172.20.0.0/16 --gateway 172.20.0.1 my-custom-network

自定义网络可以帮助你更好地控制容器间的通信,提高网络的安全性和灵活性。如果你有更具体的需求或问题,可以进一步询问。

Dockerfile

Dockerfile 是一个文本文件,它包含了一系列的指令和参数,用于定义如何构建一个 Docker 镜像。每个指令都会在镜像中创建一个新的层,并对镜像进行修改。以下是一些常用的 Dockerfile 指令:

  1. # - 注释:以 # 开头的行被视为注释。
  2. FROM - 基础镜像:指定新镜像的基础镜像。
FROM ubuntu:20.04
  1. RUN - 执行命令:在容器中执行命令,可以是 /bin/sh -c/bin/bash -c
RUN apt-get update && apt-get install -y curl
  1. CMD - 容器默认执行的命令:指定容器启动时执行的命令。
CMD ["python", "app.py"]
  1. EXPOSE - 暴露端口:声明容器运行时监听的端口。
EXPOSE 80
  1. ENV - 设置环境变量:设置环境变量,可以在后续的指令中使用。
ENV PATH /usr/local/nginx/bin:$PATH
  1. ADD - 添加文件:将文件从构建上下文目录复制到容器中。
ADD source_file.txt /dest/path/
  1. COPY - 复制文件:类似于 ADD,但只能复制本地文件。
COPY source_file.txt /dest/path/
  1. ENTRYPOINT - 配置容器的入口点:配置容器启动时执行的命令,可以与 CMD 一起工作。
ENTRYPOINT ["python"]
  1. VOLUME - 创建挂载点:创建一个可以从本地主机或其他容器挂载的挂载点。
VOLUME /data
  1. USER - 指定用户:指定运行容器时的用户名或 UID。
USER root
  1. WORKDIR - 工作目录:设置容器内部的工作目录。
WORKDIR /app
  1. ARG - 构建参数:定义构建时的参数,可以在构建时通过 --build-arg 传递。
ARG VERSION=latest
  1. LABEL - 元数据:为镜像添加元数据。
LABEL maintainer="name@example.com"
  1. STOPSIGNAL - 停止信号:设置停止容器时使用的信号。
STOPSIGNAL SIGTERM
  1. ONBUILD - 构建触发器:设置当镜像作为其他镜像的基础时,自动执行的指令。
ONBUILD RUN echo "This will be executed at build time of the next image"

一个简单的 Dockerfile 示例可能如下所示:

# 使用官方 Python 运行时作为父镜像
FROM python:3.8-slim

# 设置工作目录
WORKDIR /app

# 将本地代码复制到容器中
COPY . /app

# 安装任何必要的依赖
RUN pip install --no-cache-dir -r requirements.txt

# 声明运行时需要暴露的端口
EXPOSE 5000

# 定义容器启动时执行的命令
CMD ["python", "./app.py"]

这个 Dockerfile 定义了一个基于 Python 3.8 镜像的 Docker 镜像,设置了工作目录,复制了当前目录下的文件到容器中,安装了依赖,并设置了启动命令。

Docker卷(Volume)管理

Docker 的卷管理是 Docker 容器化技术中的一个关键特性,它允许你将容器的数据持久化到宿主机上,即使容器停止或被删除,数据也不会丢失。以下是 Docker 卷管理的一些基本概念和操作:

卷的概念

  • 卷(Volume):是一个目录,Docker 容器可以将其挂载到容器内部作为数据持久化存储。卷独立于容器生命周期,即使容器被删除,卷中的数据依然保留。

创建卷

使用 docker volume create 命令创建一个卷:

docker volume create my-volume

列出卷

使用 docker volume ls 命令列出所有卷:

docker volume ls

检查卷

使用 docker volume inspect 命令查看卷的详细信息:

docker volume inspect my-volume

挂载卷到容器

在运行容器时,可以使用 -v--mount 选项将卷挂载到容器内部:

docker run -d --name my-container -v my-volume:/path/in/container some-image

或者使用更现代的 --mount 语法:

docker run -d --name my-container --mount source=my-volume,target=/path/in/container some-image

访问卷中的数据

宿主机上卷的数据通常存储在 /var/lib/docker/volumes/ 目录下。你可以直接访问和修改这些数据。

卷的命名空间

卷可以是全局的,也可以是本地的:

  • 全局卷:在所有容器中都可用,使用 docker volume create 创建。
  • 本地卷:仅在创建它的 Docker 守护进程上可用,使用 -v /path 直接在 docker run 命令中创建。

卷的驱动

Docker 支持多种卷驱动,例如:

  • local:默认驱动,存储在本地文件系统。
  • nfs:通过网络文件系统(NFS)存储卷。
  • rexray:用于 AWS EBS、EFS 或其他云存储服务。

卷的标签

可以使用标签来组织和管理卷:

docker volume create --label=com.example.vendor=example my-volume

卷的权限

在创建卷时,可以指定访问权限,例如只读或读写:

docker run -d --name my-container -v my-volume:/path/in/container:ro some-image

卷的清理

当卷不再需要时,可以使用 docker volume rm 命令删除它:

docker volume rm my-volume

卷的备份和恢复

虽然 Docker 卷本身不提供备份和恢复机制,但你可以通过复制宿主机上的卷目录来备份数据,或者在需要时将数据复制回卷目录来恢复数据。

卷的安全性

卷可以包含敏感数据,因此需要确保卷的安全性,例如使用加密卷或限制对卷的访问。

通过合理管理 Docker 卷,你可以确保容器化应用的数据持久化、共享和安全性。

Docker常用命令

Docker 提供了一系列命令来管理容器的生命周期,包括创建、运行、停止和删除容器,以及管理镜像和网络等。以下是 Docker 的一些常用命令的总结:

镜像相关命令

  • docker images:列出本地主机上的镜像。
  • docker pull IMAGE_NAME[:TAG]:从 Docker Hub 或其他注册中心拉取指定的镜像和标签。
  • docker push IMAGE_NAME[:TAG]:将本地镜像推送到注册中心。
  • docker rmi IMAGE_IDIMAGE_NAME[:TAG]:删除一个或多个本地镜像。
  • docker build -t IMAGE_NAME[:TAG] PATH:在指定路径下构建镜像,PATH 通常是包含 Dockerfile 的目录。
  • docker login:登录 Docker 注册中心。
  • docker logout:登出 Docker 注册中心。
  • docker tag IMAGE_NAME[:TAG] NEW_IMAGE_NAME[:NEW_TAG]:给镜像打上新的标签。
  • docker inspect IMAGE_NAME[:TAG]CONTAINER_ID:获取镜像或容器的元数据。

容器相关命令

  • docker run:运行一个容器。可以附加多个参数,如 -d 后台运行、--name 指定容器名等。
  • docker start CONTAINER_IDCONTAINER_NAME:启动一个或多个已经停止的容器。
  • docker stop:停止一个或多个正在运行的容器。
  • docker restart:重启容器。
  • docker rm:删除一个或多个容器。
  • docker ps:列出当前正在运行的容器。使用 -a 显示所有容器,包括停止的。
  • docker logs:获取容器的日志。
  • docker exec:在运行的容器中执行命令。
  • docker attach:附加到一个正在运行的容器的标准输入、输出和标准错误。

容器生命周期管理

  • docker create:创建一个新的容器但不启动它。
  • docker pause:暂停容器内的所有进程。
  • docker unpause:恢复之前被暂停的容器。

网络相关命令

  • docker network ls:列出 Docker 网络。
  • docker network create:创建一个新的网络。
  • docker network rm:删除网络。
  • docker network inspect:查看网络详情。

卷相关命令

  • docker volume create:创建一个新的卷。
  • docker volume ls:列出卷。
  • docker volume rm:删除一个或多个卷。
  • docker volume inspect:获取卷的详细信息。

镜像和容器的高级操作

  • docker commit:从容器创建一个新的镜像。
  • docker save:保存一个镜像到文件。
  • docker load:从一个文件加载镜像。

系统管理命令

  • docker info:显示 Docker 系统信息,如镜像和容器的数量等。
  • docker version:显示 Docker 客户端和服务器的版本信息。
  • docker prune:清理未使用的资源,如镜像、容器、网络和卷。
  • docker system df:显示 Docker 系统的空间使用情况。

容器编排和集群管理

  • docker stack deploy:部署一个应用堆栈。
  • docker stack rm:删除应用堆栈。
  • docker stack ls:列出所有应用堆栈。

其他有用命令

  • docker stats:实时显示容器的性能数据。
  • docker top:查看容器内运行的进程。
  • docker cp:在容器和本地之间复制文件或文件夹。

这些命令为 Docker 用户提供了强大的工具,以实现容器化应用的构建、部署和管理。

浙ICP备18035094号-1管理