Docker-(3) 进阶使用

2023-10-18 08:49:54 浏览数 (1)

介绍 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

代码语言:javascript复制
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

0 人点赞