一. 实验目的:
- 熟悉镜像的基本工作原理;
- 掌握镜像操作的常用命令;
- 用两种不同的方法创建一个新的镜像;
二. 实验环境:
Ubuntu16.04+Docker
三. 实验内容:
- 练习使用镜像操作的常用命令;
- 熟练掌握创建新镜像的不同方法。
四、 实验练习:
1.拉取镜像
拉取镜像的命令如下:
docker pull [仓库地址:端口] NAME[:TAG|@DIGEST]
问题:
(1)从官方镜像上拉取一个14.04标签的镜像ubuntu。
(2)如何从私有仓库quay.io上拉取一个latest标签的镜像flannel
从私有仓库上拉取镜像:
docker pull <私有库ip>:<端口>/ < 镜像repository> :<镜像tag>
sudo docker pull quay.io/coreos/flannel:y0.10.0-amd64
docker pull quay.io/username/flannel:tag
2.搜索镜像
采用不同的两种方式进行镜像的搜索:
(1)在docker hub网站上搜索https://hub.docker.com,搜索镜像名为ubuntu的所有镜像
此时就可在这个网站上注册一个账号,之后也可在终端登录
(2)在终端下,通过docker命令行方式搜索
docker search [OPTIONS] TERM
OPTIONS说明:
--no-trunc=false 是否截断
--limit int 搜索的最多结果数,最多25个
--filters=stars=最低收藏数 限定显示结果的最低收藏数
如何从Docker Hub查找所有镜像名包含ubuntu,并且收藏数大于20的镜像?
3.查看镜像
常见有两种查看镜像的方法:
(1)docker images,查看本地存储的镜像的仓库名称、标签、ID号、创建时间和大小等简单信息。命令格式如下:
docker images [options] [REPOSITORY]
-a, --all=fase 显示所有镜像
-f,--filter=[ ]过滤参数
--no-trunc=false 是否截断
-q, --quiet=false 显示镜像的唯一ID
要求:
- 列出包含中间层的所有镜像
- 列出所有的镜像,并且可以看到完整的ID
(2)docker inspect,查看镜像的详细信息,包含制作者、适应架构和各层的数字摘要等。
要求:
- 查看ubuntu镜像的详细信息
- 通过-f参数可以快速定位,查看ubuntu镜像的创建时间:
4导出和导入镜像
举例说明,如何把镜像ubuntu:14.04从电脑A传输到电脑B?
- A先使用导出镜像(save)操作将镜像保存在本地
- B用导入镜像(load)操作,将镜像包加载到本地仓库中
5.发布镜像
(1)如何把一个镜像发布到docker hub中?请举例说明。
登录docker hub
#docker login
使用docker tag 命令为本地镜像添加新的标签
再使用docker push 命令将新添加的镜像上传到docker hub
(2)假如在docker hub上,现有用户名为username,但是想要推送一个叫做user/image的镜像到docker hub上,怎么办?
使用docker tag 命令为本地镜像添加新的标签
6删除镜像
分别用两种不同的方法删除本地镜像?说明两种方法的不同之处!
(1)第一种删除镜像的方法是docker rmi不加-f,只能删除无tag的镜像,被曾经打过多处tag就无法直接删除,需要先删除tag,删除曾经启动过的容器,最后才能删除镜像。此时,tag可比作引用,image为tag指向的对象。
加-f可以删除正在使用的镜像。
如何删除本地的所有镜像?
删除全部容器:docker rm $(docker ps -aq)
一条命令实现停用并删除容器:docker stop $(docker ps -q)& docker rm $(docker ps -aq)
如果想要删除一个镜像,但是有容器正在使用它,该如何处理?
删除docker中的镜像,我们可以使用如下命令:docker rmi 镜像id
删除docker中的容器可以使用如下命令:docker rm 容器id
7.查看镜像历史
请查看一下ubuntu:14.04镜像的历史?并描述一下
镜像 创建时间 创建者 大小
8通过已有镜像ubuntu:14.04启动一个容器,在容器中安装nginx,用docker commit命令提交新容器为镜像。相关命令如下:
Docker commit [options] container [REPOSITORY[:TAG]]
-a ,--author作者
-m, --message 镜像信息
-p, --pause 提交时候暂停容器的运行
过程:
(1)使用镜像ubuntu:14.04来启动一个交互式容器commit_test
docker run -it -p 80 --name commit_test ubuntu:14.04 /bin/bash
(2)在容器内更新apt库,并且安装nginx
apt-get update
apt-get install -y nginx
然后exit退出容器
(3)输入命令docker ps -l看到刚刚创建的容器
(4)把容器commit_test提交为镜像catherine2005/commit_image1,设置镜像作者为catherine,提交修改的内容为nginx
docker commit -a ‘catherine’ -m ‘nginx’ commit_test catherine2005/commit_image1
(5)查看刚刚创建的镜像信息
docker images
(6)使用刚刚创建的镜像catherine2005/commit_image1启动一个容器nginx_web1
docker run -d --name nginx_web1 catherine2005/commit_image nginx -g “daemon off;”
(7)查看新创建的容器
docker ps
发现没有映射端口,不可用
(8)使用刚刚创建的镜像catherine2005/commit_image1启动一个容器nginx_web2
docker run -d –name nginx_web2 -p 80 catherine2005/commit_image1 nginx -g “daemon off;”
(9)再次查看容器
docker ps
此时应该可以看到端口映射出49155->80
(10)使用命令来查看index.html网站
或者在浏览器上直接输入http://127.0.0.1:49155 就可以看到index.html网站
9如何通过新建一个Dockerfile文件来构建一个和题目8一样的新镜像?
主要分为两步
(1)创建一个dockerfile文件
(2)使用docker build命令来构建
请写出详细的实验步骤,以及贴出相应的截图。
docker build [options] path |URL| -
--build-arg=[] :设置镜像创建时的变量;
--cpu-shares :设置 cpu 使用权重;
--cpu-period :限制 CPU CFS周期;
--cpu-quota :限制 CPU CFS配额;
--cpuset-cpus :指定使用的CPU id;
--cpuset-mems :指定使用的内存 id;
--disable-content-trust :忽略校验,默认开启;
-f :指定要使用的Dockerfile路径;
--force-rm :设置镜像过程中删除中间容器;
--isolation :使用容器隔离技术;
--label=[] :设置镜像使用的元数据;
-m :设置内存最大值;
--memory-swap :设置Swap的最大值为内存+swap,"-1"表示不限swap;
--no-cache :创建镜像的过程不使用缓存;
--pull :尝试去更新镜像的新版本;
--quiet, -q :安静模式,成功后只输出镜像 ID;
--rm :设置镜像成功后删除中间容器;
--shm-size :设置/dev/shm的大小,默认值是64M;
--ulimit :Ulimit配置。
--tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
--network: 默认 default。在构建期间设置RUN指令的网络模式
使用当前目录的 Dockerfile 创建镜像,标签为 runoob/ubuntu:v1
docker build -t runoob/ubuntu:v1 .
使用URL github.com/creack/docker-firefox 的 Dockerfile 创建镜像。
docker build github.com/creack/docker-firefox
也可以通过 -f Dockerfile 文件的位置:
$ docker build -f /path/to/a/Dockerfile .
在 Docker 守护进程执行 Dockerfile 中的指令前,首先会对 Dockerfile 进行语法检查,有语法错误时会返回:
$ docker build -t test/myapp .Sending build context to Docker daemon 2.048 kBError response from daemon: Unknown instruction: RUNCMD