docker 系列7 创建容器

一.创建容器

  容器是Docker的另一个核心概念,之前讲的一直是镜像。容器是镜像的一个运行实例,所不同的是镜像是静态的只读文件,而容器带有运行时需要的可写文件层,同时容器的应用进程处于运行状态。

  如果虚拟机是模拟运行的一整套操作系统(包括内核,应用运行态环境和其他系统环境)和跑在上面的应用,那么docker容器就是独立运行的一个或一组应用,以及它们必需的运行环境。

  从现开始,忘记臃肿的虚拟机吧,对容器的操作就像直接操作应用一样简单和快速。本节主要介绍容器的create,start,run,wait,logs子命令。

  1. 新建容器 docker create

    文档:docker container create | Docker Docs

    可使用docker [container] create命令新建一个容器,创建容器需要一个镜像,这里镜像文件为 hello-world,  如果本机该镜像没有,就会去docker hub仓库下载。利用镜像创建一个容器与之关联。如下所示:

[root@VM_0_12_centos ~]# docker create -it hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
Digest: sha256:8e3114318a995a1ee497790535e7b88365222a21771ae7e53687ad76563e8e76
Status: Downloaded newer image for hello-world:latest89398d8e5822c05278b032dcd179ebe3a5066995c6fcab139092634380924d1b

   再查看所有容器,最上面一个是刚创建的容器

[root@VM_0_12_centos ~]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                    PORTS               NAMES
89398d8e5822        hello-world         "/hello"            30 seconds ago      Created                                       nifty_mahavira
b01d0e51debf        hello-world         "/bin/bash"         25 hours ago        Created                                       peaceful_turing
e709d22a467d        hello-world         "/hello"            27 hours ago        Exited (0) 27 hours ago                       distracted_lalande
6a8fc2b94a89        hello-world         "/hello"            29 hours ago        Exited (0) 29 hours ago                       naughty_chatelet

    再查看所有镜像

[root@VM_0_12_centos ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
35c6eb3fc971        hello-world         "/hello"            8 minutes ago       Created                                        confident_chaplygin
89398d8e5822        hello-world         "/hello"            13 minutes ago      Exited (0) 4 minutes ago                       nifty_mahavira
b01d0e51debf        hello-world         "/bin/bash"         26 hours ago        Created                                        peaceful_turing
e709d22a467d        hello-world         "/hello"            27 hours ago        Exited (0) 27 hours ago                        distracted_lalande
6a8fc2b94a89        hello-world         "/hello"            30 hours ago        Exited (0) 30 hours ago                        naughty_chatelet

  2. 启动容器 docker start 

    文档:docker container start | Docker Docs

  使用create命令创建的容器,处于createted停止状态,需要使用docker [contriner] start 命令来启动容器。

  下面启动容器ID,可以是前缀2个字符但启动后会秒退,可以理解为运行的程序是一个后台进程应用,运行后会自动退出( 执行完毕后容器被自动终止)。

[root@VM_0_12_centos ~]# docker start 89
89

  下面下载另一个镜像:如下所示:

[root@VM_0_12_centos ~]# docker create -it ubuntu:latest
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
d51af753c3d3: Pull complete 
fc878cd0a91c: Pull complete 
6154df8ff988: Pull complete 
fee5db0ff82f: Pull complete 
Digest: sha256:747d2dbbaaee995098c9792d99bd333c6783ce56150d1b11e333bbceed5c54d7
Status: Downloaded newer image for ubuntu:latest
3ddee94cef3a9f32f25e6e25c789e55391fc9bc57a5c294df4abd440e03b2811

  启动该容器

[root@VM_0_12_centos ~]# docker start 3d
3d

  查看启动的容器列表,看出与hello-world镜像相比,该ubuntu镜像在启动后没有秒退,应该是一个前端进程应用

[root@VM_0_12_centos ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
3ddee94cef3a        ubuntu:latest       "/bin/bash"         37 seconds ago      Up 3 seconds                            quizzical_nash

  3.创建并启动容器 docker run

    文档:docker container run | Docker Docs

    除了start命令来启动容器,也可以通过docker [container] run 来直接新建并启动容器, 它等价于先执行docker [container] create命令,再执行docker [contriner] start命令。

    容器是在主机上运行的进程。主机可以是本地主机,也可以是远程主机。当操作员执行时docker run,运行的容器进程是独立的,因为它具有自己的文件系统,自己的网络以及独立于主机的独立的进程树

   docker run命令形式: 

  $ docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]

    该docker run命令必须指定 要从中派生容器的IMAGE。镜像开发人员可以定义与以下内容有关的镜像默认值:

    • 独立运行或前台运行
    • 容器识别
    • 网络设置
    • CPU和内存的运行时限制

  下面输出一个hello world,之后容器自动终止:

[root@VM_0_12_centos ~]# docker run ubuntu /bin/echo 'Hello world'
Hello world

  当执行docker [container] run命令时,docker后台运行的标准操作步骤包括:

    1) 检查本地是否存在指定的镜像,不存在就从公有仓库下载;

    2) 利用镜像创建一个容器,并启动该容器;

    3) 分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层;

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

    5) 从网桥的地址池配置一个ip地址给容器;

    6) 执行用户指定的应用程序

    7) 执行完毕后容器被自动终止

    下面命令启动一个bash终端,允许用户进行交互,下面是一系列操作:

[root@VM_0_12_centos ~]# docker run -it ubuntu /bin/bash 
root@d11795dbc2e4:/# pwd
/
root@d11795dbc2e4:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@d11795dbc2e4:/# ps
  PID TTY          TIME CMD
    1 pts/0    00:00:00 bash
    9 pts/0    00:00:00 ps
root@d

    上面命令中,-t选项让docker分配一个伪终端并绑定到容器的标准输入上, -i 则让容器的标准输入保持打开。更多的命令选项可以通过man docker-run命令来查看。

    要交互模式下,比如在容器中查看目录,进程。这些都是容器内的资源。如ps查看进程,只运行了bash应用,并没有运行其他无关的进程,按exit命令退出容器。

  4.守护态运行

    docker容器默认前台运行容器,在更多的时候,需要让docker容器在后台以守护态(Daemoinzed)形式运行,此时可以通过添加 -d 参数来实现,例如下面的命令会在后台运行容器

[root@VM_0_12_centos /]# docker run  -d ubuntu /bin/sh -c "while true;  do echo hello world; sleep 1; done"
79a006b24f835f42252718cdd4d700f1f657ed3758cd25a78d8d730adb15613e
[root@VM_0_12_centos /]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
79a006b24f83        ubuntu              "/bin/sh -c 'while t…"   5 seconds ago       Up 5 seconds                            dreamy_mendeleev
3ddee94cef3a        ubuntu:latest       "/bin/bash"              4 days ago          Up 4 days                               quizzical_nash

   容器启动返回了一个唯一的id,通过docker ps查看运行着的容器也能看到。   linux中"sh -c" 命令,可以把一个字符串作为完整的命令来执行,这里隔一秒输出hello world;直到手动去结束该容器。

  5. 查看容器输出

    文档:docker container logs | Docker Docs

    上面第4点容器ID:79a006b24f83, 一直在后台运行着,要获取容器的输出信息,可以通过docker logs命令。该命令支持的选项包括:

    -details :打印详细信息

    -f, -follow: 持续保持输出

      -since string:输出从某个时间开始的日志

    -tail  string: 输出最近的若干日志

    -t,  -timestamps:显示时间截信息

    -until string:输出某个时间之前的日志。

    例如,查看容器ID:79a006b24f83输出的信息,如下所示:

[root@VM_0_12_centos /]# docker logs -f 79a006b24f83 
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
....

    使用-f ,会隔一秒打印一句 hello world信息。

  查看容器:docker container ls | Docker Docs

  容器所有命令:docker container | Docker Docs

  由于容器是整个docker技术栈的核心,create命令和run命令支持的选项都十分复杂,需要不断休会。

  小总结:一个容器创建必须依赖一个存在的镜像文件,与之关联。  一个镜像可以不关联容器,但运行需要关联容器。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值