欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Docker核心组件之容器(Container)

程序员文章站 2022-07-14 10:46:54
...

容器(Container):

容器的存在离不开镜像的支持,它是镜像运行时的一个载体。容器可以被创建、启动、停止、删除、暂停等。这些容器彼此之间相互隔离、互不可见的。

Docker容器有一个设计上的机制,即容器与应用是同生共死的。当容器的应用都关闭,停止运行了,那么容器也会跟着自动退出,停止运行。

镜像和容器的关系:就像是面向对象程序设计中的类和实例一样。

  • 镜像是静态的定义,里边有应用。
  • 容器是动态的,是镜像运行时的实体。

 

一、容器的创建/启动/暂停/终止

创建容器和启动容器两个命令可以使用一个 run命令搞定,它们支持参数相同。容器使用别名和id都可以

1、创建容器 - docker create 命令

创建一个新的容器但不启动它,返回容器的id,不指定名字时,自动生成。

基本语法:docker  [container] create [OPTIONS] IMAGE

[aaa@qq.com ~]# docker create -it centos:7
c26038331db72bffd851c380bde4d554270e49085ba87f34a7f25e0bf0bdad9a
[aaa@qq.com ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
c26038331db7        centos:7            "/bin/bash"         49 seconds ago      Created                                 keen_kare

2、启动容器 - docker  start 命令

启动一个或多个已经被停止的容器,使用容器的id或者name都可以。

基本语法:docker  [container] start [OPTIONS] CONTAINER [CONTAINER...]

[aaa@qq.com ~]# docker start c26038331db7
c26038331db7
[aaa@qq.com ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
c26038331db7        centos:7            "/bin/bash"         3 minutes ago       Up 5 seconds 

3、进入容器 - docker attach 命令

连接上正在运行中的容器。

基本语法:docker [container] attach [OPTIONS] CONTAINER

[aaa@qq.com /]# read escape sequence
[aaa@qq.com ~]# docker attach c26038331db7
[aaa@qq.com /]# read escape sequence
[aaa@qq.com ~]#

使用 ctrl+q+p 暂时退出容器,但是正在运行中的容器不会关闭。 

Docker核心组件之容器(Container)

4、暂停容器 - docker stop 命令

暂停一个运行中的容器,并暂停容器中所有的进程。

基本语法:docker  [container] pause [OPTIONS] CONTAINER [CONTAINER...]

[aaa@qq.com ~]# docker pause c26038331db7

Docker核心组件之容器(Container)

5、恢复容器 - docker unpause命令

将一个处于paused状态的容器恢复到运行状态,并恢复容器中所有的进程。

基本语法:docker [container] unpause [OPTIONS] CONTAINER [CONTAINER...]

[aaa@qq.com ~]# docker unpause c26038331db7

Docker核心组件之容器(Container)

6、终止容器 - docker stop 命令

停止一个运行中的容器。该命令首先会向容器发送SIGTERM信号,等待一段超时时间后(默认为10秒),再发送SIGKILL信号来终止容器。

基本语法:docker  [container] stop [OPTIONS] CONTAINER [CONTAINER...]

[aaa@qq.com ~]# docker stop c26038331db7

Docker核心组件之容器(Container)

7、重启容器 - docker  restart 命令

该命令是将一个运行态的容器先终止,然后再重新启动容器。

基本语法:docker  [container] restart [OPTIONS] CONTAINER [CONTAINER...]

[aaa@qq.com ~]# docker restart c26038331db7

8、退出容器并终止容器 - exit命令

退出容器,再退出伪终端

[aaa@qq.com ~]# docker attach c26038331db7
[aaa@qq.com /]# exit 
exit
[aaa@qq.com ~]# docker ps -a 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
2150d7c2b218        centos:7            "/bin/bash"         55 minutes ago      Up 55 minutes                                  centos7
c26038331db7        centos:7            "/bin/bash"         About an hour ago   Exited (0) 9 seconds ago                       keen_kare

9、杀死/终止容器 - docker kill 命令

杀掉一个运行中的容器。该命令会直接发送 SIGKILL信号来强行终止容器。

基本语法:docker [container] kill [OPTIONS] CONTAINER [CONTAINER...]

OPTIONS说明:

  • -s :向容器发送一个信号
[aaa@qq.com ~]# docker restart c26038331db7
c26038331db7
[aaa@qq.com ~]# docker kill -s KILL c26038331db7
c26038331db7
[aaa@qq.com ~]# docker ps -a 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                       PORTS               NAMES
2150d7c2b218        centos:7            "/bin/bash"         57 minutes ago      Up 57 minutes                                    centos7
c26038331db7        centos:7            "/bin/bash"         About an hour ago   Exited (137) 4 seconds ago                       keen_kare

10、删除容器 - docker rm 命令

删除一个或多个容器。

基本语法:docker [container] rm [OPTIONS] CONTAINER [CONTAINER...]

OPTIONS说明:

  • -f, -- force=false :通过 SIGKILL 信号强制删除一个运行中的容器。
  • -l,--link=false :移除容器间的网络连接,而非容器本身。
  • -v, --volumes=false:删除与容器关联的数据卷。
[aaa@qq.com ~]# docker rm -f dc87c233e993
dc87c233e993

批量删除所有容器:

两条命令实现停用并删除容器,先终止容器,在批量删除。

[aaa@qq.com ~]#  docker kill $(docker ps -q) 

[aaa@qq.com ~]#  docker rm $(docker ps -aq) 

 

二、docker run 命令

基本语法:docker [container] run [OPTIONS] IMAGE [COMMAND] [ARG...]

create命令和run命令支持的选项相同且非常多,这里列举出来,和参数配合使用还有更多功能,在使用中一个一个熟悉。

这些选项主要包括如下几大类:与容器运行模式相关、与容器环境配置相关、与容器资源限制和安全保护相关。

图片来自网络(感谢),也可查看官网:https://docs.docker.com/engine/reference/commandline/run/

Docker核心组件之容器(Container)

1、交互模式创建并启动容器 

[aaa@qq.com ~]# docker run -it --name centos7 centos:7 /bin/bash
[aaa@qq.com /]# 
[aaa@qq.com /]# ls
anaconda-post.log  bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[aaa@qq.com ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
2150d7c2b218        centos:7            "/bin/bash"         30 seconds ago      Up 30 seconds                           centos7

 参数:

  • -t:让Doker分配一个伪终端并绑定到容器的标准输入上, 
  • -i:让容器的标准输人保持打开。
  • --name '':给容器起别名

该命令会创建一个新的容器并运行它。将上面提到了创建和启动容器的两条命令合为一条命令来实现。

这样创建的容器是交互式的,可以通过保持开启的容器的标准输入,输入命令进入到容器里,命令在容器里执行的结果,也可以通过伪终端,显示出来。后面的/bin/bash(Centos)可以省略的,-it不可省略(交互式的)。

例如:使用容器输出一个"Hello Docker",之后容器自动终止。

[aaa@qq.com ~]# docker run centos:7 /bin/echo 'Hello Docker' 
Hello Docker
[aaa@qq.com ~]# /bin/echo 'Hello Docker' 
Hello Docker

这个docker run 和在宿主机中直接执行/bin/echo 'hello Docker' ,的运行机制是不一样。

当利用 docker run 命令来创建并启动容器时,Docker 在后台运行的标准操作包括:

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

2、守护态创建并启动容器 

通过过使用 -d 参数来实现,让Docker容器在后台以守护态(Daemonized)形式运行。

[aaa@qq.com ~]# docker run -d --name ctos7 centos:7

Docker核心组件之容器(Container)

例如:通过sh在后台运行容器

[aaa@qq.com ~]# docker run -d --name shctos7 centos:7 /bin/sh -c "while true; do echo hello world; sleep 1;done"
dc87c233e993440395b28f3e395b21ef16393049056dcc16ffae7c17e793fdc7
[aaa@qq.com ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
dc87c233e993        centos:7            "/bin/sh -c 'while t…"   18 seconds ago      Up 17 seconds                                     shctos7

 

三、查看容器信息

1、列出已有容器 - docker ps 命令

基本语法:docker [container] ps [OPTIONS]

OPTIONS说明:

  • -a :显示所有的容器,包括未运行的。
  • -f :根据条件过滤显示的内容。
  • --format :指定返回值的模板文件。
  • -l :显示最近创建的容器。
  • -n  N:列出最近创建的N个容器。
  • --no-trunc :不截断输出。
  • -q :静默模式,只显示容器编号。
  • -s :显示总的文件大小。

例如:列出所有的容器,包括未运行的。

[aaa@qq.com ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
dc87c233e993        centos:7            "/bin/sh -c 'while t…"   4 minutes ago       Up 4 minutes                                      shctos7
2d2696e48c0a        centos:7            "/bin/bash"              7 minutes ago       Exited (0) 7 minutes ago                          ctos7
2150d7c2b218        centos:7            "/bin/bash"              About an hour ago   Up About an hour                                  centos7
c26038331db7        centos:7            "/bin/bash"              About an hour ago   Exited (137) 15 minutes ago                       keen_kare

输出详情介绍:

CONTAINER ID: 容器 ID。

IMAGE: 使用的镜像。

COMMAND: 启动容器时运行的命令。

CREATED: 容器的创建时间。

STATUS: 容器状态。状态有7种:

  • created(已创建)
  • restarting(重启中)
  • running(运行中)
  • removing(迁移中)
  • paused(暂停)
  • exited(停止)
  • dead(死亡)

PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。

NAMES: 自动分配的容器名称。

2、查看某容器元数据 - docker inspect 命令

基本语法:docker [container] inspect  CONTAINER  [CONTAINER...]

例如,查看某容器的具体信息,会以json格式返回包括容器Id、创建时间、路径、状态、镜像、配置等在内的各项信息:

[aaa@qq.com ~]# docker inspect c26038331db7

Docker核心组件之容器(Container)

3、查看某容器内进程 - docker top命令

查看容器中正在运行的进程信息,支持 ps 命令参数。

基本语法:docker [container]  top [OPTIONS] CONTAINER [ps OPTIONS]

该命令类似于Linux系统中的top命令,会打印出容器内的进程信息,包括PID、用户、时间、命令等。

例如,查看某容器内的进程信息:

[aaa@qq.com ~]# docker top 2150d7c2b218
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                8701                8682                0                   16:01               pts/0               00:00:00            /bin/bash

4、查看统计信息 - docker stats 命令

查看统计信息,会显示CPU、内存、存储、网络等使用情况的统计信息。

基本语法:docker  [container]  stats   [OPTIONS] [CONTAINER]

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
2150d7c2b218        centos7             0.00%               412KiB / 972.6MiB   0.04%               656B / 0B           0B / 0B             1
^C

5、查看某容器的日志 - docker logs 命令

获取某容器的日志输出信息。

基本语法:docker [container] logs [OPTIONS] CONTAINER

OPTIONS说明:

  • -f, -follow: 跟踪日志输出,持续保持输出
  • --since :显示某个开始时间的所有日志
  • -t,-timestamps: 显示时间戳
  • --tail=N :仅列出最新N条容器日志

例如,查看上面通过sh在后台运行容器的输出可以使用如下命令:

[aaa@qq.com ~]# docker logs -f -t --tail 5 dc87c233e993
2020-09-13T09:13:33.445328235Z hello world
2020-09-13T09:13:34.447724889Z hello world
2020-09-13T09:13:35.449986082Z hello world
2020-09-13T09:13:36.452266126Z hello world
2020-09-13T09:13:37.454349812Z hello world

四、导入导出容器

1、导出容器 - docker export 命令

将指定容器保存成 tar 归档文件(实质上就是容器快照),会丢弃容器的元数据。这个本地文件可以分享给他人使用。不管此时这个容器是否处于运行状态都可导出。

基本语法:docker [container] export [OPTIONS] CONTAINER

OPTIONS说明:

  • -o :将输入内容写到文件
[aaa@qq.com ~]# docker export -o /root/abc/kz_centos7.tar centos7
[aaa@qq.com ~]# ls /root/abc/ | grep kz_
kz_centos7.tar

通过 docker  commit命令将运行中的容器,生成镜像文件,然后通过导入导出镜像文件也可实现。

docker  commit和docker export命令的主要区别:

  • docker export不管容器运行否都可以导出,docker  commit只有运行中的容器才可以使用。
  • docker export生成的容器快照文件将丟弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),docker  commit生成的镜像存储文件将保存完整记录,体积更大。

2、导入容器 - docker import 命令

导出的 tar文件导入到本地镜像库,创建成为镜像文件。

基本语法:docker [container] import [OPTIONS] file

[aaa@qq.com ~]# docker import /root/abc/kz_centos7.tar
sha256:bcd3bedadf42beacf05cdf5f3ad29bfd5f79724f7f50482d4aadeaa56247cb7d
[aaa@qq.com ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              bcd3bedadf42        12 seconds ago      203MB
[aaa@qq.com ~]# docker tag bcd3bedadf42 kc_ctos:7
[aaa@qq.com ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
kc_ctos             7                   bcd3bedadf42        2 minutes ago       203MB
[aaa@qq.com ~]# docker create -it kc_ctos:7
Error response from daemon: No command specified
[aaa@qq.com ~]# docker run -it bcd3bedadf42
docker: Error response from daemon: No command specified.
See 'docker run --help'.

注意:

  • 导出的容器tar文件,会丢失元数据信息,所以,必须给它添加标记之后才能使用。
  • 用导入成为的镜像文件来创建新容器并运行时。不能省略后面的子命令/bin/bash(centos)。
[aaa@qq.com ~]# docker create -it kc_ctos:7 /bin/bash
50eee11dc878d77097176d43f85823e9709df9c88adcdd436ad3be5a017002c5
[aaa@qq.com ~]# docker run -it --name 'kc7' kc_ctos:7 /bin/bash         
[aaa@qq.com /]# 

 

五、其他容器命令

1、在容器中执行命令 - docker exec 命令

在正在运行的容器中执行子命令。

基本语法:docker [container] exec [OPTIONS] CONTAINER COMMAND [ARG...]

OPTIONS说明:

  • -d, --detach:分离模式: 在后台运行
  • -i :打开标准输人接受用户输人命令
  • -t,--tty=true | false:分配一个伪终端

例如:执行伪终端,进入到正在运行的容器中(交互模式)。

[aaa@qq.com ~]# docker exec -it centos7 /bin/bash
[aaa@qq.com /]# 

2、复制文件 - container cp命令

用于容器与宿主机之间的数据文件拷贝。

基本语法:

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-

docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

OPTIONS说明:

  • -a, -archive: 打包模式,复制文件会带有原始的uid/gid信息;
  • -L,-follow-link :跟随软连接。当原路径为软连接时,默认只复制链接信息,使用该选项会复制链接的目标内容。

例如:将宿主机本地的目录复制到test容器的/tmp路径下,并改名

[aaa@qq.com ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
2150d7c2b218        centos:7            "/bin/bash"         3 hours ago         Up 3 hours                              centos7
[aaa@qq.com ~]# docker cp /root/abc/ 2150d7c2b218:/tmp/copy_abc
[aaa@qq.com /]# ls
anaconda-post.log  bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[aaa@qq.com /]# ls /tmp
copy_abc  ks-script-V_wEqJ  yum.log

例如:将test容器的/tmp下的目录复制到宿主机本地的/root下:

[aaa@qq.com ~]# docker cp 2150d7c2b218:/tmp/copy_abc /root/
[aaa@qq.com ~]# ls /root/ | grep abc
abc
copy_abc

3、检查容器里文件结构的更改- docker diff 命令

查看容器内文件结构的变更信息。

基本语法:docker [container]  diff [OPTIONS] CONTAINER

[aaa@qq.com ~]# docker diff 2150d7c2b218
C /tmp
A /tmp/copy_abc
A /tmp/copy_abc/aa_dir.tar
A /tmp/copy_abc/aa_dir.tar.bz2
A /tmp/copy_abc/bb_dir
A /tmp/copy_abc/file2.cfg
A /tmp/copy_abc/jqcontosv7.tar
A /tmp/copy_abc/kz_centos7.tar

 

—— Stay Hungry. Stay Foolish. 求知若饥,虚心若愚。