一、Docker的基本操作:运行容器
发布时间:

一、Docker的基本操作:运行容器

docker的基本操作可以用下面的这张图进行概括。这张图基本上概括了Docker的所有声明周期,从Dockerfile使用build指令创建镜像,镜像run成为容器,容器通过commit固化为镜像,当然也可以从仓库中pull或者push镜像,也可以选择手动的load或者save来操作镜像对应的tar

docker的基本操作可以用下面的这张图进行概括。 这张图基本上概括了Docker的所有声明周期,从Dockerfile使用build指令创建镜像,镜像run成为容器,容器通过commit固化为镜像,当然也可以从仓库中pull或者push镜像,也可以选择手动的load或者save来操作镜像对应的tar文件。

提一下,这个图是我看了B站大佬free-coder的视频copy过来的

但是这里既然是记录阅读《The Docker Book》的阅读笔记,所以还是会尽量详细一点。之后的内容还是按照书里面组织。

运行容器: docker run

  • 以运行一个ubuntu系统为例
sudo docker run -i -t ubuntu /bin/bash
  • -i参数保证容器中的STDIN是开启的
  • -t表示要为创建的容器分配伪tty终端

有了以上的两个参数,新创建的容器才能提供一个交互式的shell。后面需要指定创建容器依赖的镜像,这里使用的是ubuntu镜像。最后输入要在新容器中运行的命令/bin/bash,启动一个bash shell

Docker在背后会先检查是否包含ubuntu镜像,如果没有的话会从官方仓库中拉取镜像。创建容器的同时也会在宿主机创建与宿主机通信的网桥(容器内部有用自己的网络和IP,和宿主机是隔离的,因此需要网桥进行通信)

此时已经可以进入容器内部,这时的容器相当于一个全新的ubuntu系统,使用内置的apt软件包管理器安装各种需要的。 但是如果exit推出了这个bash shell的话,容器也会随之停止,注意这里容器只是停止运行,并不是销毁了。可以使用如下的命令查看所有容器的状态

sudo docker ps -a
  • 给容器命名

一般在Docker中可以使用uuid或者容器名来唯一确定一个容器,但是uuid一般比较难记,所以使用名称的话会更加的方便。如同上例,创建容器的时候如果没有指定名称的话,docker就会随机指定一个名字。但是可以使用—name来指定容器的名字。合法容器名字符在[a-zA-Z0-9_.-]范围内

sudo docker run --name ubuntu_test -i -t ubuntu /bin/bash
  • 重新启动已经停止的容器

如果使用exit退出bash shell的话,容器就会停止。想要重新启动的话,就要运行start命令

sudo docker start <identifier>

这里的可以使容器的uuid,也可以是上面说的名称。不记得的话可以使用docker ps命令查看。 start命令启动容器的时候,也会自动运行创建容器的时候携带的命令/bin/bash,只是使用start命令重启容器之后,并不会直接进入到bash环境中,需要使用attach命令附着到容器中去

  • 附着到容器中
sudo docker attach <identifier>

如果使用start命令重启的容器,可以使用attach命令附着到容器内部。

  • 创建守护式的容器

之前我们创建的容器,一旦退出bash shell,容器就会停止,虽然也可以重新启动,但是总归还是比较麻烦。所以可以使用-d参数创建守护式容器,容器默认会在后台一直运行。

sudo docker run --name ubuntu_test -i -t -d ubuntu /bin/bash

执行这行命令后并不会直接进入到容器内部, 同理也可以使用attach命令附着到容器上。但是如果进入bash后退出,容器依然会停止。

保证容器不停止的条件是容器中必须要有正在运行的进程。我们创建容器的时候bash是唯一的进程,如果退出bash这个进程也会退出,所以容器也会停止。

  • 查看容器的stdout输出

有没有一种方法在不进入容器的情况下查看容器的标注输出。方法就是使用logs命令

sudo docker logs <identifier>

这里的logs其实就是/bin/bash的输出,之前在bash中所作的所有操作都会在这里显示。默认会议输出最后几条日志,当然也可以使用-f参数(类似tail -f)进行持续性监控。

  • 查看容器进程

查看容器内部的进程,如果容器内自带ps命令的话,可以附着到容器内部使用ps或者top命令查看。但是如果没有的话可以使用docker的top命令查看。

sudo docker top <identifier>
  • 查看docker统计信息

可以使用stats命令查看所有docker容器的统计信息, 包括内存,网络,CPU和硬盘等的使用情况

sudo docker stats
  • 在容器内运行新的进程

之前的例子都是在创建容器的时候启动的bash进程里面执行以下操作。如果启动一个mysql容器,默认没有启动bash这个进程的话,那么怎么启动一个新的进程呢?方法就是docker exec命令

sudo docker exec -t -i <identifier> /bin/bash

同理,这里的-i和-t参数表示进入一个交互式的伪tty中。如果需要新启动的进程在后台执行,使用-d参数即可

  • 停止容器

使用stop命令即可停止正在运行的容器

sudo docker stop <identifier>
  • 自动重启容器

有的时候,有业务对容器的稳定性要求很高,如果程序发生故障,需要容器自动重启,这个时候就需要使用--restart参数了

sudo docker run --restart=always --name ubuntu_test -i -t -d ubuntu /bin/bash

restart可以指定的参数有如下两种:

  • always:表示不管容器因为什么原因停止,都会自动重启。
  • on-failure: 表示当容器退出代码为非0的时候,会自动重启该容器,重启的次数在后面指定。例如on-failure:5表示重启5次
  • 查看容器相信信息

可以使用inspect把容器的详细信息以json的形式输出出来

sudo docker inspect <identifier>

inspect命令可以携带--format参数,用于输出某个特定的字段。format筛选器的话使用的是go语言模板。

➜  ~ sudo docker inspect --format='{{.State.Status}}' ubuntu_test
running

这里就将State字段中的Status字段给输出了

  • 删除容器
sudo docker rm <identifier>

使用rm命令删除指定的容器。当然也可以删除所有容器

sudo docker rm `sudo docker ps -a -q`

这里的-q表示只输出容器的id,而不输出其他信息