Docker快速使用
一、核心概念
Docker是一种软件部署技术,利用容器化技术为应用程序封装独立的运行环境。每个运行环境即为一个容器,承载容器运行的计算机称为宿主机。
容器与虚拟机的区别:
- Docker容器: 多个容器共享同一个系统内核。
- 虚拟机: 每个虚拟机包含一个操作系统的完整内核。
- 优势: Docker容器比虚拟机更轻量、占用空间更小、启动速度更快。
镜像 (Image)是容器的模板,可类比为软件安装包。镜像类似于制作糕点的模具,可用于创建多个糕点(容器),并可分享给他人。
- 容器是基于镜像运行的应用程序实例,可类比为安装好的软件。
Docker仓库 (Registry): 用于存放和分享Docker镜像的场所。
- Docker Hub: Docker的官方公共仓库,存储了大量用户分享的Docker镜像。Docker Hub官网
二、Docker安装
Docker是基于Linux的容器化技术。在Windows和Mac电脑上,Docker通过虚拟化一个Linux子系统来运行。
Linux系统宿主机是最佳的Docker实战环境。
- Linux系统安装
直接使用命令安装即可,比较简单,不过多讲解。
- Windows系统安装
启用Windows功能: 勾选“Virtual Machine Platform”(虚拟机平台)和“适用于Linux的Windows子系统”(WSL)。
重启电脑: 根据提示完成重启。
安装WSL:
以管理员身份打开命令提示符(CMD)。
执行
wsl --set-default-version 2将WSL默认版本设为2。执行
wsl --update安装WSL(国内网络建议添加--web-download参数减少下载失败)。
- 下载并安装Docker Desktop: 从官方网站下载对应CPU架构的安装包(Windows通常为AMD64),按提示完成安装。
如果不想安装到C盘,使用命令start /w "" "Docker Desktop Installer.exe" install --installation-dir=D:Docker放到自己的目录
启动Docker Desktop: 需保持Docker Desktop软件运行。
验证安装: 在Windows终端输入
docker --version,若能打印版本号则表示安装成功。
三、docker pull 下载镜像命令
用于从Docker仓库下载镜像到本地。
一个完整的镜像名称包含四部分内容:registry/namespace/image_name:tag
- registry: 仓库地址。
docker.io表示Docker Hub官方仓库,官方仓库可省略。 - namespace: 命名空间,通常是作者或组织名称。
library是Docker官方仓库的命名空间,可省略。 - image_name: 镜像的名称。
- tag: 镜像的标签名,通常表示版本号。
latest表示最新版本,可省略。
示例 docker pull nginx:从Docker Hub官方仓库下载最新版Nginx镜像。
docker pull docker.n8n.io/n8nio/n8n: 从n8n的私有仓库下载n8n镜像。
Docker Hub网站:Docker官方仓库,可搜索、查看镜像详情(如官方镜像、版本号、使用说明)。
docker images:列出所有已下载到本地的Docker镜像。
docker rmi image_name 或 docker rmi image_id:删除镜像
- 可指定镜像名称或ID。
四、docker run运行容器
docker run 镜像名或镜像id:使用镜像创建并运行容器 (最重要命令)
docker ps: 查看正在运行的容器。docker run后,原窗口被占用,可新开窗口执行docker ps
- ps:process status(进程状态)
- 输出信息包括:Container ID(容器唯一ID)、Image(基于哪个镜像创建)、Names(容器名称,如果docker run没有手动设置名字,则系统会自动分配一个随机的名字)。
- docker ps默认只查看运行中的容器
- docker ps -a:支持查看运行和已停止的容器
docker run -d 镜像名或镜像id
- d:detached mode,分离模式,表示让容器在后台运行,不会阻塞当前窗口。控制台只打印容器ID,容器日志不会直接输出到终端。
- 执行后打印的是容器的长ID,而docker ps会输出容器的一个短ID,短ID就是截取的长ID,作用是一样的
自动拉取:可以跳过docker pull命令,直接执行docker run,如果本地不存在指定镜像,docker run会先自动拉取镜像,再创建并运行容器。
docker run -p 端口号1:端口号2 镜像名
每个容器运行在独立的虚拟网络环境中,与宿主机的网络隔离,默认无法直接从宿主机访问容器内部网络。
-p参数将宿主机的端口映射到容器内部的端口。
-p 宿主机端口:容器内部端口(先外后内)
* 示例:
-p 80:80将宿主机的80端口转发到容器内的80端口。
五、挂载卷
【绑定挂载】docker run -v 宿主机目录:容器内目录 镜像名
- 功能: 将宿主机的文件目录与容器内的文件目录进行绑定。使得在任一方修改该文件夹时,另一方都会同步修改
- 挂载卷:绑定的目录就称为挂载卷
- 目的: 实现数据的持久化保存。当容器被删除时,容器内的数据也会被删除,但挂载卷可确保容器删除时,数据仍保存在宿主机上。
【命名卷挂载】
docker run -v 卷的名字:容器内目录 镜像名
- 让Docker自动创建一个存储空间,并为其命名:docker volume create 卷的名字
- 查询挂载卷在宿主机的真实目录:docker volume inspect 卷的名字
- 命名卷挂载的好处:命名卷第一次使用的时候,docker会把容器目录中的内容同步到命名卷中,进行一个初始化;而绑定挂载没有这个功能
docker volume list:查看所有创建过的卷
docker volume rm 卷名:删除卷
docker volume prune -a:删除所有没有任何容器在使用的卷
小结:
docker run = 使用镜像创建+运行容器
每次执行都会创建一个新的容器
六、docker run的其他参数
docker run -e xxx:传递环境变量,可多次-e
- 可在dockerhub上搜索容器对应镜像,可传递的环境变量有哪些
docker run --name容器名:指定容器的名字,该名字在整个宿主机上必须唯一,不能重复
docker run -it:控制台可以进入容器内部交互,类似于从宿主机进入了容器的cmd
docker run --rm:当容器停止时,删除容器
- -it 常常和 –rm搭配使用,用于临时调试容器
docker run --restart xxx:用于配置容器停止时的重启策略
- always:容器停止就立即重启
- unless-stopped:意外停止重启,但手动停止不重启
docker rm -f容器ID或容器名
- 删除容器
- -f:force,强制删除,对正在运行的容器需要加上
七、调试容器
如果不想创建容器,只想对已有容器进行启停,使用stop/start
- docker stop 容器ID或容器名:停止一个正在运行的容器,停止后,docker ps查询不到该容器
- docker start 容器ID或容器名:重新启动一个已停止的容器。
- 使用stop/start重新启停容器时,不需要再写已写过的端口映射、挂载卷和环境变量,docker已自动记录并保存,可通过docker inspect 容器ID或容器名查看,让AI分析输出结果
docker create:使用和docker run相同,但只创建容器,不立即启动(回顾:docker run = 创建+启动),如果要启动,用 docker start
docker logs 容器ID或容器名:查看容器的命令
- -f: follow 滚动查看日志,实时刷新。
docker exec 容器ID或容器名 Linux命令:在一个正在运行的Docker容器内部执行Linux命令。
- 示例: docker exec my_nginx ps -ef 查看容器内进程。由于资源视图隔离,看不见宿主机进程。
docker exec -it 容器ID /bin/sh:进入容器内部获得交互式命令行环境,可进行文件系统查看、进程管理或深入调试。
- 可以直接在命令行环境里执行cd、ls等
- docker为尽量压缩镜像的大小,容器内部通常是极简操作系统,可能缺失vi等常用工具,需要自行安装:参考24:18
八、构建镜像
dockerfile:是一个文本文件,详细列出了如何制作Docker镜像的步骤和指令
- dockerfile:图纸
- 镜像:模具
- 容器:糕点
使用dockerfile制作一个镜像并推送到docker hub上(以将一个python程序打包为docker镜像为例):25:43
- 准备Dockerfile文件(这段好多看不懂啊)
- FROM 基础镜像: 所有Dockerfile的第一行,选择一个基础镜像,表示新镜像在此基础上构建。
- WORKDIR 目录路径: 设置镜像内的工作目录,后续命令在此目录下执行。
- COPY 源路径 目标路径: 将宿主机的文件或目录拷贝到镜像内的指定路径。
- RUN 命令: 在镜像构建过程中执行的命令(例如安装依赖)。
- EXPOSE 端口号: 声明镜像提供服务的端口(仅为声明,非强制,实际端口映射仍由
-p参数决定)。 - CMD 命令: 容器运行时默认执行的启动命令。一个Dockerfile只能有一个CMD指令。
- ENTRYPOINT 命令: 与CMD类似,但优先级更高,不易被docker run命令覆盖。
- 构建镜像:docker build -t 镜像名称:版本号 Dockerfile所在目录。
- docker build -t docker-test . (在当前目录构建名为
docker-test的镜像)。 - 镜像构建好之后,可以使用docker run基于该镜像创建一个容器
- 将镜像推送至Docker Hub
- docker login
- 构建镜像:要带上namespace【docker build -t <用户名>/<镜像名称>[:<版本号>]】。推送时镜像名称必须包含用户名作为命名空间。
- docker push <用户名>/<镜像名称>[:<版本号>]
- 在docker hub上用<用户名>/<镜像名称>搜索镜像
九、docker网络
1、桥接模式
Docker网络默认是Bridge (桥接模式),所有容器默认连接到此网络。每个容器被分配一个内部IP地址(通常是172.17.x.x开头)。
在内部子网中,容器可以通过内部IP地址互相访问。但容器网络与宿主机网络隔离,需通过端口映射(-p)才能从宿主机访问。
创建子网:docker network create <子网名称>
- 该子网默认也是桥接模式
指定容器加入不同的子网:docker run -d –name <容器名称> –network <子网名称>
- 同一个子网的容器可以互相通信,而跨子网则不行。
- 同一子网内的容器可以使用容器名称互相访问,而不必使用内部IP地址(Docker内部DNS机制可以把容器名字转换成IP地址):
- docker run -e 加入环境变量时,可以使用容器名而不是IP地址。
- ping容器名字
2、Host (主机模式)
Docker容器直接共享宿主机的网络命名空间、 直接使用宿主机的IP地址,无需端口映射(-p参数),容器内的服务直接运行在宿主机的端口上,通过宿主机的IP和端口即可访问容器。
- 语法:docker run –network host
- 在浏览器直接访问服务器的IP地址加端口80就可以访问到容器
在容器内部查询ip地址:32:40
- 安装工具iproute2
- 命令:ip addr show
- 可以发现容器的内网地址=云服务器内网地址,说明容器共享了宿主机的网络空间
3、None (不联网模式)
容器不连接任何网络,完全隔离。
docker network list:展示出所有网络
- NAME中的bridge、host、none是三种默认网络,不能删除
- docker network rm <网络ID>= docker network remove <网络ID>:删除自定义子网
十、Docker Compose(多容器编排)
当一个完整的应用由多个模块(如前端、后端、数据库)组成时
- 若将所有模块打包成一个巨大容器,会导致故障蔓延、可伸缩性差、扩容只能将整个大容器复制一份,做不到针对某个模块的精准性扩容。
- 最佳实践是把若每个模块独立容器化,但是管理多个容器(创建、网络配置)会增加使用成本(多次执行docker run并需要配置容器间网络)——引入容器编排技术。
docker compose 使用 yml文件管理多个容器
- yml文件列出了容器如何创建、如何协同工作的说明。可理解为多个docker run命令
- docker run命令和docker compose文件的对比关系:34:56
services: 顶级元素,每个服务对应一个容器。
image: 对应docker run中的镜像名。
environment`: 对应docker run的-e参数。
volumes: 对应docker run的-v参数(挂载卷)。
ports: 对应docker run的-p参数。
网络:Docker Compose会自动为每个Compose文件创建一个默认子网,文件中定义的所有容器都会自动加入此子网,并可通过服务名称互相访问。不像docker run命令那样需要显式地为容器指定子网。
docker compose可以自定义容器的启动顺序,确保依赖服务先启动(35:58)
- depends_on
AI辅助:可借助AI工具生成等价的Docker Compose文件。
- 创建docker compose文件:36:19
- docker compose up: 启动YAML文件中定义的所有服务(容器)。
- 会自动创建子网和容器。
- -d: 后台运行。
- docker ps检查正在运行的容器
- 如果容器已经在运行,再执行一次docker compose up并不会启动新的容器,没有任何效果
- docker compose down: 停止并删除由Compose文件定义的所有服务和网络。
- docker ps -a
- docker compose stop:仅停止服务,不删除容器。
- docker compose start:启动已停止的服务。
- docker compose -f </目录/文件名.yml> up: 指定非标准文件名(docker-compose.yaml)的Compose文件进行操作。
小结:
Docker Compose是一个轻量级的容器编排技术,适合个人使用和单机运行。
Docker快速使用

