在低版本的服务器或存在共用关系的大组环境里,Docker 是个好东西。Docker 可以提供独立的运行时环境,以免受其他服务和人的干扰。
GitHub 项目地址:docker-command
一、什么是 Docker
Docker 是一种容器技术。它通过轻量级的虚拟化,将程序及其依赖打包到一个被称为 容器 的独立运行环境里,从而保证应用在不同环境中的一致性。
容器与虚拟机,在功能上类似,但更加轻量化。容器提供的是操作系统级别的虚拟化;而虚拟机提供的是硬件级别的虚拟化。不同于虚拟机要为每个实例运行完整的操作系统,容器共享操作系统内核,因此更轻量、更高效。不过,轻量化的设计也带来了一些限制,例如 systemctl 等服务管理工具通常在容器中不可用。
1.1 核心组件
在上手 Docker 前,有必要了解它的核心组件:
- 镜像 (Image): 镜像拥有运行应用所需的一切,包括操作系统、代码、依赖等
- 容器 (Container): 容器由镜像创建,每个容器拥有独立的运行环境
你无法直接运行镜像,必须由镜像创建对应的容器才能运行。可以认为容器是镜像的实例。镜像负责存储与分发,容器负责提供服务。
1.2 主要用途
Docker 的主要用途包括:
- 轻量级虚拟化:可以当成虚拟机使用
- 支持微服务架构:每个服务运行在独立容器中,易于扩展和管理
- 支持 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
定义一个镜像的构建过程,包括基础镜像、安装软件、环境变量等。
下面这个 Dockerfile
以 Ubuntu 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 .
镜像构建完成后,可以在客户端中查看镜像信息:
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 |
查看帮助信息 |
附录
资源列表:
参考: