什么是docker?
Docker 是一个开源的容器化平台,可以让用户将应用程序及其依赖打包到一个可移植的容器中,运行在独立于系统的环境中,从而避免对系统本身产生影响。这些容器可以运行在任何支持 Docker 的环境中,无论是本地开发机、云服务器,还是其他操作系统。
可以理解为Python 虚拟环境,但它们两个隔离方式不同。
Python 虚拟环境 主要用于隔离 Python 依赖库,以避免不同项目之间的库冲突。Python 虚拟环境仅限于 Python 环境中的依赖,不影响系统级的库或应用程序
Docker 则是一种更为全面的隔离技术,它通过容器化将应用及其所有依赖(不仅限于 Python)封装起来,能够在不同的系统环境中运行
Docker 的主要优点:
轻量化:容器共享主机操作系统内核,占用资源少。
快速启动:容器启动速度通常在秒级。
一致性:无论在开发、测试还是生产环境中,容器的运行结果完全一致。
强大的生态系统:通过 Docker Hub,用户可以获取大量预构建的镜像。(有能力解决网络问题的话)
一个简单的例子
假设你有两个应用程序,分别依赖 MySQL 5.7 和 MySQL 8.0
应用 A 需要 MySQL 5.7,而我们系统也只有这个版本。
应用 B 则依赖 MySQL 8.0,并且需要使用新版本的特性。
用传统方法尝试直接在系统中安装多个版本的 MySQL,"可能"会遇到版本冲突的问题。降级或升级 MySQL 可能会影响到整个服务器上的其他服务,比较的麻烦,需要一定的动手能力(前提是你有很强的解决问题的能力或者拥有折腾的心)
而如果用docker,可以为应用 B 创建一个的容器,并在这个容器中运行 MySQL 5.7,从而确保不同版本的 MySQL 互不干扰这种方式完全隔离了每个版本,避免了全局版本冲突
安装docker
安装必要的依赖包
sudo apt install apt-transport-https ca-certificates curl software-properties-common
由于我不知道国内源有没有被限制,这里添加Docker 的官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
添加 Docker 仓库
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
安装 Docker
sudo apt install docker-ce
启动并启用 Docker 服务
sudo systemctl start docker
sudo systemctl enable docker
演示
我的电脑没有安装 Python,但我想通过 Docker 来运行 Flask 应用
这是我的目录:
内容:
Dockerfile文件
app.py
这个requirement是我随便在网上抄的
构建 一个Docker 镜像
sudo docker build -t flask .
docker build : Docker 的一个命令,用来根据当前目录中的 Dockerfile 创建(构建)一个 Docker 镜像。这个命令会执行 Dockerfile 中定义的步骤(例如安装依赖、复制文件等),然后生成一个镜像
-t flask : 给镜像命名为 flask
. : 指定当前目录作为构建上下文,Docker 会在这个目录查找 Dockerfile 和其他文件
构建成功
运行 Docker 容器
sudo docker run -d -p 5000:5000 flask
run : 运行容器,根据后面怎么定义
-d : 将容器后台运行着,不用麻烦手动再创一个终端
-p 5000:5000:将容器的 5000 端口映射到宿主机的 5000 端口
flask : 镜像的名称
接下来我们局域网访问flask,输入服务器ip和端口5000