Docker核心组件之容器(Container)
容器(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 暂时退出容器,但是正在运行中的容器不会关闭。
4、暂停容器 - docker stop 命令
暂停一个运行中的容器,并暂停容器中所有的进程。
基本语法:docker [container] pause [OPTIONS] CONTAINER [CONTAINER...]
[aaa@qq.com ~]# docker pause c26038331db7
5、恢复容器 - docker unpause命令
将一个处于paused状态的容器恢复到运行状态,并恢复容器中所有的进程。
基本语法:docker [container] unpause [OPTIONS] CONTAINER [CONTAINER...]
[aaa@qq.com ~]# docker unpause c26038331db7
6、终止容器 - docker stop 命令
停止一个运行中的容器。该命令首先会向容器发送SIGTERM信号,等待一段超时时间后(默认为10秒),再发送SIGKILL信号来终止容器。
基本语法:docker [container] stop [OPTIONS] CONTAINER [CONTAINER...]
[aaa@qq.com ~]# docker stop c26038331db7
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/
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
例如:通过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
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. 求知若饥,虚心若愚。