资讯专栏INFORMATION COLUMN

图表君聊Docker-Container

paney129 / 3447人阅读

摘要:利用镜像创建并启动一个容器分配一个文件系统,并在只读的镜像层外层挂接一个写读写层。容器的启动过程,对于理解容器至关重要,需要深入的理解。同时,对于终止状态的容器,我们可以采用来启动。欢迎订阅我的公众号,第一时间获取图表君的新文章。

上篇文章我们介绍了Docker三大概念中的Image,这篇我们来介绍Container,上篇文章中我们了解到了Image是运行在Container中的,实际上在容器里跑的指令都是在Container中run的。

启动容器

启动容器的方法一般有两种:

基于一个Image重新启动一个新的容器

启动一个现在已经是在Stopped状态下的容器。
来试着运行下边的这个命令:

    docker run ubuntu /bin/echo "Hello Docker"
    Hello Docker

有没有感觉和本地执行 echo ‘Hello Docker’ 的速度没什么差别?但是其实人家是在一个Container里运行的啊。想想之前用VM的情况,启动一个instance得2分钟,所要执行的Job只有几秒而已。如果同样的Job放到docker里跑,那会快多了,太爽快了。

所以一般用户在使用容器的时候都是随时新建和删除容器的。

上边那个例子是我们用docker 运行了一个输出语句,下面我们来看这样一个例子:

    docker run -t -i ubuntu /bin/bash
    root@42099bcd8196:/# ls
    bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

这样进入了一个docker container 并运行ls命令。-t让docker分配一个伪终端绑定到容器的标准输入上, -i让容器的标准输入一直打开。

容器的启动过程

那么一个容器的启动到底经历那些过程呢:

检查images如果本地不存在就是从远程仓库下载。

利用镜像创建并启动一个容器

分配一个文件系统,并在只读的镜像层外层挂接一个写读写层。

从宿主主机配置的网桥接口桥接一个虚拟接口到容器中

分配一个ip地址给容器

运行用户给定的应用程序

运行完毕,容器被终止。

容器的启动过程,对于理解容器至关重要,需要深入的理解。

使用docker ps -al查看所有的历史,使用docker start可以启动一个已经终止的容器。

后台运行

添加 -d参数可以后台运行docker container

    docker run -d ubuntu  /bin/bash -c "while true; do echo hello docker; sleep 2; done"

这样我们就看不到容器的输出信息了,可以通过docker logs来查看

docker logs [container ID or NAME]

like this

docker logs 133e58dbdc78
hello docker
hello docker
hello docker
hello docker
...
停止容器

要停止一个容器也是相当简单的,docker stop就能办到了。同时,对于终止状态的容器,我们可以采用docker start 来启动。通过docker restart来重启这个容器。

docker stop [CONTAINER ID OR NAME]
进入容器

当我们使用 -d参数运行了一个Container的时候,有时候我们需要进入这个容器进行一些操作。例如有这样的一个情况,我们运行了一个app在一个容器里,我们想进入容器看看,这个app运行的状态,查看log。那们如何进入呢?其实有很多种方法,这里介绍两种。
第一:

    docker attach [CONTAINER ID OR NAME]
$ docker run -d --name topdemo ubuntu /usr/bin/top -b
$ docker attach topdemo

top - 02:05:52 up  3:05,  0 users,  load average: 0.01, 0.02, 0.05
Tasks:   1 total,   1 running,   0 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.1%us,  0.2%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:    373572k total,   355560k used,    18012k free,    27872k buffers
Swap:   786428k total,        0k used,   786428k free,   221740k cached

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 1 root      20   0 17200 1116  912 R    0  0.3   0:00.03 top

这里我们使用了attach命令进入了容器,看到了top命令的输出。

回到我刚才说的那个例子,如果有个Container后台里执行的是一个webapp,如何看到logs 或者是输出呢?接下来具体说说。

docker run -d --name webapp -p 5000:5000 training/webapp

在执行了这个命令后,我们在后台run了一个images为training/webapp的Container(这是一个python的flask app)我们将本机的5000端口与Container的5000端口(flask的默认端口)进行了mapping。当我们从Browser访问的时候,我们就能访问到这个app。

当我们在本地开发的时候,我们很容易的可以从console里看到,这个app的访问的记录,同时也能方便的查看log文件。那么这些在容器里怎么进行呢?当然我们可以使用上边介绍的attach命令。

docker attach webapp

当从浏览器访问这个app的时候,通过attach我们可以看到Container里的输出。

docker attach webapp
172.17.0.1 - - [04/Oct/2016 04:44:23] "GET / HTTP/1.1" 200 -
172.17.0.1 - - [04/Oct/2016 04:44:24] "GET / HTTP/1.1" 200 -

但是问题来了,如果我们要看log文件,或者想进入Container,看看其他的文件状态,该怎么办呢?那么这时候我们就会用到 docker exec了。

    docker exec -it webapp /bin/bash
    root@e0cac87036f0:/opt/webapp# ls
    Procfile  app.py  requirements.txt  tests.py
    root@e0cac87036f0:/opt/webapp#

通过docker exec我们就在这个Container里又运行了bash,这时候我们就能做其他我们想做的事情了。

那么docker attachdocker exec有什么区别呢?

docker attach 让用户可以进入Container查看输出等等操作,但是并不会另外启动一个进程! 如果你用CTRL-c来退出,同时这个信号会kill Container(默认情况)

docker exec 会启动另外一个进程来进入Container,这里的操作是在这个进程下的。如果你用CTRL-c来退出,不会kill 原来的Container

好了,对于Container今天就聊到这里,下片文章我们继续聊最后一个概念,Docker仓库。


欢迎订阅我的公众号,第一时间获取图表君的新文章。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/26732.html

相关文章

  • 图表君聊Docker-开篇

    摘要:图表君聊开篇今天是图表君聊的第一篇,为什么会有这个系列呢容器技术出现已经有一段时间了,之前零零星星的也看过一些文章,图表君的项目上也在使用。至于,图表君没试过,官网有的教程,大家可以参考。上的官网,安装,然后跟着图表君一起学习吧。 图表君聊Docker-开篇 今天是图表君聊Docker的第一篇,为什么会有这个系列呢?容器技术Docker出现已经有一段时间了,之前零零星星的也看过一些文章...

    z2xy 评论0 收藏0
  • 图表君聊docker-仓库

    摘要:图表君聊仓库今天我们来继续聊,上篇文章我们介绍了里的今天来继续三大概念中的最后一个仓库。这个仓库可以是一个私有的仓库,供一个内部使用。目前官方维护一个公共仓库里边有大量的,可以满足我们的大部分需求。原创文章,欢迎转发,但请标明出处。 图表君聊docker-仓库 今天我们来继续聊docker,上篇文章我们介绍了docker里的Container.今天来继续三大概念中的最后一个--仓库(R...

    justCoding 评论0 收藏0
  • 图表君聊docker-Dockerfile

    摘要:图表君聊前边几篇文章给大家介绍了的三大基本概念。维护者的信息是图表君当前目录到容器中的目录下指定工作路径为安装依赖暴露端口启动创建镜像编写好后,就可以使用来了。欢迎订阅我的公众号,第一时间获取图表君的新文章。 图表君聊docker-Dockerfile 前边几篇文章给大家介绍了docker的三大基本概念。可能大家觉得概念的东西比较生涩,有没有更多实战的例子呢?好了,从这篇文章开始,我会...

    FingerLiu 评论0 收藏0
  • 图表君聊Docker-images

    摘要:当运行这条命令的时候,实际上是从上来请求标记为的,当然由于众所周知的原因,的速度会很慢。运行下边这条命令,我们就可以清理下了。欢迎订阅我的公众号,第一时间获取图表君的新文章。 上篇文章我们介绍了docker的历史由来带来的一些好处,从这篇文章开始,我们开始正式的进入Docker的世界,首先给大家介绍一下Docker一些基本概念。 Docker的基本概念 Docker的基本概念并不是很多...

    haobowd 评论0 收藏0
  • Docker-container详解

    本文介绍docker中的contanier,基于操作系统介绍什么是container。进程(Processes)Container是具有指定配置的Linux进程(processes)。我们进行如下操作: ##启动一个redis进程 ➜~dockerrun-d--name=dbredis:alpine ##显示容器运行的进程 ➜~dockertopdb PIDUSERTIMECOMMA...

    社区管理员 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<