文章目录
-
- 1. Docker 基础概念
-
- 1.1 镜像、容器、仓库
- 2. Docker 常用命令
-
- 2.1 查看 Docker 状态
- 2.2 镜像操作
- 2.3 容器操作
- 2.4 清理命令
- 3. 端口映射
-
- 3.1 基本用法
- 3.2 常见端口映射方式
- 3.3 修改动态端口
- 4. 目录映射和数据持久化
-
- 4.1 bind mount 目录映射
- 4.2 volume 数据卷
- 4.3 常见映射内容
- 5. 环境变量
-
- 5.1 docker run 使用环境变量
- 5.2 env 文件
- 6. 镜像导入导出和容器导入导出
-
- 6.1 镜像保存和加载
- 6.2 容器导出和导入
- 7. Docker 代理配置
-
- 7.1 Docker daemon 配置代理
- 7.2 容器内应用使用代理
- 8. Docker 仓库和 Harbor
-
- 8.1 登录仓库
- 8.2 打标签并推送
- 8.3 拉取镜像
- 8.4 私有仓库常见问题
- 9. Dockerfile 基础
-
- 9.1 Dockerfile 示例
- 9.2 常用指令
- 9.3 CMD 和 ENTRYPOINT 区别
- 10. 镜像构建优化
-
- 10.1 构建镜像
- 10.2 减小镜像体积
- 10.3 多阶段构建示例
- 11. 容器 CLI 化和服务化
-
- 11.1 CLI 化
- 11.2 服务化
- 11.3 CLI 化和服务化区别
1. Docker 基础概念
1.1 镜像、容器、仓库
镜像 Image:
- 可以理解为应用运行环境的模板。
- 包含系统基础环境、依赖包、应用文件、启动命令等。
- 镜像是分层的,只读的。
容器 Container:
- 镜像运行起来之后就是容器。
- 容器有自己的进程、文件系统、网络、环境变量等。
- 容器可以启动、停止、删除、重启。
仓库 Registry:
- 用来存放镜像。
- 常见仓库有 Docker Hub、Harbor、阿里云镜像仓库、企业私有仓库。
2. Docker 常用命令
2.1 查看 Docker 状态
docker version
docker info
systemctl status docker
2.2 镜像操作
docker images
docker pull nginx:latest
docker rmi nginx:latest
docker tag app:v1 harbor.example.com/project/app:v1
docker push harbor.example.com/project/app:v1
2.3 容器操作
docker ps
docker ps -a
docker run -d –name nginx-test nginx:latest
docker stop nginx-test
docker start nginx-test
docker restart nginx-test
docker rm nginx-test
docker logs nginx-test
docker exec -it nginx-test /bin/bash
2.4 清理命令
docker system df
docker container prune
docker image prune
docker volume prune
docker system prune
注意:
- 生产环境清理镜像、容器、卷之前要确认影响范围。
- 不要随意执行 docker system prune -a,可能删除未运行容器关联的镜像。
3. 端口映射
3.1 基本用法
docker run -d –name nginx -p 8080:80 nginx
含义:
- 宿主机 8080 端口映射到容器内 80 端口。
- 用户访问宿主机 IP:8080,实际访问的是容器里的 Nginx 80 端口。
3.2 常见端口映射方式
docker run -p 8080:80 nginx
docker run -p 127.0.0.1:8080:80 nginx
docker run -P nginx
说明:
- -p 8080:80:指定宿主机端口。
- -p 127.0.0.1:8080:80:只允许本机访问。
- -P:随机映射容器暴露端口。
查看映射:
docker port nginx
docker ps
3.3 修改动态端口
已经创建的容器不建议直接修改端口映射。常规做法:
docker stop old-app
docker rm old-app
docker run -d –name app -p 9090:8080 app:v1
如果使用 Compose,修改 docker-compose.yml 的 ports 配置后执行:
docker compose up -d
生产建议:
- 端口变更前先确认防火墙、安全组、反向代理、监控探测地址是否同步调整。
- 对外服务端口尽量通过 Nginx、SLB、Ingress 等统一入口管理。
4. 目录映射和数据持久化
4.1 bind mount 目录映射
docker run -d \\
–name mysql \\
-v /data/mysql:/var/lib/mysql \\
mysql:8
含义:
- 宿主机 /data/mysql 映射到容器内 /var/lib/mysql。
- 容器删除后,宿主机目录数据仍然保留。
4.2 volume 数据卷
docker volume create mysql-data
docker run -d –name mysql -v mysql-data:/var/lib/mysql mysql:8
docker volume ls
docker volume inspect mysql-data
bind mount 和 volume 区别:
| bind mount | 直接映射宿主机目录,路径清晰 | 配置文件、日志、业务数据 |
| volume | Docker 管理数据目录 | 数据库、通用持久化数据 |
4.3 常见映射内容
- 配置文件:/etc/nginx/nginx.conf
- 日志目录:/var/log/nginx
- 数据目录:/var/lib/mysql
- 上传文件目录:/app/uploads
注意:
- 宿主机目录权限要和容器运行用户匹配。
- 数据库容器必须考虑持久化,否则容器删除后数据会丢失。
- 配置文件映射后,修改宿主机文件通常需要重启或 reload 服务。
5. 环境变量
5.1 docker run 使用环境变量
docker run -d \\
–name app \\
-e APP_ENV=prod \\
-e DB_HOST=192.168.1.10 \\
app:v1
5.2 env 文件
docker run –env-file .env app:v1
.env 示例:
APP_ENV=prod
DB_HOST=192.168.1.10
DB_PORT=3306
注意:
- 密码、Token 不建议明文写在镜像里。
- 生产环境可以结合 Docker Secret、K8s Secret、配置中心或主机权限控制。
6. 镜像导入导出和容器导入导出
6.1 镜像保存和加载
docker save -o nginx.tar nginx:latest
docker load -i nginx.tar
6.2 容器导出和导入
docker export container_id -o container.tar
docker import container.tar app:imported
区别:
| save/load | 镜像 | 保留 | 常用 |
| export/import | 容器文件系统 | 不保留 | 较少 |
建议:
- 正常迁移镜像使用 docker save/load。
- 不建议把正在运行过的容器当作标准交付物,标准做法是通过 Dockerfile 构建镜像。
7. Docker 代理配置
7.1 Docker daemon 配置代理
适用于 Docker 拉取镜像需要走代理的情况。
创建目录:
mkdir -p /etc/systemd/system/docker.service.d
创建配置:
vim /etc/systemd/system/docker.service.d/http-proxy.conf
内容示例:
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:7890"
Environment="HTTPS_PROXY=http://proxy.example.com:7890"
Environment="NO_PROXY=localhost,127.0.0.1,harbor.example.com"
具体端口号看代理端的具体配置 重载并重启:
systemctl daemon-reload
systemctl restart docker
systemctl show –property=Environment docker
7.2 容器内应用使用代理
docker run -e HTTP_PROXY=http://proxy:7890 \\
-e HTTPS_PROXY=http://proxy:7890 \\
app:v1
注意: /etc/docker/daemon.json 配的是 registry mirror 镜像加速器,不是代理。 它的作用是:拉 docker.io/library/nginx 这类 Docker Hub 镜像时,优先走这些镜像站:如:
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.m.daocloud.io",
"https://hub.rat.dev"
]
Docker 代理的作用是:让 Docker 守护进程 dockerd 出网时走指定 HTTP/HTTPS 代理。 作用总结: Docker daemon 代理:影响 docker pull、访问 registry。配置/etc/systemd/system/docker.service.d/http-proxy.conf 容器运行时代理:影响容器内部程序访问外网。docker run的时候使用-e选项指定 构建阶段代理:影响 docker build 里的 RUN apt/pip/npm/curl。docker build的时候使用–build-arg指定
8. Docker 仓库和 Harbor
安装Harbor大概流程: 安装 Docker 、Compose环境,下载 harbor-offline-installer压缩包,解压,备份源harbor.yml配置文件,编辑harbor.yml配置文件修改hostname、密码、data_volume、HTTP/HTTPS,执行 ./install.sh,配置私有仓库"insecure-registries": ,docker login 测试推送镜像。后续修改配置后,用docker compose 启动关闭重启等等
8.1 登录仓库
docker login harbor.example.com
8.2 打标签并推送
docker tag app:v1 harbor.example.com/project/app:v1
docker push harbor.example.com/project/app:v1
8.3 拉取镜像
docker pull harbor.example.com/project/app:v1
8.4 私有仓库常见问题
证书问题:
- 私有仓库使用自签证书时,客户端可能不信任。
- 可以配置证书信任,或在测试环境配置 insecure registry。
配置 insecure registry:
{
"insecure-registries": ["harbor.example.com"]
}
配置文件:
/etc/docker/daemon.json
重启:
systemctl restart docker
生产建议:
- Harbor 项目权限按项目分配。
- 镜像打标签要规范,例如 app:1.0.0、app:20260906-commitid。
- 重要镜像开启漏洞扫描。
- 清理过期镜像,避免仓库存储爆满。
9. Dockerfile 基础
9.1 Dockerfile 示例
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY target/app.jar /app/app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app/app.jar"]
9.2 常用指令
| FROM | 指定基础镜像 |
| WORKDIR | 指定工作目录 |
| COPY | 复制文件到镜像 |
| ADD | 复制文件,支持自动解压和 URL,不建议滥用 |
| RUN | 构建镜像时执行命令 |
| ENV | 设置环境变量 |
| EXPOSE | 声明容器服务端口 |
| CMD | 指定默认启动命令 |
| ENTRYPOINT | 指定容器入口命令 |
9.3 CMD 和 ENTRYPOINT 区别
CMD:
- 设置容器默认执行命令。
- 容易被 docker run 后面的命令覆盖。
ENTRYPOINT:
- 设置容器固定入口。
- 更适合服务化应用。
示例:
CMD ["nginx", "-g", "daemon off;"]
ENTRYPOINT ["java", "-jar", "/app/app.jar"]
组合使用:
ENTRYPOINT ["python", "app.py"]
CMD ["–port", "8080"]
运行时覆盖参数:
docker run app:v1 –port 9090
10. 镜像构建优化
10.1 构建镜像
docker build -t app:v1 .
10.2 减小镜像体积
常见做法:
- 使用更小基础镜像,如 alpine、slim。
- 清理安装缓存。
- 使用多阶段构建。
- .dockerignore 排除无关文件。
- 不把日志、临时文件、源码敏感文件打进镜像。
.dockerignore 示例:
.git
node_modules
target
*.log
.env
10.3 多阶段构建示例
FROM maven:3.9-eclipse-temurin-17 AS builder
WORKDIR /src
COPY . .
RUN mvn clean package -DskipTests
FROM eclipse-temurin:17-jre
WORKDIR /app
COPY –from=builder /src/target/app.jar /app/app.jar
ENTRYPOINT ["java", "-jar", "/app/app.jar"]
优势:
- 构建环境和运行环境分离。
- 最终镜像更小。
- 减少无关工具进入生产镜像。
11. 容器 CLI 化和服务化
11.1 CLI 化
把命令行工具和依赖一起打包进镜像,用 docker run 镜像 参数 的方式执行。
示例:
docker run –rm my-cli:1.0 参数
启动一个临时容器,容器运行结束后,自动删除这个容器,镜像还在
适用场景:
- 数据备份。
- 数据迁移。
- 批处理任务。
- 巡检脚本。
- 定时任务配合 crontab 或 CI/CD 调度。 一般使用流程,先准备好cli脚本/程序,编写dockerfile文件,最后用 ENTRYPOINT 指定默认执行命令,docker build 构建镜像,cli化 使用docker run –rm 测试执行,这个时候可以跟用 -v 挂载输入输出目录,-e指定环境变量。当然也可以放到系统命令路径/bin,/sbin里
11.2 服务化
服务化是容器启动后长期运行,对外提供 HTTP、TCP、RPC 等服务。
示例:
docker run -d –name app -p 8080:8080 app:v1
适用场景:
- Web 服务。
- API 服务。
- 中间件。
- 日志采集 Agent。
11.3 CLI 化和服务化区别
| CLI 化 | 执行任务后退出 | 短生命周期 |
| 服务化 | 持续运行并提供服务 | 长生命周期 |
Python 示例:
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
ENTRYPOINT ["python", "main.py"]
CMD ["–help"]
运行:
docker run –rm ops-tool:v1 check-disk –host 192.168.1.10





