更多云服务器知识,尽在hostol.com
"在我电脑上明明是好的啊!"
这句话,是不是堪称程序员"甩锅"排行榜第一名的金句?当你辛辛苦苦开发完一个应用,把它交给同事或者部署到服务器上时,却发现因为它依赖的某个函数库版本不对、或者操作系统的配置有差异,程序压根就跑不起来。那种挫败感,足以摧毁一个美好的下午。
环境不一致,就是那个永远潜伏在开发与运维之间、制造了无数麻烦的"幽灵"。
那么,有没有一种方法,能把我的应用程序,连同它运行所需的所有环境(比如特定版本的Python、所有的依赖库、所有的配置文件),像制作一个"爱心便当"一样,完美地打包在一起?这个"便当盒"本身就是一个隔离的、干净的迷你操作系统。无论我把这个"便当"带到谁的电脑上,或者哪台服务器上,只要对方安装了"微波炉"(也就是Docker环境),就能一键"加热",百分之百地还原出和我电脑上一模一样的、热气腾腾的饭菜(应用程序)。
有!这个神奇的"便当盒"制作技术,就是Docker。而Docker,就是那位来消灭"环境不一致"这个幽灵的"捉鬼天师"。
拆解"魔法便当盒":Docker的三大核心概念
在动手之前,我们必须先花三分钟,用大白话理解Docker的三个核心"零件"。
- 镜像 (Image): 这就是制作"便当"的**"菜谱和配料清单"**。它是一个只读的模板,详细地记录了制作某个特定便当(比如"宫保鸡丁便当")需要哪些米饭、哪些鸡肉、哪些配菜(应用程序和依赖库),以及制作的先后顺序。
- 容器 (Container): 这就是根据菜谱,做出来的、那个热气腾腾的、可以吃的"便当"本身。镜像是静态的模板,而容器是动态的、正在运行的实例。你可以用同一份"宫保鸡丁"菜谱(镜像),做出无数份一模一样的"宫保鸡丁便当"(容器)。每个便当(容器)都是独立、隔离的。
- 仓库 (Repository): 这就是存放各种"菜谱"(镜像)的**"巨型线上菜谱图书馆"**。其中最大、最官方的那个,叫Docker Hub。你可以从里面找到几乎所有流行软件的官方菜谱,比如Nginx、MySQL、Python等等。
理解了这三点,我们就可以开始制作我们的第一个"便当"了。
第一步:准备"厨房"------在腾讯云上请一位"自带厨具"的大厨
我们首先需要一个装好了全套"厨具"(Docker环境)的"厨房"(服务器)。而腾讯云的轻量应用服务器,为我们提供了一个极其方便的"作弊"选项。
- 登录腾讯云,进入轻量应用服务器的购买页面。
- 选择地域和配置。 对于学习Docker来说,最便宜的2核4G配置,就已经绰绰有余。
- 关键一步:选择镜像! 在"镜像"这一栏,不要选择常规的操作系统(比如Ubuntu或CentOS)。请点击**"应用镜像",然后在下方的列表或搜索框里,找到 "Docker CE"**。
- 这是什么意思? 这意味着,你下单购买的这台服务器,腾讯云在把它交给你之前,就已经帮你把最新、最稳定的Docker环境,连同所有相关的工具,全都预装好了。
- 比喻一下: 这就像你买的不是一套毛坯房,而是一套已经通好了水电煤、并且配备了全套德国进口厨具的"精装公寓"。你只需要拎包入住,直接开始"做菜"就行了。
选中Docker CE镜像,完成支付。一两分钟后,你的"顶级厨房"就已经在云端准备就绪了。
第二步:"叮!微波炉加热"------运行你的第一个Nginx容器
现在,我们已经有了一个装好Docker的服务器。让我们来小试牛刀,从"菜谱图书馆"(Docker Hub)里,拿一份最简单的"Nginx官方菜谱",来加热一份"Nginx网站便当"。
1登录你的服务器。 在腾讯云后台找到你服务器的IP地址和密码,通过SSH登录进去。
2验证Docker是否就位。 在命令行输入:
Bash
docker --version
如果你看到一串版本号信息,说明你的"厨具"工作正常。
念出咒语,启动Nginx! 在命令行里,输入下面这行命令,然后回车:
Bash
docker run -d -p 8080:80 --name my-first-nginx nginx
别怕,我们来拆解一下这行"咒语":
命令执行后,你会看到Docker开始下载镜像,然后返回一长串字符,代表你的容器已经成功启动了!
见证奇迹的时刻:
现在,打开你本地电脑的浏览器,在地址栏输入:http://你的服务器IP地址:8080
,然后回车。
如果你看到了那个经典的**"Welcome to nginx!"**页面,那么,请为你自己鼓掌!你已经成功地启动了你人生中第一个Docker容器。你已经掌握了"热别人做好的便当"的技能。
第三步:成为"大厨"------亲手打包一个属于你自己的应用
热别人的便当固然方便,但真正的乐趣,在于亲手制作属于自己的"独家私房菜"。现在,我们就来把一个我们自己写的、极简的Python网站,打包成一个Docker镜像,并运行起来。
1准备"食材"。 我们先创建一个项目目录,并在里面创建两个文件。
Bash
mkdir my-hello-app
cd my-hello-app
创建Python应用文件 app.py
:
Bash
nano app.py
在里面输入以下内容:
Python
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, Docker! 这是我亲手打包的应用!'
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0')
创建依赖清单 requirements.txt
:
Bash
nano requirements.txt
在里面只写一行:
Flask==2.0.1
2撰写你的"独家菜谱"------Dockerfile。 在my-hello-app
目录下,创建一个名为Dockerfile
的文件(没有后缀名!):
Bash
nano Dockerfile
在里面,输入我们这份"私房菜"的制作步骤:
Dockerfile
# 步骤1:选择一个带有Python 3.9的基础厨房
FROM python:3.9-slim
# 步骤2:在厨房里,创建一个叫/app的操作台
WORKDIR /app
# 步骤3:把厨房外所有准备好的食材,都复制到操作台上
COPY . .
# 步骤4:根据食材清单,安装所有配料
RUN pip install -r requirements.txt
# 步骤5:告诉大家,这份便当的出餐口在5000
EXPOSE 5000
# 步骤6:最后,规定加热这份便当时,要执行的主菜制作命令
CMD ["python", "app.py"]
这份Dockerfile,是不是像一份注释极其详细的菜谱,清晰地记录了每一步操作?
3让Docker照着"菜谱"做"菜"------构建镜像。 在my-hello-app
目录下,执行以下命令:
Bash
docker build -t my-python-app .
docker build
:告诉Docker:"开始做菜!"
-t my-python-app
:给做出来的这份"菜谱"(镜像)起个名字。
告诉Docker,菜谱(Dockerfile)就在当前目录下。 Docker会严格按照你的Dockerfile,一步一步地执行,最终生成一个属于你自己的、独一无二的镜像。
4上菜!------运行你自己的容器。 现在,我们用自己的"菜谱",做一份"便当"出来:
Bash
docker run -d -p 5000:5000 --name my-app my-python-app
- 这次的端口映射是
-p 5000:5000
,因为我们的Flask应用,内部的出餐口是在5000。
最终的凯旋:
再次打开你本地的浏览器,这次,在地址栏输入:http://你的服务器IP地址:5000
。
当你看到屏幕上显示出**"Hello, Docker! 这是我亲手打包的应用!"**这行你亲手写下的文字时,那种成就感,无与伦比。你不再只是一个"消费者",你已经成了一个真正的"创造者"。
你的旅程,才刚刚开始
今天,你亲手打包并启动了你的第一个"魔法便当"。这个小小的"Hello, Docker!",是你通往云原生、DevOps等广阔世界的第一张门票。
你已经掌握了将任何应用,封装成一个标准、可移植、处处运行的"集装箱"的超能力。从此以后,"在我电脑上是好的"将不再是你的借口,而是你的自信宣言。因为你知道,你的应用,已经被装进了那个标准、可靠、随处可行的魔法盒子里。
去吧,去打包你的下一个伟大创意吧!