1.运行第一个docker容器

docker run -i -t ubuntu /bin/bash

参数说明:

-i, --interactive=false, 打开STDIN,用于控制台交互
-t, --tty=false, 分配tty设备,该可以支持终端登录,默认为false
-d, --detach=false, 指定容器运行于前台还是后台,默认为false

首先,docker run -it ubuntu 的意思是,为centos这个镜像创建一个容器, -i和-t这两个参数的作用是,为该docker创建一个伪终端,这样就可以进入到容器的交互模式?(也就是直接进入到容器里面)后面的/bin/bash的作用是表示载入容器后运行bash ,docker中必须要保持一个进程的运行,要不然整个容器启动后就会马上kill itself,这样当你使用docker ps 查看启动的容器时,就会发现你刚刚创建的那个容器并不在已启动的容器队列中。这个/bin/bash就表示启动容器后启动bash

Docker入门学习_docker

2.使用第一个容器

现在我们已经以root用户登录到了新容器中,容器的id是21af97ac0b0b

hostname

Docker入门学习_ubuntu_02

可以看到,容器的主机名就是该容器的id,我们再来看看/etc/hosts文件

Docker入门学习_docker_03

docker已经再hosts文件中为该容器的ip地址添加了一条主机配置项。再看看容器的网络配置情况,由于容器中没有ifconfig 命令,首先通过以下命令安装

apt-get update
apt install net-tools # ifconfig
apt install iputils-ping # ping

Docker入门学习_bash_04

可以看到lo的环回接口,还有ip为172.17.0.2的标准eth0网络接口,和普通宿主机是完全医院的。还可以查看容器中运行的进程

Docker入门学习_bash_05

如果需要编辑文件,需要安装vim软件

apt install vim

当所有工作都结束时,输入exit,就可以返回到Ubuntu宿主机的命令行提示符了。但是这个时候容器就停止运行了,只有在指定的/bin/bash命令处于运行状态的时候,我们的容器也才会相应地处于运行状态。一旦退出容器,/bin/bash命令也就结束了,这时容器也随之停止了运行。

但是容器仍然是存在的,我们可以使用以下命令来查看当前系统中容器的列表

docker ps -a

默认情况下,当执行docker ps命令时,只能看到正在运行的容器,如果指定-a标志,那么会列出所有的容器,包括正在运行和已经停止的。

docker ps -l

Docker入门学习_ubuntu_06

从该命令的输出结果中我们可以看到关于这个容器的很多有用信息:id、用于创建该容器的镜像、容器最后执行的命令、创建时间以及容器的退出状态(在上面的例子中,退出状态是0,因为容器是通过正常的exit命令退出的)

3.容器命名

docker会为我们创建的每一个容器自动生成一个随机的名称。例如,上面创建的容器就被命名为sleepy_sutherland,如果想为容器指定一个名称,则可以使用--name标志来实现(容器命名必须唯一)

docker run --name my-ubuntu -i -t ubuntu /bin/bash

Docker入门学习_bash_07

4.重新启动已经停止的容器

名称为sleepy_sutherland的容器已经停止,可以使用以下命令启动(支持start、stop、restart)

docker start sleepy_sutherland

除了容器名称,也可以使用容器id来指定容器

docker start 21af97ac0b0b

5.附着到容器

当容器启动后,我们可以使用以下命令,重新附着到该容器的会话上

docker attach sleepy_sutherland

或者

docker attach 21af97ac0b0b

如果退出容器的shell,容器也会随之停止运行

6.创建守护式容器

除了这些交互式运行的容器(interactive container),我们可以创建长期运行的容器。守护式容器(daemonized container)

没有交互式会话,非常适合运行应用程序和服务。大多数时候我们都需要以守护式来运行我们的容器。

docker run --name daemon_dave -d ubuntu /bin/sh -c "while true;do echo hello workd; sleep 1; done"

上面docker run 命令使用了-d参数,因此docker会将容器放到后台运行,容器里运行了一个while循环,该循环会一直打印hello world,直到容器或其进程停止运行

7.容器内部都再干些什么

现在我们已经有了一个在后台运行while循环的守护型容器,为了知道容器内部都在干什么,我们可以使用docker logs命令来获取容器的日志

docker logs daemon_dave

Docker入门学习_bash_08

这里,我们可以看到while循环正在向日志里打印hello world。docker会输出最后几条日志项并返回。我们也可以在命令后使用-f参数来监控docker的日志,这与tail -f命令非常相似

docker logs -f daemon_dave

可以用以下命令获取日志的最后10行内容,命令如下

Docker入门学习_docker_09

跟踪某个容器的最新日志而不必读取整个日志文件,命令如下

docker logs --tail 0 -f daemon_dave

Docker入门学习_docker_10

使用-t标志为每条日志项加上时间戳,命令如下

docker logs -ft daemon_dave

Docker入门学习_bash_11

8.查看容器内的进程

docker top daemon_dave

Docker入门学习_ubuntu_12

9.在容器内部运行进程

docker exec -d daemon_dave touch /etc/new_config_file

上面例子中的命令会在daemon_dave容器内创建一个空文件。

也可以在daemon_dave容器中启动一个打开shell的交互式任务,命令如下

docker exec -t -i daemon_dave /bin/bash

和运行交互容器时一样,这里的-t和-i标志为我们执行的进程创建了TTY并捕捉STDIN。上面这个意思中,这条命令会在daemon_dave容器内创建一个新的bash会话,有了这个会话,我们可以在该容器中运行其他命令了。

10.停止守护式容器

docker stop daemon_dave

注意:docker stop命令会向docker容器进程发送SIGTERM信号,如果你想快速停止某个容器,也可以使用docker kill命令来向容器进程发送SIGKILL信号

要想查看已经停止

的容器的状态,则可以使用docker ps命令,还有一个很实用的命令,docker ps -n x ,该命令会显示最后x个容器,不论这些容器正在运行还是已经停止

docker ps -n 3

Docker入门学习_docker_13

11.自带重启容器

如果由于某种错误而导致容器停止运行,我们换可以通过--restart标志,让docker自动重新启动该容器,--restart标志会检查容器的退出代码,并据此来决定是否要重启容器。默认的行为是docker不会重启容器。

docker run --restart=always --name daemon_dave -d ubuntu /bin/sh -c "while true;do echo hello workd; sleep 1; done"

在本例中,--restart标志被设置为always。无论容器的退出代码是什么,docker都会自动重启该容器。除了always,可以将这个标志设为on-failure,这样,只有当容器的退出代码为非0值的时候才会自动重启。另外,on-failure还接受一个可选性的重启次数参数,如下

docker run --restart=on-failure:5 --name daemon_dave -d ubuntu /bin/sh -c "while true;do echo hello workd; sleep 1; done"

这样,当容器退出代码为非0时,docker会尝试自动重启该容器,最多重启5次

12.深入容器

docker inspect命令会对容器进行详细的检查,然后返回其配置信息,包括名称、命令、网络配置以及很多有用的数据

docker inspect daemon_dave

Docker入门学习_ubuntu_14

可以使用-f或者--format标志来选定查看结果,下面这条命令会返回容器的运行状态

docker inspect --format='{{ .State.Running }}' daemon_dave

Docker入门学习_docker_15

还可以获取容器的ip信息

docker inspect --format='{{ .NetworkSettings.IPAddress }}' daemon_dave

Docker入门学习_ubuntu_16

也可以同时指定多个容器,并显示每个容器的输出结果

docker inspect --format='{{.Name}} {{ .State.Running }}' daemon_dave my-ubuntu

Docker入门学习_bash_17

注意:除了查看容器,你还可以通过浏览/var/lib/docker目录来深入了解docker的工作原理。该目录存放着docker镜像、容器以及容器的配置。所有的容器都保存在/var/lib/docker/containers

13.删除容器

如果容器已经不再使用,可以使用docker rm命令来删除它们(需要注意的是,运行中的docker容器是无法删除的!你必须先通过docker stop或docker kill命令停止容器,才能将其删除)

docker rm daemon_dave3

目前,还没有办法一次删除所有容器,不过可以通过代码清单来删除全部容器

docker rm `docker ps -a -q`

上面docker ps命令会列出现有的全部容器,-a标志代表列出所有(all)容器,而-q标志则表示只需要返回容器id而不会返回容器的其他信息。这样我们就得到了容器id的列表,并传给了docker rm命令,从而达到删除所有容器的目。