前言
这篇文章重点讲解docker compose的相关概念和命令。Compose是单机编排容器集群或者是分布式服务容器的应用工具。通过Compose,可以使用YAML文件来配置应用程序的服务。然后,使用一个命令,就可以从配置中创建并启动所有服务。
Docker-Compose是一个容器编排工具。通过一个.yml或.yaml文件,将所有的容器的部署方法、文件映射、容器端口映射等情况写在一个配置文件里,执行docker compose up命令就像执行脚本一样,一个一个的安装并部署容器。如下图所示,通过docker compose可以创建一个docker的集群。
1.使用Dockerfile创建镜像
我们可以使用Dockerfile文件,创建一个属于自己的镜像,首先是编写Dockerfile文件,然后是使用docker build命令。
可以使用nvidia的官方镜像,其中已经有了大部分的依赖包,下面是拉取pytorch镜像的命令:
官方地址:https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch
docker pull nvcr.io/nvidia/pytorch:23.05-py3
下面是Dockerfile文件,在nvidia镜像基础之上,安装了一些包,同时使用了ENTRYPOINT命令在容器启动时创建了一个jupyter-lab服务:
FROM nvcr.io/nvidia/pytorch:23.05-py3
WORKDIR /workspace
USER root
EXPOSE 8888
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get upgrade -y && apt-get install git -y
# RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple && pip install -r /workspace/requirements.txt
RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
RUN pip install diffusers --upgrade
RUN pip3 install torch torchvision torchaudio
RUN pip install invisible_watermark transformers accelerate safetensors
RUN apt-get update
ENTRYPOINT ["jupyter-lab","--no-browser","--allow-root","--port=8888","--ip=0.0.0.0","--NotebookApp.token=123456"]
进入Dockerfile所在的目录执行build命令,并取个tag名称,注意后面有个’.’
docker build -t my-image:20240205 .
2.上传镜像到私人仓库
使用以下命令给镜像打标签:
docker tag my-image:20240205 registry.example.com/my-image:20240205
使用以下命令将镜像推送至registry.example.com私人仓库:
docker push registry.example.com/my-image:20240205
使用以下命令拉取私人仓库中的镜像:
docker pull registry.example.com/my-image:20240205
3.使用Docker Compose启动一个jupyter-lab服务
首先编写好yaml文件,也可以搭配docker-entrypoint.sh使用,因为镜像里起了jupyter-lab服务,所以下面的yaml注释了entrypoint,下面是docke-compose.yaml文件:
version: '3.9'
services:
dl-train:
image: registry.example.com/my-image:20240205
ports:
- "8811:8811"
volumes:
- "/home/lxj/workspace/models:/workspace/models"
- "/home/lxj/workspace/src:/workspace/src"
networks:
- sdnet
restart: always
# entrypoint: ["sh","/workspace/src/jupyter-lab/docker-entrypoint.sh"]
deploy:
resources:
reservations:
devices:
- driver: nvidia
device_ids: ['0']
capabilities: [gpu]
networks:
sdnet:
ipam:
driver: default
config:
- subnet: 192.168.12.0/24
下面是docker-entrypoint.sh文件,可以在里面写一些pip语句安装一些包:
#!/bin/bash
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip install --upgrade jupyterlab
# jupyter labextension install @jupyter-widgets/jupyterlab-manager
jupyter-lab --no-browser --allow-root --port=8811 --ip=0.0.0.0 --NotebookApp.token=123456
最后进入yaml所在的目录,运行启动命令即可:
docker compose up -d
4.Docker Compose常用命令
当我们起了一个容器后,需要对容器有一些操作,比如查看容器中服务的日志,停止容器重新启动,接下来讲一下docker compose中操作容器的常用命令:
# 运行容器
docker compose up
# 在后台运行容器
docker compose up -d
# 指定yaml在后台运行容器
docker compose -f docker-compose.prod.yaml up -d
# 查看日志
docker compose logs -f <service-name>
# 也可以直接使用容器ID查看容器日志
docker logs -f <container-id>
# 进入容器
docker attach <container-id> 不推荐,退出容器时,容器会停止
docker exec -it <container-id> /bin/bash 推荐使用
# 停止容器,并删除相应的配置,推荐使用,如果使用docker stop并不会删除容器的network和volume,使用下面的命令可以停止并删除由docker compose文件定义的容器、网络和卷
docker compose down
5.总结
以上就是docke compose单机编排容器集群的讲解,使用yaml文件可以直观明了的使用容器,不管是日常做深度学习实验起一个单容器,还是部署一整个线上服务集群,使用docker compose容器编排技术都是十分方便快捷的。