Docker中的容器

前面讲过,容器是镜像的一个运行示例,带有额外的可写文件层。镜像是只有可读层的。

创建容器

使用create命令创建容器。

1
docker create -it ubuntu:ttag

然后可以通过如下命令查看容器的创建情况:

1
docker ps -a

显示如下:

1
2
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                    PORTS               NAMES
dd3fae4a712a ubuntu:ttag "/bin/bash" 6 seconds ago Created clever_khorana

创建的容器是处于停止状态的。

新建并启动容器

1
docker run ubuntu:ttag /bin/echo 'Hello Docker'

显示如下:

1
Hello Docker

现在详细介绍以下docker run后台进行的动作:

  1. 检查本地是否存在对应的镜像,如果不存在,则从仓库下载;
  2. 利用镜像创建并启动一个容器;
  3. 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层;
  4. 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去;
  5. 从地址池中配置一个IP地址给容器;
  6. 执行用户制定的程序;
  7. 执行完毕后终止容器;
    启动一个可交互的容器:
    1
    docker run -it ubuntu:latest /bin/bash
    解释一下上面it参数的含义:
  • t参数:分配一个伪终端并绑定到容器的标准输入上;
  • i参数:让容器的标准输入打开;
    对于创建的容器,退出后,容器即终止。

    守护态运行容器

    添加-d参数即可:
    1
    docker run -d ubuntu:latest /bin/bash -c 'while true;do echo hello wolrd;sleep 2;done'
    这样容器就运行起来了,通过docker ps -a查看:
    1
    2
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
    63eb0ed6ab1d ubuntu:latest "/bin/bash -c 'while…" 17 seconds ago Up 16 seconds nostalgic_edison
    但控制台是看不到输出的,要看到容器的输出信息,执行以下命令:
    1
    docker logs 63e
    63e是容器ID

    终止容器

    通过命令:
    1
    docker stop 63e
    此外还有docker startdocker restart命令,后者操作的是运行中的容器,即将容器终止然后重新start

    进入容器

    1
    docke exec -it 63e /bin/bash

    删除容器

    1
    docker rm 63e
    该命令带有几个参数:
  • -f:删除一个运行终端容器时,需要该参数,否则会出错。
  • -l:删除容器的连接,但保留容器。(这里尚有疑问,未完待续…)
  • -v:删除容器挂载的数据卷。

    容器的导入和导出

    跟镜像一样,可以导入导出。
    使用importexport
    1
    2
    #容器导出
    docker export 63e>test_for_run.tar
    这样就把容器导出到本地文件test_for_run.tar
    1
    2
    #容器导入
    cat test_for_run.tar |docker import - test/ubuntu:v1.0
    通过上面这条命令,就可以在本地镜像库看到多了一个镜像。即容器导入,导入会成为镜像。
    和导入镜像相比,导入容器生成的镜像体积要小,因为丢弃了所有的历史记录和元数据信息(tag等等),镜像导入产生的镜像则要大一些。