Docker学习笔记大全
Docker学习笔记大全
温馨提示
此博客内容较多,是我学习过程中对Docker做的全部笔记。访客可以根据右侧目录查找自己需要的部分,目录若不自动跟随,则需要刷新页面。可以右键弹出菜单,对选中的内容进行必应搜索。
镜像命名规范
镜像名称由两部分组成:[repository]:[tag]
- repository就是镜像名
- tag是镜像的版本
在没有指定tag时,默认为latest,代表最新版本的镜像
docker run命令的常见参数
- -d: 让容器后台运行
- --name: 给容器命名
- -e: 环境变量
- -p: 端口映射,宿主机端口:容器内端口
常见命令
镜像相关命令
-
搜索镜像:在 Docker Hub 上搜索镜像。
docker search [OPTIONS] TERM
-
拉取镜像:从仓库中拉取一个或多个镜像。
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
-
列出本地镜像:显示所有本地存储的镜像。
docker images [OPTIONS] [REPOSITORY[:TAG]]
-
构建镜像:根据 Dockerfile 构建一个新的镜像。
docker build [OPTIONS] PATH | URL | -
-
保存镜像:将一个或多个镜像保存为 tar 归档文件。
docker save [OPTIONS] IMAGE [IMAGE...]
-
加载镜像:从 tar 归档文件中加载镜像。
docker load [OPTIONS]
-
删除镜像:移除一个或多个本地镜像。
docker rmi [OPTIONS] IMAGE [IMAGE...]
-
给镜像打标签:为本地镜像添加新的标签。
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
容器相关命令
-
运行容器:创建并启动一个新的容器。
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-
列出容器:显示所有正在运行的容器(加上
-a
显示所有容器)。docker ps [OPTIONS]
-
停止容器:停止一个或多个运行中的容器。
docker stop [OPTIONS] CONTAINER [CONTAINER...]
-
启动容器:启动一个或多个已停止的容器。
docker start [OPTIONS] CONTAINER [CONTAINER...]
-
重启容器:重启一个或多个容器。
docker restart [OPTIONS] CONTAINER [CONTAINER...]
-
删除容器:移除一个或多个容器。
docker rm [OPTIONS] CONTAINER [CONTAINER...]
-
强制删除容器:即使容器正在运行也可以立即删除。
docker rm -f [OPTIONS] CONTAINER [CONTAINER...]
-
查看容器日志:获取容器的日志输出。
docker logs [OPTIONS] CONTAINER
-
进入容器:打开一个交互式 shell 进入容器内部。
docker exec -it CONTAINER /bin/bash # 或者 sh 如果是 alpine 等精简系统
-
暂停容器:暂停容器的所有进程。
docker pause CONTAINER
-
恢复容器:恢复之前被暂停的容器。
docker unpause CONTAINER
-
导出容器:将容器导出为 tar 文件。
docker export [OPTIONS] CONTAINER
-
导入容器:从 tar 文件导入内容作为一个新的文件系统镜像。
cat container.tar | docker import - example/imagename
其他常用命令
-
查看版本信息:显示 Docker 版本信息。
docker version
-
查看系统信息:显示 Docker 系统信息,包括镜像和容器的数量等。
docker info
-
清理未使用的资源:移除所有未使用的容器、网络、镜像以及可选地挂载点。
docker system prune [OPTIONS]
-
登录注册表:登录到 Docker 注册表,如 Docker Hub。
docker login [OPTIONS] [REGISTRY]
-
推送镜像:将本地镜像推送到注册表。
docker push NAME[:TAG]
-
查看命令帮助:获取更多关于特定命令的帮助。
docker COMMAND --help
-
查看容器、镜像、网络、数据卷等详细信息:获取Docker对象的配置、状态、网络设置、挂载点等详细信息。
docker inspect <OBJECT_TYPE> <OBJECT_NAME_OR_ID>
全部Docker命令
想要查询更多docker命令,可以去菜鸟教程查看https://www.runoob.com/docker/docker-command-manual.html
使用别名简化Docker命令
编辑 ~/.bashrc 文件,给命令起别名,简化Docker命令。
vim ~/.bashrc
加上需要简化的Docker命令。例如:
alias dps='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"'
alias dis='docker images'
保存退出,再重新加载此文件
source ~/.bashrc
接下来就可以使用简化后的命令了。如下:
数据卷
介绍
Docker 数据卷(Volumes)是 Docker 中用于管理持久化数据的主要机制。它们为容器提供了一种独立于容器生命周期的数据存储方式,确保即使容器被删除或重新创建,数据仍然可以保持不变和可用。
使用数据卷,可以将容器内的文件夹与宿主机的文件夹通过数据卷进行双向绑定。这样,即使容器停止或删除,数据都不会消失,依然保存在宿主机上。并且,这样我们就可以直接通过操作宿主机上的文件来操作容器内的文件。
当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷。
如图例:
Nginx容器的 /etc/nginx/conf/ _data/ 挂载到宿主机的 /var/lib/docker/conf/ 下,
Nginx容器的 /usr/share/nginx/html/ _data 挂载到宿主机的 /var/lib/docker/volumes/html/ 下。
注意:_data是宿主机实际存储文件的文件夹!
常用命令
1. 创建数据卷
创建一个新的 Docker 数据卷。
命令:
docker volume create <volume_name>
示例:
docker volume create my_volume
2. 查看所有数据卷
列出所有已创建的 Docker 数据卷。
命令:
docker volume ls
3. 查看数据卷详细信息
查看某个数据卷的详细信息。
命令:
docker volume inspect <volume_name>
示例:
docker volume inspect my_volume
4. 删除数据卷
删除一个或多个数据卷。
命令:
docker volume rm <volume_name>
示例:
docker volume rm my_volume
5. 删除所有未使用的数据卷
删除所有未被容器使用的数据卷。
命令:
docker volume prune
6. 在容器中使用数据卷
将数据卷挂载到容器的指定路径。
命令:
docker run -v <volume_name>:<container_path> <image_name>
示例:
docker run -d -v my_volume:/app/data nginx
7. 挂载主机目录作为数据卷
将主机上的目录挂载到容器中。
命令:
docker run -v <host_path>:<container_path> <image_name>
示例:
docker run -d -v /home/user/data:/app/data nginx
8. 查看容器挂载的数据卷
查看某个容器挂载的数据卷信息。
命令:
docker inspect <container_id> --format='{{.Mounts}}'
示例:
docker inspect my_container --format='{{.Mounts}}'
9. 备份数据卷
将数据卷的内容备份到主机上的一个文件。
命令:
docker run --rm -v <volume_name>:/volume -v <host_backup_dir>:/backup busybox tar cvf /backup/backup.tar /volume
示例:
docker run --rm -v my_volume:/volume -v /home/user/backups:/backup busybox tar cvf /backup/backup.tar /volume
10. 恢复数据卷
从备份文件恢复数据卷的内容。
命令:
docker run --rm -v <volume_name>:/volume -v <host_backup_dir>:/backup busybox tar xvf /backup/backup.tar -C /volume
示例:
docker run --rm -v my_volume:/volume -v /home/user/backups:/backup busybox tar xvf /backup/backup.tar -C /volume
数据卷挂载与目录挂载的区别
一、数据卷挂载
1.什么是数据卷?
数据卷是一个虚拟目录,它将宿主机目录映射到容器内目录,方便我们操作容器内文件,或者方便迁移容器产生的数据。
2.什么是数据卷挂载?
数据卷挂载是将主机上的一个目录或文件作为数据卷挂载到容器中,这个数据卷可以被多个容器共享,容器之间可以通过这个数据卷进行数据交换。数据卷挂载的好处是可以将数据从容器中分离出来,方便备份和迁移,同时也可以避免容器被删除时数据的丢失。
3.如何挂载数据卷?
(1)在创建容器时,利用【 -v 数据卷名:容器内目录】完成挂载;
(2)容器创建时,如果发现挂载的数据卷不存在时,会自动创建;
4.数据卷的常见命令有哪些?
(1)docker volume ls # 查看数据卷
(2)docker volume rm # 删除数据卷
(3)docker volume inspect # 查看数据卷详情
(4)docker volume prune # 删除未使用的数据卷
5.如何查看某个容器挂载了哪些数据卷?
(1)docker inspect 容器名
(2)查看返回数据对象中的Mounts键对应的值
二、目录挂载
1.什么是目录挂载?
目录挂载是将主机上的一个目录直接挂载到容器中,容器中的文件会直接覆盖主机上的文件,这种方式不适合多个容器共享数据。目录挂载的好处是可以方便地将主机上的文件或目录与容器中的文件或目录进行同步,方便开发和调试。
2.如何进行目录挂载?
在创建容器时,利用【 -v 本地目录:容器内目录】完成挂载;
三、二者区别
数据卷挂载适合多个容器共享数据,而目录挂载适合单个容器与主机之间进行数据交换。
四、提示
注意二者写法上的区别,例如在实例化MySQL容器时挂载写法
-v mysql:/val/lib/mysql 会识别为一个数据卷叫mysql
-v ./mysql:/val/lib/mysql 会识别为当前目录下的mysql目录
Dockerfile
Dockerfile 是一个用于定义 Docker 镜像构建过程的文本文件,其中包含了一系列指令和配置,用于自动化构建容器镜像。
Dockerfile 的典型流程
- 从基础镜像开始(
FROM
)。 - 安装系统工具和依赖(
RUN
)。 - 设置环境变量(
ENV
)和工作目录(WORKDIR
)。 - 复制代码或配置文件到镜像中(
COPY
)。 - 定义启动命令(
CMD
/ENTRYPOINT
)和暴露端口(EXPOSE
)。
示例 Dockerfile
# 使用 Node.js 官方镜像作为基础
FROM node:18-alpine
# 设置工作目录
WORKDIR /app
# 复制依赖文件并安装
COPY package*.json ./
RUN npm install
# 复制所有源代码
COPY . .
# 暴露端口
EXPOSE 3000
# 启动应用
CMD ["npm", "start"]
当编写好Dockerfile文件后,使用docker build
来构建镜像,例如:
docker build -t myImage:1.0 .
-t
是给镜像起名,格式为repositary:tag
,如果不加tag,则默认为latest
.
指定Dockerfile
所在目录,.
表示就在当前目录
关键特性
- 层(Layers)
每个指令会生成一个只读的镜像层,Docker 利用缓存机制加速后续构建。 - 多阶段构建(Multi-stage Builds)
通过多个FROM
指令分离构建环境和运行时环境,优化镜像大小(例如编译代码后仅复制二进制文件到最终镜像)。 - 可移植性
Dockerfile 与代码一起保存,确保在任何支持 Docker 的环境中都能构建出相同的镜像。
Dockerfile常见命令
以下是 Dockerfile 常见命令的表格总结:
命令 | 描述 | 示例用法 |
---|---|---|
FROM |
指定基础镜像(必须作为第一条指令) | FROM ubuntu:22.04 |
RUN |
执行命令并创建新的镜像层(常用于安装软件包) | RUN apt-get update && apt-get install -y curl |
CMD |
设置容器启动时的默认命令(可被命令行覆盖) | CMD ["python", "app.py"] |
ENTRYPOINT |
设置容器启动时的主要命令(不可被命令行覆盖,可与CMD 配合使用) |
ENTRYPOINT ["nginx"] |
COPY |
将本地文件/目录复制到镜像中 | COPY ./src /app/src |
ADD |
类似COPY ,但支持自动解压压缩文件和从URL下载 |
ADD https://example.com/file.tar.gz /app |
ENV |
设置环境变量 | ENV NODE_ENV=production |
ARG |
定义构建时的变量(仅在构建过程中有效) | ARG VERSION=1.0 |
WORKDIR |
设置后续命令的工作目录 | WORKDIR /app |
EXPOSE |
声明容器运行时监听的端口(需通过-p 映射到宿主机端口) |
EXPOSE 80 |
VOLUME |
创建挂载点(用于持久化数据或共享数据) | VOLUME /data |
USER |
指定后续命令的执行用户 | USER nobody |
LABEL |
为镜像添加元数据(如作者、版本等) | LABEL maintainer="dev@example.com" |
HEALTHCHECK |
定义容器健康检查命令 | HEALTHCHECK --interval=30s CMD curl -f http://localhost |
SHELL |
覆盖默认的Shell类型(如SHELL ["/bin/bash", "-c"] ) |
SHELL ["powershell", "-command"] |
STOPSIGNAL |
设置停止容器时发送的系统信号 | STOPSIGNAL SIGTERM |
ONBUILD |
定义当本镜像被作为基础镜像时触发的指令 | ONBUILD COPY . /app/src |
关键说明
-
CMD
vsENTRYPOINT
:-
CMD
定义的命令可被docker run
后的参数覆盖。 -
ENTRYPOINT
定义的命令始终执行,CMD
内容会作为其参数。
-
-
COPY
vsADD
:- 优先使用
COPY
,除非需要自动解压或从URL下载文件。
- 优先使用
-
多阶段构建:
可使用多个FROM
指令实现多阶段构建,优化最终镜像大小(需 Docker 17.05+)。 -
层优化:
合并多个RUN
命令(如RUN apt-get update && apt-get install -y package
)以减少镜像层数。
自定义镜像
镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程就是将上述文件打包的过程。
镜像结构
镜像结构分为层(Layer)和基础镜像(BaseImage)
容器网络
一、Docker 网络模式
Docker 提供了几种默认的网络模式,用户也可以创建自定义网络。
1.Bridge 网络(默认模式)
- Bridge 网络 是 Docker 的默认网络模式。在这种模式下,Docker 会为每个容器分配一个虚拟网络接口,并通过一个虚拟网桥(
docker0
)将容器连接到主机网络。 - 容器之间可以通过 IP 地址进行通信,但默认情况下,容器之间不能通过容器名称进行通信(除非使用自定义的 Docker 网络)。
- 容器可以通过主机的网络接口访问外部网络。
2.Host 网络
- 在 Host 网络 模式下,容器直接使用主机的网络栈,而不是使用 Docker 的虚拟网络。
- 这意味着容器与主机共享相同的网络接口和 IP 地址。
- 这种模式性能较好,但容器与主机之间的网络隔离性较差。
3.None 网络
- None 网络 模式下,容器没有网络接口,无法与外部网络或其他容器通信。
- 这种模式通常用于不需要网络访问的容器。
4.Overlay 网络
- Overlay 网络 用于跨多个 Docker 主机的容器通信,通常用于 Docker Swarm 集群。
- 它允许不同主机上的容器通过虚拟网络进行通信。
5.Macvlan 网络
- Macvlan 网络 允许容器直接使用物理网络接口的 MAC 地址,使容器看起来像是物理网络中的设备。
- 这种模式适用于需要容器直接暴露在物理网络中的场景。
二、自定义网络
除了默认的网络模式,Docker 还允许用户创建自定义网络。自定义网络可以提供更好的容器间通信功能,例如通过容器名称进行通信。
1.创建自定义网络
docker network create my_custom_network
2.将容器连接到自定义网络
docker run -d --name my_container --network my_custom_network my_image
3.查看网络信息
docker network inspect my_custom_network
三、容器间通信
- 通过 IP 地址通信:在默认的 Bridge 网络中,容器可以通过 IP 地址进行通信。
- 通过容器名称通信:在自定义网络中,容器可以通过容器名称进行通信,Docker 会自动解析容器名称到对应的 IP 地址。
四、端口映射
-
默认情况下,容器内的服务无法直接从外部访问。为了将容器内的服务暴露给外部网络,可以使用端口映射。
-
例如,将容器内的 80 端口映射到主机的 8080 端口:
docker run -d -p 8080:80 my_image
这样,外部网络可以通过访问主机的 8080 端口来访问容器内的 80 端口。
五、DNS 解析
- 在自定义网络中,Docker 提供了内置的 DNS 服务,允许容器通过容器名称进行通信。
- 例如,如果两个容器
container1
和container2
在同一个自定义网络中,container1
可以通过container2
的名称直接访问container2
。
六、网络隔离与安全
- Docker 提供了网络隔离机制,确保不同网络中的容器无法直接通信。
- 用户可以通过配置防火墙规则、网络策略等方式进一步增强网络安全性。
七、常用命令
-
查看网络列表:
docker network ls
这个命令会列出所有Docker网络,包括网络ID、名称、驱动程序和范围。
-
创建网络:
docker network create <网络名称>
这个命令用于创建一个新的Docker网络。你可以指定网络驱动(如
bridge
、overlay
等)和其他选项。 -
查看网络详细信息:
docker network inspect <网络名称或ID>
这个命令会显示指定网络的详细信息,包括连接的容器、IP地址范围等。
-
连接容器到网络:
docker network connect <网络名称或ID> <容器名称或ID>
这个命令将一个正在运行的容器连接到指定的网络。
-
断开容器与网络的连接:
docker network disconnect <网络名称或ID> <容器名称或ID>
这个命令将容器从指定的网络中断开。
-
删除网络:
docker network rm <网络名称或ID>
这个命令用于删除一个不再使用的Docker网络。注意,只有在没有容器连接到该网络时才能删除。
-
清理未使用的网络:
docker network prune
这个命令会删除所有未使用的网络(即没有容器连接的网络)。
-
查看容器的网络信息:
docker inspect <容器名称或ID> --format '{{ .NetworkSettings.Networks }}'
这个命令可以查看指定容器的网络配置信息。
DockerCompose
Docker Compose
是一个用于定义和运行多容器 Docker 应用程序的工具。它通过一个 YAML 文件(通常命名为 docker-compose.yml
)来配置应用程序的服务、网络和卷,从而简化了多容器应用的部署和管理。
核心功能
- 服务定义
在 YAML 文件中定义应用的各个组件(服务),包括镜像、端口映射、环境变量、数据卷等。 - 依赖管理
自动处理服务间的启动顺序和依赖关系(如先启动数据库再启动后端服务)。 - 环境隔离
为每个服务配置独立的环境变量、网络和数据卷,确保隔离性。 - 一键操作
通过docker compose up
或docker compose down
快速启动或销毁整个应用栈。
核心概念
- 服务(Service)
一个容器实例的配置单元,例如一个web
服务或redis
服务。 - 项目(Project)
由一组关联服务组成的应用栈,默认以当前目录名作为项目名(可通过-p
指定)。 - 网络(Network)
自动为项目创建独立的 Docker 网络,服务间通过服务名互相通信。 - 数据卷(Volume)
持久化存储数据,避免容器重启后数据丢失。
安装 Docker Compose
-
Docker Desktop:已内置 Docker Compose(V2 版本)。
-
Linux 系统:需单独安装,例如:
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose
常用命令
命令 | 说明 |
---|---|
docker-compose up |
启动所有服务(-d 后台运行) |
docker-compose down |
停止并删除容器、网络、卷 |
docker-compose build |
构建或重新构建服务镜像 |
docker-compose start |
启动已存在的服务 |
docker-compose stop |
停止运行中的服务 |
docker-compose restart |
重启服务 |
docker-compose ps |
查看服务状态 |
docker-compose logs |
查看服务日志(-f 实时追踪) |
docker-compose exec <service> <cmd> |
在运行的容器中执行命令 |
docker-compose pull |
拉取服务依赖的镜像 |
docker-compose config |
验证配置文件语法 |
docker-compose.yml 核心配置
version: "3.8" # 指定 Compose 版本(需与 Docker 版本兼容)
services:
web:
image: nginx:latest # 使用镜像
build: ./app # 从 Dockerfile 构建镜像
ports:
- "80:80" # 端口映射(主机:容器)
volumes:
- ./data:/app/data # 挂载卷(主机路径:容器路径)
environment:
- ENV_VAR=value # 设置环境变量
depends_on:
- db # 依赖的服务(启动顺序控制)
networks:
- my_network # 指定网络
db:
image: postgres:13
volumes:
- db_data:/var/lib/postgresql/data # 命名卷
environment:
POSTGRES_PASSWORD: password
volumes:
db_data: # 声明命名卷
networks:
my_network: # 自定义网络
常用配置项
-
环境变量:
- 通过
environment
直接定义,或使用.env
文件。 - 示例:
environment: - DATABASE_URL=${DB_URL}
。
- 通过
-
网络配置:
- 默认创建
default
网络,服务间可通过服务名通信。 - 自定义网络可隔离服务或优化通信。
- 默认创建
-
卷(Volumes) :
- 匿名卷:
- /container/path
- 命名卷:
- volume_name:/container/path
- 绑定挂载:
- ./host/path:/container/path
- 匿名卷:
-
依赖关系:
-
depends_on
控制启动顺序(但不保证服务就绪,需结合健康检查)。
-
-
扩展配置:
- 使用
extends
复用配置(不推荐,建议使用 YAML 锚点)。
- 使用
多环境配置
-
多文件组合:使用
-f
指定多个配置文件(如docker-compose.yml
+docker-compose.prod.yml
)。docker-compose -f docker-compose.yml -f docker-compose.prod.yml up
-
环境变量文件:通过
.env
文件或env_file
配置项加载变量。
最佳实践
- 版本控制:在
docker-compose.yml
中固定镜像版本(避免使用latest
)。 - 服务拆分:每个服务专注单一功能(如 Web、DB、缓存分离)。
- 资源限制:为服务设置 CPU/内存限制(
deploy.resources
)。 - 健康检查:通过
healthcheck
确保依赖服务就绪。 - 清理资源:定期使用
docker-compose down -v
清理旧卷。