
如果你也被这些问题折磨过,今天这篇Docker教程就是为你准备的。我保证不用任何复杂术语,纯大白话带你从0到1搞定容器化——从环境搭建到部署应用,每个步骤都配着我踩过的坑和解决办法。上个月我刚用这套方法教我媳妇(她是做设计的,纯技术小白)部署了她的个人作品集网站,她跟着步骤走,1小时就搞定了。所以别担心自己基础差,跟着做,你也行。
Docker环境搭建:从安装到核心概念,手把手带你入门
很多人一听”容器化”就觉得高深,其实Docker本质上就是个”打包神器”——把你的应用和它需要的所有环境(比如Java、MySQL、配置文件)打包成一个”集装箱”,不管放到哪台电脑上,这个”集装箱”都能原样运行。就像你带外卖,不管是骑电动车还是坐地铁,只要餐盒(容器)没坏,里面的饭菜(应用)就还是那个味道。
不同系统的Docker安装指南(避坑版)
先搞定安装,这一步看似简单,但我见过80%的新手都在这里卡壳。不同系统的安装方法不一样,我把Windows、Mac、Linux最稳妥的步骤整理出来了,你照着做就行。
Windows用户注意
:如果你用的是Windows 10/11专业版/企业版,直接装Docker Desktop就行;但如果是家庭版,得先装WSL2(Windows的Linux子系统),不然Docker启动会报错。我去年帮同事装的时候,他就是家庭版没开WSL2,折腾了半小时才发现问题。具体步骤:
Mac用户
:直接去Docker官网下载对应芯片的版本(分Intel芯片和Apple Silicon芯片,别下错了),拖到应用文件夹,启动后输入密码授权就行。我用的是M1 Mac,第一次装的时候下成了Intel版,启动后一直闪退,后来才发现芯片不对,大家注意看清楚文件名里的”arm64″(Apple Silicon)和”amd64″(Intel)。 Linux用户(以Ubuntu为例):命令行输入这几行就行,记得用sudo权限:
# 更新软件源
sudo apt-get update
安装依赖
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add
添加Docker软件源
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
安装Docker
sudo apt-get install -y docker-ce
启动Docker服务
sudo systemctl start docker
设置开机自启
sudo systemctl enable docker
装完后,打开命令行(Windows用PowerShell,Mac/Linux用终端),输入docker version
,如果能显示版本号(比如Docker version 24.0.5, build ced0996
),就说明安装成功了。
3个核心概念:镜像、容器、仓库(用”外卖”打比方)
装好了Docker,得先明白3个最核心的概念,不然后面命令再多也白搭。我用”点外卖”来比喻,保证你秒懂:
nginx
镜像就是Nginx服务器的安装包,mysql
镜像就是MySQL数据库的安装包。 为了让你更清楚,我做了个表格对比镜像和容器的区别,保存下来以后忘了可以翻出来看:
对比项 | 镜像(Image) | 容器(Container) |
---|---|---|
状态 | 静态(相当于安装包,不运行) | 动态(相当于运行中的软件,可操作) |
可修改性 | 只读(不能直接改,要改只能重新构建) | 可读写(运行中可以修改里面的文件,但容器删了修改也没了) |
占用空间 | 固定大小(比如nginx镜像约20MB) | 在镜像基础上增加运行时数据(比如日志、临时文件) |
常用命令 | 拉取:docker pull 镜像名 查看:docker images 删除:docker rmi 镜像ID |
启动:docker run 镜像名 查看运行中:docker ps 停止:docker stop 容器ID 删除:docker rm 容器ID |
新手必学的3个基础命令(记不住就抄)
装完环境、懂了概念,接下来就得动手操作了。不用记太多命令,先把这3个练熟,80%的场景都够用:
docker pull 镜像名:版本号
。比如拉取Nginx镜像:docker pull nginx:alpine
(:alpine
表示轻量级版本,比默认版本小很多,推荐用)。如果不写版本号,默认拉取latest
(最新版),但我 你指定版本,避免新版本有兼容性问题。 docker run [参数] 镜像名
。这是最核心的命令,参数有点多,但记住3个最常用的: -d
:后台运行(容器在后台跑,不占命令行窗口) -p 主机端口:容器端口
:端口映射(比如把容器的80端口映射到电脑的8080端口,这样你访问localhost:8080
就能到容器里的服务) name 容器名
:给容器起个名字(方便后续操作,比如name my-nginx
) 举个例子,启动一个Nginx容器:
docker run -d -p 8080:80 name my-nginx nginx:alpine
运行后,打开浏览器访问localhost:8080
,如果看到Nginx的欢迎页面,就说明成功了!
docker ps
(查看运行中的容器),docker ps -a
(查看所有容器,包括没运行的)。如果容器没启动成功,用docker logs 容器名
看日志,90%的问题日志里都写着呢。我之前启动MySQL容器,老是报错,看日志才发现密码里有特殊字符,改了密码就好了。 后端应用容器化部署:3个实战案例带你落地
学会了基础操作,接下来就是最爽的部分——用Docker部署实际项目。我选了3个后端开发最常用的场景,从简单到复杂,每个案例都配着详细步骤和我踩过的坑,你跟着做,保证能跑通。
案例1:5分钟部署静态网页(适合新手练手)
如果你有静态网页(比如HTML/CSS/JS写的官网、个人博客),用Docker部署简直不要太简单。传统方法需要装Nginx、配置虚拟主机,现在用Docker,5分钟搞定,连Nginx都不用手动装。
我媳妇的作品集网站就是纯静态的,之前让我帮她部署,我用传统方法搭Nginx,改配置文件、重启服务,折腾了半小时。后来用Docker,步骤简化到3步:
第一步:准备静态文件
把你的HTML、CSS、JS文件放到一个文件夹里(比如叫my-web
),假设里面有个index.html
。
第二步:写个Dockerfile
在my-web
文件夹里新建一个叫Dockerfile
(注意没有后缀名)的文件,复制下面的内容:
# 基础镜像用Nginx的轻量级版本(alpine版比默认版小80%)
FROM nginx:alpine
把当前文件夹的所有文件复制到Nginx的默认网页目录
COPY . /usr/share/nginx/html
暴露80端口(Nginx默认端口)
EXPOSE 80
这个文件的作用就是告诉Docker:”我要基于Nginx镜像,把我的静态文件放进去,然后开放80端口”。不用理解太深,照着抄就行,改都不用改。
第三步:构建镜像并启动容器
打开命令行,进入my-web
文件夹,执行:
# 构建镜像(-t 后面是镜像名,随便起,比如my-static-web)
docker build -t my-static-web .
启动容器(-p 8080:80表示把容器80端口映射到电脑8080端口)
docker run -d -p 8080:80 name my-web-app my-static-web
然后打开浏览器访问localhost:8080
,你的静态网页就出来了!是不是比传统方法快多了?
我踩过的坑
:第一次写Dockerfile时,我把COPY . /usr/share/nginx/html
写成了COPY . /usr/share/nginx
(少了/html
),结果访问页面403错误。后来进容器里一看(用docker exec -it my-web-app sh
进入容器命令行),发现文件复制错地方了,改了路径就好了。所以写路径时一定要仔细,不确定的话可以去Nginx官方文档查默认网页目录。
案例2:10分钟部署MySQL数据库(带数据持久化)
后端开发离不开数据库,用Docker部署MySQL比直接在电脑上装方便10倍——不用配环境变量、不用记安装路径,删除容器时只要做好数据备份,重装也不怕数据丢。
我团队现在开发环境的MySQL全用Docker部署,新人入职时,我就发给他一条命令,2分钟就能把数据库跑起来,比以前手动装MySQL省了至少1小时。
核心步骤
:
docker pull mysql:8.0
(指定8.0版本,避免最新版有兼容性问题) docker run -d
-v mysql-data:/var/lib/mysql-p 3306:3306 # 端口映射(主机3306:容器3306)
-e MYSQL_ROOT_PASSWORD=123456 # 设置root密码(改成你自己的)
-v mysql-data:/var/lib/mysql # 数据卷挂载(关键!容器删了数据也不会丢)
name my-mysql # 容器名
mysql:8.0
这里最关键的是
,
mysql-data是数据卷(可以理解成电脑上的一个专门存数据的文件夹),把容器里MySQL的数据目录(
/var/lib/mysql)挂载到这个数据卷。这样就算你把容器删了(
docker rm my-mysql),只要数据卷还在,下次启动新容器时继续挂载这个数据卷,数据就还在。
-v我之前有个同事没加
参数,开发到一半觉得容器名不好听,删了重起,结果数据全没了,当场emo。所以记住:只要是需要持久化数据的服务(比如数据库、Redis),一定要挂载数据卷!
localhost:3306验证连接:用Navicat或命令行连接 ,用户名root,密码123456,能连上就说明成功了。
mvn clean package案例3:Spring Boot应用容器化(后端开发核心技能)
最后这个案例是后端开发的重头戏——把Spring Boot项目打包成Docker镜像部署。传统部署需要在服务器装JDK、配环境变量、上传jar包,现在用Docker,一步到位,而且环境绝对一致。
我司现在所有Spring Boot项目都用Docker部署,上线时间从以前的"准备环境1小时+上传部署30分钟"缩短到"构建镜像5分钟+启动容器2分钟",效率提升了10倍都不止。
步骤稍微多一点,但跟着做肯定能成: 第一步:准备Spring Boot项目和Dockerfile假设你已经有一个能正常运行的Spring Boot项目(比如一个简单的REST接口),先在IDEA里用
打成jar包(在
target文件夹里,比如
demo-0.0.1-SNAPSHOT.jar)。
pom.xml然后在项目根目录(和
同级)新建
Dockerfile,内容如下:
dockerfile
构建阶段:用Maven镜像打包项目(这一步会下载依赖,可能慢一点,耐心等)
FROM maven:3.8-openjdk-11 AS builder
WORKDIR /app # 设置工作目录
COPY pom.xml . # 复制pom.xml(先复制pom.xml能利用Docker缓存,下次改代码不用重新下依赖)
RUN mvn dependency:go-offline # 下载所有依赖到本地
COPY src ./src # 复制源代码
RUN mvn package -DskipTests # 打包(-DskipTests跳过测试,加快速度)
运行阶段:用JRE镜像(比JDK小很多)
FROM openjdk:11-jre-slim
WORKDIR /app
从构建阶段复制jar包到当前目录(builder是上面的阶段名)
COPY from=builder /app/target/*.jar app.jar
启动命令(固定写法,改jar包名就行)
ENTRYPOINT [“java”, “-jar”, “app.jar”]
EXPOSE 8080 # 暴露项目端口(和你Spring Boot配置的server.port一致)
第二步:构建并启动容器
bash
构建镜像(-t 后面是镜像名,比如my-springboot-app)
docker build -t my-springboot-app .
启动容器(-p 8080:8080映射端口,name起名字)
docker run -d -p 8080:8080 name my-app my-springboot-app
第三步:验证
访问
localhost:80
我见过太多Windows家庭版的朋友卡在“WSL 2安装不完整”这个提示上了,其实这根本不是什么大问题,就是系统少了点必要的组件。你先别急着百度乱搜教程,按我踩过的坑来,保准能解决。第一步肯定是启用WSL2功能,这玩意儿就像Docker的“地基”——你得先把地基打好,楼才能盖起来。具体操作就是打开控制面板(找不到的话按Win+R输入“control”回车),点“程序”,再点“启用或关闭Windows功能”,这时候会弹个大窗口,你在里面找到“适用于Linux的Windows子系统”和“虚拟机平台”这两项,前面的方框都打上勾,然后点确定。这一步做完一定要重启电脑,别嫌麻烦,我之前图省事没重启,结果Docker还是报错,白折腾半天。
重启完电脑还没完,你得给这个“地基”配个“地面”——也就是装个Linux子系统。打开微软商店,直接搜“Ubuntu”就行,选那个最新的LTS版本(比如Ubuntu 22.04 LTS),下载安装。安装完第一次打开的时候,它会让你设置用户名和密码,这里提醒一句,用户名别用中文,密码记牢了(输的时候屏幕上不显示,输完回车就行),后面操作Linux子系统可能会用到。弄好这些再启动Docker Desktop,一般情况下那个讨厌的提示就消失了。要是还不行,十有八九是WSL2的内核版本太低,你去微软官网搜“WSL2内核更新包”,下载那个后缀是msi的文件,双击安装,装完再重启Docker,基本就能搞定。我上个月帮我表弟弄的时候,他就是少了内核更新这一步,折腾了快半小时才发现问题所在。
Docker和虚拟机有什么区别?
简单说,Docker是“轻量级虚拟机”。虚拟机需要模拟整个操作系统(比如装个Windows系统),启动慢、占资源多;而Docker共享主机的操作系统内核,只打包应用和必要依赖,启动快(1-2秒就能启动)、体积小(一个Nginx容器才20MB左右)。如果你只是部署应用,优先选Docker;如果需要完全隔离的操作系统环境(比如同时跑Windows和Linux),再考虑虚拟机。
容器停止或删除后,里面的数据会丢失吗?
默认会丢失。容器本身是临时的,停止或删除后,里面的临时数据(比如日志、缓存)会跟着消失。但你可以用“数据卷”(文章案例2提到的-v参数)把容器内的重要数据(比如MySQL数据库文件)挂载到主机上,这样即使容器删了,数据也会保存在主机的硬盘里。记得部署数据库、文件存储类应用时,一定要加数据卷挂载!
如何更新容器里的应用?比如代码改了要重新部署
分两步:先重新构建镜像(用docker build命令,基于更新后的代码生成新镜像),再停止旧容器、启动新容器。举个例子:假设你改了Spring Boot代码,先mvn package重新打jar包,然后docker build -t my-springboot-app:v2 .构建新版本镜像,接着docker stop my-app停止旧容器,docker rm my-app删除旧容器,最后docker run -d -p 8080:8080 name my-app my-springboot-app:v2启动新容器。
Docker用久了磁盘空间越来越大,怎么清理?
可以用Docker自带的清理命令:docker system prune,它会删除没用的镜像、容器、网络和缓存数据(注意:运行中的容器不会被删)。如果想更彻底,加-a参数:docker system prune -a,会删除所有未使用的镜像(包括没打标签的)。我自己每周会跑一次docker system prune -a,能释放10-20GB空间,亲测有效。
Windows系统启动Docker Desktop时提示“WSL 2安装不完整”怎么办?
这是Windows家庭版常见问题,按文章“Windows用户注意”部分的步骤操作:先启用WSL2(控制面板→程序→启用或关闭Windows功能,勾选“适用于Linux的Windows子系统”和“虚拟机平台”),重启电脑后,去微软商店下载Ubuntu、Debian等Linux发行版并安装,打开Linux子系统初始化用户名密码,最后重新启动Docker Desktop即可。如果还报错,去微软官网下载WSL2内核更新包安装。