【Docker】核心概念 && 常用指令总结 && Docker Compose

文章目录

https://www.runoob.com/docker/docker-tutorial.html

核心概念

  • 镜像(Image):类似 Windows 的安装包或便携版软件
  • 容器(Container):类似已安装并运行的程序实例
  • Dockerfile:类似软件的构建和打包说明书

指令

一、守护进程(Docker Daemon)

操作 命令 说明
启动 Docker 服务 sudo systemctl start docker 启动后台引擎
停止 Docker 服务 sudo systemctl stop docker 关闭后台服务
重启 Docker 服务 sudo systemctl restart docker 重启引擎
查看状态 sudo systemctl status docker 查看 daemon 运行状态
查看守护进程信息 docker info 显示引擎和配置
查看 Docker 日志(Linux) sudo journalctl -u docker -f 实时查看日志

二、镜像(Image)

操作 命令 说明
查看本地镜像 docker images 列出本地镜像
搜索镜像 docker search nginx 在 Docker Hub 搜索
拉取镜像 docker pull nginx:latest 下载镜像
删除镜像 docker rmi nginx:latest 删除指定镜像
删除全部镜像 docker rmi docker images -q docker images -q 是列出所有镜像id
容器转化为镜像 docker commit 容器名称/ID 镜像名称:版本
保存镜像为压缩文件 docker save -o myapp.tar myapp:1.0 导出镜像
从压缩文件加载镜像 docker load -i myapp.tar 导入镜像
从 dockerfile 构建镜像 docker build -f dockerfile文件位置 -t myapp:1.0 . 若 Dockerfile 不在当前目录,就必须用 -f 明确路径,否则会报错找不到。最后的 . 表示构建上下文(即要打包进镜像的文件所在目录)

三、容器(Container)

操作 命令 说明
查看容器 docker ps 仅显示运行中容器
查看全部容器 docker ps -a 包括已停止的容器
创建并启动容器 docker run -d --name=容器名称 -p 8080:80 nginx -d 表示后台运行8080:80表示 "宿主机端口:容器端口"
进入容器终端 docker exec -it mynginx /bin/bash 进入容器交互
停止容器 docker stop 容器ID/容器名称
启动容器 docker start 容器ID/容器名称
删除容器 docker rm 容器ID/容器名称 删除已停止的容器
删除所有容器 docker rm docker ps -aq docker ps -aq 表示所有的容器ID
查看容器信息 docker inspect 容器ID/容器名称
查看日志 docker logs -f mynginx 实时输出容器日志
导出容器为文件 docker export mynginx -o mynginx.tar 导出为镜像文件
查看容器资源占用 docker stats 实时监控 CPU/内存使用

四、卷管理

操作 命令 说明
创建卷 docker volume create myvolume 在 Docker 管理的宿主机空间创建卷
列出卷 docker volume ls 查看所有卷
查看卷详细信息 docker volume inspect myvolume 显示路径、挂载信息等
删除卷 docker volume rm myvolume 删除指定卷(确保没有容器在使用)
清理未使用卷 docker volume prune -f 删除所有未挂载的卷

五、容器挂载卷

操作 命令 说明
容器挂载宿主机目录 docker run -v /host/path:/container/path ubuntu -v 将宿主机目录挂载到容器
容器挂载命名卷 docker run -v myvolume:/data ubuntu -v 将卷挂载到容器路径
多容器共享卷 docker run --volumes-from 数据卷容器名称 ubuntu --volumes-from 可以让多个容器挂载数据卷容器
临时匿名卷 docker run -v /data ubuntu 这里没写宿主机位置,故宿主机实际路径是 Docker 管理的默认位置,可以通过 docker inspect 查到

注意事项:

  • 目录必须是绝对路径
  • 如果目录不存在,会自动创建
  • 多个容器可以挂载同一个数据卷
  • macos 不方便在宿主机中挂载指定目录,并且也不方便观察现象,最好使用 linux 系统学习!

数据卷

多个容器挂载数据卷容器

注意事项:

  1. 容器被删除,不影响挂载卷 ,除非删除时候加了 -v 选项。
  2. 卷内数据对挂载的所有容器同步可见。
  3. 容器内主动删除文件会直接影响卷里的数据。
  4. 数据卷容器挂掉不影响其他容器访问该卷。

Docker 容器和镜像的细节

  • Docker 容器不包含完整 Linux 内核
  • 容器共享宿主机的 Linux 内核(或 macOS/Windows 上的 LinuxKit 虚拟机内核,这个内核由 Docker Desktop 提供,因为它本质就是一个虚拟机)
  • Docker 容器是 进程级隔离 ,而不是完整虚拟机。
    • 每个容器内运行的是普通用户空间程序(用户态)。
    • 容器内的程序和库、工具、文件系统独立,但内核态调用都会走宿主机内核。
  • Docker 镜像只包含文件系统层(比如 bin、lib、app 等),不包含内核,所以 Ubuntu、Alpine 镜像几十 MB 到几百 MB 就够了,而不是几 GB。
  • 用户空间文件系统需要独立,但是内核是共享的
    • 每个容器可能运行不同应用、依赖不同库、不同版本的工具。
    • 容器必须有自己的文件系统层(bin、lib、应用代码等)来保证环境一致性。
    • 如果共享用户空间文件系统,可能出现:
      • 版本冲突(比如两个容器一个用 Python 3.11,一个用 Python 3.9)
      • 配置污染(一个容器修改了库,另一个容器会受影响)

Docker镜像原理

思考:

  • Docker 镜像本质是什么?
    • 本质是一个分层的文件系统
  • Docker 中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要几个G?
    • Centos的iso镜像文件包含bootfs和rootfs,而docker的centos镜像复用操作系统的bootfs,只有rootfs和其他镜像层
  • Docker 中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有70多MB?
    • 由于docker中镜像是分层的,tomcat虽然只有70多MB,但他需要依赖于父镜像和基础镜像,所有整个对外暴露的tomcat镜像大小500多MB

Docker 镜像本质是分层的 tar 文件集合(分层的文件系统),每层包含文件系统差异。

不同平台(Linux vs Windows)可能使用不同的基础镜像层(linux/amd64 vs windows/amd64)。

Linux文件系统由 bootfs rootfs 两部分组成:

  • bootfs:包含 bootloader(引导加载程序)和 kernel(内核)
  • rootfs: root 文件系统,包含的就是典型 Linux 系统中的 /dev、/proc、/bin、/etc 等标准目录和文件
  • 不同 linux 发行版之间的 bootfs 基本一样,而 rootfs 不同,如 ubuntu、centos 等

Dockerfile关键字

https://www.runoob.com/docker/docker-dockerfile.html

Docker Compose

https://www.runoob.com/docker/docker-compose.html

  • 最新的语法是 docker compose (空格) ,而不是老的 docker-compose(横杠)。
  • 横杠版本已被官方标记为 deprecated。

一、核心生命周期命令(最常用,必须记住)

命令 作用
docker compose up -d 启动服务(后台运行)
docker compose up 启动服务(前台日志)
docker compose down 关闭并删除容器、网络
docker compose stop 停止容器但不删除
docker compose start 启动已存在但停止的容器
docker compose restart 重启所有服务

二、重建 / 更新服务

命令 用途
docker compose up -d --build 改了 Dockerfile 后重建镜像再起
docker compose up -d --force-recreate 强制重建所有容器(即使没变)
docker compose up -d service_name 单独重建某个容器
docker compose pull 拉取最新镜像

实战例子:只强制重建 nginx,不动其他服务。

Bash 复制代码
docker compose up -d --force-recreate nginx

三、查看状态 / 日志 / 容器信息

命令 用途
docker compose ps 查看当前 compose 的容器
docker compose logs 查看所有日志
docker compose logs -f service_name 追踪某个服务的日志
docker compose top 查看容器中的进程

四、进入容器 / 执行命令

命令 用途
docker compose exec 容器名 bash 进入容器终端(容器已运行)
docker compose run 容器名 bash 运行并临时创建一个新容器

推荐:

Bash 复制代码
docker compose exec myapp bash

五、管理 volume / network(通常自动管理)

命令 作用
docker compose down -v 删除容器 + 网络 + volumes
docker compose down --rmi all 删除镜像
docker compose down --volumes 只删 volumes

企业里一般不会轻易删 volumes。

六、查看配置(非常重要)

命令 用途
docker compose config 校验并展示规范化配置

这是开发必备命令,可以提前发现 YAML 格式错误。

七、一次性任务(很实用)

命令 用途
docker compose run --rm service command 运行一次性命令,用完自动删容器

例子:

Bash 复制代码
docker compose run --rm myapp ls /app

八、停止但保留环境

命令 用途
docker compose stop 停止但不删容器
docker compose start 重启停止的容器
相关推荐
J2虾虾1 天前
Docker启动超时,吓得我一身汗
运维·docker·容器
码农小卡拉1 天前
Ubuntu22.04 安装 Docker 及 Docker Compose v2 详细教程
ubuntu·docker·容器
EasyNVR1 天前
docker版EasyNVR如何使用同步插件教程(包含网盘挂载,路径映射等)
docker·容器·音视频
岁岁种桃花儿1 天前
详解kubectl get replicaset命令及与kubectl get pods的核心区别
运维·nginx·容器·kubernetes·k8s
thulium_1 天前
Redis Cluster + Docker + --net=host在 WSL2 下是一个“看起来能跑,实际上必失败”的组合
redis·docker
疯子的梦想@1 天前
记录一次docker+k3s+防火墙规则冲突,导致服务无法正常启动的现象。
docker·容器·eureka
小雨青年1 天前
环境准备 Windows Mac 下 Docker Desktop 的安装与镜像源加速
windows·macos·docker
倒流时光三十年1 天前
阿里云 CentOS 7 使用 docker 安装 Nginx
nginx·阿里云·docker·centos
德育处主任Pro1 天前
『NAS』在绿联部署一个像素风宝可梦同人游戏-pokerogue
游戏·docker·群晖·nas·绿联
skywalk81631 天前
MiniMax说的FreeBSD系统使用Kubernetes完整指南
云原生·容器·kubernetes·freebsd