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)**,包含应用及其所有依赖 | 应用代码 + 配置手册,依赖在目标服务器解决 |
| 部署过程 | 拉取镜像 -> 运行容器,秒级启动 | 安装依赖 -> 配置环境 -> 部署代码,流程漫长 |
| 一致性 | 极高(开发、测试、生产环境完全一致) | 较低("在我这儿是好的"经典问题) |
| 资源占用 | 轻量(共享主机内核,仅包含应用所需) | 厚重(完整的操作系统,资源开销大) |
| 扩展与迁移 | 极简且标准(镜像随处运行) | 复杂且易出错(需重新配置环境) |