Docker 小白入门指南
Docker 小白入门指南:从零开始玩转容器
你是否曾经遇到过这样的困境:在本地开发环境运行得好好的程序,一部署到服务器就报错?或者团队里每个人的电脑环境都不一样,导致代码运行结果千奇百怪?如果你有过类似的烦恼,那么 Docker 就是为你准备的救星。
本文将用最通俗的语言,带你走进 Docker 的世界。即使你没有任何容器经验,只要跟着步骤走,也能轻松上手。
1. Docker 是什么?
简单来说,Docker 是一种容器化技术,它可以把你的应用程序及其所有依赖(比如代码、运行库、系统工具、环境变量等)打包成一个标准化的“容器”,然后这个容器可以在任何安装了 Docker 的机器上运行,真正做到“一次构建,到处运行”。
你可以把它想象成一个集装箱:
-
在物流行业,有了集装箱,无论里面装的是衣服还是电子产品,都可以用卡车、火车、轮船运输,因为集装箱的尺寸是标准化的。
-
在软件行业,Docker 容器就是标准化的“集装箱”,里面装的是你的应用和它需要的一切。开发、测试、生产环境都使用同一个“集装箱”,就不会出现“我这里可以跑,你那里跑不了”的问题了。
对比虚拟机:虚拟机是虚拟出一整台计算机(包括操作系统、硬件等),而 Docker 容器直接共享宿主机的操作系统内核,只是隔离了应用程序和依赖,因此更加轻量、启动更快、占用资源更少。
2. Docker 的核心概念
要使用 Docker,你需要理解三个最基本的概念:镜像、容器、仓库。它们之间的关系可以用下图简单表示:
-
镜像(Image):相当于一个“模板”或“类”,它是只读的。比如
Ubuntu 22.04、Nginx、MySQL都是镜像。你可以基于一个基础镜像,加上自己的应用,构建出新的镜像。 -
容器(Container):镜像运行起来之后就是一个容器。一个镜像可以同时运行多个容器,就像同一个类可以创建多个对象。容器是可以读写的,你可以在里面修改文件,但一般不建议直接修改运行中的容器,而是通过更新镜像来重新创建容器。
-
仓库(Registry):用来存放镜像的地方。Docker Hub是官方最大的公共仓库,类似 GitHub 存放代码,Docker Hub 存放镜像。你可以把本地构建的镜像推送到仓库,也可以从仓库拉取别人发布的镜像。
另外还有一个重要概念:Dockerfile,它是一个文本文件,里面写了一系列构建镜像的指令。通过 Dockerfile,你可以自动化地构建出自己需要的镜像,而不是手动修改容器再保存。
3. 安装 Docker
在开始之前,你需要在自己的电脑上安装 Docker。
-
Windows / macOS:推荐安装 Docker Desktop,它自带图形界面和命令行工具,安装完成后启动即可。
-
Linux:可以使用官方脚本一键安装
安装完成后,打开终端(或 PowerShell),输入以下命令验证是否安装成功:
docker --version
如果看到类似 Docker version 24.0.5, build ced0996 的输出,说明安装成功了。
4. 第一个 Docker 命令:Hello World
按照惯例,我们从 hello-world 开始。这个镜像非常小,作用就是打印一段欢迎信息,用来测试 Docker 是否正常工作。
在终端中执行:
docker run hello-world
你会看到如下输出(部分):
Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world ... Hello from Docker! This message shows that your installation appears to be working correctly. ...
这个命令做了三件事:
-
在本地查找名为
hello-world的镜像,没找到; -
自动从 Docker Hub 拉取该镜像;
-
基于该镜像创建并运行一个容器,容器输出信息后退出。
现在再运行一次,你会发现速度快了很多,因为镜像已经在本地了。
5. 常用的 Docker 命令
5.1 镜像相关
-
查看本地镜像:
bashdocker images -
拉取镜像:
bashdocker pull nginx -
删除镜像:
bashdocker rmi nginx
5.2 容器相关
-
运行容器:
bashdocker run -d -p 8080:80 --name my-nginx nginx参数解释:
-
-d:后台运行(detached mode) -
-p 8080:80:将宿主机的 8080 端口映射到容器内的 80 端口 -
--name my-nginx:给容器起个名字,方便后续操作 -
nginx:使用的镜像名
-
-
查看正在运行的容器:
bashdocker ps -
查看所有容器(包括已停止的):
bashdocker ps -a -
停止容器:
bashdocker stop my-nginx -
启动已停止的容器:
bashdocker start my-nginx -
删除容器(必须先停止):
bashdocker rm my-nginx强制删除运行中的容器:
docker rm -f my-nginx -
进入容器内部:
bashdocker exec -it my-nginx bash如果容器里没有 bash,可以试试
sh。退出时输入exit。 -
查看容器日志:
bashdocker logs my-nginx
6. 实战:用 Docker 运行一个网站
下面我们运行一个 Nginx 服务器,并在浏览器中访问它。
-
拉取 Nginx 镜像并运行容器:
bashdocker run -d -p 8080:80 --name web nginx -
打开浏览器访问
http://localhost:8080(如果是在云服务器上,请使用服务器公网 IP 和端口)。你应该能看到 Nginx 的默认欢迎页面。 -
查看容器日志:
bashdocker logs web你会看到 Nginx 的访问日志。
-
尝试修改容器内的文件(演示用,实际上不推荐这样操作):
bashdocker exec -it web bash cd /usr/share/nginx/html echo "<h1>Hello Docker!</h1>" > index.html exit
刷新浏览器,页面变成了 “Hello Docker!”。这说明了容器和宿主机是隔离的,你在容器内做的修改不会影响宿主机。
-
停止并删除容器:
bashdocker stop web docker rm web
7. 构建自己的镜像:Dockerfile 入门
在实际开发中,我们不会手动修改容器再保存成镜像,而是编写 Dockerfile 来自动化构建。
假设我们有一个简单的 Python Flask 应用,目录结构如下:
myapp/ ├── app.py └── requirements.txt
app.py 内容:
from flask import Flask app = Flask(__name__) @app.route('/') def hello(): return "Hello from Docker!" if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
requirements.txt 内容:
flask
现在,在 myapp 目录下创建一个名为 Dockerfile 的文件(无扩展名),内容如下:
# 基于官方 Python 镜像 FROM python:3.9-slim # 设置工作目录 WORKDIR /app # 复制依赖文件并安装 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 复制应用代码 COPY app.py . # 声明容器运行时监听的端口 EXPOSE 5000 # 容器启动时执行的命令 CMD ["python", "app.py"]
构建镜像
在 myapp 目录下打开终端,执行:
docker build -t my-flask-app .
-
-t my-flask-app:给镜像起名为my-flask-app,也可以加上版本号如my-flask-app:1.0 -
.:表示使用当前目录下的 Dockerfile
构建完成后,用 docker images 可以看到新镜像。
运行自己的镜像
docker run -d -p 5000:5000 --name flask-demo my-flask-app
打开浏览器访问 http://localhost:5000,你应该能看到 “Hello from Docker!”。
停止和清理
docker stop flask-demo docker rm flask-demo docker rmi my-flask-app
8. 小结
通过这篇文章,你已经掌握了:
-
Docker 是什么以及为什么它这么流行
-
镜像、容器、仓库的概念
-
常用的 Docker 命令
-
如何运行一个现成的容器
-
如何用 Dockerfile 构建自己的镜像
Docker 的玩法远不止这些,还有数据卷(Volume)、网络、Docker Compose 编排多容器应用等高级特性。但对于小白来说,掌握以上内容已经可以解决很多环境一致性的问题了。
下一步建议:
-
阅读Docker 官方文档加深理解
-
尝试将你自己的项目 Docker 化
-
学习 Docker Compose 来管理多个服务
祝你在容器化的世界里玩得开心!🐳
- 点赞
- 收藏
- 关注作者
评论(0)