Docker学习笔记

45 阅读9分钟

简介

  1. 概念:

用于构建,运行,传送应用程序的平台,将应用程序和它运行时,所需要的各种依赖包,第三方软件库和配置文件打包在一起,以便在任何环境都可以正确运行

  1. 为什么需要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

  1. 安装完需要启动(右上角能看到docker的小图标)

    1. window系统需要先开启HyperV
  2. 启动后可以在终端输入各种命令

容器化和Dockerfile

容器化:将应用程序打包成容器,然后再容器中运行应用程序的过程

dockerfile:是一个文本文件,里面包含了一条条的指令,用来告诉docker如何构建镜像,这个镜像中包含了我们应用程序执行的所有命令

  • 各种依赖

  • 配置环境

  • 和运行应用程序所需要的所有内容

步骤:

  1. 在项目的根目录下创建一个Dockerfile文件,来告诉docker构建应用程序镜像所需要的步骤和配置

  2. 使用Dockerfile构建镜像

  3. 使用镜像创建和运行容器

实践环节

实践:编写dockerfile,创建镜像,启动容器的过程

  1. 步骤
  • 创建一个文件夹,使用编辑器打开
  • 在文件夹中创建一个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

  1. 用于定义和运行多容器Docker应用程序的工具
  2. 使用yaml文件来配置应用程序的而服务
  3. 一条命令可创建并启动所有服务
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 已配置权限):

  1. 镜像管理(拉、查、删)
# 拉取镜像(从 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运行更新后代码步骤

从项目打包新镜像到推送到公司私有仓库,然后在服务器上拉取镜像并修改版本号运行的完整流程如下:

  1. 打包新镜像

首先,假设你的项目已经准备好,并且你有一个 Dockerfile 来构建镜像。

步骤 1:构建新的 Docker 镜像

在项目根目录(包含 Dockerfile)下,执行以下命令来构建新的 Docker 镜像:

docker build -t <镜像名>:<新版本号> .

例如,你可以为新版本使用一个时间戳或语义化版本号作为标签:

docker build -t myapp:1.1 .

或者你也可以选择一个更具体的版本标签(例如,日期):

docker build -t myapp:2026-02-25 .

  1. 推送镜像到私有仓库

在本地构建完新镜像后,推送到公司的私有仓库。假设私有仓库地址是 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 推送到私有仓库。

  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 镜像。

  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 请求来验证新的版本。

  1. 版本管理与更新

为了确保每个版本都能正确管理,你可以采取以下策略:

使用语义化版本号(如 v1.0.0, v1.1.0)作为镜像标签,帮助团队追踪不同版本。

每次更新时都创建一个新的版本标签(例如 1.2, 2026-02-25),避免使用同一标签推送不同版本的镜像。

总结的流程

构建镜像

  1.   docker build -t myapp:1.1 .

推送镜像到私有仓库

  1.   登录:docker login xxx.xxx.com
  1.   标签镜像:docker tag myapp:1.1 xxx.xxx.com/xxx/server:1.1
  1.   推送镜像:docker push xxx.xxx.com/xxx/server:1.1

拉取镜像并运行

  1.   登录:docker login xxx.xxx.com
  1.   拉取镜像:docker pull xxx.xxx.com/xxx/server:1.1
  1.   停止并删除旧容器:docker stop <容器名>docker rm <容器名>
  1.   启动新容器:docker run -d --name myapp-container -p 8080:8080 xxx.xxx.com/xxx/server:1.1