Hello,这里是柚木梨酱,今天给大家带来的是我的docker学习笔记
Docker 是一款开源轻量级容器化平台,可以将应用程序、运行依赖、配置文件、运行环境打包封装,实现一次构建,到处运行。
简单类比:如果把项目比作货物,Docker 就像是集装箱,不管运输工具是轮船、货车(不同操作系统、服务器),集装箱内的货物环境不会改变,完美规避环境兼容问题。

容器(Container)
轻量化的运行实例,包含应用代码、运行时环境和依赖库。基于镜像创建,与其他容器隔离,共享主机操作系统内核(比虚拟机更高效)。
镜像(Image)
只读模板,定义了容器的运行环境(如操作系统、软件配置等)。通过分层存储(Layer)优化空间和构建速度。
仓库(Registry)
存储和分发镜像的平台,如 Docker Hub(官方公共仓库)或私有仓库(如 Harbor)
Dockerfile(镜像构建脚本):
Dockerfile 是一个纯文本构建脚本,里面包含一条条指令,用来自动化构建自定义镜像。通俗来讲:它是制作镜像的“配方说明书”。
我们可以通过编写Dockerfile,指定依赖、安装软件、配置环境、启动命令,最后通过 docker build 命令打包生成专属镜像。优势:版本可控、环境可复刻、适配项目自动化部署。
Volume(数据卷)
Volume 即数据卷,是Docker用于持久化数据、实现宿主机和容器数据共享的目录。
容器默认内部数据是临时的:容器删除,数据全部丢失。而数据卷可以把容器数据挂载到宿主机磁盘,实现数据永久保存、容器之间数据共享。生产环境中MySQL、Redis等数据库必须挂载数据卷,防止数据丢失。
Docker Network(容器网络)
Docker 网络是用来控制容器与容器、容器与宿主机、容器与外网之间通信的网络机制。
Docker内置多种网络模式,新手常用三种:
bridge(桥接模式,默认):同一服务器下容器互相通信,隔离外网,最常用;
host(主机模式):容器直接共用宿主机网卡,无端口隔离;
none(无网络模式):禁用网络,适用于安全隔离、不需要联网的容器。
网络的核心作用:实现端口映射、集群通信、容器互通、外网访问容器服务。
环境一致性:开发、测试、生产环境完全统一,杜绝环境bug;
部署简单高效:秒级部署,一键启动服务;
资源占用低:轻量化运行,比虚拟机节省大量内存、磁盘资源;
隔离性强:多个容器相互独立,互不干扰;
可移植性高:打包后的镜像可以在任意安装Docker的服务器运行。
docker version#查看Docker客户端和服务端版本dockerinfo#查看Docker系统详细信息dockersystemdf#查看Docker 磁盘占用情况systemctl statusdocker#查看Docker服务状态systemctlstartdocker#启动Dockersystemctlstopdocker#停止Dockersystemctlrestartdocker#重启Dockersystemctlenabledocker#设置Docker开机自启systemctldisabledocker#关闭Docker 开机自启docker images#查看本地所有镜像dockerimagels#查看镜像(新版写法)dockerhistorynginx#查看镜像构建历史层dockerinspectnginx# 查看镜像详细信息docker pullnginx#拉取最新版镜像dockerpullnginx:1.27#拉取指定版本镜像dockersearchredis#搜索DockerHub 镜像docker rminginx#删除镜像dockerrmi-fnginx#强制删除镜像dockerimageprune#删除无用镜像dockerimageprune-a# 删除所有未使用镜像docker save-onginx.tarnginx#导出镜像dockerload-inginx.tar# 导入镜像docker tagnginxregistry/app:v1#给镜像打标签dockerpushregistry/app:v1#推送镜像到仓库dockerpullregistry/app:v1# 从仓库拉取镜像docker runnginx#运行容器dockerrun-dnginx#后台运行容器dockerrun-itubuntubash#交互式运行容器dockerrun--namewebnginx#指定容器名称dockerrun-p80:80nginx#端口映射dockerrun-p8080:80nginx#指定宿主机端口dockerrun-d--restartalwaysnginx#设置自动重启dockerrun-eMYSQL_ROOT_PASSWORD=123456mysql# 设置环境变量docker ps#查看运行中的容器dockerps-a#查看所有容器dockerps-q#只显示容器IDdockerstats#查看容器资源占用dockertopnginx# 查看容器进程docker startnginx#启动容器dockerstopnginx#停止容器dockerrestartnginx#重启容器dockerkillnginx#强制停止容器dockerpausenginx#暂停容器dockerunpausenginx# 恢复容器docker rmnginx#删除停止状态容器dockerrm-fnginx#强制删除运行中的容器dockercontainerprune# 删除所有停止的容器docker inspectnginx#查看容器详细配置dockerportnginx#查看端口映射dockerdiffnginx# 查看容器文件变化docker exec -it nginx bash # 进入容器(bash)dockerexec-itnginxsh#Alpine/Linux容器使用shdockerattachnginx# 直接连接容器终端docker logsnginx#查看日志dockerlogs-fnginx#实时查看日志dockerlogs--tail100nginx#查看最后100行日志dockerlogs-tfnginx# 实时查看并显示时间docker events#实时查看Docker事件dockerstats--no-stream# 查看一次资源使用情况docker volumecreatemydata#创建数据卷dockervolumels#查看所有数据卷dockervolumeinspectmydata# 查看数据卷详细信息docker run-vmydata:/datanginx#挂载Volumedockerrun-v/host:/containernginx#挂载宿主机目录dockerrun-v$(pwd):/appnginx# 挂载当前目录docker volumerm mydata # 删除数据卷dockervolumeprune# 删除无用数据卷docker networkls# 查看所有网络docker network inspect bridge # 查看网络详情docker networkcreateapp-net#创建网络dockernetworkcreate--driverbridgeapp-net# 指定驱动docker run--networkapp-netnginx#指定网络运行容器dockernetworkconnectapp-netnginx#将容器加入网络dockernetworkdisconnectapp-netnginx# 将容器移出网络docker networkrmapp-net#删除网络dockernetworkprune# 删除无用网络docker composeup#启动服务dockercomposeup-d#后台启动服务dockercomposedown#停止并删除服务dockercomposerestart# 重启服务docker composebuild#构建服务dockercomposeup-d--build#重建并启动服务dockercomposeup--scaleweb=3# 扩容服务docker composeps#查看服务状态dockercomposelogs#查看日志dockercomposelogs-f#实时日志dockercomposetop# 查看进程docker build-tapp:v1.#构建镜像dockerbuild-fDockerfile.prod.#指定Dockerfiledockerbuild--no-cache-tapp:v1.# 不使用缓存构建FROM golang:1.24ASbuildWORKDIR/appCOPY..RUNgobuild-oapp.FROMalpineCOPY--from=build/app/app.CMD["./app"]docker run--cpus="2"nginx#限制CPUdockerrun-m512mnginx#限制内存dockerrun--memory-swap=1gnginx#限制 Swapdocker run--ulimitnofile=65535:65535nginx#限制文件句柄dockerrun--pids-limit200nginx# 限制进程数量docker run--read-onlynginx#只读文件系统dockerrun--cap-dropALLnginx#删除所有LinuxCapabilitydockerrun--user1000:1000nginx# 指定用户运行trivy image nginx # 扫描镜像漏洞docker scout cves nginx # Docker 官方漏洞扫描docker systemdf#查看Docker占用空间du-sh/var/lib/docker#查看Docker 数据目录大小docker systemprune#清理无用资源dockersystemprune-a#清理所有未使用资源dockerbuilderprune# 清理构建缓存truncate -s 0/var/lib/docker/containers/*/*.log # 清空容器日志ss -tunlp#查看端口监听情况netstat-tunlp#老版本 Linuxdocker inspect nginx | grep IPAddress # 查看容器 IPdocker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginxdocker exec-itnginxshpingbaidu.com#测试网络curllocalhost#测试HTTPnslookupgoogle.com#测试 DNSdocker rm-f$(docker ps-aq) # 删除所有容器docker rmi -f$(docker images -q) # 删除所有镜像docker stop $(docker ps-q) # 停止所有运行中的容器dockerps -a--format"{{.Names}}"# 输出容器名称# 固定镜像版本nginx:1.27# 使用 Alpine 小体积镜像 node:20-alpine# 设置自动重启--restart unless-stopped# 配置健康检查HEALTHCHECK# 使用 Volume 持久化数据-v mysql-data:/var/lib/mysql
docker ps# 查看容器docker logs -f# 查看日志docker exec -it# 进入容器docker inspect # 查看详细信息docker stats # 查看资源占用docker restart # 重启容器docker compose up -d# 启动服务docker system prune -a# 清理系统docker network ls# 查看网络docker volume ls# 查看数据卷
FROM | FROM ubuntu:24.04 | |||
LABEL | LABEL author="admin" | |||
ARG | ARG VERSION=1.0 | |||
ENV | ENV JAVA_HOME=/opt/java | |||
WORKDIR | WORKDIR /app | cd /app | ||
COPY | COPY . /app | |||
ADD | ADD test.tar.gz / | |||
RUN | RUN apt update | |||
CMD | CMD ["nginx"] | |||
ENTRYPOINT | ENTRYPOINT ["python"] | |||
EXPOSE | EXPOSE 8080 | |||
VOLUME | VOLUME /data | |||
USER | USER appuser | |||
HEALTHCHECK | HEALTHCHECK CMD curl | |||
SHELL | SHELL ["/bin/bash","-c"] | /bin/sh | ||
STOPSIGNAL | STOPSIGNAL SIGTERM | |||
ONBUILD | ONBUILD COPY . . |
dockerfile 代码示例
# =========================# 指定基础镜像# =========================# 使用固定版本,避免 latest 带来的不可控问题FROMubuntu:24.04# =========================# 镜像元数据# =========================LABELmaintainer="admin@example.com"LABELversion="1.0"LABELdescription="DockerfileDemo"# =========================# 构建参数(仅构建阶段有效)# docker build --build-arg APP_VERSION=2.0 .# =========================ARGAPP_VERSION=1.0# =========================# 环境变量(容器运行时依然存在)# =========================ENVAPP_HOME=/opt/appENVTZ=Asia/Shanghai# =========================# 设置工作目录# 后续命令都会在该目录执行# =========================WORKDIR${APP_HOME}# =========================# 复制文件# COPY 推荐用于普通文件复制# =========================COPY./src./src# =========================# ADD 支持自动解压 tar 文件# 不推荐频繁使用# =========================ADDtest.tar.gz/tmp/# =========================# 安装软件# RUN 每执行一次都会生成新的 Layer# 尽量合并 RUN 指令# =========================RUNaptupdate&&\aptinstall-y\curl\wget\vim\nginx\python3\python3-pip&&\aptclean&&\rm-rf/var/lib/apt/lists/*# =========================# 创建普通用户# 企业级安全建议:# 不要使用 root 运行程序# =========================RUNuseradd-mappuser# =========================# 切换运行用户# =========================USERappuser# =========================# 容器暴露端口# 只是声明# 真正开放需要 docker run -p# =========================EXPOSE8080# =========================# 挂载卷# 用于数据持久化# =========================VOLUME ["/data"]# =========================# 健康检查# 检测服务是否正常# =========================HEALTHCHECK--interval=30s--timeout=5s--retries=3\CMDcurl-fhttp://localhost:8080||exit1# =========================# 容器启动默认参数# =========================CMD ["--port", "8080"]# =========================# 容器主程序# ENTRYPOINT 通常用于固定启动程序# =========================ENTRYPOINT ["python3", "./src/app.py"]
构建命令
# 构建镜像docker build -t myapp .# 指定构建参数docker build \--build-arg APP_VERSION=2.0\-t myapp .# 运行容器docker run -d \-p 8080:8080\--name myapp-container \myapp# 查看日志docker logs -f myapp-container# 进入容器docker exec -it myapp-container bash
企业实践