docker学习笔记(一)基础操作

一、安装

由于我的开发环境是windows环境,所以使用Docker Desktop on Windows进行环境搭建。

具体如何安装,如何配置很傻瓜式,不过多赘述。

二、基本操作

1、获取镜像

具体的选项可以查看命令: docker pull --help

  • Docker 镜像仓库地址:地址的格式一般是 <域名/IP>[:端口号]。默认地址是 Docker Hub。
  • 仓库名:如之前所说,这里的仓库名是两段式名称,即 <用户名>/<软件名>。对于 Docker Hub,如果不给出用户名,则默认为 library,也就是官方镜像。

通过 docker search 搜索自己想要的镜像

然后docker pull 进行拉取镜像

2、列出镜像

列出已经下载下来的镜像,可以使用 docker image ls 命令 或者 docker images

查看已下载镜像的体积

虚悬镜像

类似这种没有标签名也没有仓库名称的被称为虚悬镜像

出现这种现象的原因:

  1. 官方镜像维护,发布了新版本后重新pull
  2. 重新docker build之后也会出现这种情况。

一般来说,虚悬镜像已经失去了存在的价值,是可以随意删除的,可以用下面的命令删除。

默认删除无标签对象。

3、删除本地镜像

如果要删除本地的镜像,可以使用 docker image rm 命令,其格式为:

Untagged 和 Deleted

当我们使用命令删除镜像的时候,实际上是在要求删除某个标签的镜像。所以首先需要做的是将满足我们要求的所有镜像标签都取消,这就是我们看到的 Untagged 的信息。因为一个镜像可以对应多个标签,因此当我们删除了所指定的标签后,可能还有别的标签指向了这个镜像,如果是这种情况,那么 Delete 行为就不会发生。所以并非所有的 docker image rm 都会产生删除镜像的行为,有可能仅仅是取消了某个标签而已。

用 docker image ls 命令来配合

比如,我们需要删除所有仓库名为 redis 的镜像:

或者删除所有在 mongo:3.2 之前的镜像:

prune 和 rm 的区别

上面我们有提到docker image prune 进行删除进项,这里又提到了docker image rm,这两个有什么区别吗?

我们可以通过使用手册可以了解到,docker image prune 是删除未使用的镜像,docker image rm是可以删除所有的进项的。

4、docker run

创建一个新的容器并运行一个命令

nginx为例,

  • -d 表示 后台允许,如果没有这个容器会在运行完成后结束。
  • -P 表示 将容器的80端口映射到主机随机端口

-P替换为-p 80:80表示映射到容器80端口映射到主机80端口,然后localhost进行访问。

5、docker exec

在运行的容器中执行命令

利用exec命令,我们可以进入容器进行设置,如下:

  • -i 表示进入交互模式(不立即推出)
  • -t 表示分配一个伪终端

然后我们来修改nginx默认的页面内容

刷新localhost可见最新内容。

6、docker commit

如果说我们关闭容器,再次运行该镜像时,我们会发现之前修改的内容丢失了。此时我们可以使用docker commit来构建我们的镜像。

通过docker diff可以看到我们本次修改的内容。现在我们定制好了变化,我们希望能将其保存下来形成镜像。

查看镜像

查看历史变更

运行该镜像

慎用 docker commit

使用 docker commit 命令虽然可以比较直观的帮助理解镜像分层存储的概念,但是实际环境中并不会这样使用。

docker commit之后意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为 黑箱镜像,换句话说,就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人根本无从得知。而且,即使是这个制作镜像的人,过一段时间后也无法记清具体在操作的。虽然 docker diff 或许可以告诉得到一些线索,但是远远不到可以确保生成一致镜像的地步。这种黑箱镜像的维护工作是非常痛苦的。

而且,回顾之前提及的镜像所使用的分层存储的概念,除当前层外,之前的每一层都是不会发生改变的,换句话说,任何修改的结果仅仅是在当前层进行标记、添加、修改,而不会改动上一层。如果使用 docker commit 制作镜像,以及后期修改的话,每一次修改都会让镜像更加臃肿一次,所删除的上一层的东西并不会丢失,会一直如影随形的跟着这个镜像,即使根本无法访问到。这会让镜像更加臃肿。

所以推荐使用Dockerfile进行编译安装。

7、 Dockerfile

创建一个Dockerfile的文件,内容如下,就是上面我们通过命令去构建的镜像内容。

  • FROM 指定基础镜像
  • RUN 执行命令

构建镜像

  • -t nginx:v3表示最终镜像的名称
  • . 表示上下文环境

运行镜像

访问localhost可见内容。


参考:
– https://yeasy.gitbooks.io/docker_practice/