Docker运维常用命令

# 重启docker
systemctl restart docker
# 查看容器/镜像
docker ps -a
docker images
# 清理无用镜像容器
docker system prune -af
# 查看docker存储路径
docker info | grep "Docker Root Dir"
# 查看docker运行日志
journalctl -u docker -f


docker images                     # 列出本地镜像
docker images -a                  # 显示所有镜像(含虚悬镜像)
docker search nginx               # 搜索公有镜像
docker pull nginx:1.25            # 拉取指定版本镜像
docker save -o nginx.tar nginx:1.25 # 导出镜像离线包
docker load -i nginx.tar          # 导入离线镜像
docker rmi 镜像ID/镜像名          # 删除镜像
docker rmi $(docker images -q)    # 清空全部镜像
docker tag nginx:1.25 my-harbor/nginx:v1 # 镜像打标签
docker push my-harbor/nginx:v1     # 推送镜像至私有仓库

docker的二进制部署

准备

Rocky Linux 9、Ubuntu 22.04/24.04;二进制离线安装

二进制包下载地址:https://download.docker.com/linux/static/stable/x86_64/

将 docker-26.0.2.tgz 上传至服务器 /usr/local/src

脚本部署 install_docker_bin.sh

#!/bin/bash
# 适配Rocky Linux / Ubuntu 22.04+
DOCKER_TAR="docker-26.0.2.tgz"
SRC_DIR="/usr/local/src"
BIN_DIR="/usr/local/bin"
DOCKER_DATA="/data/docker"
SERVICE_FILE="/usr/lib/systemd/system/docker.service"
DAEMON_PATH="/etc/docker/daemon.json"
# 替换为自己阿里云镜像加速地址
MIRROR="https://xxxx.mirror.aliyuncs.com"
# 内网Harbor私有仓库地址
INSECURE_REG="["10.0.15:8080","10.0.16:8080"]"

echo -e "\033[32m校验离线压缩包\033[0m"
if [ ! -f ${SRC_DIR}/${DOCKER_TAR} ];then
  echo -e "\033[31m错误:${SRC_DIR}/${DOCKER_TAR} 不存在,请上传二进制压缩包!\033[0m"
  exit 1
fi

echo -e "\033[32m解压并拷贝二进制执行文件\033[0m"
cd ${SRC_DIR}
tar -zxf ${DOCKER_TAR}
cp docker/* ${BIN_DIR}/
chmod +x ${BIN_DIR}/docker*
# 校验docker命令
docker --version
if [ $? -ne 0 ];then
  echo -e "\033[31m二进制文件拷贝失败,终止部署\033[0m"
  exit 1
fi

echo -e "\033[32m创建数据目录与配置目录\033[0m"
mkdir -p ${DOCKER_DATA}
mkdir -p /etc/docker

echo -e "\033[32m生成systemd托管服务文件\033[0m"
cat > ${SERVICE_FILE} << EOF
[Unit]
Description=Docker Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target

[Service]
Type=notify
ExecStart=${BIN_DIR}/dockerd 
--data-root=${DOCKER_DATA} 
--log-driver=json-file 
--log-opt max-size=100m 
--log-opt max-file=3
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process

[Install]
WantedBy=multi-user.target
EOF

echo -e "\033[32m【步骤5】配置daemon.json(加速、日志、私有仓库)\033[0m"
cat > ${DAEMON_PATH} << EOF
{
  "registry-mirrors": ["${MIRROR}"],
  "storage-driver": "overlay2",
  "data-root": "${DOCKER_DATA}",
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "3"
  },
  "insecure-registries": ${INSECURE_REG}
}
EOF

echo -e "\033[32m【步骤6】重载systemd、启动Docker并设置开机自启\033[0m"
systemctl daemon-reload
systemctl start docker
systemctl enable docker

echo -e "\033[32m====================部署完成====================\033[0m"
echo "Docker版本信息:"
docker --version
echo -e "\nDocker存储根目录:${DOCKER_DATA}"
echo -e "镜像仓库与加速配置已写入:${DAEMON_PATH}"
echo -e "\033[32m可正常使用docker pull、run、images等命令\033[0m"

上传二进制包到 /usr/local/src

cd /usr/local/src
ls

创建脚本文件

vim install_docker_bin.sh

添加执行权限

chmod +x install_docker_bin.sh

修改脚本顶部自定义区域:镜像加速地址、私有仓库、包名

执行一键部署

./install_docker_bin.sh

注:内网 Harbor 镜像拉取报错 确认 daemon.json 写入 insecure-registries,执行

systemctl daemon-reload && systemctl restart docker

磁盘占满 脚本自带日志切割限制,定期执行docker system prune -af清理冗余资源。

用docker部署spug

Spug:开源轻量运维发布平台,内置主机管理、发布、监控、工单

确认 Docker 正常运行

systemctl status docker
docker info

开放服务器防火墙 8080 端口

Rocky/CentOS firewalld

firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --reload
# 验证端口
firewall-cmd --list-ports

Ubuntu ufw

ufw allow 8080/tcp

创建持久化数据目录

所有配置、数据库、缓存、日志本地持久化,删容器数据不丢失

mkdir -p /data/spug/{data,redis,logs}
# 查看目录确认创建成功
ls /data/spug
/data/spug/data:平台业务数据库、账号、主机、发布配置
/data/spug/redis:缓存数据
/data/spug/logs:运行日志

一键运行 Spug 容器

docker run -d \
--name spug \
--restart always \
-p 8080:80 \
-v /data/spug/data:/data \
-v /data/spug/redis:/var/lib/redis \
-v /data/spug/logs:/var/log/spug \
registry.aliyuncs.com/openspug/spug

参数

-d:后台守护运行
--name spug:容器命名,方便运维操作
--restart always:服务器开机、Docker 重启自动拉起 Spug
-p 8080:80:宿主机 8080 映射容器内部 80 端口
-v 挂载三个持久化目录
镜像地址:阿里云开源镜像,下载速度快

验证容器是否启动成功

# 查看运行容器
docker ps | grep spug

网页初始化登录

浏览器输入:服务器公网IP:8080

实时查看运行日志(排查发布、连接主机报错)

docker logs -f --tail 200 spug

重启 Spug

docker restart spug

停止服务

docker stop spug

进入容器内部排错

docker exec -it spug bash

更新新版本不丢失任何业务数据

停止并删除旧容器

docker stop spug
docker rm spug

拉取最新官方镜像

docker pull registry.aliyuncs.com/openspug/spug

启动

docker run

重装后配置全部消失 未挂载 /data/spug 持久化目录,不要省略 - v 挂载参数

服务器重启后 Spug 没自动启动 run 命令缺少--restart always参数,删除容器重新创建

用alpine制作nginx源码编译镜像

多阶段构建

创建文件夹,存放所有文件

mkdir -p /opt/nginx-build
cd /opt/nginx-build

Dockerfile文件

vim Dockerfile
# 编译环境,装工具编译nginx
FROM alpine:3.19 AS build
ENV NGINX_VER=1.26.1
RUN apk update && apk add --no-cache gcc g++ make linux-headers pcre-dev zlib-dev openssl-dev wget tar
WORKDIR /usr/local/src
# 下载解压nginx源码
RUN wget https://nginx.org/download/nginx-${NGINX_VER}.tar.gz && tar -zxf nginx-${NGINX_VER}.tar.gz
WORKDIR /usr/local/src/nginx-${NGINX_VER}
# 编译配置
RUN ./configure \
--prefix=/usr/local/nginx \
--with-pcre \
--with-zlib \
--with-openssl \
--with-http_ssl_module \
--with-http_gzip_module \
--with-http_stub_status_module
# 编译安装
RUN make && make install

# 运行镜像,只保留运行依赖
FROM alpine:3.19
# 只装运行需要的库
RUN apk add --no-cache pcre zlib openssl
# 从编译阶段复制编译好的nginx
COPY --from=build /usr/local/nginx /usr/local/nginx
# 把nginx命令加入全局环境
ENV PATH=$PATH:/usr/local/nginx/sbin
# 创建普通用户,禁止root运行
RUN adduser -D nginx
RUN mkdir -p /usr/local/nginx/logs /usr/local/nginx/cache && chown -R nginx:nginx /usr/local/nginx
# 复制写好的配置页面
COPY nginx.conf /usr/local/nginx/conf/nginx.conf
COPY index.html /usr/local/nginx/html/index.html
EXPOSE 80
USER nginx
# 前台启动nginx,防止容器直接退出
CMD ["nginx", "-g", "daemon off;"]

nginx.conf 配置文件

vim nginx.conf
user  nginx;
worker_processes  auto;
error_log  /usr/local/nginx/logs/error.log warn;
pid        /usr/local/nginx/logs/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /usr/local/nginx/logs/access.log  main;

    sendfile        on;
    keepalive_timeout  65;

    gzip on;
    gzip_min_length 1k;
    gzip_types text/plain text/css application/json application/javascript;

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   /usr/local/nginx/html;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/local/nginx/html;
        }
    }
}

index.html测试页面

vim index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Nginx</title>
</head>
<body>
<h2>Alpine源码编译Nginx 部署成功!</h2>
<p>镜像自己打包,内置ssl、gzip模块</p>
</body>
</html>

构建镜像

docker build -t my-nginx:1.26.1 .

验证镜像是否正常

# 临时启动容器查看nginx版本和编译模块
docker run --rm my-nginx:1.26.1 nginx -V

启动容器,网页可访问

宿主机创建持久化文件夹(配置、日志、页面存在服务器,删容器不丢)

mkdir -p /data/mynginx/{conf,html,logs}

先把镜像内默认配置复制到宿主机

# 临时容器拷贝文件
docker run -d --name tmp-nginx my-nginx:1.26.1
docker cp tmp-nginx:/usr/local/nginx/conf/. /data/mynginx/conf/
docker cp tmp-nginx:/usr/local/nginx/html/. /data/mynginx/html/
# 删除临时容器
docker rm -f tmp-nginx

正式启动长期运行的 nginx 容器

docker run -d \
--name mynginx-web \
--restart always \
-p 80:80 \
-v /data/mynginx/conf:/usr/local/nginx/conf \
-v /data/mynginx/html:/usr/local/nginx/html \
-v /data/mynginx/logs:/usr/local/nginx/logs \
my-nginx:1.26.1

参数解释

d 后台运行
--restart always 服务器重启自动开 nginx
-p 80:80 服务器 80 端口映射容器网页端口
-v 挂载目录,数据永久保存

放行防火墙,否则外网打不开网页

ufw allow 80/tcp

访问测试

浏览器输入 服务器公网IP,出现写的 index.html 页面,全部完成。

运维命令

# 查看容器是否在运行
docker ps |grep mynginx-web

# 实时看运行日志,报错在这里查
docker logs -f --tail 100 mynginx-web

# 修改配置后校验语法
docker exec -it mynginx-web nginx -t

# 重载配置(不中断网页访问)
docker exec -it mynginx-web nginx -s reload

# 重启nginx容器
docker restart mynginx-web

# 进入容器内部查看文件
docker exec -it mynginx-web sh

注:

docker build 报错文件找不到

解决:确认你执行命令的文件夹里有 Dockerfile、nginx.conf、index.html 三个文件,ls 查看

浏览器打不开页面

防火墙 80 端口没放行;云服务器后台安全组开放 80 入站

容器启动一秒就消失

解决:Dockerfile 里 CMD 必须带 daemon off;,复制完整文件不要漏

报权限 denied 解决:

挂载目录授权 chmod 777 /data/mynginx -R

实现wordpress的数据持久化

分 3 个挂载目录永久存数据,删容器、重装镜像数据不丢失:

  1. WordPress 网站程序 / 上传图片:/data/wp/html
  2. MySQL 数据库文件:/data/wp/mysql
  3. WordPress 配置文件:/data/wp/config

创建本地持久化文件夹

mkdir -p /data/wp/{html,mysql,config}

一键启动 MySQL(数据库持久化)

docker run -d \
--name wp-mysql \
--restart always \
-v /data/wp/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=Root@123456 \
-e MYSQL_DATABASE=wpdb \
-e MYSQL_USER=wpuser \
-e MYSQL_PASSWORD=Wp@123456 \
mysql:5.7

-v /data/wp/mysql:/var/lib/mysql:数据库文件挂载本地,核心持久化

启动 WordPress 网站(程序 + 配置持久化)

docker run -d \
--name wp-web \
--restart always \
-p 8080:80 \
--link wp-mysql:mysql \
-v /data/wp/html:/var/www/html \
-v /data/wp/config:/usr/local/etc/php/conf.d \
-e WORDPRESS_DB_HOST=mysql:3306 \
-e WORDPRESS_DB_NAME=wpdb \
-e WORDPRESS_DB_USER=wpuser \
-e WORDPRESS_DB_PASSWORD=Wp@123456 \
wordpress:latest

持久化挂载

-v /data/wp/html:/var/www/html:网站源码、文章图片、插件、主题全部存在宿主机

-v /data/wp/config:/usr/local/etc/php/conf.d:PHP 自定义配置持久保存

放行防火墙 8080 端口

firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --reload

浏览器初始化

访问 服务器IP:8080,按页面提示设置网站名称、管理员账号密码完成安装。

验证持久化

  • 上传一张图片、安装一个主题
  • 删除两个容器
  • 重新执行
docker rm -f wp-web wp-mysql
docker run -d \
--name wp-mysql \
--restart always \
-v /data/wp/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=Root@123456 \
-e MYSQL_DATABASE=wpdb \
-e MYSQL_USER=wpuser \
-e MYSQL_PASSWORD=Wp@123456 \
mysql:5.7
docker run -d \
--name wp-web \
--restart always \
-p 8080:80 \
--link wp-mysql:mysql \
-v /data/wp/html:/var/www/html \
-v /data/wp/config:/usr/local/etc/php/conf.d \
-e WORDPRESS_DB_HOST=mysql:3306 \
-e WORDPRESS_DB_NAME=wpdb \
-e WORDPRESS_DB_USER=wpuser \
-e WORDPRESS_DB_PASSWORD=Wp@123456 \
wordpress:latest

打开网站,图片、文章、账号全部保留,证明持久化生效

运维命令

# 查看容器
docker ps | grep wp

# 实时日志
docker logs -f wp-web

# 重启网站
docker restart wp-web

# 进入网站容器
docker exec -it wp-web bash

不要删除/data/wp整个文件夹,一删数据全没

数据库密码、库名前后启动必须一致,否则连不上库

云服务器记得控制台安全组放行 8080 端口

更多推荐