docker使用和部署深化学习

1.什么是docker

Docker 容器是一个轻量级、可移植、自给自足的软件环境,用于运行应用程序。

Docker 容器将应用程序及其所有依赖项(包括库、配置文件、系统工具等)封装在一个标准化的包中,使得应用能够在任何地方一致地运行。

容器是操作系统级别的虚拟化,不需要运行完整的操作系统,启动和运行更为高效。

镜像和容器的关系

镜像(Image):容器的静态模板,包含了应用程序运行所需的所有依赖和文件。镜像是不可变的。

容器(Container):镜像的一个运行实例,具有自己的文件系统、进程、网络等,且是动态的。容器从镜像启动,并在运行时保持可变。

2.拉取镜像

2.1 列出当前镜像列表
复制代码
docker images

可以看到已下载的镜像列表 ,其中 REPOSITORY:表示镜像的仓库源

TAG:镜像的标签

2.2 拉取最新镜像

此处我们以拉取mysql 版本5.7 为例

复制代码
docker pull mysql:5.7

但是因为墙的关系,上面这个命令是不行的,要加上国内镜像地址:

复制代码
docker pull docker.1ms.run/mysql:5.7

拉取过程大概这样:

复制代码
5.7: Pulling from mysql

20e4dcae4c69: Pulling fs layer

1c56c3d4ce74: Pulling fs layer

e9f03a1c24ce: Pull complete

68c3898c2015: Pull complete

6b95a940e7b6: Pull complete

90986bb8de6e: Pull complete

ae71319cb779: Pull complete

ffc89e9dfd88: Pull complete

43d05e938198: Pull complete

064b2d298fba: Pull complete

df9a4d85569b: Pull complete

Digest: sha256:4bc6bc963e6d8443453676cae56536f4b8156d78bae03c0145cbe47c2aad73bb

Status: Downloaded newer image for docker.1ms.run/mysql:5.7

docker.1ms.run/mysql:5.7

3.容器使用以及常用命令

镜像下好了,我们现在来使用他

3.1 此处我们使用mysql镜像来创建一个容器
复制代码
docker run -d -p 3309:3306 --name mysql_test docker.1ms.run/mysql:5.7 
  • -p 3309:3306 ,宿主机的3309端口 映射到容器里的3306接口,注意位置不能调乱
  • --name 指定容器的名字
  • docker.1ms.run/mysql:5.7 此处是镜像名和版本号
  • -d 后台以守护进程运行
3.2 使用ubutu 创建一个容器
复制代码
docker run -it ubuntu:22.04 /bin/bash

-it:通常组合使用,-i (--interactive) 保持 STDIN 打开,-t (--tty) 分配一个伪终端。

用于启动交互式容器(如进入容器内的 shell)

4 dockerfile 和 容器化部署

使用流程通常分为三步:

  • 编写 Dockerfile
  • 执行 docker build 命令构建镜像
  • 使用构建好的镜像运行容器
4.1 例如我们创建非常简单的python应用

1 根目录下 app.py

复制代码
# app.py

from flask import Flask

app = Flask(__name__)


@app.route('/')

def hello_world():

   return 'Hello, Docker World!'


if __name__ == '__main__':

    app.run(host='0.0.0.0', port=5000)

2 在同一目录下,创建一个名为 Dockerfile 的文件(没有扩展名)

复制代码
# 使用官方 Python 运行时作为父镜像(基础层)

FROM python:3.9-slim

# 设置工作目录在容器内

WORKDIR /app



# 将当前目录下的所有文件复制到容器的 /app 目录下

COPY . /app



# 安装 requirements.txt 中指定的任何需要的包

# 假设你有一个 requirements.txt 文件,里面写着 `flask==2.0.1`

RUN pip install --no-cache-dir -r requirements.txt



# 让容器监听 5000 端口

EXPOSE 5000



# 定义环境变量

ENV NAME World



# 在容器启动时运行 app.py

CMD ["python", "app.py"]

3 运行构建命令:

docker build -t my-python-app .

  • docker build: 构建命令。
  • -t my-python-app: -t 选项用于给新镜像指定一个名称和标签,格式是 name:tag。这里只给了名字 my-python-app,标签默认为 latest。
  • 不要忘了最后的这个点(.)非常重要!它指定了 "构建上下文"(build context) 的路径。Docker 守护进程会将这个目录下的所有文件(包括 Dockerfile)打包发送给 Docker 引擎来构建镜像。COPY . /app 命令中的 . 就是指这个上下文路径。

4 构建过程大概是这样子:

复制代码
Sending build context to Docker daemon  4.096kB

Step 1/7 : FROM python:3.9-slim

3.9-slim: Pulling from library/python

...

Step 2/7 : WORKDIR /app

...

Step 3/7 : COPY . /app

...

Step 4/7 : RUN pip install --no-cache-dir -r requirements.txt

...

Step 5/7 : EXPOSE 5000

...

Step 6/7 : ENV NAME World

...

Step 7/7 : CMD ["python", "app.py"]

...

Successfully built 123abc456def # 构建成功的镜像ID

Successfully tagged my-python-app:latest # 成功打上标签

5 然后就是运行容器:

复制代码
docker run -p 4000:5000 my-python-app

5 docker部署源码 和 普通部署有什么不一样的地方

|-------|-------------------------------|-----------------------------|
| 特性 | Docker部署 (容器化部署) | 普通部署 (传统部署) |
| 环境 | 与应用一起打包,高度一致性 | 与宿主机强耦合,易出现环境差异 |
| 隔离性 | 进程级别隔离,资源可控,互不影响 | 进程共享,可能争抢资源,互相冲突 |
| 部署单元 | **镜像 (Image)**,包含应用及其所有依赖 | 应用代码 + 配置手册,依赖在目标服务器解决 |
| 部署过程 | 拉取镜像 -> 运行容器,秒级启动 | 安装依赖 -> 配置环境 -> 部署代码,流程漫长 |
| 一致性 | 极高(开发、测试、生产环境完全一致) | 较低("在我这儿是好的"经典问题) |
| 资源占用 | 轻量(共享主机内核,仅包含应用所需) | 厚重(完整的操作系统,资源开销大) |
| 扩展与迁移 | 极简且标准(镜像随处运行) | 复杂且易出错(需重新配置环境) |