DOCKER 02:镜像和容器的基础命令使用

本文主要谈谈 docker 命令怎么使用的问题!

  

关于镜像的操作命令

 

已经知道,容器是镜像的运行的实例,所以想要运行一个容器,事先得拥有这个容器的镜像。

 

1. 使用页面搜索镜像:

在默认的注册点 docker hub,不管是官方还是非官方都上传了很多镜像:

https://hub.docker.com

可以通过搜索指定的镜像名称找到对象的镜像仓库,如 nginx:

这里只是截图的一部分,可以看到第一个和后面的两个有区别,后面两个名字中间都有斜线。

这个斜线前面的是用户名,比如第二个,前面是 nginx,这意味着第一个和第二个其实都是 nginx 官方给我们提供的镜像仓库。

至于第三个,可能就是私人创建上传的仓库了,因为它的名字不是官方名字,除此之外,第一个镜像仓库的右上角还要个 OFFICIAL 官方的标识。

点击进入仓库可以看到:

通过选中 tags,可以看到该镜像不同的版本,这意味着我们在运行容器选中镜像的时候可以运行不同版本的该镜像。

 

2. 命令行查找镜像:

除了页面搜索镜像,当然在命令行也是可以直接搜索的,如:

docker search nginx

可以看到:

第一个镜像中有 OFFICIAL 说明这是官方镜像。当然这里就没有 tag 的显示了。

 

3. 下载拉取镜像:

在老版本中,docker 命令其实是不规范的,完全没有进行分类,我们查看:

docker --help

可以看到命令分为了两大类:

管理命令和普通命令。在旧版本中我们一般使用的是普通命令,这样的坏处在于对于初学者不是很友好,因为没有进行具体分类显得很乱。

所以建议初学者都使用新的管理命令,虽然这样命令可能长一些,但是更好理解。

比如拉取 nginx 镜像:

docker image pull nginx

结果如图:

我们需要知道,其实执行 docker pull nginx 也能实现一样的需求,但是价格 image 之后我们就知道这是操作镜像的命令。

从上图中的输出需要知道:

1. 镜像后面不跟版本,默认拉取最新版本,也就是 latest。

2. 就 nginx 镜像而言,拉取了三次,这就是 docker 镜像的特点,分层复用。

举个例子,有一个 nginx 镜像是基于 CentOS 7.5 系统的,有一个 mysql 镜像也是基于 CentOS 7.5 的。

我们知道镜像是系统运行环境和服务的集合包,这意味着我们需要下载两次 CentOS 系统,会浪费磁盘。

但 docker 镜像并非这样,它将镜像分层,先是拉取一个  CentOS 7.5 的镜像,该镜像只读,然后拉取一个 nginx 镜像和一个 MySQL 镜像。

这两个镜像都复用了 CentOS 镜像,然后在它的基础上面挂载可写层,完成操作。

当然即使挂了可写层,但是镜像相对于用户依旧是只读的。如果用户想要修改它,只能再在上面挂着一层读写层镜像进行修改,其镜像本身并不会受影响。

这样的好处在于复用的时候不会因为修改了配置影响到其它复用了该镜像的镜像,同时还节省了磁盘空间。

所以这里会出现三次 pull 的情况,因为下载了其它的分层。

当然也可以拉取指定版本,如:

docker pull nginx:1.17.8

只需要在镜像后面加个冒号接上版本号即可!

 

4. 查看本机的镜像:

docker image ls

结果如图:

 

5. 查看镜像详细信息:

docker image inspect nginx:1.17.8

结果如图:

可以通过该页面了解指定镜像的详细信息,如这里我们就能指定该镜像的 nginx 版本,怎么运行的等等。

 

6. 删除指定镜像:

docker image rm nginx:1.17.8

此时再查看:

 

7. 导出镜像:

docker image save hello-world nginx -o /tmp/image.tar

我这里将这两个镜像导出到 /tmp 下面的 image.tar 下面,然后在删除掉本机的镜像!

 

8. 导入导出的镜像:

docker image load -i /tmp/image.tar

结果如图:

至于其它用法,后面单独再说,镜像的基础使用方法就以上这些。

 

 

关于容器的操作命令

 

1. 运行一个容器:

docker container run hello-world

使用老版本的命令就是 docker run 加镜像名字即可,但是为了区分,我们还是增加了 contaiiner。

这是一个测试容器,会输出一些文字,在我们执行 run 的时候,如果本机已经有该镜像则直接运行,如果该镜像不存在,则需要先自动 pull 镜像然后再度运行。

 

2. 查看运行的镜像:

docker container ps
# 或者
docker container ls

结果如图:

发现没有运行的容器,原因在于 hello-world 容器在运行之后就会停止,并不是常驻的进程。

可以通过 -a 参数查看所有:

docker container ps -a
# 或者
docker container ls -a

如图:

容器处于退出状态!

 

3. 换一种创建容器的方式:

docker container create -it --name b1 busybox

创建的时候可以指定参数:

-i:交互式。-t:打开一个 tty 终端。--name:指定该容器的名字,否则会是一个随机名字。

这样就创建了一个基于镜像 busybox 名叫 b1 的容器,但是容器并未运行,处于创建完成状态。

至于 busybox 镜像,可以把它看成 linux 的精简版,非常小但是功能强大。

当然还有其他的一些参数可以通过以下命令查看:

docker container create --help

这里列举几个常用的:

--rm:容器停止后自动删除,适用于那种一次性容器。

--restart:重启规则,可以配置:

on-failure,容器停止时报错容器自动重启,但是重启 docker 不会重启。

unless-stopped:容器停止,没有报错就重启,重启 docker 也会跟着重启。

always:无论如何只要停止就重启。

当然除了这些,还有像配置 CPU,内存,主机名,IP 等,这些就不说了。

 

4. 启动,停止,暂停,继续运行容器:

启动:

docker container start b1

结果如图:

 

暂停:

docker container pause b1

结果如图:

 

继续运行:

docker container unpause b1

结果如图:

 

停止退出:

docker container stop b1

结果如图:

 

5. 进入容器内部:

docker container attach b1

结果如图:

值得注意的是,如果直接 exit 退出,则会导致容器跟着一起退出:

需要使用以下方法:按住 ctrl 键,再按 p,再按 q,这样就不会退出容器:

 

6. 第二种进入容器的方法:

docker container exec -it b1 /bin/sh

结果如图:

这种方法的好处在于 exit 退出容器容器依然会继续运行。

 

7. 第三种进入容器的方法:

在运行容器的时候进入:

docker container run -it --name b2 busybox /bin/sh

结果如图:

这种方法 exit 也会导致容器跟着停止。

在后面两种方法中都增加了 /bin/sh 指令,这算是我们指定了容器运行的进程为 /bin/sh,特别是创建的时候,等于让容器默认的进程就是 /bin/sh,所以我们 exit 才会导致容器退出。

在使用容器的时候,其实我们是不建议进入容器的,因为没有那个必要,而且对于集群而言,容器可能导出都是,那时候也不好随便进入。

该方法只是为了配合我们查找容器出问题的原因而已。

 

8. 删除容器:

docker container rm b2

结果如图:

docker 在默认情况下只能删除停止的容器,这和镜像是一样的原理,默认情况也只能删除没有被使用的镜像。

如果非要删除,可以加 -f 参数,强制删除。

docker container rm -f b1

结果如图:

 

9. 查看容器详细信息:

docker container inspect b1

结果如图:

可以通过输出查看到容器的 IP,数据卷等等详细信息。

 

10. 查看容器日志:

docker container logs b1

 

11. 批量处理容器或者镜像:

# 删除所有容器
docker container rm $(docker container ls -aq)

# 删除所有 redis 镜像
docker image rm $(docker image ls -aq redis)

# 删除所有在 mongo:3.2 之前的镜像
docker image rm $(docker image ls -aq -f before=mongo:3.2)

这三个只是一个例子,一般能够满足我们的使用需求了。-q 能够让我们增加筛选条件。

顺便说一下,停止或者删除镜像或者容器,除了通过指定名称,也可以指定 ID,或者 ID 的一部分,只要是唯一能够标识它即可。

 

12. 最后补充一个系统的磁盘占用查看方法:

docker system df

结果如图:

 

posted @ 2020-02-25 14:20  Dy1an  阅读(181)  评论(0编辑  收藏