需要搭建帮助的可以去taobao搜索Easy Company技术服务,谢谢!!!
一、获取镜像(这里以Ubuntu为例,其余镜像雷同)
(1)获取镜像
docker pull ubuntu:18.04
上面的命令中没有给出 Docker 镜像仓库地址,因此将会从 Docker Hub (docker.io
)获取镜像。而镜像名称是 ubuntu:18.04
,因此将会获取官方镜像 library/ubuntu
仓库中标签为 18.04
的镜像。docker pull
命令的输出结果最后一行给出了镜像的完整名称,即: docker.io/library/ubuntu:18.04
。
如果下载速度超级慢甚至连接超时,请你配置镜像加速器
(2)运行入库的镜像:ubuntu:18.04
docker run -it --rm ubuntu:18.04 bash
进入容器后,我们可以在 Shell 下操作,执行任何所需的命令。这里,我们执行了
cat /etc/os-release
这是 Linux 常用的查看当前系统版本的命令,从返回的结果可以看到容器内是Ubuntu 18.04.6 LTS
系统。
最后我们通过 exit
退出了这个容器。
(3)列出镜像
列出已经下载的所有镜像:
docker image ls
查看镜像、容器、数据卷所占用的空间:
docker system df
由于新旧镜像同名,旧镜像名称被取消,从而出现仓库名、标签均为 <none> 的镜像。这类无标签镜像也被称为 虚悬镜像(dangling image) ,可以用下面的命令专门显示这类镜像:
docker image ls -f dangling=true
可以看出我的docker没有虚悬镜像(dangling image)。
如果有虚悬镜像(dangling image),但是虚悬镜像已经失去了存在的价值,是可以随意删除的,可以用下面的命令删除:
docker image prune
为了加速镜像构建、重复利用资源,Docker 会利用 中间层镜像。所以在使用一段时间后,可能会看到一些依赖的中间层镜像。默认的 docker image ls
列表中只会显示顶层镜像,如果希望显示包括中间层镜像在内的所有镜像的话,需要加 -a
参数。
docker image ls -a
由于刚使用镜像配置文件,所以还没有中间层镜像。
不加任何参数的情况下,docker image ls
会列出所有顶层镜像,但是有时候我们只希望列出部分镜像。docker image ls
有好几个参数可以帮助做到这个事情。
根据仓库名列出镜像:
docker image ls ubuntu
列出特定的某个镜像,也就是说指定仓库名和标签:
docker image ls ubuntu:18.04
除此以外,docker image ls
还支持强大的过滤器参数 --filter
,或者简写 -f
。之前我们已经看到了使用过滤器来列出虚悬镜像的用法,它还有更多的用法。比如,我们希望看到在 ubuntu:18.04
之后建立的镜像,可以用下面的命令:
docker image ls -f since=ubuntu:18.04
以特定格式显示
利用 docker image ls
把所有的虚悬镜像的 ID 列出来,然后才可以交给 docker image rm
命令作为参数来删除指定的这些镜像,这个时候就用到了 -q
参数。
docker image ls -q
下面的命令会直接列出镜像结果,并且只包含镜像ID和仓库名:
docker image ls --format "{{.ID}}: {{.Repository}}"
或者打算以表格等距显示,并且有标题行,和默认一样,不过自己定义列:
docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"
(4)利用 commit 理解镜像构成
docker commit
命令除了学习之外,还有一些特殊的应用场合,比如被入侵后保存现场等。但是,不要使用 docker commit
定制镜像,定制镜像应该使用 Dockerfile
来完成。
镜像是多层存储,每一层是在前一层的基础上进行的修改;而容器同样也是多层存储,是在以镜像为基础层,在其基础上加一层作为容器运行时的存储层。
现在让我们以定制一个 Web 服务器为例子,来讲解镜像是如何构建的。
docker run --name webserver -d -p 80:80 nginx
这条命令会用 nginx
镜像启动一个容器,命名为 webserver
,并且映射了 80 端口,这样我们可以用浏览器去访问这个 nginx
服务器。
如果是在本机运行的 Docker,那么可以直接访问:http://localhost
,如果是在虚拟机、云服务器上安装的 Docker,则需要将 localhost
换为虚拟机地址或者实际云服务器地址。
如果我们不喜欢这个欢迎页面,我们希望改成其他你喜欢的文字,我们可以使用 docker exec
命令进入容器,修改其内容:
docker exec -it webserver bash
'<h1>Easy Company</h1>' > /usr/share/nginx/html/index.html
exit
我们修改了容器的文件,也就是改动了容器的存储层。我们可以通过 docker diff
命令看到具体的改动:
docker diff webserver
现在我们定制好了变化,我们希望能将其保存下来形成镜像。
要知道,当我们运行一个容器的时候(如果不使用卷的话),我们做的任何文件修改都会被记录于容器存储层里。而 Docker 提供了一个 docker commit
命令,可以将容器的存储层保存下来成为镜像。换句话说,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。以后我们运行这个新镜像的时候,就会拥有原有容器最后的文件变化。
我们可以用下面的命令将容器保存为镜像:
docker commit \
--author "Wang Jianxiong" \
--message "Modify webpage" \
webserver \
nginx:v2
其中 --author
是指定修改的作者,而 --message
则是记录本次修改的内容。
然后可以在 docker image ls
中看到这个新定制的镜像:
docker image ls nginx
还可以用 docker history
具体查看镜像内的历史记录,如果比较 nginx:latest
的历史记录,我们会发现新增了我们刚刚提交的这一层。
docker history nginx:v2
新的镜像定制好后,我们可以来运行这个镜像:
docker run --name web2 -d -p 81:80 nginx:v2
这里命名为新的服务为 web2
,并且映射到 81
端口。访问 http://localhost:81
看到结果,其内容应该和之前修改后的 webserver
一样。
至此,完成了定制镜像,使用的是 docker commit
命令,手动操作给旧的镜像添加了新的一层,形成新的镜像,对镜像多层存储应该有了更直观的感觉。
慎用 docker commit
使用 docker commit
意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为 黑箱镜像,换句话说,就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人根本无从得知。而且,即使是这个制作镜像的人,过一段时间后也无法记清具体的操作。这种黑箱镜像的维护工作是非常痛苦的。
(5)使用 Dockerfile 定制镜像
镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。
Dockerfile 是一个文本文件,其内包含了一条条的 指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
还以之前定制 nginx
镜像为例,这次我们将使用 Dockerfile 来定制。
在一个空白目录中,建立一个文本文件,并命名为 Dockerfile
:
mkdir mynginx
cd mynginx
touch Dockerfile
其内容为:
FROM nginx
RUN echo '<h1>Easy Company</h1>' > /usr/share/nginx/html/index.html
构建镜像
在 Dockerfile
文件所在目录执行:
docker build -t nginx:v3 .
docker build
命令最后有一个 .
。.
表示当前目录,而 Dockerfile
就在当前目录,因此不少初学者以为这个路径是在指定 Dockerfile
所在路径,这么理解其实是不准确的。如果对应上面的命令格式,你可能会发现,这是在指定 上下文路径。