新闻详情

新闻详情

首页 / 资讯中心 / 详情

Docker实战指南:从安装到MySQL、Redis部署与排错全记录

发布时间:2026/9/9 23:37:39来源:尧图网络
Docker实战指南:从安装到MySQL、Redis部署与排错全记录
说实话我最早接触Docker的时候是带着一种“这玩意儿真有网上吹得那么神吗”的心态去试的。后来真正被它圈粉是在一次帮同事解决环境问题的时候同一个Java项目我本地跑得好好的到他电脑上就各种报错JDK版本、中间件配置、系统依赖全都不一样折腾了整整一下午。当时脑子里就一个念头——要是能把我的运行环境整个打包带走就好了。这个念头其实就是Docker的核心价值。如果你是那种被“在我机器上是好的”折磨过的人或者刚接触容器技术、想搞明白Docker安装、镜像加速、MySQL和Redis这些常见部署到底怎么操作那这篇基于我实际踩坑经历整理的文章应该能帮到你。我不打算复述官方文档只讲我真正试过、真正出过问题、真正搞明白了的东西。1. 先搞清楚Docker到底解决了我哪件头疼事很多人一开始看Docker的教程会被“镜像”“容器”“仓库”这几个词绕晕。我打个比方你就明白了镜像Image相当于一个打包好的系统光盘里面什么都有——操作系统、运行环境、代码、依赖全都刻在光盘里容器Container就是你拿这张光盘去装出来的一个运行实例可以同时装出好几个一模一样的互相还隔离开仓库Registry就是存放这些光盘的地方也就是镜像仓库。这样拆开看Docker干的事就很朴素把应用连同它的运行环境一起打包然后在任何装了Docker的机器上一键运行环境差异不存在的。这个“环境一致性”对实际工作的影响比想象中大得多。我后来在公司内部推Docker的时候最常跟别人说的一句话就是以前你花半天部署一套测试环境装数据库、装中间件、调配置每一步都可能踩坑现在你拿到一个镜像docker run一执行环境直接起来。这种体感差异只有亲自试过才懂。当然Docker能解决的问题不止这一个。它还解决了依赖隔离的问题一个项目要用MySQL 5.7另一个项目要用MySQL 8.0以前你得考虑装哪个、要不要共存、怎么切来切去现在两个容器各跑各的互不干扰。还解决了团队协作的问题新人入职不用再花一个星期装环境给他一个Compose文件一条命令拉起整套服务。这些说法看起来有点广告但都是我真实体验过的结论。理解了Docker是干什么的下一步自然就是装。这一步也是很多人第一次被劝退的地方——尤其是Windows用户安装完Docker Desktop点启动却怎么都起不来心态直接崩。2. 安装DockerWindows和Linux两条路线上的坑我都踩过2.1 Windows装Docker Desktop虚拟化、WSL2和换盘位Windows上装Docker目前官方推荐的就是Docker Desktop它相当于一个带图形界面的Docker管理工具。安装包本身不难下载双击安装就完了真正的坎在启动阶段。我见过太多人卡在这样一个报错上Virtualization support not detected检测不到虚拟化支持。这个报错的原因很直接——Docker Desktop需要在Windows里运行一个轻量级虚拟机来承载容器而这个虚拟机依赖CPU的虚拟化功能。遇到这个提示先别急着重装按这个顺序排查按CtrlShiftEsc打开任务管理器切到“性能”选项卡看CPU那一栏右下角“虚拟化”这一项是“已启用”还是“已禁用”。如果是“已禁用”需要进BIOS把它打开不同主板路径不太一样通常是在Advanced或者Configuration菜单下找Intel Virtualization Technology或SVM Mode设为Enabled后保存重启。如果虚拟化已经启用还是报同样的错那多半是Hyper-V或者Windows虚拟机监控程序没开。在“控制面板-程序-启用或关闭Windows功能”里勾选“Hyper-V”和“适用于Linux的Windows子系统”重启电脑再试。还有一个很容易忽略的点Windows的“内核隔离-内存完整性”功能有时会和Docker Desktop冲突如果你开了这个建议先临时关掉试试。再说一个Windows用户经常问的问题Docker安装的时候默认装在C盘镜像和容器数据也都在C盘C盘空间不够怎么办Docker Desktop的新版本是支持通过WSL2来运行的而WSL2的虚拟磁盘文件一个vhdx格式的大文件默认存在C盘。想挪到其他盘正确做法不是直接改Docker Desktop的设置就完事而是在PowerShell里执行wsl --shutdown把WSL彻底停掉。用wsl --export docker-desktop-data d:\docker-desktop-data.tar导出当前数据。用wsl --unregister docker-desktop-data注销掉原来的分发版。再wsl --import docker-desktop-data d:\wsl\docker-desktop-data d:\docker-desktop-data.tar重新导入到D盘。做这一步要提前备份重要容器数据我第一次操作的时候就因为没停干净服务导致导出报错后来每次都是先wsl --shutdown再操作就再没出过问题。2.2 Ubuntu和CentOS安装apt源和yum源的选择Linux下安装Docker就清爽得多而且我更推荐直接用官方源不要让系统自带的旧版本干扰。Ubuntu上最省事的做法sudo apt update sudo apt install -y ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod ar /etc/apt/keyrings/docker.gpg echo \ deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release echo $VERSION_CODENAME) stable | \ sudo tee /etc/apt/sources.list.d/docker.list /dev/null sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin如果你的服务器是CentOS或者碰上了“CentOS 7升级Docker”的需求那就用yum源sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum install -y docker-ce docker-ce-cli containerd.io sudo systemctl start docker sudo systemctl enable docker这里要提醒一下有些老教程会让你用curl -fsSL https://get.docker.com | bash -这个脚本一键装。这个脚本本身没问题但它在国内服务器上经常因为网络原因下载超时。所以如果服务器在境内我更推荐你直接配好官方源再装或者用阿里云镜像源把上面命令里的download.docker.com换成mirrors.aliyun.com/docker-ce即可。装完之后输入docker version能同时看到Client和Server两段版本信息才说明Docker真的跑起来了。如果只看到Client、Server显示permission denied那是当前用户没权限连Docker守护进程把自己加进docker用户组就行sudo usermod -aG docker $USER newgrp docker2.3 离线环境安装把rpm/deb包“抱”进去有些生产环境是内网不能联网装Docker这种离线安装的坑我也填过。思路很简单在一台能联网的同系统机器上下载好全部安装包然后拷贝到内网机器上安装。在CentOS上用yumdownloader或者downloadonly插件把依赖包全拉下来拷过去后rpm -ivh --force安装。在Ubuntu上用apt download一个个拉依赖或者更省事的是在有网的机器上装好Docker后把整个/usr/bin下的docker相关二进制、/etc/docker配置一起打个tar包带过去。不过这种方式不推荐因为systemd服务文件、用户组这些容易漏。最稳妥还是离线rpm包集合装完再手动systemctl start docker。离线装完后如果还要在内网拉镜像就得部署一个私有镜像仓库。这里可以先用最简单的docker run -d -p 5000:5000 --name registry registry:2起一个本地仓库之后其他机器通过docker pull 内网IP:5000/镜像名来使用。如果团队规模大一点可以用Harbor功能全很多支持Web界面和权限管理。这个后面会再提。3. 镜像下载慢换源这件事值得专门研究3.1 为什么默认仓库这么慢以及加速器到底是什么原理装好Docker之后你执行docker pull mysql:8.0如果发现进度条半天不动不用怀疑这不是你网速问题而是Docker默认访问的Docker Hub镜像仓库在国内访问速度非常不稳定经常超时或断流。这个问题从Docker普及开始就一直存在。解决方案就是“换源”也就是配置镜像加速器。加速器的原理其实是提供了一些Docker Hub的同步镜像节点你拉镜像的时候实际是从这些节点下载速度快得多。常见的加速器地址有阿里云容器镜像服务提供的专属加速器每个人都有一个独立的地址用阿里云账号登录控制台就能看到、中科大镜像、网易镜像等。注意这些加速器地址可能随时间变化如果某个失效了就换成其他可用源。配置方式极其简单Linux上编辑/etc/docker/daemon.json没有就新建Windows上在Docker Desktop的设置里也能找到镜像配置入口本质改的是同一个文件。3.2 daemon.json配置镜像加速和私有仓库共存你需要在这个JSON文件里加上registry-mirrors字段把要用的镜像加速地址填进去。比如{ registry-mirrors: [ https://docker.m.daocloud.io, https://dockerproxy.com ] }改完保存重启Docker才能生效sudo systemctl daemon-reload sudo systemctl restart docker重启后可以用docker info看Registry Mirrors字段如果显示了你填的地址说明配置成功了。这里还要提醒一个容易踩的坑如果你自己搭了私有仓库千万别把registry-mirrors和insecure-registries搞混。registry-mirrors是给Docker Hub做镜像加速用的私有仓库地址要写在insecure-registries里特别是HTTP协议或者自签名证书的仓库否则你访问私有仓库会被拦下来。我见过有人把私有仓库地址写进registry-mirrors结果半天没生效还以为是自己仓库的问题。3.3 换完源还是慢/拉取超时的排查顺序配置完镜像加速之后如果你发现拉取速度还是很慢要按照这个顺序排查先确认配置真的生效了docker info里有没有显示你配置的加速器地址。没有显示就说明daemon.json放错位置或格式有问题。确认当前确实是从加速器源拉取而不是走了默认源。你可以docker pull一个不存在的镜像名看报错信息里的仓库地址是不是你配置的加速器域名。如果确认走了加速器还是慢那就是加速器本身带宽或连通性的问题换个加速器地址再试。用docker pull前先docker search如果search都卡住说明网络连通性有问题检查防火墙和DNS。另外一个降低等待时间的技巧用小镜像替代大镜像。比如mysql:8.0官方镜像体积不小但有mysql:8.0-oracle、mysql:8.0-debian等不同变体体积差异很大Java应用的镜像选择基础镜像时优先考虑eclipse-temurin而不是openjdk能瘦身不少。别小看这个内网环境拉一个几百MB的镜像和拉一个几十MB的镜像完全不是一个体验。4. MySQL 8.0实战一个容器还不够持久化和配置都要管4.1 拉镜像和启动容器很多新手第一次跑容器都是照着这样的命令敲docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD123456 mysql:8.0这条命令确实能把MySQL跑起来但如果你只做到这一步后面容器一删数据全没了配置文件想改也改不了。所以我的建议是从第一次跑MySQL容器开始就养成挂载数据卷和配置文件的习惯。数据卷volume是Docker用来持久化数据的一种方式可以简单理解成容器和宿主机之间的一个共享文件夹。容器里MySQL写的所有数据实际上都落在宿主机的指定目录里即使容器被删掉数据还在。这样做有什么好处比如你要升级MySQL镜像可以放心地删掉旧容器用新镜像重新创建一个容器数据不会丢。这对数据库这种有状态的应用来说是必备的。我实际用的命令长这样docker run -d \ --name mysql8 \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORDMyPssw0rd \ -e TZAsia/Shanghai \ -v /data/mysql/conf:/etc/mysql/conf.d \ -v /data/mysql/data:/var/lib/mysql \ --restartalways \ mysql:8.0 --character-set-serverutf8mb4 --collation-serverutf8mb4_unicode_ci来解释一下这些参数-d后台运行。--name给容器起个名字后面管理起来方便。-p 3306:3306把宿主机的3306端口映射到容器的3306端口这样外部才能访问到MySQL。-e MYSQL_ROOT_PASSWORD设置root密码。这里有个细节MySQL 8.0镜像在第一次创建容器时会读取这个环境变量来初始化root账户的密码如果这个变量不设置容器可能直接退出。-e TZAsia/Shanghai设置时区不然MySQL容器默认是UTC时间和本地时间差8个小时你查日志和数据时间会乱掉。-v /data/mysql/conf:/etc/mysql/conf.d把宿主机的配置目录挂载进容器你之后想改字符集、改隔离级别、改最大连接数写一个文件放进去重启就生效。-v /data/mysql/data:/var/lib/mysql把MySQL的数据目录挂载到宿主机数据持久化的关键。--restartalwaysDocker守护进程重启或服务器重启后这个容器会自动启动省心。最后面的--character-set-serverutf8mb4 --collation-serverutf8mb4_unicode_ci是MySQL服务端的启动参数直接指定字符集和排序规则。utf8mb4和utf8的区别一定要知道utf8在MySQL里是阉割版最多只支持3字节的字符像emoji表情、某些生僻字它存不了会报错utf8mb4才是完整的UTF-8能存4字节字符。现在的项目一律用utf8mb4准没错。启动后怎么验证docker ps能看到容器状态是Up然后docker exec -it mysql8 mysql -uroot -p进入MySQL命令行输入密码看看版本号。4.2 数据卷与备份迁移容器用久了你可能会遇到要迁移数据库的服务器的情况。这时候只要宿主机上/data/mysql/data这个目录还在把整个目录拷贝到新服务器同样的位置然后用同样的命令再起一个容器数据就全回来了。这就是数据卷带来的最大好处。如果你想手动备份某个数据库进容器里用mysqldump即可docker exec mysql8 sh -c exec mysqldump -uroot -p$MYSQL_ROOT_PASSWORD --databases testdb /data/backup/testdb.sql这里我特别说一下不要把$MYSQL_ROOT_PASSWORD写成-pMyPssw0rd直接拼在命令里因为在容器内执行命令时进程列表里能看到完整的环境变量和命令行参数存在一定的安全隐患。用环境变量传密码能降低密码泄露风险。恢复也简单把SQL文件拷贝进容器再用mysql命令执行docker exec -i mysql8 mysql -uroot -pMyPssw0rd /data/backup/testdb.sql4.3 中文乱码和字符集排查MySQL 8.0容器如果字符集没设对会出现中文乱码典型的表现是程序里写入的数据是中文但查询出来是???。排查思路是进容器查看当前字符集docker exec -it mysql8 mysql -uroot -p -e show variables like character%;。重点看character_set_server和character_set_database。如果是latin1或utf8注意这里指的就是那个阉割版utf8就说明你启动容器时没加字符集参数或者配置文件没生效。最简单的修复方式在之前挂载的/data/mysql/conf目录下新建一个配置文件比如charset.cnf写上[mysqld] character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci然后docker restart mysql8即可。这种“通过挂载目录改配置再重启”的模式在容器化部署里非常常见用到Redis、Nginx等中间件时思路完全一样。早点养成这种习惯后面能少走很多弯路。5. Redis主从两条命令搭出主从再说说配置挂载5.1 跑一个最简主从Redis也是Docker用得最多的中间件之一。单节点跑Redis非常简单docker run -d --name redis -p 6379:6379 redis:7但生产环境一般不搞单点至少要做一个主从复制。用Docker搭Redis主从比你在裸机上装两个Redis要快得多。先起一个主节点docker run -d --name redis-master -p 6379:6379 redis:7 --requirepass masterpassword再起一个从节点docker run -d --name redis-slave -p 6380:6379 redis:7 \ --replicaof 宿主机IP 6379 \ --masterauth masterpassword注意--replicaof后面的IP不能写localhost或127.0.0.1因为在容器内部localhost指向的是容器自己而不是宿主机。要从容器里访问宿主机的服务正确的地址是你的局域网IP或者使用Docker提供的特殊DNS名称host.docker.internalWindows和macOS上默认支持Linux上需要在启动时加--add-hosthost.docker.internal:host-gateway。起完之后怎么验证主从是否成功执行docker exec -it redis-slave redis-cli -a masterpassword info replication看输出里role:slave和master_link_status:up这两个字段。master_link_status是up才说明主从连接正常如果是down大概率是--replicaof的地址写错了或者--masterauth的密码和主节点的requirepass不一致。5.2 持久化与配置文件挂载Redis容器跑起来之后数据的持久化也是一个关键点。Redis默认是有RDB持久化的但如果你想自定义持久化策略、开启AOF建议还是通过挂载配置文件来做。做法是先在宿主机准备一个redis.conf然后把文件挂载进容器并指定Redis启动时加载它docker run -d --name redis-master \ -p 6379:6379 \ -v /data/redis/redis.conf:/etc/redis/redis.conf \ -v /data/redis/data:/data \ redis:7 redis-server /etc/redis/redis.conf这里有个大坑我踩过之后记忆深刻如果你挂载了配置文件但配置文件和官方默认配置差别很大比如没有daemonize noRedis容器必须是前台运行一旦daemonize yes容器会立刻退出、没有指定bind 0.0.0.0或者没有protected-mode no那么Redis可能起不来或者容器起来了但外部连不上。所以挂载配置文件时最好基于官方配置文件去改不要自己从零写一个。我一般先执行一次不带挂载的docker run把默认配置方式跑通再从容器的/etc/redis/redis.conf拷贝一份出来作为宿主机的修改基准。5.3 主从验证思维主从搭好之后不少人只看了master_link_status:up就以为万事大吉其实还应该实际写入、实际读取来验证。正确姿势是在主节点写一个测试键docker exec -it redis-master redis-cli -a masterpassword set test hello。去从节点读docker exec -it redis-slave redis-cli -a masterpassword get test能读到hello说明数据同步没问题。再确认一下从节点是只读的在从节点执行set test2 world应该会返回READONLY错误因为默认配置下从节点是只读的。这套“写主读从、从节点只读”的验证流程能帮你快速判断复制链路是否真的可用而不仅仅是看状态字段。6. Docker Compose把多容器环境变成“一条命令”6.1 什么时候该上Compose当你需要同时运行多个容器的时候比如一个项目既要有MySQL又要有Redis还可能要Nginx和后端应用再手动一个一个docker run每次都要记一堆参数效率低且容易出错。这时候就该用Docker Compose。Compose的本质是把多个容器的配置写在一个YAML文件里然后一条命令全部启动。它还有一个好处Compose会自动创建一个专用的网络服务之间可以直接通过服务名互相访问不需要通过宿主机IP和映射端口。这就解决了容器间通信的很多麻烦。比如后端容器里要连数据库直接写jdbc:mysql://mysql8:3306/testdb就行mysql8就是Compose服务名Compose内部的DNS会自动解析到那个容器的IP。6.2 一个mysqlredis组合示例我来写一个我常用的docker-compose.yml示例覆盖MySQL和Redisversion: 3.8 services: mysql8: image: mysql:8.0 container_name: mysql8 restart: always environment: MYSQL_ROOT_PASSWORD: MyPssw0rd TZ: Asia/Shanghai ports: - 3306:3306 volumes: - /data/mysql/conf:/etc/mysql/conf.d - /data/mysql/data:/var/lib/mysql command: - --character-set-serverutf8mb4 - --collation-serverutf8mb4_unicode_ci redis7: image: redis:7 container_name: redis7 restart: always ports: - 6379:6379 volumes: - /data/redis/data:/data command: redis-server --appendonly yes在这个文件所在目录执行docker compose up -d两个服务就一起起来了。这个-d参数是后台运行不加的话会前台输出所有容器的日志。docker compose ps查看状态docker compose logs -f mysql8查看某个服务的实时日志docker compose down停掉所有服务。如果配置文件有改动重新执行docker compose up -d即可Compose会自动重建配置有变化的容器。有一点要注意version: 3.8这个字段在新版Compose里已经不再是必填项了写上也不会报错但不写也完全没问题。网上很多旧教程都带这个字段如果你用的是新版Docker Desktop内置的Compose v2可以直接省略。6.3 环境变量文件与团队协作Compose还有一个我很喜欢的能力通过.env文件来管理环境变量避免把密码直接写在YAML文件里提交到代码仓库。比如同目录下建一个.env文件MYSQL_ROOT_PASSWORDMyPssw0rd MYSQL_TZAsia/Shanghai然后在docker-compose.yml里引用${MYSQL_ROOT_PASSWORD}。这样密码只存在于本地的.env文件和YAML配置分离团队协作时可以把.env.example提交上去大家自己填自己的密码。如果你带着团队一起用Compose我建议把docker-compose.yml模板放在项目仓库里新成员拉下来改一下.env就能跑起来整个环境。配合前面说的镜像加速和私有仓库基本上可以做到从一台裸机到完整开发环境只需要十分钟。7. 容器运维和排错这些报错你不遇到一两次不算用过Docker7.1 权限问题Permission denied、docker.sock 和用户组先说说最常见的一类问题Docker权限错误。Linux下刚装完Docker执行docker ps如果提示permission denied while trying to connect to the Docker daemon socket说明当前用户没有访问Docker守护进程的权限。Docker客户端本质上就是通过/var/run/docker.sock这个Unix套接字和Docker守护进程通信的这个套接字的默认属主是root只有root用户和docker用户组成员能访问。解决方式是我在前面说过的sudo usermod -aG docker $USER newgrp dockernewgrp docker的作用是让当前会话立即切换到新的用户组不需要退出重新登录这个细节很多人不知道以为改完要重启机器。顺便说一句如果某个容器里需要调用Docker命令比如你在容器里跑CI、跑构建工具常见的做法是把宿主机的/var/run/docker.sock挂载进容器。这样容器内的Docker客户端就能和宿主机的守护进程通信。但这个操作等同于把宿主机的root控制权交出去风险很大只在可信环境中这么干。7.2 npipe连接失败Windows上的经典故障Windows用户如果用过WSL2模式跑Docker或者升级过Docker Desktop大概率见过这样一个报错failed to connect to the docker api at npipe:////./pipe/dockerdesktop-linux: context deadline exceeded它的大概意思是Docker客户端无法通过Windows命名管道连接到Docker Desktop的引擎。我第一次遇到这个报错的时候第一反应是重装Docker Desktop结果白折腾了一晚上。后来总结出最有效的排查顺序先看Docker Desktop右下角托盘图标是啥状态。如果图标是半灰的说明引擎没起来先点菜单里的“Restart”重启。如果重启还是不行去任务管理器把所有的Docker相关进程Docker Desktop.exe、com.docker.backend.exe等全部结束再用管理员身份重新打开Docker Desktop。检查WSL2的发行版状态。在PowerShell里执行wsl --list --verbose查看docker-desktop和docker-desktop-data两个分发版的状态是否为Running。如果状态异常执行wsl --shutdown之后重新打开Docker Desktop。还不行的话清除Docker Desktop的缓存和日志。有些版本的Docker Desktop在数据损坏后会卡在这个问题上。路径一般是%APPDATA%\Docker下的相关目录清理前记得备份重要数据。最后可以考虑卸载重装。但我很少走到这一步绝大多数情况前面三步就能解决。Windows下Docker服务启动失败的另一个高频原因是Windows版本或WSL2内核太旧更新到最新版本后这个问题会少很多。7.3 Kafka的metadata报错容器启动成功了但客户端连不上再有就是很多人在Docker里跑Kafka时遇到的一个经典报错搜一下能搜到大量相关帖子Error while fetching metadata with correlation id ...。这个报错的现象是Kafka容器本身起来了但客户端去连接的时候拉不到metadata于是报这个错。我排查这个问题的思路是Kafka的broker注册到Zookeeper的时候用的是一组advertised.listeners而客户端要去访问broker必须知道这个地址。如果advertised.listeners配置成了容器内部的hostname比如kafka:9092宿主机上的客户端去连的时候就找不到这个主机名自然报错。解决方式是显式指定宿主机可访问的地址environment: KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://你的宿主机IP:9092如果是用Docker Compose编排的Kafka集群还要注意broker ID、Zookeeper连接地址等配置的一致性。这类问题的本质就是“容器内外网络地址不一致”同样的思路也适用于其他会做地址注册的服务比如Eureka、Nacos等。7.4 GitLab这类重量级容器内存、端口和挂载策略Docker部署GitLab是我经常被问到的一个需求。GitLab算是个重量级应用动辄占用好几个G的内存所以部署前一定要关注机器的资源配置。我这边的建议配置至少4核8G如果内存不足跑起来会频繁OOM表现成页面打不开、500错误排查起来头大。部署命令大致是这样docker run -d \ --name gitlab \ --hostname gitlab.example.com \ -p 8443:443 -p 8080:80 -p 2222:22 \ -v /data/gitlab/config:/etc/gitlab \ -v /data/gitlab/logs:/var/log/gitlab \ -v /data/gitlab/data:/var/opt/gitlab \ --restartalways \ gitlab/gitlab-ce:latest这里有几个细节--hostname最好设置成你实际要访问的域名不然后续Git仓库的克隆地址会显示成容器IDSSH端口映射我特意映射到2222为了避免和宿主机已有的22端口冲突第一次启动GitLab会比较慢要等好几分钟你可以docker logs -f gitlab盯着日志看到gitlab Reconfigured!相关字样基本上就完成了。有些人在安装GitLab前会习惯性去看“docker里面有没有饭店点餐那样”的东西——意思是图形化管理界面。有这就是Portainer。你用docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer跑一个出来就能在网页上看到所有容器的运行状态、日志、执行命令行入口对不太习惯命令行的朋友特别友好。但它只是管理工具不能替代你真懂Docker命令。7.5 青龙面板和依赖管理容器里跑定时任务的典型玩法青龙面板qinglong是一个定时任务管理工具很多人拿它在Docker里跑签到、定时脚本之类的东西。部署很简单docker run -d \ --name qinglong \ -p 5700:5700 \ -v /data/qinglong/config:/ql/config \ -v /data/qinglong/log:/ql/log \ -v /data/qinglong/data:/ql/data \ -e QL_PORT5700 \ --restartalways \ whyour/qinglong:latest跑起来之后浏览器访问http://宿主机IP:5700进入Web面板。但青龙面板常见的坑在“依赖管理”这一块你写的脚本需要某些Python或Node依赖但容器里没有脚本一运行就报ModuleNotFoundError。解决办法有两种在青龙面板的“依赖管理”页面里添加需要安装的依赖比如requests、axios等它会在容器内自动执行安装。更推荐的方式自己基于官方镜像重新打一个镜像把脚本需要的依赖提前装进去避免每次新建容器都要重新装。写一个Dockerfile把pip install -r requirements.txt或npm install的过程固化下来。顺带一提如果你想让青龙面板的脚本跑得更稳定给容器加上--restartalways同时给宿主机配置好时区因为定时任务的cron表达式对时区很敏感。7.6 PHP应用打包镜像Dockerfile不只是把代码拷进去最后再说一个和开发紧密相关的场景用Docker打包PHP应用镜像。很多人第一次写Dockerfile就是基于php:8.1-apache然后把代码拷贝进去。基础做法没错但直接拷贝的话扩展没装、目录权限不对、配置文件没改都可能导致运行环境有坑。我常用的PHP Dockerfile是这样FROM php:8.1-apache RUN docker-php-ext-install pdo_mysql mysqli \ docker-php-ext-enable pdo_mysql mysqli \ a2enmod rewrite COPY . /var/www/html/ RUN chown -R www-data:www-data /var/www/html \ chmod -R 755 /var/www/html/storage/logs几个要点PHP官方镜像里自带docker-php-ext-install、docker-php-ext-enable这些辅助脚本装扩展用它比直接用apt装再改php.ini要规范得多。别忘了a2enmod rewrite很多PHP框架比如Laravel、ThinkPHP的路由都依赖Apache的mod_rewrite不开启这个页面直接404。写权限目录要提前设置好尤其是log目录和upload目录。我用把多个RUN指令连在一起还有一个好处减少镜像层数构建出来的镜像更小构建速度也更快。构建和运行是这样docker build -t my-php-app:latest . docker run -d -p 8080:80 --name my-php-app my-php-app:latest构建时如果你的机器上镜像下载慢记得在前面先配好镜像加速否则光基础镜像就能让你等得怀疑人生。最后再分享一点我的体会写过这么多容器踩过这么多坑之后我最大的体会是Docker的学习曲线不在于记命令而在于建立一种“容器思维”——装什么软件之前先想清楚它需不需要持久化、需不需要和宿主机共享配置、需不需要固定网络、需不需要开机自启。这套思维一旦建立起来你部署任何新服务都会变得非常顺手。还有一个小技巧想分享给刚开始用Docker的人养成用docker inspect看容器详细信息的习惯。比如某个容器起不来docker logs看不出有效信息时docker inspect里会给出错误码、健康检查结果、挂载配置、网络配置等大量细节。我之前排查过很多看起来莫名其妙的报错最后都是靠docker inspect找到真正原因的。如果你现在刚开始接触Docker不要把这篇提到的所有内容一次性都记住先跑通一个MySQL再跑通一个Redis然后试着用Compose把两个串起来最后再回到这里对照排查指南。遇到报错不要慌Docker的报错信息虽然有时候看起来吓人但绝大多数都能归到网络、权限、配置三个大类里。按这个思路去查基本上都能解决。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

STEP7 MicroWIN SMART V2.6安装与联机:从解压报错到通信异常的完整排查指南 2026/9/10 0:10:45

STEP7 MicroWIN SMART V2.6安装与联机:从解压报错到通信异常的完整排查指南

简介:西门子STEP 7 MicroWIN SMART V2.6是面向S7-200 SMART系列PLC的官方编程与配置软件,适合工业自动化工程师进行从基础逻辑编写到复杂流程控制的项目开发,也可用于设备调试和运维。相比旧版本,该版本新增了Web服务器功能&#…

阅读更多 →
后端邮件验证码模块实践:安全设计、防刷策略与踩坑排查 2026/9/10 0:10:45

后端邮件验证码模块实践:安全设计、防刷策略与踩坑排查

做后端开发这些年,邮件验证码是几乎绕不开的一个功能模块。不管是用户注册、登录保护、找回密码,还是改绑邮箱、风控验证,邮箱验证码总是以各种姿势出现在业务链路里。这个功能乍一看很简单,就是生成几个数字、发一封邮件、再比对…

阅读更多 →
SecureCRT v9.6.2-3540实际使用指南:SSH终端模拟器的会话管理与自动化技巧 2026/9/10 0:10:45

SecureCRT v9.6.2-3540实际使用指南:SSH终端模拟器的会话管理与自动化技巧

简介:这是一份面向网络管理员、运维工程师与开发者的SecureCRT v9.6.2中文汉化移动注册版工具包,解决英文原版界面不友好和安装部署繁琐的问题,内置汉化组件及注册许可,并额外提供单文件版本便于随身携带与快速调用。压缩包内共12…

阅读更多 →
OpenClaw browser工具:给AI Agent装上眼睛,实现网页自动化操作 2026/9/10 0:10:45

OpenClaw browser工具:给AI Agent装上眼睛,实现网页自动化操作

1. 从“养龙虾”到给Agent装上一双眼睛:browser工具到底解决的什么问题 如果你一路跟着这个“个人游戏笔记本免费养龙虾”系列读过来,会发现我们一直在做的一件事,就是把一台普普通通的游戏本变成一台能自己干活、自己跑任务的AI Agent主机。…

阅读更多 →
微博私信管理效率工具:石青软件1.1.2.0功能实战测评 2026/9/10 0:10:45

微博私信管理效率工具:石青软件1.1.2.0功能实战测评

简介:石青微博私信软件1.1.2.0是一款面向微博运营与营销人群的私信群发工具,支持登录、搜索与批量私信等核心操作。此次升级重构登录算法,并更新搜索算法,提升账号交互稳定性与用户检索效率;同时移除IP精灵&#xff0c…

阅读更多 →
mise tasks 命令全解:列任务、看依赖图、校验与一键添加 2026/9/10 0:07:45

mise tasks 命令全解:列任务、看依赖图、校验与一键添加

mise tasks 命令全解:列任务、看依赖图、校验与一键添加 【免费下载链接】mise dev tools, env vars, task runner 项目地址: https://gitcode.com/GitHub_Trending/mi/mise 本文基于当前仓库 docs/cli/tasks.md 官方命令参考,结合 src/cli/tasks…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞