Docker容器

Posted gavin-guo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker容器相关的知识,希望对你有一定的参考价值。

简介 

  容器是Docker的另一个核心概念。
  简单地说,容器是镜像的一个运行实例,所不同的是,它带有额外的可写文件层。
  如果认为虚拟机是模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。那么Docker容器就是独立运行的一个或一组应用,以及它们的必需运行环境。
  本文将具体介绍围绕容器的重要操作,包括创建一个容器、启动容器、终止一个容器、进入容器内执行操作、删除容器和通过导入导出容器来实现容器迁移等。

创建容器

  Docker的容器十分轻量级,用户可以随时创建或删除容器。

新建容器

  可以使用Docker create命令新建一个容器,例如:

[[email protected] ~]# sudo docker create -it ubuntu
Unable to find image ‘ubuntu:latest‘ locally
latest: Pulling from library/ubuntu
5b7339215d1d: Pull complete 
14ca88e9f672: Pull complete 
a31c3b1caad4: Pull complete 
b054a26005b7: Pull complete 
Digest: sha256:9b1702dcfe32c873a770a32cfd306dd7fc1c4fd134adfb783db68defc8894b3c
Status: Downloaded newer image for ubuntu:latest
c03bb46b440ca9c6b5fe9b941f38005ad08558497cb6f3e6613ccfcdadc7dd5a

  当镜像不存在时会先下载镜像再创建容器。
  使用docker create命令新建的容器处于停止状态,可以使用docker start命令来启动它。

新建并启动容器

  启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动。所需要的命令主要为docker run,等价于先执行docker create命令,再执行docker start命令。
  例如,下面的命令输出一个“Hello World”,之后容器自动终止:

[[email protected] /]# sudo docker run ubuntu /bin/echo ‘Hello World‘
Hello World

  这跟在本地直接执行/bin/echo ‘Hello World‘几乎感觉不出任何区别。
  当利用docker run来创建并启动容器时,Docker在后台运行的标准操作包括:

  • 检查本地是否存在指定的镜像,不存在就从公有仓库下载。
  • 利用镜像创建并启动一个容器。
  • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层。
  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去。
  • 从地址池配置一个IP地址给容器。
  • 执行用户指定的应用程序。
  • 执行完毕后容器被终止。

  下面的命令则启动一个bash终端,允许用户进行交互:

[[email protected] /]# sudo docker run -t -i ubuntu /bin/bash
[email protected]:/# 

  其中,-t选项让Docker分配一个伪终端(pseudo-ty)并绑定到容器的标准输入上,-i则让容器的标准输入保持打开。
  在交互模式下,用户可以通过所创建的终端来输入命令,例如:

[email protected]:/# pwd
/
[email protected]:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[email protected]:/# ps
   PID TTY          TIME CMD
     1 pts/0    00:00:00 bash
    11 pts/0    00:00:00 ps

  在容器内用ps命令查看进程,可以看到,只运行了bash应用,并没有运行其他不需要的进程。
  用户可以按Ctrl+d或输入exit命令来退出容器:

[email protected]:/# exit
exit

  对于所创建的bash容器,当使用exit命令退出之后,该容器就自动处于终止状态了。这是因为对于Docker容器来说,当运行的应用(此处例子中为bash)退出后,容器也就没有继续运行的必要了。

守护态运行

  更多的时候,需要让Docker容器在后台以守护态(Daemonized)形式运行。用户可以过添加-d参数来实现。
  例如下面的命令会在后台运行容器:

[[email protected] /]# sudo docker run -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done"
1cdff0f459ad8f8e5a3de5603bbd14ea09a152ca430a5528e344c4254197f550

  容器启动后会返回一个唯一的ID,也可以通过docker ps命令来查看容器信息:

[[email protected] /]# sudo docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
1cdff0f459ad        ubuntu              "/bin/sh -c ‘while t…"   11 seconds ago      Up 9 seconds                            keen_perlman

  要获取容器的输出信息,可以通过docker logs命令:

[[email protected] /]# docker logs 1cdff0f459ad
hello world
hello world
hello world
...

终止容器

  可以使用docker stop来终止一个运行中的容器,命令的格式为docker stop [-t l --time[=10]]。它会首先向容器发送SIGTERM信号,等待一段时间后(默认为10秒),再发送SIGKILL信号终止容器。
  此外,当Docker容器中指定的应用终结时,容器也自动终止。例如对于上面演示中只启动了一个终端的容器,用户通过exit命令或Ctrl+d来退出终端时,所创建的容器立刻终止。
  另外,可以使用docker stop来终止一个运行中的容器:

[[email protected] /]# sudo docker stop 1cdff0f459ad
1cdff0f459ad

  可以使用docker ps -a -q命令看到处于终止状态的容器的ID信息。例如:

[[email protected] /]# sudo docker ps -a -q
1cdff0f459ad
5380e1ecc9c8
e6e0a53c33c4
c03bb46b440c

  处于终止状态的容器,可以通过docker start命令来重新启动:

[[email protected] /]# sudo docker start 1cdff0f459ad
1cdff0f459ad

  此外,docker restart命令会将一个运行态的容器终止,然后再重新启动它:

[[email protected] /]# sudo docker restart 1cdff0f459ad
1cdff0f459ad

进入容器

  在使用-d参数时,容器启动后会进入后台,用户无法看到容器中的信息。某些时候如果需要进入容器进行操作,有多种方法,包括使用docker attach命令、docker exec命令,以及nsenter工具等,博主这里只说下docker exec命令。
  Docke自1.3版本起,提供了一个非常方便的工具exec,可以直接在容器内运行命令。
  例如进入到刚创建的容器中,并启动一个bash:

[[email protected] /]# sudo docker exec -ti 1cdff0f459ad /bin/bash
[email protected]:/# 

删除容器

  可以使用docker rm命令删除处于终止状态的容器,命令格式为docker rm [OPTTONS] CONTAINER [CONTAINER...]。支持的选项包括:

  • -f,--force=false强行终止并删除一个运行中的容器。
  • -l,--link=false 删除容器的连接,但保留容器。
  • -v,--volumes=false 删除容器挂载的数据卷。

  例如,查看处于终止状态的容器并删除如下所示:

[[email protected] /]# sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
1cdff0f459ad        ubuntu              "/bin/sh -c ‘while t…"   19 minutes ago      Up 10 minutes                                   keen_perlman
5380e1ecc9c8        ubuntu              "/bin/bash"              26 minutes ago      Exited (0) 23 minutes ago                       practical_snyder
e6e0a53c33c4        ubuntu              "/bin/echo ‘Hello Wo…"   31 minutes ago      Exited (0) 31 minutes ago                       lucid_robinson
c03bb46b440c        ubuntu              "/bin/bash"              About an hour ago   Created                                         practical_volhard
[[email protected] /]# sudo docker rm 5380e1ecc9c8
5380e1ecc9c8

  如果要删除一个运行中的容器,可以添加-f参数。Docker会发送SIGKILL信号给容器,终止其中的应用:

[[email protected] /]# sudo docker rm 1cdff0f459ad
Error response from daemon: You cannot remove a running container 1cdff0f459ad8f8e5a3de5603bbd14ea09a152ca430a5528e344c4254197f550. Stop the container before attempting removal or force remove
[[email protected] /]# sudo docker rm -f 1cdff0f459ad
1cdff0f459ad

导入和导出容器

导出容器

  导出容器是指导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态,可以使用docker export命令,该命令格式为docker export CONTAINER。
  查看所有的容器如下所示:

[[email protected] /]# sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                          PORTS               NAMES
2e003db2a309        ubuntu              "/bin/sh -c ‘while t…"   14 seconds ago      Up 12 seconds                                       keen_nobel
e6e0a53c33c4        ubuntu              "/bin/echo ‘Hello Wo…"   39 minutes ago      Exited (0) About a minute ago                       lucid_robinson

  分别导出2e003db2a309容器和e6e0a53c33c4容器到test_for_run.tar文件和test_for_stop.tar文件:

[[email protected] test]# sudo docker export 2e003db2a309 > test_for_run.tar
[[email protected] test]# ls
test_for_run.tar
[[email protected] test]# sudo docker export e6e0a53c33c4 > test_for_stop.tar
[[email protected] test]# ls
test_for_run.tar  test_for_stop.tar

  可将这些文件传输到其他机器上,在其他机器上通过导入命令实现容器的迁移。

导入容器

  导出的文件又可以使用docker import命令导入,成为镜像,例如:

[[email protected] test]# cat test_for_run.tar | sudo docker import - test/ubuntu:v1.0
sha256:5b8050c321636ec1814fd0927a5044aed089df8641d32ea4442c75a71ad3e596
[[email protected] test]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test/ubuntu         v1.0                5b8050c32163        3 seconds ago       64.2MB

  读者可能会记得,博主在之前博文中曾介绍过使用docker load命令来导入一个镜像文件。
  实际上,既可以使用docker load命令来导人镜像存储文件到本地的镜像库,又可以使用docker import命令来导人一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。

 

这篇文章是我学习 Docker 的记录,内容参考自《Docker技术入门与实战》

 

以上是关于Docker容器的主要内容,如果未能解决你的问题,请参考以下文章

docker 容器重启策略

docker 容器自动启动run

docker的容器常规操作

docker容器自动启动及修改配置文件

docker容器设置固定IP

docker 启动 mysql,重启docker导致容器消失