容器技术的认识与基础使用

容器技术基础使用与认识

一、容器技术概述

1. 什么是容器?

容器是一种轻量级的虚拟化技术,允许将应用及其依赖环境打包成一个独立单元(镜像),实现一次构建,处处运行

  • 与传统部署的区别
    • 传统部署:直接在服务器安装依赖(如PHP、MySQL),容易引发环境冲突,迁移困难。
    • 容器部署:应用与依赖打包成独立容器,环境隔离,避免依赖冲突,部署效率高。

2. 容器 vs 虚拟机

特性 容器 虚拟机
资源占用 轻量(共享宿主机内核) 较重(独立完整系统)
启动速度 秒级 分钟级
性能损耗 较高
隔离性 进程级隔离 完全系统隔离

二、核心概念

1. 镜像

  • 定义:包含应用代码、依赖、配置的只读模板,类似“安装包”
  • 示例nginx:latestmysql: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、部署实操

参考项目导航站开发笔记容器部署部分


六、注意事项

  1. 容器安全性

    • 避免以root用户运行容器进程
  2. 资源限制

    # 限制容器内存使用为512MB
    docker run -d --memory=512m nginx:latest
    
  3. 日志管理

    • 通过docker logs查看容器日志,或配置日志驱动集中收集
  4. 备份策略

    • 定期备份重要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
导航页 GitHub