实验环境为
centos7
首先查看docker信息:
$ sudo docker info
创建容器:
$ sudo docker run -i -t ubuntu /bin/bash
这里创建了ubuntu
的镜像,并在容器中运行了/bin/bash
命令启动了一个Bash shell;首先docker回检查本地是否有ubuntu
镜像,如果本地没有,则会连接官网的Docker Hub Registry,查看是否有该镜像,如果有就会自动下载该镜像的最新版本;其中参数-i
保证容器中STDIN是开启的,-t
为创建的容器分配一个伪tty终端,使用这两个参数,新容器才能提供一个交互式的shell。
运行之后就回执行容器中的/bin/bash
命令,就可以看到容器内的shell了:
root@db99828a1442:/#
其中a7d8sdfe9s8c
为该容器的唯一ID,检查容器的主机,
root@db99828a1442:/# hostname a7d8sdfe9s8c
发现容器的主机名就是该容器的ID;检查容器hosts
文件,
root@db99828a1442:/# cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.2 db99828a1442
Docker已经在hosts
文件中为该容器的IP地址添加了一条主机配置项。检查容器网络配置,
root@db99828a1442:/# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 4: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 172.17.0.2/16 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::42:acff:fe11:2/64 scope link valid_lft forever preferred_lft forever
可以看到这里有lo
环回接口,还有IP为172.17.0.2
的标准eth0
网络接口,和普通宿主机是完全一样的。
检查容器的进程,
root@db99828a1442:/# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 4232 1984 ? Ss+ 12:52 0:00 /bin/bash root 18 0.0 0.1 5888 1480 ? R+ 12:59 0:00 ps aux
容器中同样可以安装软件包,
root@db99828a1442:/# apt-get install vim
看见在容器中的所有操作都和完整系统是相同的。
当工作结束需要退出时,输入exit
就可以返回宿主机了。但是同样会导致容器停止运行。这时因为运行容器时指定的命令为/bin/bash
,一旦退出容器,/bin/bash
命令也就结束了,这时容器也就会随之停止运行。
但是容器仍然是存在的,可以在宿主机中查看,
$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES db99828a1442 ubuntu "/bin/bash" 13 days ago Exited eager_kalam
查看当前系统中容器的所有容器,docker ps
只能看到正在运行的容器;docker ps -a
可以显示所有容器,不管是否运行。
docker
的ps
命令和系统的ps
命令类似,可以通过指定-l
标志,列出最后一个运行的容器,不管是否运行;通过指定--format
标志,控制输出格式。
如果想要重新启动已经停止的容器,可以使用下面的命令,
$ sudo docker start db99
当然这里同样可以使用
db99828a1442
,或者容器名ubuntu
来启动容器。
除了使用start
命令,也可以使用restart
命令重启容器,
$ sudo docker restart db99828a1442
这时运行docker ps
就可以看到运行的容器了。
附着类似与“屏幕共享”,使用下面的命令,
sudo docker attach db99
如果容器正在运行,就会附着到容器上。但是如果要退出附着的话,使用exit
,但是这时容器同样会退出。
在Docker 1.3
之后,可以通过docker exec
命令在容器内部额外启动新进程。可以在容器内运行的进程有两种:后台任务和交互式任务。后台任务在容器中运行且没有交互需求,而交互式任务则保持在前台运行。
在容器中运行后台任务,
$ sudo docker exec -d db99 touch /root/hello
这里-d
标志表明需要运行一个后台进程,之后指定容器名以及要执行的命令。
也可以在容器中运行交互命令,
$ sudo docker exec -t -i db99 /bin/bash
这条命令在容器中创建了新的bash
会话,这样就可以在容器中运行其他命令了。如果退出当前会话,容器不会停止。
在Docker中可以通过docker logs
命令来获取容器的日志,
$ sudo docker logs db99
Docker会输出最后几条日志并返回。同样可以使用-f
标志监控Docker日志,
$ sudo docker logs -f db99
使用
Ctrl+C
退出日志跟踪
也可以使用--tail
标志获取最后的几条日志,
$ sudo docker logs --tail 10 db99
显示最后10条日志;
$ sudo docker logs --tail 0 -f db99
跟踪容器的最新日志;
也可以加上-t
标志位日志加上时间戳,
$ sudo docker logs -ft db99
从Docker 1.6
开始,可以通过--log-driver
选项来控制容器所用的日志驱动,
$ sudo docker run --log-driver='syslog' -d ubuntu /bin/sh -c "while true; do echo hello world; sleep1; done"
这里syslog
,会将容器的日志输出重定向到Syslog
,同时将禁止docker logs
。
在Docker中使用docker top
查看容器内运行的进程,
$ sudo docker top db99
该命令可以看到容器内所有进程、运行进程的用户及进程ID。
同时,还可以使用docker stats
命令,显示容器一个或多个容器的统计信息,
$ sudo docker stats db99
该命令能看到一个守护式容器的列表,以及它们的CPU、内存、网络I/O及存储I/O的性能和指标。
要停止容器的守护进程,使用命令docker stop
,
$ sudo docker stop db99
同时可以使用docker kill
命令,
$ sudo docker kill db99
如果由于某种错误而导致容器停止运行,可以通过--restart
标志,让Docker自动重新启动该容器。--restart
标志会检查容器的退出代码,并据此来决定是否需要重启容器。Dockers默认是不会重启容器的。
$ sudo docker run --restart=always -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
这里--restart=always
,意味着无论容器的退出代码是什么,Docker都会重启该容器,除了always
,还可以设置为on-failure
,这样只有容器的退出代码不为0时,才会自动重启,另外on-failure
还接受一个可选的重启次数参数,
--restart=on-failure:5
--restart
标志是Docker 1.2.0
引入的
可以使用docker inspect
来获取容器的详细信息,
$ sudo docker inspect db99
该命令会返回容器的配置信息,包括名称、命令、网络配置以及其它信息。
同时可以指定--format
或-f
标志筛选结果,
$ sudo docker inspect --format='{{.State.Running}}' db99
上面的命令会返回容器的运行状态;
$ sudo docker inspect --format='{{.NetworkSettings.IPAddress}}' db99
该命令返回容器的IP地址;
--format
可以指定多个容器,或多个条件,
$ sudo docker inspect --format=''{{.Name}} {{.State.Running}}'' db99 s8zd
如果容器不再使用,可以使用docker rm
命令删除,
$ sudo docker rm db99
从Docker 1.6.2
开始,可以通过给docker rm
命令指定-f
标志删除运行中的Docker容器;在此版本之前,必须先使用docker stop
或docker kill
命令停止容器。
目前没有办法一次删除所有容器,但是可以使用下面命令,
$ sudo docker rm `sudo docker ps -a -q`
其中-a
标志意味着列出所有容器,-q
标志表示只返回容器的ID。