zoukankan      html  css  js  c++  java
  • 《第一本Docker书》学习笔记——第3章 Docker入门

    3.1 确保Docker已经就绪

    查看docker是否正常工作:

    sudo docker info
    

    3.2 运行我们的第一个容器

    现在,让我们尝试启动第一个Docker容器。我们可以使用docker run命令创建容器。docker run命令提供了Docker容器的创建到启动的功能,在本书中我们也会使用该命令来创建新容器。

    代码清单3-2 运行我们的第一个容器

    sudo docker run -i -t ubuntu /bin/bash
    

    其中,-i标志保证容器中STDIN时是开启的,尽管我们并没有附着到容器中。持久的标准输入是交互式shell的“半边天”,-t标志则是另外的半边天,它告诉Docker为要创建的容器分配一个伪tty终端。这样,新创建的容器才能提供一个交互式shell。若要在命令行下创建一个我们能与之进行交互的容器,而不是一个运行后台服务的容器,则这两个参数(指 -i-t 这两个参数)已经是最基本的参数了。
    接下来我们是通过ubuntu来表示使用ubuntu镜像。ubuntu镜像是一个常备镜像,也可以称为“基础”(base)镜像,它由Docker公司提供,保存在Docker Hub Registry上。可以以ubuntu基础镜像(以及类似的fedora、debian、centos等镜像)为基础,在选择的操作系统上构建自己的镜像。到目前为止,我们基于此基础景象启动了一个容器,并且没有对容器增加任何东西。
    Docker在文件系统内会使用这个ubuntu镜像创建一个新容器。该容器拥有自己的网络、IP地址,以及一个用来和宿主机进行通信的桥接网络接口。最后,我们告诉Docker在新容器中要运行什么命令,在本例中我们在容器中运行/bin/bash启动了一个Bash shell。
    在容器创建完毕之后,Docker就会执行容器中的/bin/bash命令,就像我们在命令行中看到的:

    root@0d9624f5c022:/#
    

    3.3 使用第一个容器

    用户可以继续在容器中做任何事情。当所有的工作都结束了,输入exit,就可以返回到Ubuntu宿主机的命令行提示符了。随着/bin/bash的退出,容器也停止了运行!
    但容器仍然是存在的,可以用docker ps -a命令查看当前系统中容器的列表。

    3.4 容器命名

    使用--name标志来给容器命令。
    代码清单3-11 给容器命名

    sudo docker run --name zifeiy_the_container -i -t ubuntu /bin/bash
    

    如果要使用的容器名称已经存在,可以先用docker rm命令删除已有的同名容器后,再来创建新的容器。

    3.5 重新启动已经停止的容器

    代码清单3-12 启动已经停止运行的容器

    sudo docker start zifeiy_the_container
    

    代码清单3-13 通过ID启动已经停止运行的容器

    sudo docker start b12af0d40150
    

    也可以使用docker restart命令来重新启动一个容器。
    类似的,Docker也提供了docker create命令来创建一个容器,但是并不运行它。这让我们可以在自己的容器工作流中对其进行细粒度的控制。

    3.6 附着到容器上

    Docker容器重新启动的时候,会沿用docker run命令时制定的参数来运行,因此我们的容器重新启动后会运行一个交互式会话shell。此外,也可以用docker attach命令,重新附着到该容器的会话上。
    代码清单3-14 附着到正在运行的容器

    sudo docker attach zifeiy_the_container
    

    (attach之前要确保容器时运行着的:you cannot attach to a stopped container, start it first

    3.7 创建守护式容器

    除了这些交互式运行的容器(interactive container),也可以创建长期运行的容器。守护式容器(daemonized container)没有交互式会话,非常适合运行应用程序和服务。大多数时候我们都需要以守护式来运行我们的容器。下面就来启动一个守护式容器:
    代码清单3-17 创建长期运行的容器

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

    代码清单3-18 查看正在运行的daemon_zifeiy容器

    sudo docker logs daemon_zifeiy
    

    我们也可以在命令后使用-f参数来监控Docker的日志,这与tail -f命令费城相似:
    代码清单3-20 跟踪守护式容器的日志

    sudo docker logs -f daemon_zifeiy
    

    其他参数:--tail 10
    还可以使用-t标志为每条日志加上时间戳:
    代码清单3-21 跟踪守护式容器的最新日志

    sudo docker logs -ft daemon_zifeiy
    

    3.9 Docker日志驱动

    通过--log-driver选项来实现控制Docker守护进程和容器所用的日志驱动。可以在启动Docker守护进程或者执行docker run命令时使用这个选项。
    json-file时默认的选项,json-file也为我们前面看到的docker logs命令提供了基础。
    其他可用的选项还包括syslog,该选项将禁用docker logs命令,并将所有容器的日志输出都重定向到Syslog。
    还有一个选项是none,这个选项将会禁用所有容器中的日志,导致docker logs命令也被禁用。
    代码清单3-22 在容器级别启动Syslog

    sudo docker run --log-driver="syslog" --name daemon_zifeiy2 -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
    

    3.10 查看容器内的进程

    使用docker top

    sudo docker top daemon_zifeiy
    

    3.11 Docker统计信息

    使用docker stats

    sudo docker stats zifeiy_the_container
    

    3.12 在容器内部运行进程

    使用docker exec
    -d参数可以运行一个后台任务;
    -t -i参数可以运行一个交互式任务。
    代码清单3-26 在容器中运行后台任务

    sudo docker exec -d daemon_zifeiy touch /etc/new_config_file
    

    代码清单3-27 在容器内运行交互命令

    sudo docker exec -t -i daemon_zifeiy /bin/bash
    

    3.13 停止守护式容器

    使用docker stop命令:
    代码清单3-28 停止正在运行的Docker容器

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

    3.14 自动重启容器

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

    sudo docker run --restart=always --name daemon_zifeiy -d ubuntu /bin/sh "while true; do echo hello world; sleep 1; done"
    

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

    --restart=on-failure:5
    

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

    3.15 深入容器

    除了通过docker ps命令获取容器的信息,还可以使用docker inspect来获得更多的容器信息:
    代码清单3-32 查看容器

    sudo docker inspect daemon_zifeiy
    

    docker inspect命令会对容器进行详细的检查,然后返回其配置信息,包括名称、命令、网络配置以及很多有用的数据。
    也可以用-f或者--format标志来选定查看结果:
    代码清单3-33 有选择地获取容器信息

    sudo docker inspect --format='{{ .State.Running }}' daemon_zifeiy 
    false
    

    上面这条命令会返回容器的运行状态,示例中该状态为false。
    我们还能回去其他有用的信息,如容器IP地址:
    代码清单3-34 查看容器的IP地址

    sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' daemon_zifeiy
    172.17.0.2
    

    也可以同时指定多个容器,并显示每个容器的输出结果:
    代码清单3-35 查看多个容器

    $ sudo docker inspect --format '{{.Name}} {{.State.Running}}' 
    daemon_zifeiy zifeiy_the_container
    /daemon_zifeiy false
    /zifeiy_the_container false
    

    所有的Docker容器都保存在/var/lib/docker/containers目录下。

    3.16 删除容器

    如果容器不再使用,可以使用docker rm命令来删除它们:
    代码清单3-36 删除容器

    sudo docker rm 80430f8d0921
    

    代码清单3-37 删除所有容器

    sudo docker rm `sudo docker ps -a -q`
    
  • 相关阅读:
    Codeforces Round #432 (Div. 2, based on IndiaHacks Final Round 2017) Finished D. Arpa and a list of numbers
    Codeforces Round #432 (Div. 2, based on IndiaHacks Final Round 2017) C. Five Dimensional Points
    Codeforces Round #432 (Div. 2, based on IndiaHacks Final Round 2017) B. Arpa and an exam about geometry
    Codeforces Round #432 (Div. 2, based on IndiaHacks Final Round 2017) A. Arpa and a research in Mexican wave
    hdu 5510
    长沙理工大学第十二届ACM大赛
    Codeforces Round #336 (Div. 2) D. Zuma
    百(垃)度(圾)之星初赛B hdu6114
    百(垃)度(圾)之星初赛B hdu6119
    Codeforces Round #428C
  • 原文地址:https://www.cnblogs.com/zifeiy/p/10348696.html
Copyright © 2011-2022 走看看