Zzzxb's Blog

你要静心学习那份等待时机的成熟的情绪,也要你一定保有这份等待之外的努力和坚持。

Docker Mar 16, 2026

docker images                    # 列出所有镜像
docker images -a                 # 包含中间层镜像
docker pull nginx:1.21-alpine    # 拉取指定版本
docker rmi nginx                 # 删除镜像
docker tag nginx my-nginx:v1     # 给镜像打标签
docker tag nginx:latest umyun.com/nginx:prod  # 推送到私有仓库
docker inspect nginx             # 查看镜像详细信息
docker run nginx                              # 运行容器
docker run -d nginx                           # 后台运行
docker run -it nginx bash                     # 交互模式运行
docker run --name my-nginx nginx              # 指定名称
docker run --rm nginx                         # 运行后自动删除
docker run -p 8080:80 nginx                   # 端口映射
docker run -v /host/path:/container/path nginx # 挂载卷
docker run -e MY_ENV=value nginx              # 设置环境变量
docker start container_name                   # 启动容器
docker stop container_name                    # 优雅停止
docker stop -t 30 container_name              # 指定超时时间
docker restart container_name                 # 重启容器
docker pause container_name                   # 暂停容器
docker unpause container_name                 # 恢复容器
docker kill container_name                    # 强制停止
docker rm container_name                      # 删除容器
docker container prune                        # 删除所有停止的容器
docker ps                                     # 查看运行中的容器
docker ps -a                                  # 查看所有容器
docker exec -it container_name bash           # 进入容器(推荐)
docker exec container_name ls /app            # 执行单条命令
docker logs container_name                    # 查看日志
docker logs -f container_name                 # 实时查看(类似 tail -f)
docker logs --tail 100 container_name         # 查看最后100行
docker logs --since 10m container_name        # 查看最近10分钟
docker logs -t container_name                 # 显示时间戳
docker inspect container_name                 # 查看容器详细信息
docker stats                                  # 实时查看资源使用
docker stats --no-stream                      # 单次查看资源使用
docker top container_name                     # 查看容器内进程
docker port container_name                    # 查看端口映射
docker diff container_name                    # 查看容器文件变化

Docker build

可用来将本地服务构建成镜像

常用命令

FROM openjdk:8u312-oraclelinux8

ENV JAVA_HOME=/usr/java/openjdk-8
ENV EXT_DIRS=${JAVA_HOME}/jre/lib/ext
ENV APP_USER=umcc
ENV APP_GROUP=umcc
ENV APP_HOME=/opt/app
ENV PROJECT_NAME=fnp

ARG USER_ID=1000
ARG GROUP_ID=1000

RUN groupadd -g ${GROUP_ID} ${APP_GROUP} && \
    useradd -u ${USER_ID} -g ${APP_GROUP} -s /sbin/nologin -M ${APP_USER}

VOLUME /tmp

RUN mkdir -p ${APP_HOME}/{lib,conf,config,log,doc,phone} && \
    chown -R ${APP_USER}:${APP_GROUP} ${APP_HOME}

WORKDIR ${APP_HOME}

COPY --chown=${APP_USER}:${APP_GROUP} target/rms-gpd-fnp.jar ./
COPY --chown=${APP_USER}:${APP_GROUP} target/lib/ ./lib/
COPY --chown=${APP_USER}:${APP_GROUP} target/conf/ ./conf/
COPY --chown=${APP_USER}:${APP_GROUP} target/config/ ./config/
COPY --chown=${APP_USER}:${APP_GROUP} target/doc/ ./doc/
COPY --chown=${APP_USER}:${APP_GROUP} target/startup.sh ./

RUN chmod +x startup.sh

# 切换到非 root 用户
USER ${APP_USER}

# 声明端口
EXPOSE 18081

# 健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=40s --retries=3 \
  CMD curl -f http://localhost:18081/actuator/health || exit 1

# 启动命令
ENTRYPOINT ["sh", "startup.sh"]

Docker compose

用于定义和运行多容器 Docker 应用程序的工具

常用命令

services:
  fnp:
    build:
      context: .
      dockerfile: Dockerfile
      args:
        USER_ID: ${HOST_UID:-1000}
        GROUP_ID: ${HOST_GID:-1000}
    image: fnp:latest
    container_name: umcc_fnp
    ports:
      - "18081:18081"
    volumes:
      - /opt/app/test_rms/fnp/log:/opt/app/log
      - /opt/app/test_rms/fnp/conf:/opt/app/conf
      - /opt/app/test_rms/fnp/config:/opt/app/config
      - /opt/app/test_rms/fnp/doc:/opt/app/doc
      - /opt/app/test_rms/fnp/phone:/opt/app/phone
      - /tmp:/tmp:rw,noexec,nosuid
    environment:
      - TZ=${TZ}
      - JAVA_OPTS=${JAVA_OPTS}
      # 如果需要可选配置,可以取消注释下面这行
      # - JAVA_OPTS=${JAVA_OPTS} ${GC_SAFEPOINT_OPTS} ${JMX_OPTS} ${DEBUG_OPTS}
    restart: unless-stopped
    #restart: "no"           # 从不自动重启(默认)
    #restart: always         # 总是重启
    #restart: on-failure     # 失败时重启
    #restart: unless-stopped # 除非手动停止,否则总是重启
    # 最大内存限制
    mem_limit: 4G
    # 最小内存限制
    mem_reservation: 2G
    # cpu分配可填写小数
    cpus: 4.0
    # CPU 权重(可选) 权重只在CPU紧张时生效
    cpu_shares: 1024
    
    stop_grace_period: 30s

构建脚本

#!/bin/bash

set -e

PROJECT_NAME=fnp
ROOT_DIR=/opt/app/test_rms
PROJECT_HOME=${ROOT_DIR}/${PROJECT_NAME}
CURRENT_UID=$(id -u)
CURRENT_GID=1000

export HOST_UID=$CURRENT_UID
export HOST_GID=$CURRENT_GID

echo "========== 部署 ${PROJECT_NAME} =========="

mkdir -p ${PROJECT_HOME}/{log,conf,config,doc,phone}

# 初始化配置文件
cp -rn target/conf/* ${PROJECT_HOME}/conf/ 2>/dev/null || true
cp -rn target/config/* ${PROJECT_HOME}/config/ 2>/dev/null || true
sudo chown -R $CURRENT_UID:$CURRENT_GID ${PROJECT_HOME}

mkdir -p ${PROJECT_HOME}/log/rocketmqlogs
sudo chown -R $CURRENT_UID:$CURRENT_GID ${PROJECT_HOME}/log

docker compose down 2>/dev/null || true
docker compose build
docker compose up -d

if [ $? -eq 0 ]; then
    echo "✅ ${PROJECT_NAME} - 部署成功"
else
    echo "❌ ${PROJECT_NAME} - 部署失败"
fi

CPU分配

Java 应用经验法则

应用类型 CPU 需求 内存需求 说明
小型服务 0.5-1 核 1-2 GB 简单 CRUD,低并发
中型服务 1-2 核 2-4 GB 业务逻辑复杂,中等并发
大型服务 2-4 核 4-8 GB 计算密集,高并发
计算密集型 4+ 核 8+ GB 数据处理、批量任务

Docker install

安装

# yum 增强工具
sudo yum install -y yum-utils
# 添加阿里云Docker仓库
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 安装最新版本
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 或者安装特定版本
sudo yum install -y docker-ce-<VERSION> docker-ce-cli-<VERSION> containerd.io

# 启动Docker
sudo systemctl start docker

# 设置开机自启
sudo systemctl enable docker

# 查看Docker状态
sudo systemctl status docker

# 重启Docker服务
sudo systemctl daemon-reload
sudo systemctl restart docker

# 查看Docker版本
docker version

# 查看详细信息
docker info

自定义配置

# 创建配置文件目录
sudo mkdir -p /etc/docker
vim /etc/docker/daemon.json

国内镜像加速

{
  "registry-mirrors": [
    "https://mirror.baidubce.com",
    "https://mirror.aliyuncs.com",
    "https://docker.m.daocloud.io",
    "https://registry.docker-cn.com",
    "https://quay.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com/",
    "https://dockerhub.icu"
  ]
}

删除

# 停止服务
sudo systemctl stop docker

# 卸载软件包
sudo yum remove docker-ce docker-ce-cli containerd.io

# 删除相关文件
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

关于网络访问

使用 Docker 网络

# 创建网络
docker network create mynetwork

# 运行容器时加入同一网络
docker run -d --name web --network mynetwork nginx
docker run -d --name redis --network mynetwork redis:alpine

使用主机网络模式(–network host)

  --add-host="redis.server:192.168.2.100" \  # B服务器的真实IP
  --add-host="host.docker.internal:host-gateway" # 宿主主机地址

Inspect 查看容器内网IP

# 查看容器IP
docker inspect -f '' 容器名