我们都知道,操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而 Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:14.04 就包含了完整的一套 Ubuntu 14.04 最小系统的 root 文件系统。
Docker基础命令
查看Docker信息
docker info
下载镜像
docker pull busybox
BusyBox是一个最小的Linux系统
运行一个带标签镜像的容器
sudo docker run -t -i ubuntu:14.04 /bin/bash
跑个Hello World
docker run busybox /bin/echo Hello World
构建容器
sample_job=$(docker run -d busybox /bin/sh -c "while true;do echo Docker;sleep 1;done")
其中的-d
是放在后台执行
查看日志
docker logs $sample_job
运行结果
名为sample_job的容器,停止命令是
docker stop $sample_job
重启该容器
docker restart $sample_job
要将容器删除,需要先将容器停止,容器删除命令为:
docker rm $sample_job
将容器的状态保存为新的镜像的方法为:
docker commit
查看镜像
docker images
搜索镜像
docker search (image-name)
查看镜像的历史版本
docker history (image-name)
将镜像推送到registry
docker push (image-name)
查看我们正在运行的容器
docker ps -l
端口映射
docker run -d -p 5000:5000 training/webapp python app.py
移除镜像
docker rmi(镜像名称或者id前3位)
小例子
命令
docker run -d -p 80:80 --name webserver nginx
这条命令会用 nginx 镜像启动一个容器,命名为 webserver,并且映射了 80 端口,这样我们可以用浏览器去访问这个 nginx 服务器。
现在,假设我们非常不喜欢这个欢迎页面,我们希望改成欢迎 Docker 的文字,我们可以使用 docker exec 命令进入容器,修改其内容。
$ docker exec -it webserver bash
root@3729b97e8226:/# echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
root@3729b97e8226:/# exit
exit
我们修改了容器的文件,也就是改动了容器的存储层。我们可以通过 docker diff 命令看到具体的改动。
$ docker diff webserver
现在我们定制好了变化,我们希望能将其保存下来形成镜像。
Docker commit
要知道,当我们运行一个容器的时候(如果不使用卷的话),我们做的任何文件修改都会被记录于容器存储层里。而 Docker 提供了一个 docker commit 命令,可以将容器的存储层保存下来成为镜像。换句话说,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。以后我们运行这个新镜像的时候,就会拥有原有容器最后的文件变化。
我们可以用下面的命令将容器保存为镜像:
$ docker commit \
--author "Tao Wang <twang2218@gmail.com>" \
--message "修改了默认网页" \
webserver \
nginx:v2
docker run --name web2 -d -p 81:80 nginx:v2
这里我们命名为新的服务为 web2,并且映射到 81 端口。
慎用 docker commit
首先,如果仔细观察之前的 docker diff webserver 的结果,你会发现除了真正想要修改的 /usr/share/nginx/html/index.html 文件外,由于命令的执行,还有很多文件被改动或添加了。这还仅仅是最简单的操作,如果是安装软件包、编译构建,那会有大量的无关内容被添加进来,如果不小心清理,将会导致镜像极为臃肿。
此外,使用 docker commit 意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为黑箱镜像,换句话说,就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人根本无从得知。而且,即使是这个制作镜像的人,过一段时间后也无法记清具体在操作的。虽然 docker diff 或许可以告诉得到一些线索,但是远远不到可以确保生成一致镜像的地步。这种黑箱镜像的维护工作是非常痛苦的。
docker stop webserver
docker rm webserver
运行一个带标签镜像的容器
sudo docker run -t -i -rm ubuntu:14.04 /bin/bash
-it
:这是两个参数,一个是 -i:交互式操作,一个是 -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端。
-rm
:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用 --rm 可以避免浪费空间。
ubuntu:14.04
:这是指用 ubuntu:14.04 镜像为基础来启动容器。
bash
:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 bash。
要想列出已经下载下来的镜像,可以使用 docker images 命令。
Docker images的过滤
$ docker images ubuntu
镜像 ID 则是镜像的唯一标识,一个镜像可以对应多个标签。
如果仔细观察,会注意到,这里标识的所占用空间和在 Docker Hub 上看到的镜像大小不同。比如,ubuntu:16.04
镜像大小,在这里是 127 MB
,但是在 Docker Hub 显示的却是 50 MB
。这是因为 Docker Hub 中显示的体积是压缩后的体积。
docker images 还支持强大的过滤器参数 --filter,或者简写 -f。我们希望看到在 mongo:3.2 之后建立的镜像,可以用下面的命令
$ docker images -f since=mongo:3.2
想查看某个位置之前的镜像也可以,只需要把 since 换成 before 即可。
文章参考:
Docker入门实战
极客学院
Docker从入门到实践
网友评论