一、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>
这里的
- 附着到容器中
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,而不输出其他信息