
Docker 是什么?
- Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
- Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
- 容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker 架构的工作流程
- 构建镜像:使用 Dockerfile 创建镜像。
- 推送镜像到注册表:将镜像上传到 Docker Hub 或私有注册表中。
- 拉取镜像:通过 docker pull 从注册表中拉取镜像。
- 运行容器:使用镜像创建并启动容器。
- 管理容器:使用 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 守护进程(通常是自动启动的):
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 守护进程的版本:
curl --unix-socket /var/run/docker.sock http://localhost/version
Docker 容器(Docker Containers)
容器是 Docker 的执行环境,它是轻量级、独立且可执行的软件包。容器是从 Docker 镜像启动的,包含了运行某个应用程序所需的一切——从操作系统库到应用程序代码。容器在运行时与其他容器和宿主机共享操作系统内核,但容器之间的文件系统和进程是隔离的。
功能:
- 提供独立的运行环境,确保应用程序在不同的环境中具有一致的行为。
- 容器是临时的,通常在任务完成后被销毁。
- 容器的生命周期是由 Docker 守护进程管理的。容器可以在任何地方运行,因为它们不依赖于底层操作系统的配置,所有的运行时依赖已经封装在镜像中。
启动一个容器:
docker run -d ubuntu
Docker 镜像(Docker Images)
Docker 镜像是容器的只读模板。每个镜像都包含了应用程序运行所需的操作系统、运行时、库、环境变量和应用代码等。镜像是静态的,用户可以根据镜像启动容器。
功能:
- 镜像是构建容器的基础,每个容器实例化时都会使用镜像。
- 镜像是只读的,不同容器使用同一个镜像时,容器中的文件系统层是独立的。
- Docker 镜像可以通过 docker pull 从 Docker Hub 或私有注册表拉取,也可以通过 docker build 从 Dockerfile 构建。
拉取 Ubuntu 镜像:
docker pull ubuntu
Docker 仓库(Docker Registries)
Docker 仓库是用来存储 Docker 镜像的地方,最常用的公共仓库是 Docker Hub 。用户可以从 Docker Hub 下载镜像,也可以上传自己的镜像分享给其他人。除了公共仓库,用户也可以部署自己的私有 Docker 仓库来管理企业内部的镜像。
功能:
- 存储 Docker 镜像。
- 提供镜像的上传和下载功能。
- Docker Hub 提供了大量官方和社区维护的镜像,如 Ubuntu、Nginx、MySQL 等。
推送镜像到 Docker Hub:
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 定义的所有服务:
docker compose up
TIPDocker Compose 插件自 V2 版本起开始作为 Docker CLI(命令行)的一部分,不再需要单独安装,使用 docker compose 命令替代 docker-compose
Docker Swarm
Docker Swarm 是 Docker 提供的集群管理和调度工具。它允许将多个 Docker 主机(节点)组织成一个集群,并通过 Swarm 集群管理工具来调度和管理容器。Swarm 可以实现容器的负载均衡、高可用性和自动扩展等功能。
功能:
- 管理多节点 Docker 集群。
- 通过调度器管理容器的部署和扩展。
初始化 Swarm 集群:
docker swarm init
Docker 网络(Docker Networks)
Docker 网络允许容器之间相互通信,并与外部世界进行连接。Docker 提供了多种网络模式来满足不同的需求,如 bridge 网络(默认)、host 网络和 overlay 网络等。
功能:
- 管理容器间的网络通信。
- 支持不同的网络模式,以适应不同场景下的需求。
创建一个自定义网络并将容器连接到该网络:
docker network create my_networkdocker run -d --network my_network ubuntu
Docker 卷(Docker Volumes)
Docker 卷是一种数据持久化机制,允许数据在容器之间共享,并且独立于容器的生命周期。与容器文件系统不同,卷的内容不会随着容器的销毁而丢失,适用于数据库等需要持久存储的应用。
功能:
- 允许容器间共享数据。
- 保证数据持久化,独立于容器的生命周期。
创建并挂载卷:
docker volume create my_volumedocker run -d -v my_volume:/data ubuntu
Docker 安装
Linux 安装
考虑到不同的发行版会有不一致的包/安装方式,此处将不使用官方的安装方式,采用SuperManito的 LinuxMirrors 项目进行安装docker,由于一些不可抗力的因素,目前国内网络环境一般无法正常访问 Docker Hub 因此无法拉取镜像,该镜像集成安装 Docker Engine 和 Docker Compose,支持选择或更换软件源以及镜像仓库、安装指定版本、重装等功能,支持 ARM 架构。
NOTEDocker CE 软件仓库,全称 Docker Community Edition(Docker 社区版),用于下载并安装 Docker 相关软件包 Docker Registry 镜像仓库,用于控制拉取镜像的默认来源存储仓库,又称镜像加速器,默认为官方的 Docker Hub 仓库
安装命令:
bash <(curl -sSL https://linuxmirrors.cn/docker.sh)
Windows 安装
Docker 并非是一个通用的容器工具,它依赖于已存在并运行的 Linux 内核环境。
Docker 实质上是在已经运行的 Linux 下制造了一个隔离的文件环境,因此它执行的效率几乎等同于所部署的 Linux 主机。
因此,Docker 必须部署在 Linux 内核的系统上。如果其他系统想部署 Docker 就必须安装一个虚拟 Linux 环境。
本页提供 Windows 上 Docker Desktop 的下载链接、系统要求和分步安装说明。
- 适用于 Windows 的 Docker 桌面 - x86_64
- Microsoft Store 上的 Docker Desktop for Windows - x86_64
- 适用于 Windows 的 Docker Desktop - Arm(早期访问)
交互式安装
使用页面顶部的下载按钮或从 发行说明中下载安装程序。
双击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组:
- 以管理员身份运行计算机管理。
- 导航到本地用户和组 > 组 > docker-users。
- 右键单击以将用户添加到组。
- 退出并重新登录以使更改生效。
从命令行安装
下载Docker Desktop Installer.exe完成后,在终端中运行以下命令安装 Docker Desktop:
"Docker Desktop Installer.exe" install
如果您使用 PowerShell,则应按以下方式运行它:
Start-Process 'Docker Desktop Installer.exe' -Wait install
如果使用 Windows 命令提示符:
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
中写入如下内容(如果文件不存在请新建该文件):
{ "registry-mirrors": [ "阿里云加速器地址", "可按格式添加多个地址" ]}
之后重新启动服务:
sudo systemctl daemon-reloadsudo systemctl restart docker
NOTEDocker的某些版本是daemon.conf文件,是一样的,如果重启出现报错就将后缀conf/json选择另一个即可
重启后使用以下命令检查加速器是否生效,如果生效会出现先前添加的加速器地址:
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
命令。
$ docker export 1e560fca3906 > ubuntu.tar
导出容器 1e560fca3906 快照到本地文件 ubuntu.tar。
这样将导出容器快照到本地文件。
导入容器快照
可以使用 docker import
从容器快照文件中再导入为镜像,以下实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1:
cat docker/ubuntu.tar | docker import - test/ubuntu:v1
此外,也可以通过指定 URL 或者某个目录来导入,例如:
docker import http://example.com/exampleimage.tgz example/imagerepo
Docker 命令详解
docker run
docker run 命令用于创建并启动一个新的容器。
语法
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
常用参数说明:
-d
: 后台运行容器并返回容器 ID。-it
: 交互式运行容器,分配一个伪终端。--nam
e: 给容器指定一个名称。-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 目录,并设置为开机自启
docker run -d -p 8080:80 -v /host/data:/data --restart always --name webserver nginx
Docker exec
docker exec 命令用于在运行中的容器内执行一个新的命令。这对于调试、运行附加的进程或在容器内部进行管理操作非常有用。
语法
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.
在容器内运行命令:
docker exec my_container ls /app
在运行中的 my_container 容器内执行 ls /app 命令,列出 /app 目录的内容。
以交互模式运行命令:
docker exec -it my_container /bin/bash
在运行中的 my_container 容器内启动一个交互式的 Bash shell。-i 保持标准输入打开,-t 分配一个伪终端。
在后台运行命令:
docker exec -d my_container touch /app/newfile.txt
在运行中的 my_container 容器内后台执行 touch /app/newfile.txt 命令,创建一个新文件。
设置环境变量:
docker exec -e MY_ENV_VAR=my_value my_container env
在运行中的 my_container 容器内执行 env 命令,并设置环境变量 MY_ENV_VAR 的值为 my_value。
以指定用户身份运行命令:
docker exec -u user123 my_container whoami
在运行中的 my_container 容器内以 user123 用户身份执行 whoami 命令。
指定工作目录:
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
输出:
NETWORK ID NAME DRIVER SCOPEb649b57f5bc5 bridge bridge local7e8c2d2c0b5a host host local6a9c8d69bfb2 none null local
docker network inspect 命令
查看指定网络的详细信息。 输出:
[ { "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 命令
创建一个新网络。
docker network create my_network
常用参数
--driver
: 指定网络驱动程序(如 bridge、host、overlay)。--subnet
: 指定子网。--gateway
: 指定网关。--ip-range
: 指定可用 IP 地址范围。--ipv6
: 启用 IPv6。--label
: 为网络添加标签。
示例:
docker network create --driver bridge --subnet 192.168.1.0/24 my_network
将一个容器连接到一个网络。
docker network connect my_network my_containerdocker network disconnect 命令
将一个容器从一个网络断开
docker network disconnect my_network my_container