docker笔记

docker笔记
安安docker学习笔记
一.docker安装配置(Ubuntu)
1.卸载旧版本
1 | for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done |
2.使用apt存储库安装
2.1设置 Docker 的apt存储库。
1 | sudo apt-get update |
1 | echo \ |
2.2安装 Docker 包。
安装最新版
1 | sudo apt-get update |
验证是否运行
1 | sudo systemctl status docker |
某些系统可能已禁用此行为并需要手动启动:
1 | sudo systemctl start docker |
3.通过运行镜像验证安装是否成功hello-world:
1 | sudo docker run hello-world |
此命令下载测试镜像并在容器中运行。容器运行时,它会打印一条确认消息并退出。
这里一般会出错,原因是:Docker 默认从 Docker Hub(registry-1.docker.io) 拉取镜像,但国内访问 Docker Hub 常因网络波动、延迟高导致连接超时。
解决方法:
获取专属镜像加速地址
登录 阿里云容器镜像服务(需注册阿里云账号),在「镜像加速器」板块复制你的专属地址(类似
https://xxxx.mirror.aliyuncs.com)。修改 Docker 配置文件
daemon.json
1 | sudo vim /etc/docker/daemon.json |
添加以下内容:
1 | { |
再次运行即可.
一键安装脚本:install-docker.sh
1 |
|
使用方法:
创建脚本文件
1
nano install-docker.sh
粘贴上面的内容,保存退出。
赋予执行权限
1
chmod +x install-docker.sh
执行安装
1
./install-docker.sh
Debian系统安装Docker
1 | # 使用阿里云镜像源 |
二.docker常用指令
镜像(Image)相关指令
| 指令 | 描述 | 示例 |
|---|---|---|
docker images |
列出本地所有镜像 | docker images |
docker pull <image> |
从仓库拉取镜像 | docker pull nginx |
docker push <image> |
推送镜像到仓库 | docker push myimage:latest |
docker build -t <name:tag> . |
从 Dockerfile 构建镜像 | docker build -t myapp:1.0 . |
docker rmi <image> |
删除镜像 | docker rmi nginx |
docker tag <source> <target> |
为镜像添加新标签 | docker tag myapp:1.0 myapp:latest |
docker search <term> |
在 Docker Hub 搜索镜像 | docker search mysql |
容器(Container)相关指令
| 指令 | 描述 | 示例 |
|---|---|---|
docker run <image> |
基于镜像运行一个新容器(可添加参数如 -d 后台运行、-p 端口映射) |
docker run -d -p 80:80 nginx |
docker ps |
列出运行中的容器 | docker ps |
docker ps -a |
列出所有容器(包括停止的) | docker ps -a |
docker start <container> |
启动已停止的容器 | docker start mycontainer |
docker stop <container> |
停止运行中的容器 | docker stop mycontainer |
docker restart <container> |
重启容器 | docker restart mycontainer |
docker rm <container> |
删除容器(需先停止) | docker rm mycontainer |
docker exec -it <container> <command> |
在运行容器中执行命令(-it 为交互模式) |
docker exec -it mycontainer /bin/bash |
docker logs <container> |
查看容器日志 | docker logs mycontainer |
docker inspect <container> |
查看容器或镜像的详细信息 | docker inspect mycontainer |
网络(Network)相关指令
| 指令 | 描述 | 示例 |
|---|---|---|
docker network ls |
列出所有网络 | docker network ls |
docker network create <name> |
创建自定义网络 | docker network create mynet |
docker network rm <name> |
删除网络 | docker network rm mynet |
docker network inspect <name> |
查看网络详情 | docker network inspect bridge |
卷(Volume)相关指令
| 指令 | 描述 | 示例 |
|---|---|---|
docker volume create <name> |
创建命名卷 | docker volume create mydata |
docker volume ls |
列出所有卷 | docker volume ls |
docker volume inspect <name> |
查看卷详情(如路径) | docker volume inspect mydata |
docker volume rm <name> |
删除卷(容器需停止) | docker volume rm mydata |
docker volume prune |
清理未使用卷 | docker volume prune |
系统管理相关指令
| 指令 | 描述 | 示例 |
|---|---|---|
docker version |
显示 Docker 版本信息 | docker version |
docker info |
显示 Docker 系统信息 | docker info |
docker login |
登录 Docker 仓库 | docker login |
docker logout |
登出 Docker 仓库 | docker logout |
docker system prune |
清理未使用的资源(镜像、容器等) | docker system prune -a |
注:大多数指令支持 –help 参数查看详细用法,例如 docker run --help。
三.docker目录挂载
在 Docker 中,目录挂载(也称为卷挂载或数据持久化)是用于将主机上的目录或文件映射到容器内部的机制。这可以确保容器数据持久化,即使容器被删除也不会丢失。Docker 支持两种主要挂载方式:绑定挂载(Bind Mounts) 和 卷(Volumes)。绑定挂载直接链接主机路径,而卷由 Docker 管理,更推荐用于生产环境。
基本概念
- 绑定挂载:将主机上的具体路径挂载到容器中。适合开发环境,便于实时修改文件。
- 卷:Docker 管理的存储卷,不依赖主机路径。支持备份、迁移和多容器共享,更安全和高效。
- 挂载使用
docker run命令的-v或--volume参数(或--mount提供更多选项)。 - 注意权限:主机路径需有读写权限;容器用户(如
root)需匹配。
常用挂载指令示例
以下表格列出常见挂载方式,使用 docker run 指令。假设镜像为 nginx,你可以替换为自己的镜像。
| 挂载类型 | 指令示例 | 说明 |
|---|---|---|
| 绑定挂载(目录) | docker run -d -p 80:80 -v /host/dir:/container/dir nginx |
将主机 /host/dir 挂载到容器 /container/dir。容器内修改会同步到主机。 |
| 绑定挂载(文件) | docker run -d -p 80:80 -v /host/file.conf:/container/file.conf nginx |
挂载单个文件,如配置文件。 |
| 绑定挂载(只读) | docker run -d -p 80:80 -v /host/dir:/container/dir:ro nginx |
添加 :ro 使容器内路径只读。 |
| 命名卷 | docker run -d -p 80:80 -v myvolume:/container/dir nginx |
如果 myvolume 不存在,Docker 会自动创建。卷数据存储在 Docker 的 /var/lib/docker/volumes/ 下。 |
| 匿名卷 | docker run -d -p 80:80 -v /container/dir nginx |
不指定主机路径,Docker 创建匿名卷(随机名称)。适合临时数据。 |
| 使用 –mount 参数 | docker run -d -p 80:80 --mount type=bind,source=/host/dir,target=/container/dir nginx |
更灵活的语法,支持 type=volume 或 type=bind。 |
步骤示例:挂载主机目录到 Nginx 容器
创建主机目录:mkdir -p ~/mywebsite 并在其中添加文件(如 index.html)。
运行容器并挂载:
1
docker run -d --name my-nginx -p 8080:80 -v ~/mywebsite:/usr/share/nginx/html nginx
- 这将主机
~/mywebsite挂载到容器的 Nginx 默认网页目录。
- 这将主机
访问测试:浏览器打开 http://localhost:8080,看到主机文件内容。
查看挂载:docker inspect my-nginx(在 “Mounts” 部分)。
四.Docker 卷映射
Docker 中的“卷映射”(Volume Mapping)是指使用 Docker 卷(Volumes)来实现主机与容器之间数据的持久化和共享。不同于绑定挂载(Bind Mounts),卷由 Docker 引擎管理,不直接依赖主机文件系统路径。这使得卷更适合生产环境,因为它支持更好的数据隔离、备份和迁移。卷映射的主要目的是确保容器数据在容器生命周期结束后不会丢失。
卷映射的基本概念
- 卷的类型:
- 命名卷(Named Volumes):有明确名称的卷,由 Docker 管理。数据存储在主机的
/var/lib/docker/volumes/目录下(具体路径取决于系统)。 - 匿名卷(Anonymous Volumes):没有名称的卷,Docker 自动生成随机 ID。适合临时数据。
- 命名卷(Named Volumes):有明确名称的卷,由 Docker 管理。数据存储在主机的
- 优势:
- 数据持久化:容器删除后,卷数据仍保留。
- 多容器共享:多个容器可挂载同一卷。
- 性能更好:卷优化了 I/O 操作,尤其在云环境。
- 安全性:不暴露主机路径,减少风险。
- 与绑定挂载的区别:
- 绑定挂载:直接指定主机路径(如
-v /host/path:/container/path),适合开发调试。 - 卷映射:使用卷名称或匿名方式(如
-v myvolume:/container/path),更抽象和可移植。
- 绑定挂载:直接指定主机路径(如
常用卷映射指令
使用 docker run 命令的 -v 或 --volume 参数进行映射。以下是示例表格(假设镜像为 nginx,可替换):
| 指令类型 | 示例 | 说明 |
|---|---|---|
| 创建并映射命名卷 | docker run -d -p 80:80 -v myvolume:/usr/share/nginx/html nginx |
如果 myvolume 不存在,Docker 自动创建。将卷映射到容器路径。 |
| 映射匿名卷 | docker run -d -p 80:80 -v /usr/share/nginx/html nginx |
不指定卷名,Docker 创建匿名卷。 |
| 使用 –mount 参数 | docker run -d -p 80:80 --mount type=volume,source=myvolume,target=/app nginx |
更精细控制,type=volume 指定为卷类型。 |
| 多卷映射 | docker run -d -p 80:80 -v vol1:/data1 -v vol2:/data2 nginx |
同时映射多个卷。 |
| 只读卷 | docker run -d -p 80:80 -v myvolume:/app:ro nginx |
添加 :ro 使容器内路径只读。 |
操作步骤示例:使用卷映射持久化数据
创建卷(可选,先手动创建):
1
docker volume create mydata
运行容器并映射卷:
1
docker run -d --name my-container -v mydata:/app ubuntu
- 这将 mydata 卷映射到容器的 /app 目录。
在容器中写入数据:
1
2
3docker exec -it my-container /bin/bash
echo "Hello from container" > /app/test.txt
exit删除容器并验证数据持久化:
1
2
3
4docker stop my-container
docker rm my-container
docker run -d --name new-container -v mydata:/app ubuntu
docker exec new-container cat /app/test.txt # 输出: Hello from container查看卷信息:
1
docker volume inspect mydata
五.Docker 自定义网络
Docker 默认提供桥接(bridge)、主机(host)和无网络(none)等网络模式,但自定义网络允许用户创建更灵活的网络环境,提供更好的容器隔离、DNS 解析(容器间可通过名称通信)和自定义配置。自定义网络特别适合多容器应用,如微服务架构。默认自定义网络类型为桥接(bridge),但也可指定其他驱动如 overlay(用于 Swarm 集群)或 macvlan。
自定义网络的基本概念
- 优势:
- 隔离:不同网络的容器无法直接通信,提高安全性。
- DNS 解析:在同一网络中,容器可使用名称(如 mycontainer)互相访问,而非 IP。
- 可扩展:支持子网、网关等自定义参数。
- 驱动类型:
- bridge:本地桥接网络(默认,最常用)。
- overlay:跨主机网络(需 Docker Swarm)。
- macvlan:容器使用主机 MAC 地址,直接连接物理网络。
- ipvlan:类似 macvlan,但共享 MAC。
- none 或 host:非自定义,通常不用于创建。
- 默认网络:docker network ls 可查看,如 bridge(默认桥接)、host 和 none。
常用自定义网络指令
以下表格列出核心指令,使用 docker network 子命令。示例假设创建桥接网络。
| 指令 | 描述 | 示例 |
|---|---|---|
docker network create <name> |
创建自定义网络(默认 bridge 类型) | docker network create mynet |
docker network create --driver <driver> <name> |
指定驱动创建网络 | docker network create --driver bridge mynet |
docker network create --subnet <subnet> <name> |
指定子网创建 | docker network create --subnet 192.168.0.0/16 mynet |
docker network ls |
列出所有网络 | docker network ls |
docker network inspect <name> |
查看网络详情(如子网、容器列表) | docker network inspect mynet |
docker network rm <name> |
删除网络(需无容器连接) | docker network rm mynet |
docker network connect <network> <container> |
将运行容器连接到网络 | docker network connect mynet mycontainer |
docker network disconnect <network> <container> |
从网络断开容器 | docker network disconnect mynet mycontainer |
docker network prune |
清理未使用网络 | docker network prune |
操作步骤示例:创建并使用自定义网络
创建自定义网络:
1
docker network create mynet
- 这创建一个桥接网络,Docker 会自动分配子网(如 172.18.0.0/16)。
运行容器并指定网络:
1
2docker run -d --name web1 --network mynet nginx
docker run -d --name web2 --network mynet nginx- 两个容器在 mynet 中,可通过名称互访(如从 web1 ping web2)。
测试容器间通信:
进入 web1 容器:
1
2
3docker exec -it web1 /bin/bash
ping web2 # 应成功解析并 ping 通
exit
连接现有容器到网络:
假设有一个默认网络的容器
oldcontainer:
1
docker network connect mynet oldcontainer
查看和删除:
1
2docker network inspect mynet # 显示连接的容器
docker network rm mynet # 先断开所有容器
注意事项和最佳实践
- 多网络连接:一个容器可连接多个网络(如默认 bridge + 自定义 mynet),使用 connect 指令。
- 端口映射:在自定义网络中,容器间通信无需端口映射;但暴露到主机仍需 -p 参数。
- Swarm 模式:对于集群,使用 overlay 驱动:docker network create –driver overlay myoverlay。
- 权限与安全:自定义网络默认隔离;避免在生产环境暴露不必要端口。
- Docker Compose:在 docker-compose.yml 中定义网络,更方便。 示例 YAML 片段:
六.Docker Compose
Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。它通过一个 YAML 文件(通常名为 docker-compose.yml 或 compose.yml)来描述服务的配置,包括镜像、端口、卷、网络和依赖关系。Compose 简化了多容器应用的启动、管理和扩展,尤其适合开发、测试和 CI/CD 环境。当前版本为 Compose v2(集成在 Docker CLI 中,作为 docker compose 子命令)。
Docker Compose 的优势
- 声明式配置:用 YAML 文件定义整个应用栈,一键启动/停止。
- 依赖管理:自动处理服务启动顺序(使用
depends_on)。 - 环境变量和秘密:支持
.env文件和 secrets。 - 与 Docker Swarm/Kubernetes 集成:可扩展到集群。
- 替代方案:对于单容器,直接用
docker run;复杂应用推荐 Compose。
安装和要求
- Docker Compose v2 默认随 Docker Desktop(Windows/Mac)或 Docker Engine(Linux)安装。
- 检查版本:
docker compose version(应显示 v2.x,如 v2.29.1)。 - 如果未安装(旧系统),从 Docker 官网 下载。
- 要求:Docker Engine v20.10+。
常用 Docker Compose 指令
Compose 指令以 docker compose 开头(v1 为 docker-compose,已弃用)。以下表格列出核心指令,假设在项目目录下运行(含 docker-compose.yml)。
| 指令 | 描述 | 示例 |
|---|---|---|
docker compose up |
构建镜像、创建并启动容器(前台运行) | docker compose up |
docker compose up -d |
后台启动 | docker compose up -d |
docker compose down |
停止并删除容器、网络(保留卷) | docker compose down |
docker compose down -v |
同时删除卷 | docker compose down -v |
docker compose ps |
列出项目容器 | docker compose ps |
docker compose logs |
查看所有服务日志 | docker compose logs -f(实时跟踪) |
docker compose exec <service> <command> |
在服务容器中执行命令 | docker compose exec web bash |
docker compose build |
构建或重建镜像 | docker compose build |
docker compose pull |
拉取镜像 | docker compose pull |
docker compose config |
验证和查看 YAML 配置 | docker compose config |
docker compose restart <service> |
重启特定服务 | docker compose restart db |
docker compose scale <service>=<num> |
扩展服务实例 | docker compose scale web=3 |
提示:添加 --project-name <name> 指定项目名;用 --file <path> 指定 YAML 文件路径。
YAML 文件基本结构(docker-compose.yml)
Compose 使用 YAML 定义服务。以下是一个简单示例:一个 Web 应用(Nginx) + 数据库(MySQL)。
1 | version: '3.8' # 指定 Compose 文件版本(推荐 3.x) |
- 关键部分:
services:每个服务对应一个容器。volumes:支持绑定挂载(./host:/container)或命名卷(myvol:)。networks:默认创建项目网络,或自定义。environment或env_file:设置变量。- 其他选项:
command重写入口命令、restart策略、healthcheck健康检查。
操作步骤示例:搭建简单栈
- 创建项目目录:
mkdir myapp && cd myapp。 - 创建
docker-compose.yml(如上例)。 - 启动:
docker compose up -d。 - 测试:浏览器访问
http://localhost(Nginx 首页);用docker compose exec db mysql -uroot -pexample连接 MySQL。 - 停止:
docker compose down。
与先前话题的结合
- 卷映射:在 YAML 中用
volumes定义(如上例的db_data)。 - 自定义网络:用
networks部分创建(如app_net)。 - Redis 主从集群:如前述响应,可直接用提供的
docker-compose.yml启动多容器 Redis。
注意事项
- 版本兼容:v2 指令无连字符(
docker compose而非docker-compose)。 - 环境变量:在
.env文件中定义(如MYSQL_ROOT_PASSWORD=secret),Compose 会自动加载。 - 生产环境:使用
secrets管理敏感数据;结合 Orchestrator 如 Swarm。 - 常见错误:YAML 缩进问题(用空格,非 Tab);镜像不存在(先
pull);端口冲突。 - 迁移 v1 到 v2:简单替换指令;旧项目用
COMPOSE_FILE=docker-compose.yml。
如果需要特定示例(如多环境配置、集成 CI)、高级功能(如 profiles 或 extensions),或针对某个应用的 YAML,请提供更多细节!
简单例子:wordpress
1 | name: myblog |
七.Dockerfile
Dockerfile 是一个文本文件,用于自动化构建 Docker 镜像。它定义了镜像的构建过程,包括基础镜像、文件复制、命令执行等。通过 Dockerfile,你可以创建可重复、可版本化的镜像,适合 CI/CD 和团队协作。Dockerfile 无扩展名,通常命名为 Dockerfile(大写 D),并放置在项目根目录。
Dockerfile 的基本概念
- 构建过程:Docker 按顺序执行 Dockerfile 中的指令,每条指令创建一个镜像层(layer),优化缓存以加速后续构建。
- 语法:指令大写(如
FROM),参数小写;支持#注释;多行用\续行。 - 多阶段构建:支持多个
FROM语句,用于分离构建和运行环境,减少镜像大小。 - 构建命令:使用
docker build -t <image:tag> .构建(.表示当前目录)。 - ARG 和 ENV:ARG 用于构建时变量(
--build-arg传递);ENV 用于运行时环境变量。
常用 Dockerfile 指令
以下表格列出核心指令,按典型顺序排列。每个镜像至少需一个 FROM。
| 指令 | 描述 | 示例 |
|---|---|---|
FROM <image> [AS <name>] |
指定基础镜像(必须是第一条非注释指令) | FROM ubuntu:22.04 AS builder |
ARG <name>[=<default>] |
定义构建时变量 | ARG VERSION=1.0 |
RUN <command> |
在镜像中执行命令(shell 形式) | RUN apt-get update && apt-get install -y curl |
RUN ["executable", "param1", ...] |
执行命令(exec 形式,避免 shell) | RUN ["/bin/bash", "-c", "echo hello"] |
COPY <src> <dest> |
复制主机文件/目录到镜像 | COPY ./app /usr/src/app |
ADD <src> <dest> |
类似 COPY,但支持 URL 和 tar 解压 | ADD https://example.com/file.tar /tmp/ |
WORKDIR <dir> |
设置工作目录(后续指令相对路径) | WORKDIR /app |
ENV <key>=<value> |
设置环境变量 | ENV PATH=/app/bin:$PATH |
EXPOSE <port> |
声明暴露端口(不实际映射) | EXPOSE 80 |
VOLUME <path> |
定义匿名卷(数据持久化) | VOLUME /data |
USER <user> |
指定运行用户(默认 root) | USER appuser |
CMD ["executable", "param1", ...] |
默认容器启动命令(可被覆盖) | CMD ["nginx", "-g", "daemon off;"] |
ENTRYPOINT ["executable", ...] |
容器入口点(不可覆盖,常与 CMD 结合) | ENTRYPOINT ["/app/entrypoint.sh"] |
LABEL <key>=<value> |
添加元数据标签 | LABEL version="1.0" maintainer="user@example.com" |
HEALTHCHECK [options] CMD <command> |
定义健康检查 | HEALTHCHECK --interval=30s CMD curl -f http://localhost/ |
提示:
RUN应合并命令以减少层数(e.g., 使用&&)。COPY优先于ADD,除非需要解压。- 多阶段:从一个阶段复制文件到另一个(
COPY --from=<name> /src /dest)。
示例 Dockerfile:构建简单 Node.js 应用
假设项目目录有 app.js 和 package.json。
1 | # 第一阶段:构建 |
- 构建:
docker build -t myapp:1.0 . - 运行:
docker run -p 3000:3000 myapp:1.0
构建和优化镜像
- 构建选项:
-t <name:tag>:标签镜像。--build-arg <key>=<value>:传递 ARG。--no-cache:忽略缓存重新构建。-f <file>:指定 Dockerfile 文件名。
- 优化技巧:
- 最小化层数:合并 RUN 指令。
- 放置变化频繁的文件在后:如先 COPY package.json,再 RUN install,最后 COPY 代码。
- 使用 .dockerignore 文件排除不必要文件(类似 .gitignore)。
- 选择 slim/alpine 基础镜像减少大小。
- 查看镜像:
docker images;细节docker inspect <image>。 - 推送:
docker push <image:tag>(需登录docker login)。
与先前话题的结合
- 卷映射:在 Dockerfile 中用
VOLUME定义默认卷;在docker run或 Compose 中映射。 - 自定义网络:构建后,在 Compose 的
networks中使用。 - Redis 集群:可为 Redis 自定义 Dockerfile 添加配置,但官方镜像通常足够。
- Docker Compose:Compose 可引用 Dockerfile(
build: .)构建服务。
注意事项
- 安全:避免 root 用户;扫描镜像用 Trivy 或 Docker Scout。
- 多平台:用
--platform linux/amd64,linux/arm64构建跨平台镜像。 - 常见错误:路径错误(WORKDIR 影响相对路径);权限问题(USER 后文件所有权)。
- 版本管理:将 Dockerfile 放入 Git,标签镜像版本。
如果需要特定应用的 Dockerfile 示例(如 Python/Go)、多阶段高级用法,或构建问题的排查,请提供更多细节!
八.其他笔记
批量删除:
1 | docker rm -f $(docker ps -aq) |
1 | docker rmi -f $(docker images -q) |
redis主从复制
主机:
1 | docker run -d -p 6379:6379 -v /app/rd1:/bitnami/redis/data -e REDIS_REPLICATION_MODE=master -e REDIS_PASSWORD=123456 --network mynet --name redis01 bitnami/redis |
从机:
1 | docker run -d -p 6380:6379 -v /app/rd2:/bitnami/redis/data -e REDIS_REPLICATION_MODE=slave -e REDIS_MASTER_HOST=redis01 -e REDIS_MASTER_PORT_NUMBER=6379 -e REDIS_MASTER_PASSWORD=123456 -e REDIS_PASSWORD=123456 --network mynet --name redis02 bitnami/redis |
DockerCheatSheet-ByGeekHour.pdf
【尚硅谷3小时速通Docker教程,名师带练docker部署到实战!】https://www.bilibili.com/video/BV1Zn4y1X7AZ?p=22&vd_source=941455fe2c7174431d55039a85b22ebd

