docker学习之容器续

继续学习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信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值