Docker - Image镜像创建及容器操作

主要包括两部分:

  1. 镜像(IMAGE)创建
  2. 数据卷(Data Volumes)挂载

1. 镜像(IMAGE)创建

1.1 获取镜像

从注册服务器(如Docker Hub、 阿里云等)中的 IAMGE_NAME 仓库中下载标签为latest(默认)和TAG的镜像.

sudo docker pull IMAGE_NAME      
sudo docker pull IMAGE_NAME:TAG  

1.2 查看镜像信息

sudo docker images  

列出IMAGE的字段信息:

仓库来源, REPOSITORY   
镜像的标签信息,TAG
镜像的ID(唯一)
创建时间
镜像大小

1.3 搜索镜像

搜索远程仓库里共享的镜像

sudo docker search TERM

1.4 删除镜像

sudo docker rmi IMAGE:TAG/IMAGE_ID

1.5 创建镜像

创建镜像的方法主要有三种:

[1] - 基于已有镜像的容器创建

[2] - 基于本地模板导入

[3] - 基于Dockerfile创建

这里主要说明第一种方法.

1.5.1 基于已有镜像的容器创建

利用下载好的镜像,使用 docker/nvidia-docker(gpu版本) commit 命令进行容器创建,其命令格式为:

sudo docker commit [OPTIONS] CONTAINER [REPOSITORY:TAG]  

OPTIONS 说明:

-a, --authors="",  作者信息
-m, --message="", 提交信息  
-p, --pause=true, 提交时暂停容器进行

以基于镜像 aliyun/caffe:latest创建新镜像 aliyun/caffe:v1为例说明.

[1] - Step1 启动镜像aliyun/caffe,并在其中进行修改:

sudo docker run -it aliyun/caffe /bin/bash 
root@a868ca395b0f:/#   

此时容器ID为a868ca395b0f.

参数说明:

-i, 交互模式,在标准控制台进行输入输出
-d, 后台模式
-t, 为新创建的容器分配一个新的伪终端, 往往与-i合用,-it    
aliyun/caffe, 镜像名称,也可以是IMAGE_ID   
/bin/bash, 在新建容器中运行的命令,类似于Ubuntu系统终端操作

[2] - Step2 在容器 /bin/bash/ 中所有操作跟普通的一样,可以进行NVIDIA-Drivers和CUDA的安装、Caffe依赖项安装、Caffe编译和pycaffe接口编译等Caffe环境的搭建操作. 此时与镜像aliyun/caffe相比,已经发生了改变,则可以利用 docker commit 来提交一个新的镜像

sudo docker commit -m "Modified Caffe Version" -a "Author" a868ca395b0f aliyun/caffe:v1  

该命令会返回新创建镜像的ID信息,一串字符.

sudo docker images

查看本地镜像列表,即可看到新创建镜像aliyun/caffe:v1的相关信息

1.6 保存和载入镜像

镜像保存,如,将镜像aliyun/caffe保存为文件 aliyun_caffe.tar

sudo docker save -o aliyun_caffe.tar aliyun/caffe 

镜像载入,如,将文件 aliyun_caffe.tar 载入到镜像列表里

sudo docker load --input aliyun_caffe.tar 
# 或
sudo docker load < aliyun_caffe.tar

1.7 上传镜像

镜像创建或修改后,可以上传到Docker 镜像存储中心,即仓库(Registry)里,如阿里云提供的Docker仓库服务中,需要登录.

[1] - 上传本地的aliyun/caffe:v1镜像,可以先添加新的标签(TAG) aliyun/caffe:v1_change, 然后上传

sudo docker tag aliyun/caffe:v1 aliyun/caffe:v1_change
sudo docker push aliyun.caffe/caffe:v1_change 

[2] - 上传到阿里云 Docker 仓库

# docker login
# 登录时指明仓库域名:registry.cn-hangzhou.aliyuncs.com
sudo docker login registry.cn-hangzhou.aliyuncs.com
# Username: xxx@xxx.com
# Password:
# Login Succeeded # 登录成功

确认登录信息:

cat ~/.docker/config.json
{
    "auths": {
        "registry.cn-hangzhou.aliyuncs.com": {
            "auth": "XXXXXXXXXXXXXXXXXXXXXX"
        }
    }
}

企业子账户登录:

sudo docker login registry.cn-hangzhou.aliyuncs.com
# Username: subaccount@compannycount
# Password:
# Login Succeeded

上传镜像:

# docker push
sudo docker push registry.cn-hangzhou.aliyuncs.com/caffe:v1

2. 数据卷(Data Volumes)挂载

数据卷是可供容器使用的目录,可以在容器之间共享和重用;

对数据卷的修改马上生效;

更新数据卷不影响镜像;

数据卷会一直存在,直到没有容器再使用.

数据卷的使用类似于Linux下对目录或文件进行 mount 操作.

2.1 容器内创建数据卷

利用 docker run -v--volume=/data1:/data2 命令可以实现数据卷的创建,多个-v可以创建多个数据卷,以将数据卷挂载到容器的对应目录中,如:

sudo docker run -v /data/of/container IMAGE_NAME python demo.py

2.2 挂载主机目录作为容器数据卷

该功能允许用户放置部分程序或数据在本地主机目录,然后在容器内运行和使用. 其中,本地目录的路径必须是绝对路径,若不存在,Docker会自动创建,如:

sudo docker run -volume=/data1/of/host:/data1/of/container \
                -volume=/data2/of/host:/data2/of/container \
                IMAGE_NAME python demo.py

Docker 挂载数据卷的默认权限是读写(rw), 也可以通过ro指定权限为只读,使容器挂载的数据卷中的内容不能进行修改, 如:

sudo docker run -volume=/data1/of/host:/data1/of/container:ro \
                -volume=/data2/of/host:/data2/of/container:ro \
                IMAGE_NAME python demo.py 

3. 容器操作

3.1 查看容器状态

sudo docker ps -a

3.2 新建容器

docker create 命令,如:

sudo docker create -it ubuntu:latest

新建容器处于停止状态,采用 docker start 来启动.

3.3 启动容器

两种启动方式:

  • 基于镜像新建容器并启动;docker run命令
  • 基于停止状态的容器重新启动; docker create + docker start 命令.

3.4 退出容器

exit 命令.

3.5 后台运行容器

Docker 容器在后台以守护状态(Daemonized) 运行.

sudo docker run -d ubuntu:latest /bin/sh -c "***"

容器启动,返回唯一 ID .

查看容器信息:

sudo docker ps

查看容器的输出信息,docker logs

sudo docker logs docker_container_ID

3.6 停止容器

sudo docker stop docker_container_ID

查看处于停止状态的容器 ID 信息:

sudo docker ps -a -q

重新启动停止状态的容器:

sudo docker start docker_container_ID

停止运行状态的容器,并重启:

sudo docker restart docker_container_ID

3.7 进入容器

exec命令.

sudo docker exec -it docker_container_ID /bin/bash

3.8 删除容器

查看处于停止状态的容器,并删除:

sudo docker ps -a
sudo docker rm container_ID 

删除处于运行状态的容器:

sudo docker rm -f container_ID
Last modification:December 14th, 2018 at 05:11 pm

Leave a Comment