Docker容器化保姆级教程:从环境搭建到应用部署,零基础也能轻松上手

Docker容器化保姆级教程:从环境搭建到应用部署,零基础也能轻松上手 一

文章目录CloseOpen

如果你也被这些问题折磨过,今天这篇Docker教程就是为你准备的。我保证不用任何复杂术语,纯大白话带你从0到1搞定容器化——从环境搭建到部署应用,每个步骤都配着我踩过的坑和解决办法。上个月我刚用这套方法教我媳妇(她是做设计的,纯技术小白)部署了她的个人作品集网站,她跟着步骤走,1小时就搞定了。所以别担心自己基础差,跟着做,你也行。

Docker环境搭建:从安装到核心概念,手把手带你入门

很多人一听”容器化”就觉得高深,其实Docker本质上就是个”打包神器”——把你的应用和它需要的所有环境(比如Java、MySQL、配置文件)打包成一个”集装箱”,不管放到哪台电脑上,这个”集装箱”都能原样运行。就像你带外卖,不管是骑电动车还是坐地铁,只要餐盒(容器)没坏,里面的饭菜(应用)就还是那个味道。

不同系统的Docker安装指南(避坑版)

先搞定安装,这一步看似简单,但我见过80%的新手都在这里卡壳。不同系统的安装方法不一样,我把Windows、Mac、Linux最稳妥的步骤整理出来了,你照着做就行。

Windows用户注意

:如果你用的是Windows 10/11专业版/企业版,直接装Docker Desktop就行;但如果是家庭版,得先装WSL2(Windows的Linux子系统),不然Docker启动会报错。我去年帮同事装的时候,他就是家庭版没开WSL2,折腾了半小时才发现问题。具体步骤:

  • 先启用WSL2:按Win+X打开”应用和功能”,点”程序和功能”→”启用或关闭Windows功能”,勾选”适用于Linux的Windows子系统”和”虚拟机平台”,重启电脑。
  • 去微软商店搜”Ubuntu”下载安装(随便选个Linux发行版就行),打开Ubuntu初始化用户名密码。
  • 下载Docker Desktop,安装时勾选”Use WSL 2 instead of Hyper-V”,一路下一步,安装完成后启动,右下角出现鲸鱼图标就说明成功了。
  • 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个最核心的概念,不然后面命令再多也白搭。我用”点外卖”来比喻,保证你秒懂:

  • 镜像(Image):相当于外卖平台上的”菜品图片+制作配方”。比如”宫保鸡丁盖饭”的图片和怎么做这道菜的步骤(需要鸡肉、花生米、酱油等)。Docker里的镜像是一个只读的模板,包含了运行应用所需的代码、运行环境、库、配置文件等。你可以把它理解成”安装包”,比如nginx镜像就是Nginx服务器的安装包,mysql镜像就是MySQL数据库的安装包。
  • 容器(Container):相当于你实际收到的”外卖餐盒”。镜像是静态的”配方”,容器是镜像运行起来的动态实例。就像你点了宫保鸡丁(镜像),商家按照配方做好,装进餐盒(容器)递给你,你打开餐盒(启动容器)就能吃了。一个镜像可以生成多个容器,比如你可以同时点两份宫保鸡丁(两个容器),它们互不影响。
  • 仓库(Repository):相当于”外卖平台”。用来存放各种镜像的地方,最常用的是官方的Docker Hub(就像美团外卖),国内还有阿里云、腾讯云的镜像仓库(相当于饿了么)。你需要什么镜像,直接从仓库”点单”(拉取)就行。
  • 为了让你更清楚,我做了个表格对比镜像和容器的区别,保存下来以后忘了可以翻出来看:

    对比项 镜像(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小时。

    核心步骤

  • 拉取MySQL镜像docker pull mysql:8.0(指定8.0版本,避免最新版有兼容性问题)
  • 启动容器(关键是数据持久化)
  •  docker run -d 
    

    -p 3306:3306 # 端口映射(主机3306:容器3306)

    -e MYSQL_ROOT_PASSWORD=123456 # 设置root密码(改成你自己的)

    -v mysql-data:/var/lib/mysql # 数据卷挂载(关键!容器删了数据也不会丢)

    name my-mysql # 容器名

    mysql:8.0

    这里最关键的是

    -v mysql-data:/var/lib/mysqlmysql-data是数据卷(可以理解成电脑上的一个专门存数据的文件夹),把容器里MySQL的数据目录(/var/lib/mysql)挂载到这个数据卷。这样就算你把容器删了(docker rm my-mysql),只要数据卷还在,下次启动新容器时继续挂载这个数据卷,数据就还在。

    我之前有个同事没加

    -v参数,开发到一半觉得容器名不好听,删了重起,结果数据全没了,当场emo。所以记住:只要是需要持久化数据的服务(比如数据库、Redis),一定要挂载数据卷!
  • 验证连接:用Navicat或命令行连接
  • localhost:3306,用户名root,密码123456,能连上就说明成功了。

    案例3:Spring Boot应用容器化(后端开发核心技能)

    最后这个案例是后端开发的重头戏——把Spring Boot项目打包成Docker镜像部署。传统部署需要在服务器装JDK、配环境变量、上传jar包,现在用Docker,一步到位,而且环境绝对一致。

    我司现在所有Spring Boot项目都用Docker部署,上线时间从以前的"准备环境1小时+上传部署30分钟"缩短到"构建镜像5分钟+启动容器2分钟",效率提升了10倍都不止。

    步骤稍微多一点,但跟着做肯定能成第一步:准备Spring Boot项目和Dockerfile

    假设你已经有一个能正常运行的Spring Boot项目(比如一个简单的REST接口),先在IDEA里用

    mvn clean package打成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内核更新包安装。

    0
    显示验证码
    没有账号?注册  忘记密码?