Docker 命令速查

在低版本服务器运行高版本环境,使用 Docker 是一个好办法。

GitHub 项目地址:docker-command

一、什么是 Docker

Docker 是一种容器技术。它通过轻量级的虚拟化,将程序及其依赖打包到一个称为 容器 的独立运行环境中,从而保证应用在不同环境中的一致性。

容器与虚拟机功能类似,但更加轻量化,这是因为容器提供操作系统级别的虚拟化,而虚拟机则是硬件级别的虚拟化。不同于虚拟机需要为每个实例运行一个完整的操作系统,容器共享操作系统内核,因此更轻量、更高效。不过,轻量化的设计也带来了一些限制,例如 systemctl 等服务管理工具通常在容器中不可用。

1.1 核心组件

要上手 Docker,首先要认识两大核心组件:

  1. 镜像 (Image): 镜像拥有运行应用所需的一切,包括操作系统、环境变量、代码、依赖包等等
  2. 容器 (Container): 容器可由镜像创建,每个容器拥有独立的运行环境

镜像是无法直接运行的,需要由镜像创建对应的容器才能运行。可以认为容器是镜像的实例。镜像负责存储和分发,容器负责部署并提供服务。

1.2 主要用途

很多场景能用上 Docker:

  1. 轻量级虚拟化:可以当作虚拟机使用
  2. 保证环境一致:确保开发、测试和生产环境的一致性
  3. 支持微服务架构:让每个服务运行在独立的容器中,易于扩展和管理
  4. 支持 CI/CD 流水线:打包依赖及应用时,一次构建即可在任何环境中运行

如果你还不了解 Docker,请访问以下资源:

二、常用命令

2.1 基础操作

命令 描述
docker info 查看 docker 系统信息
docker version 查看 docker 版本信息
docker --version 查看 docker 简略版本信息
docker login 登录 DockerHub
docker login nvcr.io 登录 nvcr.io

2.2 镜像管理

命令 描述
docker images 查看镜像
docker pull [IMAGE] 拉取镜像
docker rmi [IMAGE] 删除镜像
docker commit [CONTAINER] [IMAGE]:[TAG] 将容器保存为新的镜像
docker save -o myimage.tar [IMAGE] 将镜像保存到指定路径
docker load -i path/to/myimage.tar 从 tar 文件中加载镜像

2.3 容器管理

命令 描述
docker create [IMAGE] 创建容器
docker run [IMAGE] 创建并运行容器
docker start [CONTAINER] 启动容器
docker stop [CONTAINER] 停止容器
docker restart [CONTAINER] 重启容器
docker ps 列出运行容器
docker ps -a 列出所有容器
docker exec -it [CONTAINER] /bin/bash 启动交互模式
docker rm [CONTAINER] 删除容器
docker port [CONTAINER] 查看端口映射
docker top [CONTAINER] 查看容器内进程
docker stats [CONTAINER] 查看资源使用情况
docker cp [CONTAINER]:[PATH] [LOCAL_PATH] 拷贝文本到本地
docker cp [LOCAL_PATH] [CONTAINER]:[PATH] 拷贝文件到容器
docker export -o mycontainer.tar [CONTAINER] 将容器存成文件
docker import path/to/mycontainer.tar [IMAGE]:[TAG] 文件加载成镜像

2.4 容器运行

命令 描述
docker run --name [NAME] [IMAGE] 创建运行并命名容器
docker run -d [IMAGE] 创建容器并在后台运行
docker run -p [LOCAL_PORT]:[CONTAINER_PORT] [IMAGE] 创建容器并指定端口映射
docker run -v [LCOAL_PATH]:[CONTAINER_PATH] [IMAGE] 创建容器并将本地目录挂载到容器目录
docker run -it [IMAGE] /bin/bash 创建容器并启动交互式 shell

三、Docker 的简单使用

Docker 是客户端 / 服务端分离的,因此使用前,通常需要检查一下服务端和客户端是否都在运行:

docker info

3.1 获取镜像的两种方法

3.1.1 从 Docker Hub 获取镜像

可以用 docker pull 命令,从 Docker Hub 拉取镜像。例如,以下命令可拉取带有 Nginx 服务的镜像:

docker pull nginx:stable-alpine-perl
3.1.2 用 Dockerfile 构建镜像

通过 Dockerfile,你可以定义一个镜像的构建过程,包括基础镜像、安装软件、环境变量等。

下面这个 DockerfileUbuntu 22.04 为基础镜像,安装了 Miniconda 和 Jupyter Lab,并将 Jupyter Lab 日志写入工作目录的 jupyter_lab.log 文件。

Dockerfile 文件:

# 使用 Ubuntu 22.04 LTS 作为基础镜像
FROM ubuntu:22.04

# 设置环境变量
ENV DEBIAN_FRONTEND=noninteractive

# 更新 apt-get 并安装必要的依赖
RUN apt-get update && apt-get install -y \
    wget \
    bzip2 \
    curl \
    git \
    && rm -rf /var/lib/apt/lists/*

# 安装 Miniconda
RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh && \
    bash miniconda.sh -b -f -p /opt/conda && \
    rm miniconda.sh && \
    /opt/conda/bin/conda init bash

# 设置 conda 环境路径
ENV PATH=/opt/conda/bin:$PATH

# 安装 Jupyter Lab
RUN conda install -y jupyterlab

# 创建工作目录
WORKDIR /workspace

# 暴露 Jupyter Lab 默认端口
EXPOSE 8888

# 启动 Jupyter Lab,设置根目录为工作目录,禁用浏览器,禁用 token
CMD ["sh", "-c", "nohup jupyter lab --ip=0.0.0.0 --allow-root --notebook-dir=/ --no-browser > /workspace/jupyter_lab.log 2>&1"]

使用以下命令构建镜像:

# 1. 检查 docker 环境是否正常
docker info

# 2. 构建镜像
docker build -t jupyter_server_image .

镜像构建完成后,可以在客户端中查看镜像信息:

docker-app

3.2 如何启动容器

一旦镜像完成构建,可以通过以下命令启动容器:

# 3. 测试容器
docker run \
    --rm \
    --gpus all \
    -it \
    --name jupyter_server_app \
    jupyter_server_image /bin/bash

# 4. 运行容器
docker run \
    --gpus all \
    --name jupyter_server_app \
    -d \
    -p 9999:8888 \
    -v $(pwd)/jupyter_workspace:/workspace \
    jupyter_server_image

运行选项说明:

  • --rm: 当容器退出时自动删除容器,常用于测试
  • --gpus all: 启用所有可用的 GPU 资源
  • -it: 启动交互式终端
  • --name: 为容器指定名字
  • -d: 以后台模式运行容器
  • -p <local-port>:<container-port>: 将主机端口映射到容器端口
  • -v <local-path>:<container-path>: 将主机路径挂载到容器路径

3.3 GPU 机器配置

1)检查 NVIDIA 驱动程序

确保你的系统上已经安装了 NVIDIA 驱动程序。你可以通过 nvidia-smi 命令来检查是否已安装并输出版本信息。

nvidia-smi

2)安装 NVIDIA Container Toolkit

如果还没有安装 NVIDIA Container Toolkit,可以通过以下命令安装(以 Ubuntu 为例):

# 1. 添加 NVIDIA 软件包列表
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

# 2. 更新 apt 缓存,并安装 NVIDIA Container Toolkit
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit

# 3. 重启Docker服务
sudo systemctl restart docker

3)检查 CUDA 和 PyTorch

通常 CUDA 和 PyTorch 在 NVIDIA 官方容器中已经安装好了。运行以下命令验证是否已安装:

# 输出 CUDA 版本
nvcc --version

# 输出 PyTorch 版本
pip show torch

四、Docker Compose 的简单使用

Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。通过 YAML 文件(docker-compose.yml),可定义多个服务及其配置。使用 docker-compose 命令可以快速部署和管理这些服务。

4.1 安装 Docker Compose

对于 MacOS 和 Linux:

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

4.2 常用命令

命令 描述
docker-compose version 显示版本信息
docker-compose up 创建并启动容器
docker-compose up -d 以后台模式启动容器
docker-compose down 停止并移除容器和网络
docker-compose restart 重启容器
docker-compose start 启动容器
docker-compose stop 停止容器
docker-compose rm 移除容器
docker-compose logs 查看容器日志
docker-compose top 显示容器进程
docker-compose build 构建镜像
docker-compose ps 列出容器及其状态信息
docker-compose config 检查 Compose 文件是否有语法错误
docker-compose exec 在运行中的容器执行命令
docker-compose kill 强制终止容器
docker-compose pause 暂停服务容器
docker-compose unpause 恢复已暂停的服务容器
docker-compose images 列出使用的镜像
docker-compose port 显示端口绑定
docker-compose help 查看帮助信息

附录

资源列表: