为什么需要 Docker 网络管理
# 创建容器时自动连接默认网络
docker run -d --name web nginx
docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=123 mysql
mysql:3306
)场景 | 需求 | Docker 实现 |
---|---|---|
多项目环境 | 隔离开发/测试/生产 |
|
敏感服务隔离 | 数据库不与前端直连 | 划分独立网络分区 |
安全防护 | 限制非法访问路径 | 默认网络策略阻断跨网通信 |
docker run -d -p 80:8080 myapp # 宿主机80端口映射到容器8080
docker network create no-internet --internal
docker network create -d overlay cluster-net
graph TD
A[容器A] -->|带宽限制 10Mbps| B[网关]
C[容器B] -->|最高优先级| B
D[容器C] -->|最低优先级| B
docker stats
实时观测Docker 有五种网络驱动模式
# 查看网络(默认情况下,docker安装完成后,会自动创建bridge、host、none三种网络驱动)
[root@lavm-zo7f3xq5c6 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
cf440d390e12 bridge bridge local
77af46120087 host host local
7f7b53529fb3 none null local
# 创建 网络 bridge模式
[root@lavm-zo7f3xq5c6 ~]# docker network create -d bridge my-bridge
f5e6b44a050cbd486bc4b76084100927ae69349d5face6a2213f1e46844c3cdf
# 查看网络
[root@lavm-zo7f3xq5c6 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
cf440d390e12 bridge bridge local
77af46120087 host host local
f5e6b44a050c my-bridge bridge local
7f7b53529fb3 none null local
# host和none模式网络只能存在一个
# 创建 网络 host模式
[root@lavm-zo7f3xq5c6 ~]# docker network create -d host my-host
Error response from daemon: only one instance of "host" network is allowed
# 创建 网络 none模式
[root@lavm-zo7f3xq5c6 ~]# docker network create -d null my-null
Error response from daemon: only one instance of "null" network is allowed
# 创建 网络 overlay
[root@lavm-zo7f3xq5c6 ~]# docker network create -d overlay my-overlay
# docker自带的overlay 网络创建依赖于docker swarm(集群负载均衡)服务
Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.
# 创建 网络 macvlan模式
[root@lavm-zo7f3xq5c6 ~]# docker network create -d macvlan my-macvlan
d670a3bf8e2adfa4ecda3504c7a07f8591905e436aeed9224b9ef73b1d893e52
# 查看网络
[root@lavm-zo7f3xq5c6 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
cf440d390e12 bridge bridge local
77af46120087 host host local
f5e6b44a050c my-bridge bridge local
d670a3bf8e2a my-macvlan macvlan local
7f7b53529fb3 none null local
# 删除 my-macvlan
docker network rm my-macvlan
#
docker inspect bridge
#
[root@lavm-zo7f3xq5c6 ~]# docker network inspect -f '{{index .IPAM.Config }}' bridge
[{172.17.0.0/16 172.17.0.1 map[]}]
# centos使用my-bridge网络
docker run --network my-bridge -dti centos bash
# 断开
docker network disconnect my-bridge centos
# 连接
docker network disconnect my-bridge centos
特点
# 运行 redis
docker run -dti -P redis
# 随机映射 主机=》容器 端口
0.0.0.0:36271->6379/tcp,
#运行 redis
docker run -dti -p :6379:6379 redis
# 指定 主机=》容器 端口
0.0.0.0:6379->6379/tcp,
特点
特点
应用场景
特点
应用场景
特点
应用场景
为什么需要数据卷
一、解决容器数据丢失问题
/var/lib/mysql
目录通过卷挂载)二、支持容器间数据共享与协作
📈 三、提升性能与管理效率
tar
打包)。ro
)或读写(rw
)权限,防止误操作特点:
/var/lib/docker/volumes/
)操作命令
# 创建命名卷
docker volume create my_vol
# 挂载到容器
docker run -v my_vol:/容器路径 镜像名
# 或使用 --mount(推荐精确控制)
docker run --mount source=my_vol,target=/容器路径 镜像名
适用场景: 生产环境数据库(如 MySQL)、需长期保存的配置文件.
特点:
/home/user/data:/容器路径
)操作命令
docker run -v /宿主机绝对路径:/容器路径[:ro] 镜像名 # ro 表示只读
适用场景: 开发调试(代码热更新)、宿主机与容器实时共享数据
特点:
操作命令
docker run --tmpfs /容器路径 镜像名
# 或限制大小
docker run --mount type=tmpfs,destination=/容器路径,tmpfs-size=100M 镜像名
适用场景: 临时缓存(如会话数据)、处理敏感信息(如密钥)
特性 | 卷挂载 | 绑定挂载 | tmpfs 挂载 |
---|---|---|---|
数据持久性 | ✅ 永久保存 | ✅ 永久保存 | ❌ 容器停止即丢失 |
性能 | ⭐⭐⭐(绕过联合文件系统) | ⭐⭐⭐⭐(直接读写宿主机) | ⭐⭐⭐⭐⭐(内存级速度) |
目录初始内容可见性 | 可见3**4** | 隐藏3**9** | |
移植性 | ⭐⭐⭐⭐(Docker 托管) | ⭐⭐(依赖宿主机路径) | ⭐⭐⭐⭐ |
典型场景 | 数据库、生产配置 | 开发调试、代码热更新 | 敏感数据、临时缓存 |
权限控制:
:ro
设置为只读(如 -v my_vol:/data:ro
目录覆盖风险:
数据清理:
docker volume rm my_vol
Dockerfile 是 Docker 镜像的自动化构建脚本,本质是一个纯文本文件(无后缀名,通常命名为 Dockerfile
),其中包含一系列按顺序执行的指令。这些指令定义了如何从基础镜像开始,逐步添加配置、依赖和代码,最终生成一个可运行的容器镜像
指令 | 用途 | 示例 |
---|---|---|
| 指定基础镜像 |
|
| 执行命令(安装软件等) |
|
| 复制本地文件到镜像 |
|
| 类似 COPY,支持解压/URL |
|
| 设置工作目录 |
|
| 设置环境变量 |
|
| 声明容器运行时端口 |
|
| 容器启动时执行的命令(可被覆盖) |
|
| 容器入口命令(不易被覆盖) |
|
| 指定运行用户 |
|
| 创建数据卷挂载点 |
|
# 创建文件夹 df_dir
mkdir df_dir
# 进入 文件夹 df_dir
cd df_dir
# vi 编辑器打开一个名为 Dockerfile 的文件
vi Dockerfile
# 要进入编辑模式 a:进入插入模式。输入内容
# 测试Dockerfile
FROM centos
# 输出
RUN echo "测试的Dockerfile"
#按 Esc 键退出编辑模式回到命令模式。输入 :wq 然后按 Enter 键
#查看 Dockerfile
[root@lavm-zo7f3xq5c6 df_dir]# cat Dockerfile
# 测试Dockerfile
FROM centos
RUN echo ‘测试的Dockerfile’
# 查看路径
[root@lavm-zo7f3xq5c6 df_dir]# pwd
/root/df_dir
# 打包镜像
[root@lavm-zo7f3xq5c6 df_dir]# docker build /root/df_dir
[+] Building 0.4s (4/5) docker:default
[+] Building 0.5s (4/5) docker:default
=> [internal] load build definition from Dockerfile 0.1s
[+] Building 0.6s (5/6) docker:default
[+] Building 0.7s (6/6) docker:default
[+] Building 0.8s (6/6) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.1s
=> => transferring dockerfile: 103B 0.0s. => [internal] load metadata for docker.io/library/centos:latest 0.0s. => [internal] load .dockerignore #执行步骤
=> => transferring context: 2B 0.0s. => [1/2] FROM docker.io/library/centos:latest 0.0s. => [2/2] RUN echo ‘测试的Dockerfile’ 0.3s> exporting to image 0.2s
=> => writing image sha256:7eb8703a9e804f8c9f4e136d1b3a4530070584a8216d62933caa61c7b69d726d # 查看生成的镜像 0.0s
[root@lavm-zo7f3xq5c6 df_dir]# docker images
# 7eb8703a9e80 没有生成名称
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 7eb8703a9e80 3 minutes ago 202MB
centos-netv2 1.0 6d0baed20aad 6 days ago 319MB
再次构建
第二次构建,因为是同一个 Dockerfile,Dockerfile 也没有修改。直接把之前构建的镜像重命名。镜像 id 也不变。
# 再次构建 添加镜像名称
[root@lavm-zo7f3xq5c6 df_dir]# docker build /root/df_dir -t test-images:v1.0
[+] Building 0.1s (6/6) docker:default
[+] Building 0.2s (6/6) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 103B 0.0s
=> [internal] load metadata for docker.io/library/centos:latest 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [1/2] FROM docker.io/library/centos:latest 0.0s. => CACHED [2/2] RUN echo ‘测试的Dockerfile’ 0.0s> exporting to image 0.1s
=> exporting to image 0.1s
=> => exporting layers 0.0s
=> => writing image sha256:7eb8703a9e804f8c9f4e136d1b3a4530070584a8216d62933caa61c7b69d726d 0.0s
=> => naming to docker.io/library/test-images:v1.0 0.0s
[root@lavm-zo7f3xq5c6 df_dir]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test-images v1.0 7eb8703a9e80 7 minutes ago 202MB
centos-netv2 1.0 6d0baed20aad 6 days ago 319MB
FROM
, COPY
, RUN
)描述构建步骤# dockerfile
FROM node:18
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
docker history <image_name>
.dockerignore
排除无关文件# dockerfile
# 推荐明确版本
FROM python:3.11.4-slim-bookworm
CMD
/ENTRYPOINT
定义容器启动行为EXPOSE
声明网络端口VOLUME
指令定义数据卷挂载点docker-compose up
,Compose 将启动并运行整个应用程序 配置文件组成Linux Docker Compose CLI 插件
# 从 GitHub 下载最新版 Docker Compose 的二进制文件:
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
# 将二进制文件链接到 /usr/bin 目录,方便全局调用
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# 查看
docker-compose --version
Docker Compose 文件(通常命名为 docker-compose.yml
)是一个 YAML 格式的配置文件,用于定义和运行多容器 Docker 应用程序。它描述了应用程序的服务、网络、卷等组件及其关系
Docker Compose File 顶级配置项
示例
# Docker Compose File 有多个版本,基本是向后兼容的,但也有极个别配置项高版本中没有
# 在docker-compose.yml一开始就需要利用version关键词标明当前file使用的版本
version: "3.8" # 定义 Compose 文件的版本,决定使用的语法和功能
# 在 services 部分,你定义了应用中运行的每个容器(服务)。每个服务通常会包含镜像、端口映射、环境变量、卷挂载等配置
services:
# web: 这个服务使用 nginx:latest 镜像,并将宿主机的 8080 端口映射到容器的 80 端口。同时,它将宿主机的 ./html 目录挂载到容器中的 /usr/share/nginx/html,允许自定义网页内容
web:
image: nginx:latest
# 端口映射
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
networks:
- webnet
# db: 使用 MySQL 镜像,环境变量设置了数据库的 root 密码,使用名为 mysql_data 的卷存储数据
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
volumes:
- mysql_data:/var/lib/mysql
networks:
- webnet
# 创建一个自定义的网络 webnet,让 web 和 db 服务在同一个网络中进行通信
networks:
webnet:
# 定义了一个名为 mysql_data 的卷,保存 MySQL 数据,确保数据持久化
volumes:
mysql_data:
基础启动命令
# 进入包含 docker-compose.yml 的目录
cd /path/to/your/project
# 启动所有服务(前台运行,日志输出到控制台)
docker compose up
# 后台启动(推荐)
docker compose up -d
核心操作命令
命令 | 作用 | 示例 |
---|---|---|
| 创建并启动所有服务 |
|
| 停止并移除所有容器/网络 |
|
| 启动已存在的服务容器 |
|
| 停止运行中的容器 |
|
| 重启服务 |
|
| 查看服务状态 |
|
| 查看服务日志 |
|
私有仓库搭建:带认证私有仓库 和 无认证私有仓库.
核心区别对比
特性 | 无认证私有仓库 | 带认证私有仓库 |
---|---|---|
适用场景 | 开发测试、封闭内网环境 | 准生产环境、多用户共享 |
安全性 | ⚠️ 低(完全开放访问) | 🔒 中(基础账号密码保护) |
配置复杂度 | ★☆☆ 简单 | ★★☆ 中等 |
认证方式 | 无需认证 | Basic Auth 或 Token 认证 |
客户端配置 | 需设置 | 需登录 ( |
镜像保护 | 所有用户可任意推送/拉取 | 需凭证才能操作镜像 |
网络要求 | 必须内网环境 | 可配置公网访问(需 HTTPS) |
mkdir auth-registry && cd auth-registry
mkdir auth registry-data # 认证文件和存储目录
# 创建用户名密码 (user: myuser, password: mypassword)
docker run --rm \
--entrypoint htpasswd \
httpd:2 -Bbn myuser mypassword > auth/htpasswd
# 查看生成的凭证
cat auth/htpasswd
# 输出:myuser:$apr1$... (加密字符串)
docker-compose.yml
version: "3.8"
services:
registry:
image: registry:2
container_name: secure-registry
ports:
- "5000:5000"
environment:
REGISTRY_AUTH: htpasswd # 启用认证
REGISTRY_AUTH_HTPASSWD_REALM: "Registry Realm"
REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
REGISTRY_STORAGE_DELETE_ENABLED: "true" # 允许删除镜像
volumes:
- ./registry-data:/var/lib/registry # 镜像存储
- ./auth:/auth # 认证文件
docker compose up -d
# 登录私有仓库
docker login your-server-ip:5000
# 输入用户名 myuser 和密码 mypassword
# 验证登录凭证
cat ~/.docker/config.json
# 推送镜像 (需先登录)
docker tag alpine your-server-ip:5000/secure-alpine
docker push your-server-ip:5000/secure-alpine
# 未登录尝试拉取 (应失败)
docker logout your-server-ip:5000
docker pull your-server-ip:5000/secure-alpine
# 错误:pull access denied, requires authentication
mkdir private-registry && cd private-registry
docker-compose.yml
version: "3.8"
services:
registry:
image: registry:2
container_name: insecure-registry # 明确命名表示无认证
ports:
- "5000:5000"
environment:
REGISTRY_STORAGE_DELETE_ENABLED: "true" # 允许删除镜像
REGISTRY_AUTH: "none" # 关键:禁用所有认证
volumes:
- ./registry-data:/var/lib/registry # 持久化存储镜像数据
# 注意:不需要定义 networks,使用默认网络即可
📌 关键配置说明:
REGISTRY_AUTH: "none"
:禁用所有认证机制REGISTRY_STORAGE_DELETE_ENABLED: "true"
:允许删除镜像./registry-data
:本地目录持久化存储镜像#启动
docker compose up -d
# 验证是否运行
docker compose ps
#显示
NAME COMMAND SERVICE STATUS PORTS
insecure-registry "/entrypoint.sh /etc…" registry running 0.0.0.0:5000->5000/tcp
# Linux/Mac 编辑 Docker 配置文件:
sudo nano /etc/docker/daemon.json
# 添加以下内容(替换 your-server-ip 为实际 IP):
{
"insecure-registries": ["your-server-ip:5000"]
}
# 重启 Docker:
sudo systemctl restart docker
推送镜像到私有仓库
# 拉取测试镜像
docker pull hello-world
# 标记镜像指向私有仓库
docker tag hello-world your-server-ip:5000/my-hello
# 推送镜像
docker push your-server-ip:5000/my-hello
从私有仓库拉取
# 删除本地镜像
docker rmi your-server-ip:5000/my-hello
# 从私有仓库拉取
docker pull your-server-ip:5000/my-hello
# 1. 查看镜像标签
curl http://your-server-ip:5000/v2/my-hello/tags/list
# 2. 删除镜像(需要两步)
# 获取镜像的 digest
curl -I -H "Accept: application/vnd.docker.distribution.manifest.v2+json" \
http://your-server-ip:5000/v2/my-hello/manifests/latest
# 从返回头中复制 Digest: 值(如 sha256:123...)
docker exec insecure-registry bin/registry garbage-collect /etc/docker/registry/config.yml
# 3. 清理旧数据
# 进入仓库容器
docker exec -it insecure-registry sh
# 执行垃圾回收
registry garbage-collect /etc/docker/registry/config.yml --delete-untagged=true
无认证仓库
+----------------+ +---------------------+
| Docker Client | ----> | 开放仓库 (IP:5000) |
| (任意访问) | +---------------------+
+----------------+ |
+------v------+
| 本地存储 |
| registry-data|
+-------------+
带认证仓库
+----------------+ +---------------------+ +---------------+
| Docker Client | ----> | 认证网关 | ----> | 仓库服务 |
| (需docker login)| | - 验证 htpasswd | +-------^-------+
+----------------+ +---------------------+ |
+------v------+
| 持久化存储 |
| 镜像数据 |
+------------+
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。