简介
- 概念:
用于构建,运行,传送应用程序的平台,将应用程序和它运行时,所需要的各种依赖包,第三方软件库和配置文件打包在一起,以便在任何环境都可以正确运行
- 为什么需要docker?
举例:假设我们要部署一个前后端分离架构的项目,需要
- 安装nodeJs环境
- 安装各种npm环境
- 安装java运行时环境
- 安装各种第三方依赖
- 安装mysql数据库
- 环境变量,启动脚本
- 安装配置redis
- 安装配置nginx
- ...
如果要部署到开发环境上又要重新安装一遍
docker和虚拟机的区别
虚拟机:可以将一台服务器虚拟为多台服务器,每个虚拟化服务器都有自己的操作系统
docker:是容器的一种实现,是一个容器化的解决方案和平台,使用宿主机的操作系统,启动速度快,需要的资源更少,所以可以在一台物理服务器上,运行更多的容器
暂时无法在飞书文档外展示此内容
基本原理和概念
概念:(镜像,容器,仓库)
体系结构:
镜像:只读的模板,可以用来创建容器
容器:docker的运行实例,提供一个独立的可移植的环境,可以在这个环境中运行应用程序
仓库:用来存储docker镜像的地方;DockerHub(集中管理和存储镜像,实现镜像的共享和复用)
架构模式
使用docker-server架构模式
client和docker daemon之间通过socket和restful API进行通信
Docker client负责向docker deamon发送请求
Docker deamon就是服务端的守护进程,负责管理docker的各种资源
安装和配置
官网:docker.com
-
安装完需要启动(右上角能看到docker的小图标)
- window系统需要先开启HyperV
-
启动后可以在终端输入各种命令
容器化和Dockerfile
容器化:将应用程序打包成容器,然后再容器中运行应用程序的过程
dockerfile:是一个文本文件,里面包含了一条条的指令,用来告诉docker如何构建镜像,这个镜像中包含了我们应用程序执行的所有命令
-
各种依赖
-
配置环境
-
和运行应用程序所需要的所有内容
步骤:
-
在项目的根目录下创建一个Dockerfile文件,来告诉docker构建应用程序镜像所需要的步骤和配置
-
使用Dockerfile构建镜像
-
使用镜像创建和运行容器
实践环节
实践:编写dockerfile,创建镜像,启动容器的过程
- 步骤
- 创建一个文件夹,使用编辑器打开
- 在文件夹中创建一个index.js的文件,在文件中输入一段代码,可以在控制台输出一段文字
console.log("hello-docker")
- Dockerfile的配置文件编写步骤
step1:安装操作系统
step2:安装javaScript运行环境
step3: 复制应用程序,依赖包,配置文件
step4: 执行启动命令运行程序
FROM 基础镜像
COPY source(相对于dockerfile文件的路径) dest(相对于镜像的路径)
CMD ["第一个参数表示可实现程序的名字","这个可执行程序接收到的参数"]
docker build -t 镜像的名字 .
.表示dockerfile所在的目录
在dockerfile中先指定基础镜像,镜像是按层次结构来构建的,每一层都是基于上一层的
DockerDesktop
问题:是docker中用来存储数据的,docker容器有一个特点,容器中的数据不会持久化,当我们创建一个容器的时候,通常以一个干净的文件系统开始,容器启动之后可以在容器中创建文件,修改文件,当容器停止之后,容器中的所有数据都会丢失掉,如果想要持久化容器中的数据,需要使用逻辑卷
逻辑卷:可以把容器中的目录或指定路径映射到宿主机的一个目录或位置上
Docker Compose
- 用于定义和运行多容器Docker应用程序的工具
- 使用yaml文件来配置应用程序的而服务
- 一条命令可创建并启动所有服务
redis:
image:redis
db:
images:mysql
frontend:
...
举例:
比如前端,后端,数据库,缓存,nginx等分别在不同服务器上,服务之间的关联关系就是Docker Compose要解决的问题,通过docker-compose.yaml的配置文件;将互相关联容器组合在一起,使用一条命令就可以启动,停止或重建这些服务。
执行$ docker compose up 后就可以自动安装各种依赖和配置运行环境
mac使用docker的常用命令
一、Docker 服务启停
# 启动 Docker 服务
brew services start docker# 停止 Docker 服务
brew services stop docker# 重启 Docker 服务
brew services restart docker# 查看 Docker 服务状态
brew services list | grep docker
二、macOS 通用:Docker 核心操作命令(和 Linux 完全一致)
以下命令是 macOS 操作 Docker 的核心,和 Linux 无区别,无需加 sudo(Docker Desktop 已配置权限):
- 镜像管理(拉、查、删)
# 拉取镜像(从 Docker Hub 下载)
docker pull nginx:latest # 拉取最新版 Nginx
docker pull mysql:8.0 # 拉取指定版本 MySQL
# 查看本地镜像
docker images # 显示所有镜像(名称、标签、ID、大小)
docker images -q # 只显示镜像 ID(批量操作用)
# 删除镜像(需先删除依赖该镜像的容器)
docker rmi nginx:latest # 通过镜像名删除
docker rmi 828a4989590d # 通过镜像 ID 删除(输前几位即可)
docker rmi -f $(docker images -q) # 强制删除所有镜像(谨慎!)
2. 容器管理(创、查、启、停、进、删)
# 1. 创建并运行容器(最核心)
# 示例:后台运行 Nginx,映射主机 8080 端口到容器 80 端口,命名为 my-nginx
docker run -d -p 8080:80 --name my-nginx nginx
# 参数说明:
# -d:后台运行 -p 主机端口:容器端口:端口映射 --name:自定义容器名
# 示例:运行 MySQL 容器,设置密码,持久化数据
docker run -d -p 3306:3306 --name my-mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-v mysql-data:/var/lib/mysql \
mysql:8.0
# -e:设置环境变量 -v:挂载数据卷(避免容器删除丢失数据)
# 2. 查看容器
docker ps # 查看运行中的容器
docker ps -a # 查看所有容器(包括已停止)
docker ps -aq # 只显示所有容器 ID
# 3. 启停/重启容器
docker start my-nginx # 启动已停止的容器
docker stop my-nginx # 停止运行中的容器
docker restart my-nginx # 重启容器
# 4. 进入运行中的容器(调试/执行命令)
docker exec -it my-nginx /bin/bash # 进入 Nginx 容器(退出用 exit,容器不停止)
docker exec -it my-mysql mysql -uroot -p123456 # 直接进入 MySQL 终端
# 5. 查看容器日志(排查问题)
docker logs my-nginx # 查看 Nginx 日志
docker logs -f my-nginx # 实时跟踪日志(类似 tail -f)
# 6. 删除容器
docker rm my-nginx # 删除已停止的容器
docker rm -f my-nginx # 强制删除运行中的容器
docker rm -f $(docker ps -aq) # 强制删除所有容器(谨慎!)
3. 数据卷管理(持久化数据)
# 查看所有数据卷
docker volume ls
# 创建自定义数据卷
docker volume create my-volume
# 查看数据卷详情(macOS 下数据卷默认存放在 ~/Library/Containers/com.docker.docker/Data/vms/0/)
docker volume inspect my-volume
# 删除数据卷(需先解绑容器)
docker volume rm my-volume
# 清理未使用的所有数据卷
docker volume prune
4. 使用清理命令(释放磁盘空间)
# 清理停止的容器、未使用的镜像/网络/数据卷(安全)
docker system prune
# 清理所有未使用的镜像(包括未运行容器的镜像,谨慎)
docker system prune -a
docker运行更新后代码步骤
从项目打包新镜像到推送到公司私有仓库,然后在服务器上拉取镜像并修改版本号运行的完整流程如下:
- 打包新镜像
首先,假设你的项目已经准备好,并且你有一个 Dockerfile 来构建镜像。
步骤 1:构建新的 Docker 镜像
在项目根目录(包含 Dockerfile)下,执行以下命令来构建新的 Docker 镜像:
docker build -t <镜像名>:<新版本号> .
例如,你可以为新版本使用一个时间戳或语义化版本号作为标签:
docker build -t myapp:1.1 .
或者你也可以选择一个更具体的版本标签(例如,日期):
docker build -t myapp:2026-02-25 .
- 推送镜像到私有仓库
在本地构建完新镜像后,推送到公司的私有仓库。假设私有仓库地址是 xxx.xxx.com,并且命名空间是 xxx。
步骤 2:登录到私有仓库
首先,登录到公司私有镜像仓库(假设是 xxx 或其他类似的仓库):
docker login xxx.xxx.com
输入用户名和密码以验证身份。
步骤 3:给镜像打标签
将本地镜像打上私有仓库的标签(即指定仓库名称):
docker tag myapp:1.1 xxx.xxx.com/xxx/server:1.1
此命令将 myapp:1.1 镜像标记为 xxx.xxx.com/xxx/server:1.1,以便推送到私有仓库。
步骤 4:推送镜像到私有仓库
将镜像推送到私有仓库:
docker push xxx.xxx.com/xxx/server:1.1
这个命令会将 xxx.xxx.com/xxx/server:1.1 推送到私有仓库。
- 在服务器上拉取新镜像
在服务器(通常是生产或测试环境)上,你可以通过以下步骤拉取并运行新的镜像。
步骤 5:登录到私有仓库
在服务器上,同样需要登录到私有仓库:
docker login xxx.xxx.com
输入用户名和密码进行身份验证。
步骤 6:拉取新镜像
拉取你刚才推送到私有仓库的镜像:
docker pull xxx.xxx.com/xxx/server:1.1
这会将 xxx.xxx.com/xxx/server:1.1 镜像从私有仓库拉取到本地服务器。
步骤 7:查看镜像
使用以下命令来查看本地是否成功拉取了新镜像:
docker images
你应该能看到 xxx.xxx.com/xxx/server:1.1 镜像。
- 修改版本号并运行容器
通常,在生产环境中,我们会运行新版本的容器,可能需要指定一个新的容器名称,或者修改端口映射等。
步骤 8:停止并删除旧容器
如果你已经有一个旧的容器在运行,首先需要停止并删除它:
docker ps
docker stop <旧容器ID或名称>
docker rm <旧容器ID或名称>
步骤 9:运行新的容器
使用拉取的新镜像启动一个新的容器:
docker run -d --name <新容器名称> -p <宿主机端口>:<容器端口> xxx.xxx.com/xxx/server:1.1
例如,如果容器服务运行在 8080 端口上,你可以运行:
docker run -d --name myapp-container -p 8080:8080 xxx.xxx.com/xxx/server:1.1
这会启动一个名为 myapp-container 的容器,并将宿主机的 8080 端口映射到容器的 8080 端口。
步骤 10:检查新容器是否正常运行
你可以通过以下命令检查容器是否成功启动:
docker ps
这将显示正在运行的容器。如果容器运行正常,你可以通过浏览器或 API 请求来验证新的版本。
- 版本管理与更新
为了确保每个版本都能正确管理,你可以采取以下策略:
使用语义化版本号(如 v1.0.0, v1.1.0)作为镜像标签,帮助团队追踪不同版本。
每次更新时都创建一个新的版本标签(例如 1.2, 2026-02-25),避免使用同一标签推送不同版本的镜像。
总结的流程
构建镜像:
-
docker build -t myapp:1.1 .
推送镜像到私有仓库:
- 登录:
docker login xxx.xxx.com
- 标签镜像:
docker tag myapp:1.1 xxx.xxx.com/xxx/server:1.1
- 推送镜像:
docker push xxx.xxx.com/xxx/server:1.1
拉取镜像并运行:
- 登录:
docker login xxx.xxx.com
- 拉取镜像:
docker pull xxx.xxx.com/xxx/server:1.1
- 停止并删除旧容器:
docker stop <容器名>,docker rm <容器名>
- 启动新容器:
docker run -d --name myapp-container -p 8080:8080 xxx.xxx.com/xxx/server:1.1