容器技术Docker(十四)
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_TARdocker-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 # 替换为自己阿里云镜像加速地址 MIRRORhttps://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] DescriptionDocker Container Engine Documentationhttps://docs.docker.com Afternetwork-online.target firewalld.service Wantsnetwork-online.target [Service] Typenotify ExecStart${BIN_DIR}/dockerd --data-root${DOCKER_DATA} --log-driverjson-file --log-opt max-size100m --log-opt max-file3 ExecReload/bin/kill -s HUP $MAINPID TimeoutSec0 RestartSec2 Restartalways LimitNOFILEinfinity LimitNPROCinfinity LimitCOREinfinity TasksMaxinfinity Delegateyes KillModeprocess [Install] WantedBymulti-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/srccd /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部署spugSpug开源轻量运维发布平台内置主机管理、发布、监控、工单确认 Docker 正常运行systemctl status docker docker info开放服务器防火墙 8080 端口Rocky/CentOS firewalldfirewall-cmd --add-port8080/tcp --permanent firewall-cmd --reload # 验证端口 firewall-cmd --list-portsUbuntu ufwufw 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重启 Spugdocker 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-buildDockerfile文件vim Dockerfile# 编译环境装工具编译nginx FROM alpine:3.19 AS build ENV NGINX_VER1.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 --frombuild /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.confuser 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 charsetutf-8 titleNginx/title /head body h2Alpine源码编译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 个挂载目录永久存数据删容器、重装镜像数据不丢失WordPress 网站程序 / 上传图片/data/wp/htmlMySQL 数据库文件/data/wp/mysqlWordPress 配置文件/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_PASSWORDRoot123456 \ -e MYSQL_DATABASEwpdb \ -e MYSQL_USERwpuser \ -e MYSQL_PASSWORDWp123456 \ 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_HOSTmysql:3306 \ -e WORDPRESS_DB_NAMEwpdb \ -e WORDPRESS_DB_USERwpuser \ -e WORDPRESS_DB_PASSWORDWp123456 \ wordpress:latest持久化挂载-v /data/wp/html:/var/www/html网站源码、文章图片、插件、主题全部存在宿主机-v /data/wp/config:/usr/local/etc/php/conf.dPHP 自定义配置持久保存放行防火墙 8080 端口firewall-cmd --add-port8080/tcp --permanent firewall-cmd --reload浏览器初始化访问 服务器IP:8080按页面提示设置网站名称、管理员账号密码完成安装。验证持久化上传一张图片、安装一个主题删除两个容器重新执行docker rm -f wp-web wp-mysqldocker run -d \ --name wp-mysql \ --restart always \ -v /data/wp/mysql:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORDRoot123456 \ -e MYSQL_DATABASEwpdb \ -e MYSQL_USERwpuser \ -e MYSQL_PASSWORDWp123456 \ mysql:5.7docker 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_HOSTmysql:3306 \ -e WORDPRESS_DB_NAMEwpdb \ -e WORDPRESS_DB_USERwpuser \ -e WORDPRESS_DB_PASSWORDWp123456 \ wordpress:latest打开网站图片、文章、账号全部保留证明持久化生效运维命令# 查看容器 docker ps | grep wp # 实时日志 docker logs -f wp-web # 重启网站 docker restart wp-web # 进入网站容器 docker exec -it wp-web bash不要删除/data/wp整个文件夹一删数据全没数据库密码、库名前后启动必须一致否则连不上库云服务器记得控制台安全组放行 8080 端口