Docker Container (容器),概念以及指令

什么是容器?

通俗来讲,容器是镜像的运行实体。镜像只是静态的只读文件,而容器带有运行时需要的可写文件层,并且容器中的进程属于运行状态。即容器运行着真正的应用程序。容器有初建、运行、停止、暂停和删除五种状态。

虽然容器的本质时主机上的一个进程,但是容器有自己独立的命名空间隔离和资源限制。也就是说,在容器内部,无法看到主机上的进程、环境变量、网络等信息,这是容器与直接运行在主机上的进程的本质区别

容器是基于镜像创建的可运行实例,并且单独存在,一个镜像可以创建出多个容器。运行容器化环境时,实际上是在容器内部创建该文件系统的读写副本。这将添加一个容器层,该层允许修改镜像的整个副本。

为什么需要容器?

镜像是静态的文件,并不能提供服务,就像我拿个linux或者Windows的光盘一样,只有安装到主机里面运行起来才能对外提供服务,我们才能使用。

容器的状态

容器各生命周期之间的转换关系如图所示

docker create : 创建容器以后,不立刻启动运行,容器进入初建状态

docker run : 创建容器,并立即启动运行,进入运行状态

docker start : 容器转为运行状态

docker stop : 容器将转入停止状态

docker kill : 容器在故障(死机)时,执行kill(断电),容器转入停止状态,这种操作容易丢失数据,除非必要,否则不建议使用

docker restart : 重启容器,容器转入运行状态

docker pause : 容器进入暂停状态

docker unpause : 取消暂停状态,容器进入运行状态

docker rm : 删除容器,容器转入删除状态

killed by out-of-memory(因内存不足被终止) : 宿主机内存被耗尽,也被称为OOM,非计划终止这时需要杀死最吃内存的容器

container process exitde(异常终止) : 出现容器被终止后,将进入Should restart?选择操作

容器OOM

docker在处理OOM事件时分为三种情况

(1)如果容器中的应用耗尽了主机系统分配给容器的内存限额,就会触发OOM事件。

例如:在容器当中,部署了一个web服务。假设主机分配给此容器的内存上限是1G,当脚本申请的内存大于1G时,此容器就会触发OOM事件。而在这种情况下,此容器将会被强制关闭。

但是需要注意的是,此时关闭容器的并非是Docker Daemon,而是宿主机操作系统。因为一个容器其实就是一组运行在宿主机操作系统当中的进程,宿主机操作系统通过cgroups对这组进程设定资源上限,当这些进程申请的资源到达上限时,触发的时宿主机操作系统的内核OOM事件,因此最终是由宿主机内核来关闭这些进程。

(2)如果用户不想关闭这个容器,那么可以选择--oom-kill-disable来禁用OOM-Killer。使用此参数时,仍需要注意,如果使用了-m设置了该容器内存上限,那么当容器到达内存资源上限时,主机不会关闭容器,但也不会继续向此容器继续分配资源,此时容器将处于hung状态。只需要将最坏的情况封闭在一定范围之内,而不至于蔓延出去。

(3)如果用户使用了--oom-kill-disable,但也没有使用-m来设置上限,因而此时此容器将会尽可能多的使用主机内存资源。换而言之,主机内存有多大,它将使用多大。

容器异常退出

每个容器内部都存在一个Init进程,容器中其他所有进程都是此进程的子进程。运行的容器是因为Init进程在运行,如果一个子进程因为某种原因造成了退出,那么其父进程也会同步退出,直至Init进程也退出。当Init进程退出时,也就代表着此容器被关闭。docker目前没有办法知道此时的进程退出属于正常退出还是异常退出。当出现容器关闭情况时,Docker Daemon会尝试再次重新将此容器由Stopped状态转为Running状态。只是设置了--restart参数的容器,Docker Daemon才会去尝试启动,否则容器会保持停止状态。

容器暂停

docker“剥夺”了此容器的CPU资源。而其他资源,如Memory资源、Network资源等还保留未动。如此一来,失去了CPU资源的进程,是不会被主机内核系统所调度的,所以此容器就处于“冰封”状态

容器命令清单

命令

别名

功能

备注

docker create

docker container create

创建容器

docker run

docker container run

运行容器

必须掌握

docker attach

docker container attach

连接到正在运行的容器

docker commit

docker container commit

将镜像提交为容器

必须掌握

docker cp

docker container cp

在容器和宿主机之间拷贝

必须掌握

docker diff

docker container diff

检查容器里文件结构的更改

docker exec

docker container exec

在运行的容器中执行命令

必须掌握

docker export

docker container export

将容器导出为tar

docker container inspect

查看容器详细信息

必须掌握

docker kill

docker container kill

杀死容器

必须掌握

docker logs

docker container logs

查看日志

必须掌握

docker ps

docker container ls,

docker container list,

docker container ps

查看正在运行的进程

必须掌握

docker pause

docker container pause

暂停进程

docker port

docker container port

查看容器的端口映射

docker container prune

删除停止的容器

docker rename

docker container rename

重命名容器

docker restart

docker container restart

重启容器

必须掌握

docker rm

docker container rm,

docker container remove

删除容器

必须掌握

docker start

docker container start

启动容器

必须掌握

docker stats

docker container stats

查看资源占用情况

必须掌握

docker stop

docker container stop

停止容器

必须掌握

docker top

docker container top

查看某个容器的资源占用

必须掌握

docker unpause

docker container unpause

继续运行容器

docker update

docker container update

更新容器配置

docker wait

docker container wait

阻止一个或多个容器停止,然后打印退出代码

容器命令详解

1.docker create

功能:创建一个新的容器但不启动它

docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

关键参数

-i

以交互模式运行容器,通常与-t同时使用

-P

随机端口映射,容器内部端口随机映射到主机端口

-p

指定端口映射,格式为:主机(宿主)端口:容器端口

-t

为容器重新分配一个伪输入终端,通常与-i同时使用

--name="nginx-lb"

为容器指定一个名称

-h "mars"

指定容器的hostname

-e username="ritchie"

设置环境变量

--cpuset-cpus="0-2"

--cpuset-cpus="0,1,2"

绑定容器到指定CPU容器运行

-m

设置容器使用内存最大值

--network="bridge"

指定容器的网络连接类型

--link=[]

添加链接到另一个容器

--volume

-v

绑定一个卷

-rm

shell退出的时候自动删除容器

--restart

自动重启

示例

2.docker run

功能:创建一个新的容器并运行一个命令

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

关键参数

-d

后台运行容器,并返回容器ID;比create 多了这个参数

-i

以交互模式运行容器,通常与-t同时使用

-P

随机端口映射,容器内部端口随机映射到主机端口

-p

指定端口映射,格式为:主机(宿主)端口:容器端口

-t

为容器重新分配一个伪输入终端,通常与-i同时使用

--name="nginx-lb"

为容器指定一个名称

-h "mars"

指定容器的hostname

-e username="ritchie"

设置环境变量

--cpuset-cpus="0-2"

--cpuset-cpus="0,1,2"

绑定容器到指定CPU容器运行

-m

设置容器使用内存最大值

--network="bridge"

指定容器的网络连接类型

--link=[]

添加链接到另一个容器

--volume

-v

绑定一个卷

-rm

shell退出的时候自动删除容器

--restart

自动重启

3.docker ps

功能:列出容器

docker ps [OPTIONS]

关键参数

-a

显示所有的容器,包括未运行的

-f

根据条件过滤显示的内容

--format

指定返回值的模板文件。如json或者table

-l

显示latest的容器

-n

列出最近创建的n个容器

--no-trunc

不截断输出

-q

静默模式,只显示容器编号

-s

显示总的文件的大小

4.docker logs

功能:查看容器日志

docker logs [OPTIONS] CONTAINER

关键参数

-f

--follow

跟踪日志输出

--since

显示某个开始时间的所有日志

-t

--timestamps

显示时间戳

-n

--tail

仅列出最新N条容器日志

5.docker attach

功能:连接到正在运行中的容器

docker attach [OPTIONS] CONTAINER

关键参数只有--sig-proxy:是否将所有信号代理,默认是true,如果设置为false,退出的话不会影响容器,否则退出会导致容器退出

6.docker exec

功能:在容器中执行命令

docker exec [OPTIONS] CONTAINER COMMAND [ARG ...]

关键参数

-d

分离模式:在后台运行

-i

即使没有附加也保持STDIN打开

-t

分配一个伪终端

-e

设置环境变量

-u

--user

指定用户"[:]"

-w

--workdir

指定工作目录

7.docker start

功能:启动停止的容器

docker start [OPTIONS] CONTAINER [CONTAINER...]

8.docker stop

功能:停止运行的容器

docker stop [OPTIONS] CONTAINER [CONTAINER...]

关键参数只有-s:发送的信号

9.docker restart

功能:重启容器

docker restart [OPTIONS] CONTAINER [CONTAINER...]

关键参数只有-s:发送信号

10.docker kill

功能:强制退出容器

docker kill [OPTIONS] CONTAINER [CONTAINER...]

关键参数只有-s:发送的信号

注意:docker stop发送的是SIGTERM信号,docker kill发送的是SIGKILL信号

11.docker top

功能:查看容器中运行的进程信息,支持ps命令参数

docker top CONTAINER [ps OPTIONS]

注意事项:容器运行时不一定有/bin/bash终端来交互执行top命令,而且容器还不一定有top命令,可以使用docker top 来实现查看container中运行的进程

12.docekr stats

功能:显示容器资源的使用情况,包括CPU、内存、网络I/O等

docker stats [OPTIONS] [CONTAINER ...]

关键参数

--all

-a

显示所有容器,包括未运行的

--format

指定返回值的模板文件。如table,json

--no-stream

展示当前状态就直接退出了,不再实时更新

--no-trunc

不截断输出

正常动态输出运行容器的资源占用情况

以json格式输出

13.docker container inspect

功能:查看容器详细信息

docker container inspect [OPTIONS] CONTAINER [CONTAINER...]

关键参数

-f

指定返回值的模板文件。如table、json

-s

显示总的文件大小

注意事项:docker inspect会自动检查时镜像还是容器然后显示相关信息

14.docker port

功能:用于列出指定的容器的端口映射,或者查找将PRIVATE_PORT NAT到面向公众的端口

docker port CONTAINER [PRIVATE_PORT[/PROTO]]

15.docker cp

功能:在容器和宿主机之间拷贝文件

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

16.docker diff

功能:检查容器里文件结构的更改

docker diff CONTAINER

17.docker commit

功能:从容器创建一个新的镜像

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

参数

-a

提交镜像的作者

-c

使用Dockerfile指令来创建镜像;可以修改启动指令

-m

提交时的说明文字

-p

在commit时,将容器暂停

18.docker pause

功能:暂停容器中所有的进程

docker pause CONTAINER [CONTAINER...]

能看到当我们停止mynginx4中的所有进程后进入容器提示该容器已暂停

19.docker unpause

功能:恢复容器中所有的进程

docker unpause CONTAINER [CONTAINER...]

20.docker rm

功能:删除停止的容器

docker rm [OPTIONS] CONTAINER [CONTAINER...]

关键参数-f:通过SIGKILL信号强制删除一个运行中的容器

21.docker export

功能:导出容器内容为tar文件

docker export [OPTIONS] CONTAINER

关键参数-o:写入到文件

22.docker wait

功能:阻塞运动直到容器停止,然后打印它的退出代码

docker wait CONTAINER [CONTAINER...]

这里我开了两个终端在第一个终端输入docker container wait mynginx4 以后这个终端就阻塞在这里了,然后我开第二个终端输入docker kill mynginx4 就可以看到第一个终端已返回了

23.docker rename

功能:重命名容器

docker rename CONTAINER NEW_NAME

24.docker container prune

功能:删除所有停止的容器

docker container prune [OPTIONS]

关键参数-f,--force:不提示是否进行确认

25.docker update

功能:更新容器配置

docker update [OPTIONS] CONTAINER [CONTAINER...]

关键参数

--cpus

cpu的数量

--cpuset-cpus

使用哪些cpu

--memory

-m

内存限制

--memory-swap

交换内存

--cpu-period

是用来指定容器对CPU的使用要在多长时间内做一次重新分配

--cpu-quota

是用来指定在这个周期内,最多可以有多少时间用来跑这个容器

### 删除 Docker 容器的命令 删除指定容器可以使用以下命令: ```bash docker rm -f <containerid> ``` 该命令会强制删除指定 ID 的容器[^2]。 若需删除未启动成功的容器,可使用如下命令: ```bash docker rm $(docker ps -a | grep Created | awk '{print $1}') ``` 或者使用更简洁的方式: ```bash docker rm $(docker ps -qf status=created) ``` 这将删除所有处于 `Created` 状态的容器[^2]。 对于退出状态的容器,也可以通过以下命令进行清理: ```bash docker rm $(docker ps -a | grep Exited | awk '{print $1}') ``` 或者使用: ```bash docker rm $(docker ps -qf status=exited) ``` 这些命令会删除所有处于 `Exited` 状态的容器[^2]。 如果希望删除所有未运行的容器,可以使用以下命令: ```bash docker rm $(docker ps -a -q) ``` 此命令会删除所有未运行的容器,但正在运行的容器无法被删除。从 Docker 1.13 版本开始,还可以使用以下命令来删除孤立的容器: ```bash docker container prune ``` 此命令专门用于删除孤立的容器,即那些未被使用的容器。 此外,如果需要停止并删除所有容器,可以使用以下组合命令: ```bash docker stop $(docker ps -a -q) docker rm $(docker ps -a -q) ``` 第一条命令会停止所有容器,第二条命令会删除所有容器[^4]。 为了简化操作,可以为这些命令创建别名。例如,在 `.bash_aliases` 文件中添加以下内容: ```bash alias dockerkill='docker kill $(docker ps -a -q)' alias dockercleanc='docker rm $(docker ps -a -q)' ``` 这样可以通过 `dockerkill` 杀死所有正在运行的容器,通过 `dockercleanc` 删除所有已经停止的容器[^5]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值