欢迎光临
我们一直在努力

Docker 基础到进阶知识点整理上

文章目录

    • 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

赞(0)
未经允许不得转载:171主机测评 » Docker 基础到进阶知识点整理上
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址