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/用户名/仓库名:[镜像版本号]