介绍 Dockerfile 以及 Docker Compose 的使用
1. Dockerfile
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
Dockerfile一行一个命令。常见的命令如下:
- FROM: 用来告诉Docker使用哪个base Image或者主平台,基础镜像可以从dockerhub找,如pytorch(选devel版):https://hub.docker.com/r/pytorch/pytorch/tags?page=1&ordering=last_updated
- WORKDIR: 为其他的docker指令如RUN、CMD设置一个工作目录
- ENV: 设置app所需的环境变量。
- ARG: 设置构建参数,ARG <参数名>[=<默认值>] -COPY: 格式为COPY SOURCE DESTINATION,拷贝文件
- RUN: 在当前的image新建一个layer,并在这个新的layer运行命令
- CMD: 在container中运行命令
- ENTRYPOINT: 将container配置为可执行文件,如 ENTRYPOINT [“flask”, “run”]
更多命令可参考:https://docs.docker.com/engine/reference/builder/#run
注意:RUN和CMD的区别——Dockerfile不能等同于shell命令来写, 在 Shell 中,连续两行是同一个进程执行环境,因此前一个命令修改的内存状态,会直接影响后一个命令; 而在 Dockerfile 中,这两行 RUN 命令的执行环境根本不同,是两个完全不同的容器。 每一个 RUN 都会启动一个容器、执行命令、然后提交存储层文件变更。 第二层RUN启动的是一个全新的容器,跟第一层的容器完全没关系,自然不可能继承前一层构建过程中的内存变化。 因此如果需要改变以后各层的工作目录的位置,那么应该使用 WORKDIR 指令。
Dockerfile示例:
代码语言:javascript复制FROM pytorch/pytorch:1.3-cuda10.1-cudnn7-devel
MAINTAINER kppkkp <920315842@qq.com>
ENV DEBIAN_FRONTEND=noninteractive
RUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
RUN apt-get update
&& apt-get install -y sudo build-essential cmake curl vim wget tree screenfetch
htop zip openssh-server screen unzip graphviz ca-certificates
&& apt-get install -y ffmpeg libsm6 libxext6 git ninja-build libglib2.0-0 libxrender-dev
&& apt-get clean
&& rm -rf /var/lib/apt/lists/*
# python3 related
RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
RUN pip install cython
RUN pip install -U 'git https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI'
RUN git clone --recursive https://github.com/LingyvKong/CenterTrack.git /CenterTrack
WORKDIR /CenterTrack
RUN pip install -r requirements.txt
# RUN sh /CenterTrack/src/lib/model/networks/DCNv2/make.sh
# Add user root
RUN echo "root:123456" | chpasswd
RUN echo "root ALL=(ALL) ALL" >> /etc/sudoers
# config ssh
RUN mkdir /var/run/sshd &&
sed -ri 's/^PermitRootLogins .*/PermitRootLogin yes/' /etc/ssh/sshd_config &&
sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config
EXPOSE 22
# set environment
RUN ldconfig
ENV LANG C.UTF-8
RUN export LC_ALL=C.UTF-8 >> /root/.bashrc
RUN export LANG=C.UTF-8 >> /root/.bashrc
CMD ["/usr/sbin/sshd", "-D"]
从Dockerfile构建image
代码语言:javascript复制# 进入Dockerfile所在路径后运行
docker build -t flask_app:1.0 .
构建完后会在本机上创建一个image,可以使用docker images
查看。
2. Docker Compose
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
https://www.runoob.com/docker/docker-compose.html
docker-compose.yaml中使用GPU(注意观察示例yaml中的层级结构):
注意docker-compose -v
,docker-compose版本需要高于1.19
version: '2.4'
services:
nvsmi:
image: ubuntu:16.04
runtime: nvidia
environment:
- NVIDIA_VISIBLE_DEVICES=all
command: nvidia-smi
常用命令
代码语言:javascript复制# 创建并运行容器
docker-compose up -d
docker-compose up
# 停止并删除容器
docker-compose down
# 停止容器
docker-compose stop
# 删除停止状态的容器
docker-compose rm
# 查看日志
docker-compose logs
# 查看所有容器
docker-compose ps -a