【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 重启停止的容器
相关推荐
菩提祖师_14 小时前
基于Docker的微服务自动化部署系统
开发语言·javascript·flutter·docker
tzhou6445214 小时前
云原生与K8S入门
云原生·容器·kubernetes
言一木14 小时前
Undertow使用说明
容器
creator_Li14 小时前
docker搭建kafka集群
docker·kafka
_loehuang_14 小时前
Docker Compose 部署 Maven 私有库 nexus3
java·docker·maven·nexus·maven私有库
moxiaoran57531 天前
使用docker安装myql 8.0
运维·docker·容器
喵叔哟1 天前
15.故障排查与调试
后端·docker·容器·服务发现
梦帮科技1 天前
第三十四篇:开源社区运营:GitHub Stars增长策略
开发语言·前端·爬虫·python·docker·架构·html
长安即是故里1 天前
保姆级docker安装教程,含国内加速镜像地址
docker·docker安装教程·国内加速