Docker的镜像、容器和仓库介绍

镜像(Image):类似虚拟机镜像

容器(Container):类似linux系统环境,运行和隔离应用。容器从镜像启动的时候,docker会在镜像的最上一层创建一个可写层,镜像本身是只读的,保持不变。

仓库(Repository):每个仓库存放某一类镜像。

镜像可以理解为是一个基础的系统镜像,容器则是利用该环境创建的实例,可以直接使用或修改,但是不会修改原镜像,但容器可以做成新的镜像。关系类似于面向对象的类与对象。Docker使用时大概流程是拉取(或文件加载)镜像、按需修改容器(安装软件等)、使用容器、打包成镜像和上传镜像等。

Docker镜像拉取与查看

镜像搜索(从仓库)

docker search <image> # 在docker index中搜索image

    --automated=false 仅显示自动创建的镜像

    --no-trunc=false 输出信息不截断显示

    -s 0 指定仅显示评价为指定星级的镜像

镜像拉取(从仓库)

docker pull <image> # 从docker registry server 中下拉image

还可通过指定标签下载某镜像

    docker pull [:TAG]

    docker pull centos:7

镜像载入和存出(从文件)

    存出本地镜像文件为.tar

    docker save -o ubuntu_14.04.tar ubuntu:14.04

    导入镜像到本地镜像库

    docker load --input ubuntu_14.04.tar  或者  docker load < ubuntu_14.04.tar

镜像(含容器)查看/删除

docker images: # 列出images

docker images -a # 列出所有的images(包含历史)

docker rmi <image ID>  # 删除一个或多个image

如果镜像被容器使用中,需要指定强制删除或者先删除容器,

docker ps -a #列出本机所有容器

docker rm <container ID> # 删除一个或多个container

Docker容器的使用

从镜像创建容器

docker run -it REPOSITORY:TAG (等价于先执行docker create 再执行docker start 命令)

其中-t选项让docker分配一个伪终端并绑定到容器的标准输入上, -i则让容器的标准输入保持打开。若要在后台以守护态(daemonized)形式运行,可加参数-d

docker run 的时候可以通过-v 指定挂载本地路径到系统方便使用(可以多个-v),在最后指定/bin/bash来启动命令行,例如

docker run -it -v local_path:container_path REPOSITORY:TAG /bin/bash

使用容器

通过/bin/bash创建的容器直接进入命令行,假设容器是ubuntu系统,那么就像用普通的系统一样可以在容器内安装软件

apt-get install something

通过挂载的目录拷贝文件,例如

cp /mnt/file /usr/data/

运行程序,例如

python **.py

启动进入容器

如果想进入之前的容器,使用 docker attach container_id即可,不建议重复用镜像创建容器会有大量冗余

如果容器当前的状态是stop的需要先启动容器docker start container_id。

docker ps 查看活动的容器,docker ps -a查看所有的容器。

退出容器

Ctrl-D

将容器生成镜像

如果想复用容器,可以将容器固化生成镜像

docker commit <container> [repo:tag] # 将一个container固化为一个新的image,后面的repo:tag可选。

使用dockfile生成可自动运行的镜像

新建dockerfile文件,并写入

# 基础的镜像
FROM nvidia/cuda:10.0-cudnn7-runtime-ubuntu16.04
# 配置程序依赖环境
RUN apt-get update && apt-get install -y --no-install-recommends \
         build-essential \
         cmake \
         curl \
         ca-certificates \
         libjpeg-dev \
         libpng-dev && \
     rm -rf /var/lib/apt/lists/*
# 将镜像外内容复制容器内,表示在/workspace路径下
COPY .  /workspace
# 确定容器启动时程序运行路径
WORKDIR /workspace
# 确定容器启动命令。这里列举python示例,python表示编译器,xxx.py表示执行文件,input_path和output_path为容器内绝对路径
CMD ["python", "xxx.py", "/input_path", "/output_path"]

编写好Dockerfile后,与需要打包的内容放到同一个文件夹下,然后执行命令docker build -t image_name:tag .构建镜像。

容器制作好后,可使用如下命令进行镜像调用测试,通过挂载实现输入输出在容器外。-d则直接执行之前写入文件的CMD命令:

docker run -d -v /home/images/:/input_path -v /home/out:/output_path image_name:tag

镜像上传到Docker仓库

生成的镜像可以上传到网络仓库中,以阿里云镜像服务为例,假设已经注册

docker login --username=注册邮箱 registry.cn-beijing.aliyuncs.com
docker tag [ImageId] registry.cn-beijing.aliyuncs.com/用户名/仓库名:[镜像版本号]
docker push registry.cn-beijing.aliyuncs.com/用户名/仓库名:[镜像版本号]