Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。

最近用 Docker 的次数越来越多了,在此记录一下常用的命令。

核心概念

在使用之前,需要理解几个基本概念。

镜像(Image)

镜像是一个只读模板,包含应用程序运行所需的环境、依赖和配置文件,可以理解为一个运行环境的 快照。容器就是基于镜像创建的运行实例。

镜像通常采用分层结构构建,便于复用和节省存储空间。

容器(Container)

容器是镜像的运行实例,是一个轻量级、隔离的运行环境。

它共享宿主机内核,启动速度快、资源占用少,并通过 NamespaceCgroups 实现进程级隔离。

仓库(Repository)

仓库是镜像存储与分发的位置,例如:Docker Hub

可以通过 docker pull 从仓库拉取镜像,也可以搭建私有仓库用于企业内部使用。

Docker 架构

Docker 采用 C/S 架构:

客户端(docker CLI)
→ Docker Daemon(后台服务)
→ 镜像仓库

用户通过 CLI 发送命令,由 Docker Daemon 负责镜像构建、容器运行和资源管理,如本地无镜像则会自动从远程仓库拉取。


安装 Docker

安装 Docker 主要有以下几种方法,适用于不同的操作系统和需求:

通用安装脚本

推荐用于 CentOS 7、Debian、Ubuntu

curl -sSL https://get.docker.com/ | sh

国内镜像加速

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

配置 Docker

设置开机自启

systemctl start docker
systemctl enable docker

更换镜像源

为了提高拉取镜像的速度,建议配置国内的镜像源:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [
    "https://mirror.ccs.tencentyun.com"
  ]
}
EOF

sudo systemctl daemon-reload
sudo systemctl restart docker
docker info

Docker 常用命令

以下是一些基本的 Docker 命令,用于管理容器和镜像:

镜像操作

docker -v                     # 查看版本
docker search nginx           # 搜索镜像
docker pull nginx             # 拉取镜像
docker images                 # 查看本地镜像
docker rmi 镜像ID              # 删除镜像
docker history nginx          # 查看镜像分层历史
docker save -o nginx.tar nginx   # 导出镜像
docker load -i nginx.tar         # 导入镜像

构建镜像(不使用缓存):

docker build --no-cache -t mynginx .

容器操作

docker run -d -p 8080:80 --name mynginx nginx

常用参数说明:

  • --name 指定容器名称
  • -d 后台运行
  • -p 端口映射(宿主机:容器)
  • -P 随机端口映射
  • -it 交互模式
  • --rm 容器停止后自动删除
  • -e 传递环境变量
  • --restart 设置重启策略

其他命令

docker ps               # 查看当前正在运行的容器
docker ps -a            # 查看所有容器(包括已停止的容器)
docker ps -q            # 只显示容器ID(静默模式)
docker ps -n 5          # 显示最近创建的5个容器

docker stop 容器名      # 停止正在运行的容器(优雅停止,发送 SIGTERM 信号)
docker start 容器名     # 启动一个已经停止的容器
docker restart 容器名   # 重启容器(先 stop 再 start)

docker rm 容器名        # 删除已停止的容器(运行中的容器需要先 stop)
docker rm -f 容器名     # 强制删除运行中的容器

docker exec -it 容器名 bash  
# 进入正在运行的容器内部
# -i  保持标准输入开启
# -t  分配一个伪终端
# bash  在容器中启动 bash 终端(如果没有 bash,可改为 sh)

docker attach 容器名     # 连接到容器主进程

docker logs 容器名       # 查看日志
docker logs -f 容器名    # 实时查看日志

docker stats             # 查看容器资源使用情况
docker top 容器名        # 查看容器内部进程
docker inspect 容器名    # 查看容器详细信息

数据持久化(Volume)

容器删除后数据会丢失,因此必须使用数据卷。

目录挂载

docker run -d \
-p 8080:80 \
-v /data/www:/usr/share/nginx/html \
nginx

查看数据卷

docker volume ls

删除数据卷

docker volume rm 卷名

Docker 网络管理

查看网络

docker network ls

默认网络模式:

  • bridge(默认):为容器分配独立网络空间,通过 NAT 与宿主机通信,适合大多数场景
  • host:容器与宿主机共享网络栈,不进行端口映射,性能高但隔离性降低
  • none:不配置网络,容器没有任何网络功能

创建自定义网络

docker network create mynet

指定网络运行

docker run -d --network=mynet nginx

网络连接与断开

docker network connect 网络名 容器名
docker network disconnect 网络名 容器名

自定义网络下容器可以通过容器名互相访问。


日志与调试

查看日志

docker logs 容器名

实时查看日志

docker logs -f 容器名

限制日志大小(生产环境建议)

docker run -d \
--log-opt max-size=10m \
--log-opt max-file=3 \
nginx

容器运行高级参数

环境变量

docker run -d \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql

自动重启

docker run -d \
--restart=always \
nginx

重启策略:

  • no:默认,不自动重启容器
  • always:始终重启容器(即使手动停止后也会尝试重启)
  • on-failure:容器异常退出时重启,可指定失败次数
  • unless-stopped:除非手动停止,否则自动重启

资源限制

docker run -d \
--memory="512m" \
--cpus="1.0" \
nginx

指定 CPU 核心:

--cpuset-cpus="0,1"

时间同步

-v /etc/localtime:/etc/localtime:ro

Dockerfile 基础

Dockerfile 用于自定义镜像。

FROM nginx:latest
COPY ./html /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

常见指令:

  • FROM:指定基础镜像,Dockerfile 必须以 FROM 开头
  • RUN:在构建镜像时执行命令(生成新的镜像层)
  • COPY:将本地文件复制到镜像中
  • ADD:类似 COPY,但支持自动解压和远程 URL
  • WORKDIR:设置工作目录,后续命令默认在该目录执行
  • EXPOSE:声明容器对外暴露的端口(仅说明用途,不会自动映射)
  • CMD:容器启动时默认执行的命令(可被覆盖)
  • ENTRYPOINT:容器启动时的固定入口命令(通常不被覆盖)

构建镜像:

docker build -t mynginx .

Docker Compose

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。

安装

curl -L "https://github.com/docker/compose/releases/download/v2.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose version

yml 文件编写

version: '3'
services:
  php:
    image: php:7.2-apache
    volumes:
      - ./www:/var/www/html
    ports:
      - "8080:80"

启动:

docker compose up -d

停止并删除:

docker compose down

查看状态:

docker compose ps

查看日志:

docker compose logs -f

Docker 清理与空间管理

查看磁盘占用

docker system df

清理无用资源

docker system prune

清理所有未使用镜像(慎用):

docker system prune -a

批量操作命令

docker stop $(docker ps -aq)
docker rm $(docker ps -aq)
docker rmi $(docker images -q)

按条件删除:

docker rmi `docker images | grep nginx | awk '{print $3}'`