Docker从安装到代码打包到部署云服务器全过程保姆级教程
核心说明:本教程面向新手,全程无复杂命令,每一步均附操作截图级说明,覆盖「Windows10/11、Mac、Linux」三大系统Docker安装,「Python/Java/前端」通用代码打包,「阿里云/腾讯云」服务器部署,同时整合常见报错解决,确保全程可复现。
前置要求:Windows需Win10/11专业版(家庭版需额外配置,下文附解决方法);Mac需macOS 10.15+;Linux优先Ubuntu 20.04/22.04(最适配Docker)。
1. 以「管理员身份」打开「PowerShell」(按下Win+X,选择“Windows终端(管理员)”);
2. 输入以下两条命令,开启WSL2(Windows子系统,Docker依赖此功能),每条命令输入后按回车,等待执行完成:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
3. 重启电脑(必须重启,否则功能不生效);
4. 下载WSL2内核更新包(解决Docker启动报错),下载地址:WSL2内核更新包,下载后双击安装,一路下一步即可。
1. 下载地址(官网,国内可直接访问):Docker Desktop for Windows;
2. 双击安装包,勾选「Use WSL 2 instead of Hyper-V」(重点,避免Hyper-V冲突),其余默认下一步,安装完成后点击「Close and restart」;
3. 重启后,Docker会自动启动,桌面右下角出现Docker图标(白色鲸鱼),等待图标停止闪烁(约1-2分钟),说明启动成功。
1. 打开PowerShell,输入命令:docker --version,若输出类似「Docker version 26.0.0, build 2ae903e」,说明版本正常;
2. 输入命令:docker run hello-world,若输出「Hello from Docker!」相关内容,说明Docker能正常运行(首次执行会自动下载hello-world镜像,耐心等待)。
若为Win10/11家庭版,无法直接开启Hyper-V,需先安装「Hyper-V激活工具」,百度搜索“Hyper-V家庭版激活”,下载后以管理员身份运行,激活后再按上述步骤操作即可。
1. 下载地址:Docker Desktop for Mac,根据自己的芯片选择(Intel芯片选Intel版本,M1/M2/M3芯片选Apple Silicon版本);
2. 下载后双击.dmg文件,将Docker拖到「应用程序」文件夹中。
1. 打开「应用程序」,找到Docker,双击启动,首次启动会提示“是否允许Docker使用系统权限”,点击「允许」;
2. 等待Docker启动(图标停止闪烁),打开「终端」,输入命令:docker --version,输出版本信息即正常;
3. 输入命令:docker run hello-world,输出正常说明安装成功。
1.3 Linux系统(Ubuntu 20.04/22.04)安装
Linux系统安装最简洁,全程终端命令操作,无需图形界面。
sudo apt update
sudo apt upgrade -y
sudo apt install -y ca-certificates curl gnupg lsb-release
步骤3:添加Docker官方镜像源(国内加速,避免下载缓慢)
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/trusted.gpg.d/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) 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
sudo systemctl start docker
sudo systemctl enable docker
docker --version
docker run hello-world
补充:若执行docker命令时提示“权限不足”,无需每次加sudo,执行以下命令(重启终端生效):
sudo usermod -aG docker $USER
newgrp docker
1.4 通用优化:配置国内镜像加速(必做,解决下载镜像缓慢)
Docker默认镜像源在国外,国内下载速度极慢,配置国内加速源后,下载速度可提升10倍以上。
1. 打开Docker Desktop,点击右上角「设置」(齿轮图标);
2. 找到「Docker Engine」,在右侧输入框中添加加速源,替换原有内容(注意格式正确,逗号分隔):
{
"registry-mirrors": [
"https://docker.mirrors.aliyun.com",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
3. 点击「Apply & Restart」,重启Docker后生效。
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.mirrors.aliyun.com",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
验证加速是否生效:输入docker info,找到「Registry Mirrors」,显示配置的加速源即成功。
第二部分:本地代码打包成Docker镜像(通用教程,适配所有语言)
核心逻辑:编写Dockerfile(告诉Docker如何构建镜像)→ 构建镜像 → 测试镜像,以「Python Flask项目」为例(Java、前端项目仅需修改Dockerfile,下文附差异说明)。
创建一个单独的项目文件夹(避免中文路径),结构如下(以Flask项目为例):
my_flask_project/ # 项目根目录
├── app.py # 核心代码(Flask入口文件)
├── requirements.txt # 项目依赖(如flask==2.0.1)
└── Dockerfile # 重点,需手动创建,无后缀名
1. app.py(Flask简单示例,可替换为自己的代码):
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello Docker! 部署成功!"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000) # 必须写host=0.0.0.0,否则容器外无法访问
2. requirements.txt(项目依赖,通过命令生成:pip freeze > requirements.txt):
flask==2.0.1
打开项目根目录,新建「Dockerfile」文件(无后缀名,注意首字母大写),复制以下内容,每一行均附注释,可根据自己的项目修改:
# 1. 指定基础镜像(必须,选择对应语言的基础镜像,轻量化优先)
# Python项目用python:3.9-alpine(alpine版本体积小,适合部署)
FROM python:3.9-alpine
# 2. 设置工作目录(容器内的目录,后续命令均在此目录执行)
WORKDIR /app
# 3. 复制项目依赖文件到容器工作目录(先复制依赖,再复制代码,可利用Docker缓存,加快构建速度)
COPY requirements.txt .
# 4. 安装项目依赖(国内镜像加速,避免安装缓慢)
RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# 5. 复制项目所有代码到容器工作目录
COPY . .
# 6. 暴露端口(必须,和代码中port一致,仅声明端口,不实际映射)
EXPOSE 5000
# 7. 容器启动时执行的命令(启动项目,和代码中入口一致)
CMD ["python", "app.py"]
# 基础镜像(jdk1.8,轻量化)
FROM openjdk:8-jre-alpine
WORKDIR /app
# 复制打包好的jar包(需先本地用maven打包成jar,放在项目根目录)
COPY target/myproject.jar app.jar
EXPOSE 8080
# 启动jar包
CMD ["java", "-jar", "app.jar"]
# 第一步:构建前端项目(依赖node环境)
FROM node:16-alpine as build
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install --registry=https://registry.npm.taobao.org
COPY . .
RUN npm run build
# 第二步:部署(用nginx运行打包后的静态文件)
FROM nginx:alpine
# 复制构建好的静态文件到nginx目录
COPY --from=build /app/dist /usr/share/nginx/html
# 暴露80端口(nginx默认端口)
EXPOSE 80
# 启动nginx
CMD ["nginx", "-g", "daemon off;"]
打开终端(Windows用PowerShell,Mac/Linux用终端),cd到项目根目录(示例命令):
cd /Users/xxx/Documents/my_flask_project # Mac/Linux
cd C:\Users\xxx\Documents\my_flask_project # Windows
docker build -t my_project:v1.0 .
命令解释:
- -t:给镜像打标签(命名),格式为「镜像名:版本号」,方便后续识别和部署;
- my_project:v1.0:镜像名(可自定义,如flask-app、vue-app),版本号(可自定义,如v1.0、latest);
- .:表示当前目录(Dockerfile所在目录,不可省略)。
注意:若构建过程卡死,大概率是基础镜像拉取失败,可先手动拉取基础镜像(如docker pull python:3.9-alpine),再重新执行构建命令,或检查国内镜像加速是否配置正确。
输入命令:docker images,若列表中出现「my_project:v1.0」(对应自己的镜像名和版本),说明构建成功。
执行命令,启动容器(映射端口,让本地能访问):
docker run -d -p 5000:5000 --name my_project_container my_project:v1.0
命令解释:
- -d:后台运行容器(不占用终端);
- -p 5000:5000:端口映射,格式为「本地端口:容器端口」,本地访问http://localhost:5000即可访问容器内的项目;
- --name:给容器命名(可自定义,如my_container);
- 最后面是镜像名:版本号(和构建时一致)。
测试:打开浏览器,访问http://localhost:5000,能看到「Hello Docker! 部署成功!」,说明镜像正常。
停止容器(测试完成后):docker stop my_project_container
核心逻辑:云服务器安装Docker → 本地镜像上传到服务器 → 服务器启动容器 → 配置安全组(让公网能访问)。
- 系统:Ubuntu 20.04 LTS(64位,最适配Docker,避免CentOS,新手操作更复杂);
- 配置:1核2G(足够部署小型项目,新手入门性价比最高);
- 带宽:1M(足够测试,后续可升级);
- 购买后,记录服务器「公网IP」(后续连接和访问需要)。
1. 本地打开终端(Windows用PowerShell,Mac/Linux用终端);
2. 输入连接命令(替换为公网IP):
ssh root@你的公网IP
3. 首次连接会提示「Are you sure you want to continue connecting?」,输入「yes」,按回车;
4. 输入服务器密码(购买时设置的密码,输入时不显示,输完按回车),成功连接后,终端会显示「root@xxx:~#」(说明已进入服务器)。
补充:若连接失败,大概率是服务器22端口未开放,进入阿里云控制台 → 服务器实例 → 安全组 → 入方向,添加「22端口(SSH)」,允许所有IP访问。
3.2 云服务器安装Docker(和本地Linux安装一致,快速复用)
在连接好的服务器终端,依次执行以下命令(复制粘贴即可,每执行完一条按回车):
# 1. 更新软件包
sudo apt update
sudo apt upgrade -y
# 2. 安装依赖
sudo apt install -y ca-certificates curl gnupg lsb-release
# 3. 添加阿里云Docker镜像源
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/trusted.gpg.d/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 4. 安装Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
# 5. 启动Docker并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
# 6. 配置国内镜像加速(和本地Linux一致)
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.mirrors.aliyun.com",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
验证:输入docker --version,输出版本信息即安装成功。
步骤1:本地终端,将镜像保存为tar文件(进入项目根目录,执行命令):
docker save -o my_project.tar my_project:v1.0
解释:-o 表示输出文件,my_project.tar是保存后的文件名(可自定义),后面是镜像名:版本号。
步骤2:将tar文件上传到云服务器(本地终端执行,替换公网IP和文件路径):
# Windows/Mac/Linux通用命令
scp 本地tar文件路径 root@你的公网IP:/root
示例(Mac/Linux):scp /Users/xxx/Documents/my_flask_project/my_project.tar root@123.45.67.89:/root
示例(Windows):scp C:\Users\xxx\Documents\my_flask_project\my_project.tar root@123.45.67.89:/root
说明:上传时会提示输入服务器密码,输完按回车,等待上传完成(根据镜像大小,约1-5分钟)。
步骤3:服务器终端,加载上传的镜像(执行命令):
# 进入root目录(tar文件上传到了这里)
cd /root
# 加载镜像
docker load -i my_project.tar
验证:输入docker images,能看到本地构建的镜像(my_project:v1.0),说明上传成功。
1. 登录阿里云控制台,搜索「容器镜像服务」,进入后创建「命名空间」(自定义名称);
2. 创建「镜像仓库」,选择「本地仓库」,填写仓库名称(如my-project),完成创建;
3. 本地终端登录阿里云镜像仓库(替换自己的用户名和仓库地址):
docker login --username=你的阿里云用户名 registry.cn-你的地域.aliyuncs.com
4. 给本地镜像打标签(替换为自己的仓库地址):
docker tag my_project:v1.0 registry.cn-你的地域.aliyuncs.com/你的命名空间/my-project:v1.0
5. 推送镜像到阿里云仓库:
docker push registry.cn-你的地域.aliyuncs.com/你的命名空间/my-project:v1.0
6. 服务器终端拉取镜像(替换为自己的仓库地址):
docker pull registry.cn-你的地域.aliyuncs.com/你的命名空间/my-project:v1.0
在服务器终端,执行启动命令(和本地测试命令类似,端口映射一致):
docker run -d -p 5000:5000 --name my_project_container --restart=always my_project:v1.0
新增参数说明:--restart=always 表示服务器重启后,容器自动启动(避免服务器重启后项目失效)。
docker ps
若列表中出现「my_project_container」,且「STATUS」为「Up X minutes」,说明容器正常运行。
补充:若容器启动后立即停止,执行docker logs my_project_container查看报错信息,大概率是端口占用或代码错误,针对性解决即可。
云服务器默认关闭所有端口,需手动开放项目端口(如5000端口),步骤如下(阿里云为例):
- 登录阿里云控制台,找到「云服务器ECS」→ 选择自己的服务器实例;
- 点击左侧「安全组」→ 点击当前安全组的「配置规则」;
- 点击「入方向」→ 「添加规则」,填写以下信息:
- 端口范围:5000/5000(和容器映射的端口一致);
- 授权对象:0.0.0.0/0(允许所有公网IP访问,新手推荐,后续可根据需求限制IP);
- 协议类型:TCP;
- 描述:自定义(如my_project端口)。
- 点击「确定」,生效时间约1-2分钟。
腾讯云操作:控制台 → 云服务器 → 安全组 → 入方向规则 → 添加端口,参数和阿里云一致。
打开本地浏览器,输入地址:http://你的公网IP:5000,若能看到「Hello Docker! 部署成功!」,说明整个部署流程完成!
- Windows:未开启WSL2或未安装内核更新包,重新执行1.1步骤;若提示「Hermes相关冲突」,关闭Docker Desktop的「Experimental Features」。
- Mac:芯片不兼容(如M芯片装了Intel版本),重新下载对应芯片的Docker Desktop。
- Linux:权限不足,执行sudo systemctl start docker;或镜像源配置错误,重新配置国内加速。
- 报错「no such file or directory」:Dockerfile路径错误,确保终端在Dockerfile所在目录,或命令末尾加「.」。
- 依赖安装缓慢/失败:未配置国内镜像,在Dockerfile的pip/npm命令中添加国内源(如Python用清华源,前端用淘宝源)。
- 构建卡死:手动拉取基础镜像,或检查网络,重新执行构建命令。
- 执行docker logs 容器名查看报错,常见原因:端口占用、代码错误、配置文件缺失。
- 端口占用:执行netstat -tulpn | grep 端口号,找到占用端口的进程,执行kill -9 进程ID,再重启容器。
- 安全组未开放端口:重新配置安全组,确保端口和容器映射端口一致,授权对象为0.0.0.0/0。
- 容器端口映射错误:重新执行docker run命令,确保「-p 本地端口:容器端口」正确,代码中host=0.0.0.0。
- 服务器防火墙拦截:执行sudo ufw allow 5000(开放5000端口),或关闭防火墙sudo ufw disable(新手推荐)。
若项目有配置文件(如数据库配置),不建议打包进镜像,可通过「挂载目录」方式挂载宿主机配置文件:
docker run -d -p 5000:5000 -v /root/config:/app/config --name my_project_container my_project:v1.0
解释:将服务器/root/config目录,挂载到容器/app/config目录,修改宿主机配置文件即可生效,无需重新构建镜像。
全程核心流程:本地Docker安装→编写Dockerfile→构建镜像→上传镜像到云服务器→启动容器→配置安全组→公网访问,所有步骤均为新手友好型,无复杂命令,只要严格按照教程操作,均可成功部署
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)