4628 字
23 分钟Add commentMore actions
Docker使用指南

Docker 是什么?#

  • Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
  • Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
  • 容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

Docker 架构的工作流程#

  • 构建镜像:使用 Dockerfile 创建镜像。
  • 推送镜像到注册表:将镜像上传到 Docker Hub 或私有注册表中。
  • 拉取镜像:通过 docker pull 从注册表中拉取镜像。
  • 运行容器:使用镜像创建并启动容器。
  • 管理容器:使用 Docker 客户端命令管理正在运行的容器(例如查看日志、停止容器、查看资源使用情况等)。
  • 网络与存储:容器之间通过 Docker 网络连接,数据通过 Docker 卷或绑定挂载进行持久化。

Docker 架构的工作流程

Docker 的核心组件#

Docker 客户端(Docker Client)#

Docker 客户端是用户与 Docker 守护进程交互的命令行界面(CLI)。它是用户与 Docker 系统的主要交互方式,用户通过 Docker CLI 发出命令,这些命令被发送到 Docker 守护进程,由守护进程执行相应的操作。

功能:#

允许用户使用命令与 Docker 守护进程通信,如创建容器、构建镜像、查看容器状态等。

交互方式:Docker 客户端与 Docker 守护进程之间通过 REST API 或 Unix 套接字通信。常用的命令行工具是 docker,通过它,用户可以发出各种 Docker 操作命令。

常用命令:

  • docker run:运行容器。
  • docker ps:列出正在运行的容器。
  • docker build:构建 Docker 镜像。
  • docker exec:在容器中执行命令。

Docker 守护进程(Docker Daemon)#

Docker 守护进程(通常是 dockerd)是 Docker 架构的核心,负责管理容器生命周期、构建镜像、分发镜像等任务。

守护进程通常以后台进程的方式运行,等待来自 Docker 客户端的 API 请求。

功能:#

  • 启动和停止容器。
  • 构建、拉取和推送镜像。
  • 管理容器的网络和存储。
  • 启动、停止、查看容器日志等。
  • 与 Docker 注册表进行通信,管理镜像的存储与分发。
  • Docker 守护进程监听来自 Docker 客户端的请求,并且通过 Docker API 执行这些请求。守护进程将负责容器、镜像等 Docker 对象的管理,并根据请求的参数启动容器、删除容器、修改容器配置等。

启动 Docker 守护进程(通常是自动启动的):

Terminal window
sudo systemctl start docker

Docker 引擎 API(Docker Engine API)#

Docker 引擎 API 是 Docker 提供的 RESTful 接口,允许外部客户端与 Docker 守护进程进行通信。通过这个 API,用户可以执行各种操作,如启动容器、构建镜像、查看容器状态等。API 提供了 HTTP 请求的接口,支持跨平台调用。

功能:#

向 Docker 守护进程发送 HTTP 请求,实现容器、镜像的管理。 提供 RESTful 接口,允许通过编程与 Docker 进行交互。 可以通过 curl 或其他 HTTP 客户端访问 Docker 引擎 API。例如,查询当前 Docker 守护进程的版本:

Terminal window
curl --unix-socket /var/run/docker.sock http://localhost/version

Docker 容器(Docker Containers)#

容器是 Docker 的执行环境,它是轻量级、独立且可执行的软件包。容器是从 Docker 镜像启动的,包含了运行某个应用程序所需的一切——从操作系统库到应用程序代码。容器在运行时与其他容器和宿主机共享操作系统内核,但容器之间的文件系统和进程是隔离的。

功能:#

  • 提供独立的运行环境,确保应用程序在不同的环境中具有一致的行为。
  • 容器是临时的,通常在任务完成后被销毁。
  • 容器的生命周期是由 Docker 守护进程管理的。容器可以在任何地方运行,因为它们不依赖于底层操作系统的配置,所有的运行时依赖已经封装在镜像中。

启动一个容器:

Terminal window
docker run -d ubuntu

Docker 镜像(Docker Images)#

Docker 镜像是容器的只读模板。每个镜像都包含了应用程序运行所需的操作系统、运行时、库、环境变量和应用代码等。镜像是静态的,用户可以根据镜像启动容器。

功能:#

  • 镜像是构建容器的基础,每个容器实例化时都会使用镜像。
  • 镜像是只读的,不同容器使用同一个镜像时,容器中的文件系统层是独立的。
  • Docker 镜像可以通过 docker pull 从 Docker Hub 或私有注册表拉取,也可以通过 docker build 从 Dockerfile 构建。

拉取 Ubuntu 镜像:

Terminal window
docker pull ubuntu

Docker 仓库(Docker Registries)#

Docker 仓库是用来存储 Docker 镜像的地方,最常用的公共仓库是 Docker Hub 。用户可以从 Docker Hub 下载镜像,也可以上传自己的镜像分享给其他人。除了公共仓库,用户也可以部署自己的私有 Docker 仓库来管理企业内部的镜像。

功能:#

  • 存储 Docker 镜像。
  • 提供镜像的上传和下载功能。
  • Docker Hub 提供了大量官方和社区维护的镜像,如 Ubuntu、Nginx、MySQL 等。

推送镜像到 Docker Hub:

Terminal window
docker push <username>/<image_name>

Docker Compose#

Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。通过 Compose,用户可以使用一个 docker-compose.yml 配置文件定义多个容器(服务),并可以通过一个命令启动这些容器。Docker Compose 主要用于开发、测试和部署多容器的应用。

功能:#

  • 定义和运行多个容器组成的应用。
  • 通过 YAML 文件来配置应用的服务、网络和卷等。

创建一个简单的 docker-compose.yml 文件来配置一个包含 Web 服务和数据库服务的应用:

version: '3'
services:
web:
image: nginx
ports:
- "8080:80"
db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: example

启动 Compose 定义的所有服务:

Terminal window
docker compose up
TIP

Docker Compose 插件自 V2 版本起开始作为 Docker CLI(命令行)的一部分,不再需要单独安装,使用 docker compose 命令替代 docker-compose

Docker Swarm#

Docker Swarm 是 Docker 提供的集群管理和调度工具。它允许将多个 Docker 主机(节点)组织成一个集群,并通过 Swarm 集群管理工具来调度和管理容器。Swarm 可以实现容器的负载均衡、高可用性和自动扩展等功能。

功能:#

  • 管理多节点 Docker 集群。
  • 通过调度器管理容器的部署和扩展。

初始化 Swarm 集群:

Terminal window
docker swarm init

Docker 网络(Docker Networks)#

Docker 网络允许容器之间相互通信,并与外部世界进行连接。Docker 提供了多种网络模式来满足不同的需求,如 bridge 网络(默认)、host 网络和 overlay 网络等。

功能:#

  • 管理容器间的网络通信。
  • 支持不同的网络模式,以适应不同场景下的需求。

创建一个自定义网络并将容器连接到该网络:

Terminal window
docker network create my_network
docker run -d --network my_network ubuntu

Docker 卷(Docker Volumes)#

Docker 卷是一种数据持久化机制,允许数据在容器之间共享,并且独立于容器的生命周期。与容器文件系统不同,卷的内容不会随着容器的销毁而丢失,适用于数据库等需要持久存储的应用。

功能:#

  • 允许容器间共享数据。
  • 保证数据持久化,独立于容器的生命周期。

创建并挂载卷:

Terminal window
docker volume create my_volume
docker run -d -v my_volume:/data ubuntu

Docker 安装#

Linux 安装#

考虑到不同的发行版会有不一致的包/安装方式,此处将不使用官方的安装方式,采用SuperManito的 LinuxMirrors 项目进行安装docker,由于一些不可抗力的因素,目前国内网络环境一般无法正常访问 Docker Hub 因此无法拉取镜像,该镜像集成安装 Docker Engine 和 Docker Compose,支持选择或更换软件源以及镜像仓库、安装指定版本、重装等功能,支持 ARM 架构。

Docker 安装与换源脚本

SuperManito
/
LinuxMirrors
Waiting for api.github.com...
00K
0K
0K
Waiting...
NOTE

Docker CE 软件仓库,全称 Docker Community Edition(Docker 社区版),用于下载并安装 Docker 相关软件包 Docker Registry 镜像仓库,用于控制拉取镜像的默认来源存储仓库,又称镜像加速器,默认为官方的 Docker Hub 仓库

安装命令:

Terminal window
bash <(curl -sSL https://linuxmirrors.cn/docker.sh)

Windows 安装#

Docker 并非是一个通用的容器工具,它依赖于已存在并运行的 Linux 内核环境。

Docker 实质上是在已经运行的 Linux 下制造了一个隔离的文件环境,因此它执行的效率几乎等同于所部署的 Linux 主机。

因此,Docker 必须部署在 Linux 内核的系统上。如果其他系统想部署 Docker 就必须安装一个虚拟 Linux 环境。

win下docker的安装示意

本页提供 Windows 上 Docker Desktop 的下载链接、系统要求和分步安装说明。

交互式安装#

使用页面顶部的下载按钮或从 发行说明中下载安装程序。

双击Docker Desktop Installer.exe运行安装程序。默认情况下,Docker Desktop 安装在C:\Program Files\Docker\Docker。

出现提示时,请确保根据您选择的后端,选择配置页面上的使用 WSL 2 而不是 Hyper-V选项。

NOTE

我应该使用 Hyper-V 还是 WSL?#

Docker Desktop 的功能在 WSL 和 Hyper-V 上保持一致,无需优先选择任何一种架构。Hyper-V 和 WSL 各有优缺点,具体取决于您的具体设置和计划用例。个人更偏好 WSL2

CAUTION

使用 Docker Desktop WSL 2 后端时,无法在用户帐户之间共享容器和镜像。

在仅支持一个后端的系统上,Docker Desktop 会自动选择可用选项。

按照安装向导上的说明授权安装程序并继续安装。

安装成功后,选择关闭即可完成安装过程。

启动 Docker Desktop#

如果您的管理员帐户与您的用户帐户不同,则必须将用户添加到docker-users组:

  1. 以管理员身份运行计算机管理。
  2. 导航到本地用户和组 > 组 > docker-users。
  3. 右键单击以将用户添加到组。
  4. 退出并重新登录以使更改生效。

从命令行安装#

下载Docker Desktop Installer.exe完成后,在终端中运行以下命令安装 Docker Desktop:

Terminal window
"Docker Desktop Installer.exe" install

如果您使用 PowerShell,则应按以下方式运行它:

Terminal window
Start-Process 'Docker Desktop Installer.exe' -Wait install

如果使用 Windows 命令提示符:

Terminal window
start /w "" "Docker Desktop Installer.exe" install

默认情况下,Docker Desktop 安装在C:\Program Files\Docker\Docker

Docker 镜像配置加速#

当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。 目前国内 Docker 镜像源出现了一些问题,基本不能用了,尽管可以通过上述 LinuxMirrors 项目配置源,但其提供的源并不能保证一直处于可用的状态,这个时候就需要我们自己去寻找相关源仓库添加到相关文件里了

对于使用 systemd 的系统,请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件):

Terminal window
{
"registry-mirrors": [
"阿里云加速器地址",
"可按格式添加多个地址"
]
}

之后重新启动服务:

Terminal window
sudo systemctl daemon-reload
sudo systemctl restart docker
NOTE

Docker的某些版本是daemon.conf文件,是一样的,如果重启出现报错就将后缀conf/json选择另一个即可

重启后使用以下命令检查加速器是否生效,如果生效会出现先前添加的加速器地址:

Terminal window
docker info

常用的 Docker 客户端命令#

命令功能示例
docker run启动一个新的容器并运行命令docker run -d ubuntu
docker ps列出当前正在运行的容器docker ps
docker ps -a列出所有容器(包括已停止的容器)docker ps -a
docker build使用 Dockerfile 构建镜像docker build -t my-image
docker images列出本地存储的所有镜像docker images
docker pull从 Docker 仓库拉取镜像docker pull ubuntu
docker push将镜像推送到 Docker 仓库docker push my-image
docker exec在运行的容器中执行命令docker exec -it container_name bash
docker stop停止一个或多个容器docker stop container_name
docker start启动已停止的容器docker start container_name
docker restart重启一个容器docker restart container_name
docker rm删除一个或多个容器docker rm container_name
docker rmi删除一个或多个镜像docker rmi my-image
docker logs查看容器的日志docker logs container_name
docker inspect获取容器或镜像的详细信息docker inspect container_name
docker exec -it进入容器的交互式终端docker exec -it container_name /bin/bash
docker network ls列出所有 Docker 网络docker network ls
docker volume ls列出所有 Docker 卷docker volume ls
docker-compose up启动多容器应用(从 docker-compose.yml 文件)docker-compose up
docker-compose down停止并删除由 docker-compose 启动的容器、网络等docker-compose down
docker info显示 Docker 系统的详细信息docker info
docker version显示 Docker 客户端和守护进程的版本信息docker version
docker stats显示容器的实时资源使用情况docker stats
docker login登录 Docker 仓库docker login
docker logout登出 Docker 仓库docker logout

常用选项说明:

  • -d:后台运行容器,例如 docker run -d ubuntu
  • -it:以交互式终端运行容器,例如 docker exec -it container_name bash
  • -t:为镜像指定标签,例如 docker build -t my-image
  • -p:将容器内部使用的网络端口随机映射到我们使用的主机上,例如docker run -d -p 12345:5000 training/webapp python app.py,其中12345为主机端口
NOTE

-P:是容器内部端口随机映射到主机的端口。

-p:是容器内部端口绑定到指定的主机端口。

备份容器快照#

导出和导入容器#

导出容器#

如果要导出本地某个容器,可以使用 docker export 命令。

Terminal window
$ docker export 1e560fca3906 > ubuntu.tar

导出容器 1e560fca3906 快照到本地文件 ubuntu.tar。

这样将导出容器快照到本地文件。

导入容器快照#

可以使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1:

Terminal window
cat docker/ubuntu.tar | docker import - test/ubuntu:v1

此外,也可以通过指定 URL 或者某个目录来导入,例如:

Terminal window
docker import http://example.com/exampleimage.tgz example/imagerepo

Docker 命令详解#

docker run#

docker run 命令用于创建并启动一个新的容器。

语法#

Terminal window
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

常用参数说明:#

  • -d: 后台运行容器并返回容器 ID。
  • -it: 交互式运行容器,分配一个伪终端。
  • --name: 给容器指定一个名称。
  • -p: 端口映射,格式为 host_port
  • -v: 挂载卷,格式为 host_dir
  • --rm: 容器停止后自动删除容器。
  • --env-e: 设置环境变量。
  • --network: 指定容器的网络模式。
  • --restart: 容器的重启策略(如 no、on-failure、always、unless-stopped)。
  • -u: 指定用户。

e.g. 后台运行一个命名为 webserver 的 nginx 容器,将主机的 8080 端口映射到容器的 80 端口,并将主机的 /host/data 目录挂载到容器的 /data 目录,并设置为开机自启

Terminal window
docker run -d -p 8080:80 -v /host/data:/data --restart always --name webserver nginx

Docker exec#

docker exec 命令用于在运行中的容器内执行一个新的命令。这对于调试、运行附加的进程或在容器内部进行管理操作非常有用。

语法#

Terminal window
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

常用参数#

  • -d , --detach: 在后台运行命令。
  • --detach-keys: 覆盖分离容器的键序列。
  • -e, --env: 设置环境变量。
  • --env-file: 从文件中读取环境变量。
  • -i, --interactive: 保持标准输入打开。
  • --privileged: 给这个命令额外的权限。
  • --user, -u: 以指定用户的身份运行命令。
  • --workdir, -w: 指定命令的工作目录。
  • -t, --tty: 分配一个伪终端。

e.g.

在容器内运行命令:#

Terminal window
docker exec my_container ls /app

在运行中的 my_container 容器内执行 ls /app 命令,列出 /app 目录的内容。

以交互模式运行命令:#

Terminal window
docker exec -it my_container /bin/bash

在运行中的 my_container 容器内启动一个交互式的 Bash shell。-i 保持标准输入打开,-t 分配一个伪终端。

在后台运行命令:#

Terminal window
docker exec -d my_container touch /app/newfile.txt

在运行中的 my_container 容器内后台执行 touch /app/newfile.txt 命令,创建一个新文件。

设置环境变量:#

Terminal window
docker exec -e MY_ENV_VAR=my_value my_container env

在运行中的 my_container 容器内执行 env 命令,并设置环境变量 MY_ENV_VAR 的值为 my_value。

以指定用户身份运行命令:#

Terminal window
docker exec -u user123 my_container whoami

在运行中的 my_container 容器内以 user123 用户身份执行 whoami 命令。

指定工作目录:#

Terminal window
docker exec -w /app my_container pwd

在运行中的 my_container 容器内以 /app 目录为工作目录执行 pwd 命令。

docker network#

docker network 命令用于管理 Docker 网络。这些命令可以创建、列出、删除和检查网络,帮助用户在 Docker 容器之间建立通信。

常用 docker network 命令#

  • docker network ls: 列出所有网络
  • docker network inspect: 查看网络详细信息
  • docker network create: 创建一个新网络
  • docker network rm: 删除一个或多个网络
  • docker network connect: 将一个容器连接到一个网络
  • docker network disconnect: 将一个容器从一个网络断开

docker network ls 命令:#

列出所有网络。

docker network ls输出:

Terminal window
NETWORK ID NAME DRIVER SCOPE
b649b57f5bc5 bridge bridge local
7e8c2d2c0b5a host host local
6a9c8d69bfb2 none null local

docker network inspect 命令#

查看指定网络的详细信息。 输出:

Terminal window
[
{
"Name": "my_network",
"Id": "b649b57f5bc5",
"Created": "2024-07-23T00:00:00.000000000Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
NOTE

容器与容器之间的连接强烈推荐使用容器内部ip而不是主机端映射的端口!但也要注意容器内部ip可能会因为重启而导致ip变换

docker network create 命令#

创建一个新网络。

Terminal window
docker network create my_network

常用参数#

  • --driver: 指定网络驱动程序(如 bridge、host、overlay)。
  • --subnet: 指定子网。
  • --gateway: 指定网关。
  • --ip-range: 指定可用 IP 地址范围。
  • --ipv6: 启用 IPv6。
  • --label: 为网络添加标签。

示例:

Terminal window
docker network create --driver bridge --subnet 192.168.1.0/24 my_network

将一个容器连接到一个网络。#

Terminal window
docker network connect my_network my_container
docker network disconnect 命令

将一个容器从一个网络断开#

Terminal window
docker network disconnect my_network my_container
Docker使用指南
https://p1ume.vercel.app/posts/docker/
作者
p1ume
发布于
2023-09-13
许可协议
CC BY-NC-SA 4.0