容器技术基础使用与认识
一、容器技术概述
1. 什么是容器?
容器是一种轻量级的虚拟化技术,允许将应用及其依赖环境打包成一个独立单元(镜像),实现一次构建,处处运行。
- 与传统部署的区别:
- 传统部署:直接在服务器安装依赖(如PHP、MySQL),容易引发环境冲突,迁移困难。
- 容器部署:应用与依赖打包成独立容器,环境隔离,避免依赖冲突,部署效率高。
2. 容器 vs 虚拟机
| 特性 | 容器 | 虚拟机 |
|---|---|---|
| 资源占用 | 轻量(共享宿主机内核) | 较重(独立完整系统) |
| 启动速度 | 秒级 | 分钟级 |
| 性能损耗 | 低 | 较高 |
| 隔离性 | 进程级隔离 | 完全系统隔离 |
二、核心概念
1. 镜像
- 定义:包含应用代码、依赖、配置的只读模板,类似“安装包”
- 示例:
nginx:latest、mysql:8.0
2. 容器
- 定义:镜像的运行实例,可启动、停止、删除,类似“进程”
- 特点:容器间相互隔离,通过端口映射与外部通信
3. 仓库
- 作用:存储和分发镜像的平台,如Docker Hub、阿里云镜像仓库
三、 Docker 常用命令
1、镜像操作
| 命令 | 含义 | 常用参数说明 |
|---|---|---|
docker pull 镜像[:标签] |
拉取远程镜像 | :latest 默认最新版本 |
| 示例 | 拉取特定版本的 Nginx | docker pull nginx:1.24 |
docker images |
查看本地镜像 | -a 显示中间层镜像 |
| 示例 | 显示所有镜像(含中间层) | docker images -a |
docker rmi 镜像名/ID |
删除本地镜像 | -f 强制删除 |
| 示例 | 强制删除 nginx 镜像 | docker rmi -f nginx:1.24 |
docker tag 源镜像 新镜像 |
给镜像打新标签 | 用于 push 上传 |
| 示例 | 给本地 nginx 重命名为私有仓库名 | docker tag nginx:1.24 registry.example.com/web/nginx:stable |
docker image inspect 镜像 |
查看镜像元信息 | 返回 JSON 格式数据 |
| 示例 | 查看 nginx 镜像的详细信息 | docker image inspect nginx:1.24 |
docker image prune |
清理无用镜像 | -a 全部清除未用镜像 |
| 示例 | 清除所有未被使用的镜像 | docker image prune -a -f |
2、容器操作
| 命令 | 含义 | 常用参数说明 |
|---|---|---|
docker run |
创建并启动容器 | -d 后台、-p 端口映射、-v 挂载 |
| 示例 | 启动 Nginx 并挂载日志目录 | docker run -d -p 8080:80 -v /data/logs:/var/log/nginx --name my-nginx nginx:1.24 |
docker ps |
查看运行中的容器 | -a 显示所有容器 |
| 示例 | 查看所有容器(含停止) | docker ps -a |
docker stop/start 容器 |
停止/启动容器 | 支持批量操作 |
| 示例 | 停止多个容器 | docker stop my-nginx redis-server |
docker rm 容器 |
删除容器 | -f 强制删除 |
| 示例 | 强制删除已运行的容器 | docker rm -f my-nginx |
docker exec -it 容器 bash |
进入容器 | -it 为交互模式 |
| 示例 | 进入容器并执行 bash | docker exec -it my-nginx bash |
docker logs 容器 |
查看日志 | -f 实时输出、--tail 限制行数 |
| 示例 | 实时查看容器日志 | docker logs -f --tail 100 my-nginx |
docker cp 容器:路径 本地路径 |
容器文件拷贝 | 宿主与容器间传输 |
| 示例 | 拷贝 nginx 配置文件到本地 | docker cp my-nginx:/etc/nginx/nginx.conf ./ |
3、分享操作
| 命令 | 含义 | 常用参数说明 |
|---|---|---|
docker commit 容器 新镜像 |
容器转为镜像 | 保存调试环境 |
| 示例 | 保存已修改的容器为新镜像 | docker commit my-nginx nginx-debug:latest |
docker save -o 文件 镜像 |
保存镜像为文件 | 便于离线传输 |
| 示例 | 导出 nginx 镜像到本地文件 | docker save -o nginx.tar nginx:1.24 |
docker load -i 文件 |
导入本地镜像 | 恢复 .tar 镜像文件 |
| 示例 | 从文件导入 nginx 镜像 | docker load -i nginx.tar |
docker export 容器 -o 文件 |
导出容器文件系统 | 无镜像历史 |
| 示例 | 导出容器根文件系统 | docker export my-nginx -o nginx-rootfs.tar |
docker import 文件 镜像名 |
从文件生成镜像 | 与 export 配合使用 |
| 示例 | 从 tar 导入为镜像 | docker import nginx-rootfs.tar nginx:clean |
docker login |
登录镜像仓库 | 输入用户名密码 |
| 示例 | 登录 Docker Hub | docker login(后跟交互输入) |
docker tag 本地镜像 远程镜像 |
改名准备上传 | tag 必须匹配仓库名 |
| 示例 | 将本地 nginx 标记为私有仓库地址 | docker tag nginx:1.24 registry.example.com/myrepo/nginx:1.24 |
docker push 远程镜像 |
上传镜像到远程 | 登录后才能 push |
| 示例 | 推送镜像至私有仓库 | docker push registry.example.com/myrepo/nginx:1.24 |
四、容器化部署实战
1. 传统部署痛点
- 需手动安装Nginx、配置环境、处理依赖冲突
2. 容器化部署步骤
# 通过Docker运行Nginx
docker run -d \
--name my-web \
-p 80:80 \
-v /data/html:/usr/share/nginx/html \
nginx:latest
- 参数说明:
-v /data/html:...:将宿主机目录挂载到容器,实现数据持久化-p 80:80:将宿主机80端口映射到容器80端口
3. 验证结果
- 访问
http://服务器IP:80查看Nginx默认页面 - 修改宿主机
/data/html下的文件,实时生效
五、容器进阶知识
1、Docker Compose 常用操作
| 命令 | 含义 | 常用参数说明 |
|---|---|---|
docker-compose up |
启动服务 | -d 后台运行,--build 强制构建 |
docker-compose down |
停止并删除容器、网络 | -v 同时删除数据卷 |
docker-compose ps |
查看服务状态 | - |
docker-compose build |
构建服务镜像 | --no-cache 不使用缓存构建 |
docker-compose logs |
查看日志 | -f 实时日志,--tail 限制行数 |
| 示例 | 查看 Nginx 服务日志 | docker-compose logs -f nginx |
docker-compose exec 服务 bash |
进入服务容器 | 类似 docker exec |
| 示例 | 进入 mysql 容器 | docker-compose exec mysql bash |
docker-compose.yml 基本结构
version: '3.8'
services:
web:
image: nginx:1.24
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- app
app:
build: ./app
ports:
- "3000:3000"
environment:
- NODE_ENV=production
说明:
| 字段 | 含义 |
|---|---|
services |
定义多个服务容器 |
image / build |
使用已有镜像或从 Dockerfile 构建 |
ports |
端口映射 |
volumes |
数据卷挂载 |
environment |
环境变量 |
depends_on |
启动依赖顺序 |
2、Dockerfile 编写基础
| 指令 | 含义 | 示例 |
|---|---|---|
FROM |
基础镜像 | FROM node:18-alpine |
WORKDIR |
设置工作目录 | WORKDIR /app |
COPY |
拷贝文件到镜像 | COPY . . |
ADD |
类似 COPY,但支持 URL 和解压 | ADD https://... |
RUN |
执行命令(用于构建时) | RUN npm install |
CMD |
容器启动时默认命令(数组形式推荐) | CMD ["npm", "start"] |
ENTRYPOINT |
指定容器主进程 | 可与 CMD 配合使用 |
EXPOSE |
声明容器端口 | EXPOSE 3000 |
ENV |
设置环境变量 | ENV NODE_ENV=production |
实战示例:Node 应用 Dockerfile
# 使用轻量 Node 镜像作为基础
FROM node:18-alpine
# 设置工作目录
WORKDIR /app
# 拷贝依赖声明
COPY package*.json ./
# 安装依赖
RUN npm install
# 拷贝项目所有文件
COPY . .
# 声明端口
EXPOSE 3000
# 启动命令
CMD ["npm", "start"]
3. 容器网络
- 网络模式:bridge(默认)、host、none等
- 自定义网络:实现容器间通信(如Web应用连接MySQL容器)
4、部署实操
参考项目导航站开发笔记容器部署部分
六、注意事项
容器安全性:
- 避免以root用户运行容器进程
资源限制:
# 限制容器内存使用为512MB docker run -d --memory=512m nginx:latest日志管理:
- 通过
docker logs查看容器日志,或配置日志驱动集中收集
- 通过
备份策略:
- 定期备份重要Volume数据
- 导出镜像备份:
docker save -o my-image.tar my-app:1.0
七、常见问题(FAQ)
Q1:容器与宿主机如何通信?
A:通过端口映射(如-p 8080:80),或使用host网络模式共享网络栈
Q2:容器内修改配置文件如何持久化?
A:挂载配置文件到宿主机目录:-v /path/nginx.conf:/etc/nginx/nginx.conf
Q3:如何查看容器IP地址?
A:执行 docker inspect 容器名 | grep IPAddress
Q4:在单体架构下,容器之间怎么进行服务调用?
A:手动创建一个自定义网络,容器加入同一网络,通过服务名互相访问,不需要手动指定 IP 地址
1.创建网络
docker network create my-net
2.启动 Redis 加入网络:
docker run -d --name redis-server --network my-net redis:7.0
欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1701220998@qq.com