继续学习docker,我们可以使用docker attach命令(可能需要按一下回车键才能进入容器的会话)附着到一个容器的会话上,想要解除附着需要键入ctrl+p,ctrl+q
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5e76e76207fb daocloud.io/library/ubuntu:latest "/bin/bash" 35 seconds ago Up 5 seconds ubuntu
# docker attach ubuntu
root@5e76e76207fb:/# hostname
5e76e76207fb
ctrl+p,ctrl+q
#
我们之前创建的容器都是交互式容器,当exit出容器会话后,容器就停止运行,很多情况下我们需要容器长期运行(比如服务程序),这时我们就需要创建守护式容器,守护式容器没有交互式会话,很适合运行应用程序和服务,在docker run 命令中加入-d参数,这样创建出的容器就是守护式容器,可以长期在后台运行。
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
daocloud.io/library/ubuntu latest f49eec89601e 6 weeks ago 129 MB
daocloud.io/library/ubuntu 13.04 a58cd502f927 2 years ago 169 MB
# docker run --name daemon_ubuntu -d f49eec89601e /bin/bash -c "while true;do echo hello world;sleep 1;done"
f49eec89601e
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5e76e76207fb daocloud.io/library/ubuntu:latest "/bin/bash" 14 minutes ago Up 8 minutes ubuntu
5517741cfb2c f49eec89601e "/bin/bash -c 'whi..." 5 days ago Up 2 hours daemon_ubuntu
我们在运行容器daemon_ubuntu时,在这个容器里要运行的命令中使用一个while循环,该循环会一直打印hello world,直到容器或进程停止运行。当我们执行docker run命令时,发现不像以前会进入容器的会话命令行,而只是返回一个容器id。但当我们使用docker ps 命令后,看到daemon_ubuntu确实已经在运行状态了。
当我们使用docker attach命令附着到该容器时,会发现屏幕上一直在打印hello world。
# docker attach daemon_ubuntu
hello world
hello world
hello world
...
下面来看一下守护式容器内部在干些什么。使用docker logs命令获取容器的日志。
# docker logs daemon_ubuntu
hello world
hello world
hello world
...
可以看到容器没干别的事就是不停的打印hello world。
docker logs 有几个选项参数比较常用
docker logs 容器id/name -f 可以动态监控容器日志,与tail -f 相似
docker logs --tail 10 容器id/name 获取容器最后10行日志
docker logs -t 容器id/name 可以为每条打印的日志加上时间戳。
使用docker top命令可以查看容器内部运行的进程。
# docker top daemon_ubuntu
UID PID PPID C STIME TTY TIME CMD
root 5652 5636 0 04:05 ? 00:00:00 /bin/bash -c while true;do echo hello world;sleep 1;done
root 7037 5652 0 04:27 ? 00:00:00 sleep 1
在docker 1.3之后我们可以通过docker exec 命令在容器内部额外启动新进程。可以在容器内部运行两种类型的进程:后台任务
和交互式任务,后台任务在容器内部运行且没有交互需求,而交互式任务则保持在前台运行,对于需要在容器内部打开shell的任务,交互式任务是很实用的,我们的容器daemon_ubuntu守护式容器。我们可以使用docker exec 命令在正在运行的容器中进行维护和管理任务。
# docker exec daemon_ubuntu ls /lib
init lsb systemd terminfo udev x86_64-linux-gnu
# docker exec -it daemon_ubuntu /bin/bash
root@5517741cfb2c:/# hostname
5517741cfb2c
与docker run命令一样,这里-t和-i标志为我们执行的进程创建了tty伪终端并捕捉stdin,最后的/bin/bash指定了我们要在容器内部执行的命令。
# docker exec -it daemon_ubuntu touch 1.txt
# docker exec -it daemon_ubuntu /bin/bash
root@5517741cfb2c:/# ls
1.txt dev lib mnt root srv usr
bin etc lib64 opt run sys var
boot home media proc sbin tmp
上述命令在根目录下创建了一个名为1.txt的文件。
如果想要停止容器,使用docker stop命令即可
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5e76e76207fb daocloud.io/library/ubuntu:latest "/bin/bash" 9 hours ago Up 50 minutes ubuntu
5517741cfb2c f49eec89601e "/bin/bash -c 'whi..." 5 days ago Up 50 minutes daemon_ubuntu
root@ubuntu:/home/jie# docker stop daemon_ubuntu
daemon_ubuntu
root@ubuntu:/home/jie#
root@ubuntu:/home/jie# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5e76e76207fb daocloud.io/library/ubuntu:latest "/bin/bash" 9 hours ago Up 50 minutes ubuntu
我们在使用docker run命令创建容器时,可以通过–restart 标志,让docker自动重启该容器,设置过–restart标志后,当容器退出后,docker会检查容器的退出码,决定是否重启容器,默认的行为是docker 不会重启容器。
# docker run --restart=always --name daemon_ubuntu -d f49eec89601e /bin/bash -c "while true;do echo hello world;sleep 1;done"
设置--restart=always后,不论退出码是什么,docker都会重启该容器。
设置--restart=on_failure后,当退出码为非零值时,docker才会重启该容器。
设置--restart=on_failure:5后,当退出码为非零值时,docker才会重启该容器,最多重启5次 。
除了用docker ps 命令外,我们还可以使用docker inpect获得更多容器信息,该命令会输出容器比较详细的各项配置信息。
# docker inspect daemon_ubuntu
[
{
"Id": "5517741cfb2c087444ca85fd6341977191636fc1fd0bb77e5b30922960be4f5c",
"Created": "2017-02-27T14:18:25.67643785Z",
"Path": "/bin/bash",
"Args": [
"-c",
"while true;do echo hello world;sleep 1;done"
],
"State": {
"Status": "running",
......
如果想要删除容器使用docker rm 命令来删除。但是要注意不能删除运行中的docker容器,可以先通过docker stop/kill命令停止容器,才能将其删除。如果想要强行删除正在运行的容器,可以使用docker rm -f 强制删除。
# docker rm -f `docker ps -a -q`
上述命令可以删除所有容器,-q选项表示只返回容器的id信息。