轻松掌握 docker 容器管理项目

文/晨风不可依米 (2025.07.22)

Docker 介绍与安装

Docker 概念

  • docker:一款开源的应用容器引擎。
  • 镜像:一个可独立运行的应用程序。具有轻量级、不可变性(完整软件包)等特点;可使用Dockerfile配置完成自动化构建。
  • 容器:一个镜像运行的实例。具有轻量化、隔离性、易管理等特点;
  • 卷积:用于持久化存储容器数据;特别注意:卷积是支持双向同步机制;不管是宿主机或容器一方文件更改,相对一方会同步更新。
  • 网络:建立容器之间的通信;网络类型有桥接网络、主机网络、覆盖网络等。
  • Dockerfile文件配置:定义自动化构建、文件迁移等配置内容。
  • docker-compose.yml文件配置:一款在单台Linux服务器运行多个容器的工具。常用于自动化部署、管理项目等场景。

Docker 安装

  • 前往docker官网地址:https://www.docker.com,下载桌面端即可。
  • 镜像源加速配置,常见加速镜像源地址,如下:
    • https://dockerhub.icu较稳定
    • https://dockerproxy.com
    • https://docker.nju.edu.cn
    • https://mirror.baidubce.com
    • https://registry.docker-cn.com
    • https://docker.mirrors.ustc.edu.cn
    • https://docker.mirrors.sjtug.sjtu.edu.cn
    • https://eph8xfli.mirror.aliyuncs.com临时
    • https://ozhrm8gx.mirror.aliyuncs.com临时

Docker 常用命令

Docker 镜像命令

  • 查看本地镜像:docker images ls
  • 查找镜像:docker search <image>
  • 拉取镜像:docker pull <image:version>
  • 删除镜像:docker rmi <imageID | image:version>
  • 构建镜像:docker build -t <自定义镜像名称:版本号> <构建内容目录> [-f <dockerfile 配置路径>]
  • 保存镜像:docker save -o <image>.tar <image:version>
  • 查看镜像详情:docker inspect <imageID>

Docker 容器命令

  • 查看运行中的容器:docker ps;追加参数-a可查看所有容器。
  • 运行容器:docker run -d -p <HostPort>:<ContainerPort> --name <ContainerName> <image:version>
  • 删除容器:docker rm <ContainerID | ContainerName>
  • 启动容器:docker start <ContainerID | ContainerName>
  • 暂停容器:docker stop <ContainerID | ContainerName>
  • 重启容器:docker restart <ContainerID | ContainerName>
  • 强制删除已停止容器:docker container prune -f
  • 进入容器:docker exec -it <ContainerID> /bin/bash
  • 查看容器内进程:docker top <ContainerID>
  • 查看容器日志内容:docker logs -f <ContainerID>
  • 拷贝文件(宿主机 => 容器):docker cp ./dir/file <ContainerID>:/dir/file
  • 拷贝文件(容器 => 宿主机):docker cp <ContainerID>:/dir/file ./dir/file

理解命令参数

docker run -d -p <HostPort>:<ContainerPort> -v <HostCacheDir>:<ContainerDir> --name <ContainerName> <image:version>

## 参数理解
-d          指定后台运行容器。
-p          指定端口映射,格式:宿主机端口:容器端口。
-v          指定数据卷积目录挂载,数据持久化存储(实时同步容器,但删除容器它还在);格式:宿主机目录:容器资源目录。
--name      指定容器名称。

Docker 容器内部命令(精简Linux

进程资源命令

  • 查看进程资源:ps aux
  • 关闭进程服务:kill -9 <PID>
  • 查看内存信息:cat /proc/meminfo
  • 查看磁盘信息:df -h

网络测试命令

  • 查看容器内网卡:ifconfig
  • 查看网络监听端口:ss -tunlpnetstat -tunlp
  • 查看容器服务名称:hostname
  • 查看容器服务IPhostname -I
  • 查看主机服务端口:netstat -lnt
  • 测试连通性和DNSnslookup <host-url>ping 8.8.8.8
  • 直测本容器连通性:curl http://localhost:<port>

文件日志命令

  • 文件操作:与Linux环境无异。
  • 查看日志:tail -f <file.log>

软件测试命令

  • 查看操作系统:cat /etc/os-release
  • 查看终端类型:echo $SHELL
  • 查看环境配置:env
  • 查看当前用户:whoami
  • 查看当前权限:id

工具包命令

  • 更新工具包:apt update
  • 安装工具包:apt install -y <pkg>;参数-y表示静默安装。

docker compose 命令

特别注意docker compose命令会根据项目根目录下的dockercompose.yml配置文件来编排管理项目。

  • 自动化构建部署命令:docker compose up [-d] [--build];参数-d代表后台运行,参数-build代表强制构建镜像(在开发阶段很有用)。

  • 查看已启动服务项目:docker compose ps;等价于docker ps命令。

  • 构建项目服务镜像:docker compose build;需存在dockercompose.yml配置文件。

  • 扩展项目服务容器数量:docker-compose up -d --scale <ContainerName>=<number>

  • 启动服务(后台隐藏):docker-compose up -d

  • 查看服务(compose):docker-compose ps

  • 查看日志(实时):docker-compose logs -f

  • 构建或重建服务:docker-compose build

  • 扩展服务数量:docker-compose up -d --scale <ContainerName>=<number>

常见工具包

  • iproute2:包含ssiptc等常见命令集。

Docker 卷积命令

  • 列出卷积挂载目录信息:docker volume ls
  • 创建卷积挂载目录信息:docker volume create <volume_name>
  • 删除卷积挂载目录信息:docker volume rm <volume_name>
  • 删除所有未使用卷积目录信息:docker volume prune
  • 清理所有卷积目录信息:docker volume prune -f
  • 查看卷积挂载信息:docker volume inspect <volume_name>
  • 查看卷积挂载目录:docker volume inspect <volume_name> --format '{{ .Mountpoint }}'

Docker 其它命令

  • 查看系统磁盘使用信息(含卷积信息):docker system df

Docker 配置详解

特别提醒:项目根目录下一般都会出现Dockerfiledocker-compose.yml同时存在情况。

  • Dockerfile配置文件负责自动化构建流程。
  • docker-compose.yml负责项目服务启动。

Dockerfile 文件配置

  • Dockerfile文件配置,用于自动化构建过程。
  • 自动化构建过程三阶段。
  1. 开发环境:热更新实时预览,适合开发阶段。
  2. 构建环境:打包构建输出生产环境产物(dist目录)。
  3. 生产环境:将生产环境产物(dist目录)构建成镜像,并部署。

关键词理解

  • WORKDIR:本地源码存放在容器指定位置;常定义在容器的/usr/src/<project_name>
  • COPY:终端复制操作;用法:COPY <本地资源位置 或 指定阶段里的容器资源位置> <容器资源位置>
  • ENV:定义环境变量;用法:ENV <key> <value>
  • ARG:定义参数变量;用法:ARG <key> <value>
  • RUN:执行终端命令;用法(案例):RUN npm insall -g pnpm
  • CMD:启动项目命令:用法(案例):CMD [ "node", "dist/apps/${APP_NAME}/main.js" ]

## Vue 项目案例配置自动化构建过程
### 开发环境
FROM node AS development
ENV NODE_ENV development
RUN npm install -g pnpm
RUN pnpm config set registry https://registry.npmmirror.com
RUN mkdir -p /usr/src/<project_name>
WORKDIR /usr/src/<project_name>
COPY package.json ./
COPY . .
## 先删除后安装,解决依赖项冲突或不一致问题。
RUN rm -rf /usr/src/<project_name>/node_modules
RUN pnpm install


### 构建环境
FROM node AS building
ENV NODE_ENV building
RUN npm install -g pnpm
RUN pnpm config set registry https://registry.npmmirror.com
RUN mkdir -p /usr/src/<project_name>
WORKDIR /usr/src/<project_name>
COPY package.json ./
COPY . .
## 先删除后安装,解决依赖项冲突或不一致问题。
RUN rm -rf /usr/src/<project_name>/node_modules
RUN pnpm install
RUN pnpm irun build


### 生产环境
FROM node AS production
WORKDIR /usr/src/<project_name>
## 仅用构建打包产物 dist 目录,减少镜像体积。
COPY --from=building /usr/src/<project_name>/dist ./dist
# 设置默认的 Nginx 配置;特别注意:vue 项目根目录下请创建 nginx.conf 配置文件;详细配置往下看(单独说明)。
COPY nginx.conf /etc/nginx/nginx.conf
# 设置启动命令
CMD ["nginx", "-g", "daemon off;"]


############################################################

## NestJS 微服务(monorepo)案例配置自动化构建过程

## 开发环境
FROM node AS development
ARG APP_NAME
ENV NODE_ENV development
RUN npm install -g pnpm
RUN pnpm config set registry https://registry.npmmirror.com
RUN mkdir -p /usr/src/<monorepo_pkgame>
WORKDIR /usr/src/<monorepo_pkgame>
COPY package.json ./
COPY . .
## 先删除后安装,解决依赖项冲突或不一致问题。
RUN rm -rf /usr/src/<monorepo_pkgame>/node_modules
RUN pnpm install


## 构建环境
FROM node AS building
ARG APP_NAME
ENV NODE_ENV production
RUN npm install -g pnpm
RUN pnpm config set registry https://registry.npmmirror.com
RUN mkdir -p /usr/src/<monorepo_pkgame>
WORKDIR /usr/src/<monorepo_pkgame>
COPY package.json ./
COPY . .
## 先删除后安装,解决依赖项冲突或不一致问题。
RUN rm -rf /usr/src/<monorepo_pkgame>/node_modules
RUN pnpm install
RUN pnpm run build -- ${APP_NAME}


## 生产环境
FROM node AS production
ARG APP_NAME
WORKDIR /usr/src/<monorepo_pkgame>
## 仅用构建打包产物 dist 目录,减少镜像体积。
COPY --from=building /usr/src/<monorepo_pkgame>/dist ./dist
CMD [ "node", "dist/apps/${APP_NAME}/main.js" ]

前端项目部署的 nginx.conf 配置

server {
    ## 域名和端口设置
    listen 80;
    server_name localhost;

    location / {
        root /usr/share/nginx/html;
        index index.html index.htm;
        ## 解决路由重定向问题(未匹配路径)
        try_files $uri $uri/ /index.html;
    }

    location /api {
        proxy_pass http://backend-service;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        ## 服务异常的路由重定向
        root /usr/share/nginx/html;
    }
}


docker-compose.yml 文件配置

  • 特别提醒:docker-compose.yml文件会默认读取.env配置文件;但shell脚本命令参数的优先级高于.env文件配置。
  • 定义services配置时,通常情况会部署开发环境和生产环境;切记容器端口不要存在重复或冲突,建议开发环境用x000 ~ x999区间宽口,生产环境用y000 ~ Y999区间端口。


## vue 项目案例管理(一键部署)

## 服务列表
services:
  
  ## 以项目名为 vue 为例,开发环境统一用 **-dev 作为开发项目名。
  vue-dev:
    build:
      context: .
      ### 指定上述 vue 项目根目录下的 Dockerfile 配置文件
      dockerfile: Dockerfile
    ### 持久化存储(源码和依赖;加速启动)
    volumes:
      - .:/usr/src/vue-dev
      - /usr/src/vue-dev/node_modules
    ### 指定容器端口与项目端口(格式:容器端口:项目|镜像端口)
    ports:
      - "8080:8080"
    environment:
      NODE_ENV: development
    ### 开发环境的启动命令
    command: npm run serve

  ## 以项目名为 vue 为例,开发环境统一用 **-prod 作为开发项目名。
  vue-prod:
    build:
      context: .
      ### 指定上述 vue 项目根目录下的 Dockerfile 配置文件
      dockerfile: Dockerfile
    ### 持久化存储(源码和依赖;加速启动)
    volumes:
      - .:/usr/src/vue-dev
      - /usr/src/vue-dev/node_modules
    ### 指定容器端口与项目端口(格式:容器端口:项目|镜像端口)
    ports:
      - "80:80"
    environment:
      NODE_ENV: production
      

############################################################


## NestJS 微服务(monorepo)案例管理(一键部署)

### 持久化存储数据
volumes:
  ## 开发环境卷积目录
  auth-db-dev-data:
  email-db-dev-data:

  ## 生产环境卷积目录
  auth-db-prod-data:
  email-db-prod-data:

## 服务列表
services:

  ## 开发环境项目(以 **-dev 为标识)
  auth-db-dev:
    image: mysql:8
    container_name: auth-db-dev
    ports:
      - '3307:3306'
    volumes:
      - auth-db-dev-data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_USER=root
      - MYSQL_ROOT_PASSWORD=user
      - MYSQL_DATABASE=auth-db

  email-db-dev:
    image: mysql:8
    container_name: email-db-dev
    ### 格式:容器端口:镜像端口;注意保证容器杜阿口不重复或冲突
    ports:
      - '3308:3306'
    volumes:
      - email-db-dev-data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_USER=root
      - MYSQL_ROOT_PASSWORD=user
      - MYSQL_DATABASE=email-db


  gateway-service-dev:
    build:
      context: .
      target: development
      ### 指定自动化构建配置文件 
      dockerfile: Dockerfile
      args:
        - APP_NAME=gateway-service
    ### 格式:容器端口:镜像端口;注意保证容器杜阿口不重复或冲突
    ports:
      - '3000:3000'
    environment:
      - NODE_ENV=development
    ### 持久化存储数据(缓存源码和项目依赖,加速构建速度)
    volumes:
      - .:/usr/src/<monorepo_pkgame>
      - /usr/src/<monorepo_pkgame>/node_modules
    ### 启动项目开发环境的命令
    command: 'pnpm run start:dev -- gateway-service'

  auth-service-dev:
    build:
      context: .
      target: development
      dockerfile: Dockerfile
      args:
        - APP_NAME=auth-service
    ports:
      - '3001:3001'
    environment:
      - NODE_ENV=development
    volumes:
      - .:/usr/src/<monorepo_pkgame>
      - /usr/src/<monorepo_pkgame>/node_modules
    depends_on:
      - auth-db-dev
    command: 'pnpm run start:dev -- auth-service'

  email-service-dev:
    build:
      context: .
      target: development
      dockerfile: Dockerfile
      args:
        - APP_NAME=email-service
    ports:
      - '3002:3002'
    environment:
      - NODE_ENV=development
    volumes:
      - .:/usr/src/<monorepo_pkgame>
      - /usr/src/<monorepo_pkgame>/node_modules
    depends_on:
      - email-db-dev
    command: 'pnpm run start:dev -- email-service'


  ## 生产环境项目(以 **-prod 为标识)
  auth-db-prod:
    image: mysql:8
    container_name: auth-db-prod
    ports:
      - '4307:3306'
    volumes:
      - auth-db-prod-data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_USER=root
      - MYSQL_ROOT_PASSWORD=xiaoyimi
      - MYSQL_DATABASE=auth-db

  email-db-prod:
    image: mysql:8
    container_name: email-db-prod
    ports:
      - '4308:3306'
    volumes:
      - email-db-prod-data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_USER=root
      - MYSQL_ROOT_PASSWORD=xiaoyimi
      - MYSQL_DATABASE=email-db

  gateway-service-prod:
    build:
      context: .
      target: production
      dockerfile: Dockerfile
      args:
        - APP_NAME=gateway-service
    ports:
      - '4000:4000'
    environment:
      - NODE_ENV=production
    # depends_on:
    #   - gateway-db-prod

  auth-service-prod:
    build:
      context: .
      target: production
      dockerfile: Dockerfile
      args:
        - APP_NAME=auth-service
    ports:
      - '4001:4001'
    environment:
      - NODE_ENV=production
    depends_on:
      - auth-db-prod

  email-service-prod:
    build:
      context: .
      target: production
      dockerfile: Dockerfile
      args:
        - APP_NAME=email-service
    ports:
      - '4002:4002'
    environment:
      - NODE_ENV=production
    depends_on:
      - email-db-prod


构建镜像并启动服务命令:在完成以上Dockerfiledocker-compose.yml等配置文件,可执行以下命令:

  • 构建docker-compose.yml定义的所有服务:docker compose up --build
  • 构建docker-compose.yml定义的指定服务:docker compose up --build <service1> <service2> <...>



文章收获

  • 如果觉得对你有所帮助,请点下“推荐”吧!
  • 如果担心文忘记章地址,请点下“收藏”吧!
  • 如果对博主文章内容喜欢,可进行“关注”博主,更好地获悉最新文章内容。
posted @ 2025-07-22 18:21  晨风不可依米  阅读(50)  评论(0)    收藏  举报