Docker 镜像创建
主要包括两部分:
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 创建镜像
创建镜像的方法主要有三种:
基于已有镜像的容器创建
基于本地模板导入
基于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为例说明.
# 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系统终端操作# Step2 在容器/bin/bash/中所有操作跟普通的一样,可以进行NVIDIA-Drivers和CUDA的安装、Caffe依赖项安装、Caffe编译和pycaffe接口编译等Caffe环境的搭建操作. 此时与镜像aliyun/caffe相比,已经发生了改变,则可以利用 docker commit 来提交一个新的镜像
$ sudo docker commit -m “Modified Caffe Version” -a “Author-Deepdraw” 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仓库服务中,需要登录.
-
上传本地的aliyun/caffe:v1镜像,可以先添加新的标签(TAG) aliyun/caffe:v1_change, 然后上传
sudo docker tag aliyun/caffe:v1 aliyun/caffe:v1_change
sudo docker push /caffe:v1_change 上传到阿里云 Docker 仓库
# docker login
# 登录时指明仓库域名:
sudo docker login registry.cn-hangzhou.aliyuncs.com
Username: xxx@163.com
Password:
Login Succeeded # 登录成功
- 1
- 2
- 3
- 4
- 5
- 6
确认登录信息:
- 1
cat ~/.docker/config.json
{
"auths": {
"": {
"auth": "XXXXXXXXXXXXXXXXXXXXXX"
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
企业子账户登录:
- 1
sudo docker login registry.cn-hangzhou.aliyuncs.com
Username: subaccount@compannycount
Password:
Login Succeeded
- 1
- 2
- 3
- 4
# docker push
sudo docker push registry.cn-hangzhou.aliyuncs.com/caffe:v1
- 1
- 2
2. 数据卷(Data Volumes)挂载
数据卷是可供容器使用的目录,可以在容器之间共享和重用;对数据卷的修改马上生效;更新数据卷不影响镜像;数据卷会一直存在,直到没有容器再使用.
数据卷的使用类似于Linux下对目录或文件进行 mount 操作.
-
2.1 容器内创建数据卷
利用docker run -v或–volume=/data1:/data2 命令可以实现数据卷的创建,多个-v可以创建多个数据卷,j以将数据卷挂载到容器的对应目录中,如:
$ sudo docker run -v /data/of/container IMAGE_NAME python
-
2.2 挂载主机目录作为容器数据卷
该功能允许用户放置部分程序或数据在本地主机目录,然后在容器内运行和使用. 其中,本地目录的路径必须是绝对路径,若不存在,Docker会自动创建, 如:
$ sudo docker run -volume=/data1/of/host:/data1/of/container -volume=/data2/of/host:/data2/of/container IMAGE_NAME python
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
3. 容器操作
3.1 查看容器状态
sudo docker ps -a
- 1
3.2 新建容器
docker create
命令,如:
sudo docker create -it ubuntu:latest
- 1
新建容器处于停止状态,采用 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 "***"
- 1
容器启动,返回唯一 ID .
查看容器信息:
sudo docker ps
- 1
查看容器的输出信息,docker logs
:
sudo docker logs docker_container_ID
- 1
3.6 停止容器
sudo docker stop docker_container_ID
- 1
查看处于停止状态的容器 ID 信息:
sudo docker ps -a -q
- 1
重新启动停止状态的容器:
sudo docker start docker_container_ID
- 1
停止运行状态的容器,并重启:
sudo docker restart docker_container_ID
- 1
3.7 进入容器
exec
命令.
sudo docker exec -it docker_container_ID /bin/bash
- 1
3.8 删除容器
查看处于停止状态的容器,并删除:
sudo docker ps -a
sudo docker rm container_ID
- 1
- 2
删除处于运行状态的容器:
sudo docker rm -f container_ID
- 1