一、概述
Docker 是一种轻量级的容器化技术,通过容器打包应用及其依赖环境,实现“一次构建,到处运行”。核心概念包括:
- 镜像(Image):应用的静态模板(类似“快照”),包含运行所需的所有依赖。
- 容器(Container):镜像的运行实例(类似“进程”),可启动、停止、删除。
- 数据卷(Volume):容器与宿主机间共享的持久化存储目录。
- Dockerfile:用于构建自定义镜像的脚本文件。
- Docker Compose:管理多容器应用的编排工具(通过
docker-compose.yml
配置)。
二、Docker 服务管理
1. 服务操作
操作 | 命令 | 说明 |
---|---|---|
启动 Docker | systemctl start docker |
启动 Docker 服务 |
停止 Docker | systemctl stop docker |
停止 Docker 服务 |
重启 Docker | systemctl restart docker |
重启 Docker 服务 |
设置自启动 | systemctl enable docker |
开机自动启动 Docker |
查看运行状态 | systemctl status docker |
检查 Docker 服务是否运行正常 |
查看版本信息 | docker version 或 docker info |
显示 Docker 版本及系统信息 |
三、镜像操作
1. 镜像基础
镜像可从 Docker Hub(官方仓库)或其他私有仓库拉取,格式为 [仓库地址/][命名空间/]镜像名:标签
(标签默认 latest
)。
2. 常用命令
操作 | 命令 | 示例/说明 |
---|---|---|
拉取镜像 | docker pull 镜像名[:标签] |
docker pull nginx (拉取最新版 Nginx) |
查看本地镜像 | docker images 或 docker image ls |
显示所有本地镜像(含仓库、标签、大小等) |
搜索镜像 | docker search 镜像名 |
搜索 Docker Hub 中的镜像(如 docker search mysql ) |
删除单个镜像 | docker rmi -f 镜像名[:标签] 或 docker rmi -f 镜像ID |
-f 强制删除(即使镜像被容器使用) |
删除多个镜像 | docker rmi -f 镜像1 镜像2 ... |
空格分隔多个镜像 |
删除所有未使用镜像 | docker rmi -f $(docker images -aq) |
清理无容器引用的镜像 |
打标签(Tag) | docker tag 原镜像名:原标签 新镜像名:新标签 |
如 docker tag nginx:latest my-nginx:v1 |
保存镜像到本地 | docker save -o 保存路径 镜像名[:标签] |
docker save -o /tmp/nginx.tar nginx:latest |
加载本地镜像 | docker load -i 本地文件路径 |
docker load -i /tmp/nginx.tar |
四、容器操作
1. 容器生命周期
操作 | 命令 | 示例/说明 |
---|---|---|
运行容器 | docker run [参数] 镜像名[:标签] |
常用参数: - -d :后台运行- -p 宿主机端口:容器端口 :端口映射- --name 容器名 :指定容器名- -v 宿主机路径:容器路径 :挂载数据卷- -e 环境变量=值 :设置环境变量示例: docker run -d --name my-nginx -p 80:80 nginx |
停止容器 | docker stop 容器名/容器ID |
优雅停止容器(发送 SIGTERM 信号) |
启动容器 | docker start 容器名/容器ID |
启动已停止的容器 |
重启容器 | docker restart 容器名/容器ID |
重启容器 |
强制删除容器 | docker rm -f 容器名/容器ID |
-f 强制删除(即使容器运行中) |
查看所有容器 | docker ps -a 或 docker container ps -a |
-a 显示所有容器(含已停止的) |
查看运行中容器 | docker ps 或 docker container ps |
仅显示运行中的容器 |
2. 容器日志与交互
操作 | 命令 | 示例/说明 |
---|---|---|
查看实时日志 | docker logs -f 容器名/容器ID |
-f 跟踪日志更新(类似 tail -f ) |
查看末尾 N 行日志 | docker logs --tail=N 容器名/容器ID |
示例:docker logs --tail=100 my-nginx |
进入容器终端 | docker exec -it 容器名/容器ID /bin/bash |
-it 交互式终端(退出用 exit 或 Ctrl+P+Q ) |
从容器拷贝文件到宿主机 | docker cp 容器名/容器ID:容器内路径 宿主机路径 |
示例:docker cp my-nginx:/etc/nginx/nginx.conf ./nginx.conf |
从宿主机拷贝文件到容器 | docker cp 宿主机路径 容器名/容器ID:容器内路径 |
示例:docker cp ./app.jar my-container:/app/ |
3. 数据卷管理
操作 | 命令 | 示例/说明 |
---|---|---|
查看所有数据卷 | docker volume ls |
显示所有数据卷名称及驱动信息 |
创建数据卷 | docker volume create 卷名 |
示例:docker volume create mysql-data |
查看数据卷详情 | docker volume inspect 卷名 |
显示卷的挂载路径等详细信息 |
删除数据卷 | docker volume rm 卷名 |
删除未被容器使用的数据卷 |
清理未使用数据卷 | docker volume prune |
删除所有未被容器引用的数据卷 |
五、Dockerfile 构建镜像
1. Dockerfile 指令
Dockerfile 是构建镜像的脚本,包含一系列指令。以下是核心指令说明:
指令 | 说明 | 示例 |
---|---|---|
FROM |
指定基础镜像(必须为第一条指令) | FROM openjdk:8 |
MAINTAINER |
镜像维护者信息(已弃用,推荐用 LABEL ) |
LABEL maintainer="user@example.com" |
RUN |
构建时执行的命令(支持 shell 或 exec 格式) |
RUN apt-get update && apt-get install -y vim |
COPY |
拷贝宿主机文件/目录到镜像(不自动解压) | COPY ./app.jar /app/ |
ADD |
类似 COPY ,但支持 URL 和自动解压 tar 包 |
ADD http://example.com/file.tar.gz /tmp/ |
WORKDIR |
设置容器的工作目录(后续指令在此目录执行) | WORKDIR /app |
ENV |
设置环境变量(可在后续指令中引用) | ENV JAVA_HOME=/usr/lib/jvm/java-8-openjdk |
EXPOSE |
声明容器暴露的端口(仅声明,需配合 -p 映射) |
EXPOSE 8080 |
VOLUME |
创建数据卷(挂载到宿主机或匿名卷) | VOLUME ["/data"] |
CMD |
容器启动时执行的默认命令(仅最后一个生效,可被 docker run 参数覆盖) |
CMD ["java", "-jar", "app.jar"] |
ENTRYPOINT |
容器启动时的入口命令(不会被 docker run 参数覆盖,常与 CMD 配合) |
ENTRYPOINT ["java", "-jar"] CMD ["app.jar"] |
2. 构建步骤
- 编写 Dockerfile:在项目根目录创建
Dockerfile
(无扩展名)。 - 构建镜像:执行
docker build -t 镜像名:标签 .
(.
表示 Dockerfile 所在目录)。- 示例:
docker build -t my-spring-boot:1.0 .
- 示例:
- 运行容器:基于新镜像启动容器(参考第四章容器运行命令)。
六、Docker Compose 编排
Docker Compose 用于管理多容器应用,通过 docker-compose.yml
配置文件定义服务、网络、数据卷等。
1. 常用命令
操作 | 命令 | 说明 |
---|---|---|
启动所有服务(前台) | docker compose up |
实时显示日志,按 Ctrl+C 停止 |
启动所有服务(后台) | docker compose up -d |
后台运行,不显示日志 |
停止并删除所有资源 | docker compose down |
停止容器、删除网络/卷/镜像(可选 -v ) |
查看服务日志 | docker compose logs [服务名] |
示例:docker compose logs web |
重启服务 | docker compose restart [服务名] |
示例:docker compose restart db |
检查配置文件语法 | docker compose config |
验证 docker-compose.yml 格式是否正确 |
2. 示例 docker-compose.yml
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- db
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: "123456"
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data:
- 说明:定义两个服务(
web
和db
),web
服务挂载本地./html
目录到容器,依赖db
服务;db
服务使用 MySQL 镜像,设置 root 密码并持久化数据到mysql-data
卷。
七、高级配置
1. 远程访问 Docker(仅开发环境)
默认 Docker 仅监听本地 Unix Socket(fd://
),如需远程访问(如通过 TCP 端口),需修改配置:
- 编辑 Docker 服务配置文件:
sudo vim /lib/systemd/system/docker.service
- 修改
ExecStart
行,添加-H tcp://0.0.0.0:2375
(监听所有 IP 的 2375 端口):ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375
- 重新加载配置并重启 Docker:
sudo systemctl daemon-reload sudo systemctl restart docker
- 开放防火墙端口(如使用
firewalld
):sudo firewall-cmd --zone=public --add-port=2375/tcp --permanent sudo firewall-cmd --reload
2. 查看容器 IP 地址
docker inspect 容器名/容器ID | grep -i ipaddress | head -n 1 | awk '{print $2}' | tr -d '",'
3. 清理无用资源
- 清理停止的容器:
docker rm $(docker ps -aq)
- 清理名称/标签为
<none>
的镜像:docker rmi -f $(docker images | grep '<none>' | awk '{print $3}')
- 清理所有未使用资源(容器、镜像、卷、网络):
docker system prune -a --volumes
八、附录:常用命令速查表
分类 | 命令 | 说明 |
---|---|---|
服务管理 | systemctl start/stop/restart docker |
启动/停止/重启 Docker 服务 |
镜像操作 | docker pull nginx |
拉取 Nginx 镜像 |
docker images |
查看本地镜像 | |
容器操作 | docker run -d -p 80:80 --name web nginx |
运行后台 Nginx 容器并映射端口 |
docker logs -f web |
实时查看 web 容器日志 | |
数据卷 | docker volume create my-vol |
创建数据卷 my-vol |
docker volume ls |
查看所有数据卷 | |
Dockerfile 构建 | docker build -t my-img:1.0 . |
构建名为 my-img:1.0 的镜像 |
Docker Compose | docker compose up -d |
后台启动 Compose 服务 |
注意:以上操作需根据实际环境调整路径、端口等参数,生产环境需加强安全配置(如限制远程访问、启用 TLS 加密等)。