目录
[Docker Container(容器)](#Docker Container(容器))
[docker run](#docker run)
[docker create](#docker create)
[docker ps](#docker ps)
[docker logs](#docker logs)
[docker attach](#docker attach)
[docker exec](#docker exec)
[docker start](#docker start)
[docker stop](#docker stop)
[docker restar](#docker restar)
[docker kill](#docker kill)
[docker top](#docker top)
[docker stats](#docker stats)
[docker container inspect](#docker container inspect)
[docker port](#docker port)
[docker cp](#docker cp)
[docker diff](#docker diff)
[docker commit](#docker commit)
[docker pause](#docker pause)
[docker unpause](#docker unpause)
[docker rm](#docker rm)
[docker export](#docker export)
[docker import](#docker import)
[docker wait](#docker wait)
[docker rename](#docker rename)
[docker container prune](#docker container prune)
[docker update](#docker update)
Docker Container**(容器)**
什么是容器?
通俗地讲,容器是镜像的运行实体。镜像是静态的只读文件,而容器带有运行时需要的可写文件层,并且容器中的进程属于运行状态。即容器运行着真正的应用进程。容器有初建、运行、停止、暂停和删除五种状态。
虽然容器的本质是主机上运行的一个进程,但是容器有自己独立的命名空间隔离和资源限制。也就是说,在容器内部,无法看到主机上的进程、环境变量、网络等信息,这是容器与直接运行在主机上进程的本质区别。
容器是基于镜像创建的可运行实例,并且单独存在,一个镜像可以创建出多个容器。运行容器化环境时,实际上是在容器内部创建该文件系统的读写副本。 这将添加一个容器层,该层允许修改镜像的整个副本

镜像与容器就相当于同样是开发商提供的毛坯房,但是两家人装修出来的完全不一样。


或者我们都学习了 Java 或者 C++之类的面向对象的语言,可以理解为镜像为基础类,容器是实例化出来的一个个对象,每个用户需要的不一样,里面的内容也就不一样了

为什么需要容器?
镜像是静态的文件,并不能提供服务,就像我拿了个 Linux 或者 Windows 的光盘一样,只有安装到主机里面运行起来才能对外提供服务,我们才能使用。
容器化有什么好处呢?
资源利用率高
将利用率较低的服务器资源进行整合,用更少硬件资源运行更多业务,降低 IT 支出和运维管理成本。
环境标准化
一次构建,随处执行。实现执行环境的标准化发布,部署和运维。开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。
资源弹性伸缩
根据业务情况,动态调整计算、存储、网络等硬件及软件资源
差异化环境提供
同时提供多套差异化的执行环境,限制环境使用资源。比如我的服务一个以来 Ubuntu 操作系统,一个服务依赖 CentOS 操作系统,但是没有预算购买两个物理机,这个时候容器化就能很好的提供多种不同的环境。
沙箱安全
为避免不安全或不稳定软件对系统安全性、稳定性造成影响,可使用虚拟化技术构建虚拟执行环境。
比如我在容器里面执行 rm -rf /* 不会把整个服务器搞死,也不影响其他人部署的程序使用。
容器对比虚拟机更轻量,启动更快
传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。
docker 不需要虚拟内核,所以启动可以更快,相当于 windows 的开机时间省去了。
维护和扩展容易
Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。比如 docker hub 提供了很多镜像,各个系统的一个命令就可以拿到了,研发也可以自己定制镜像分享给各个产品
容器的生命周期
容器的生命周期主要有五个:
create:创建状态
running:运行状态
stopped:停止状态
pausee:暂停状态
deleted:删除状态
状态转换图如下:

其中可能不好理解的就是killed by out-of-memory(OOM),container process exitde(容器异常退出)状态,我们来解释一下:
容器****OOM
Docker 在处理 OOM 事件时分为三种情况
(1)如果容器中的应用耗尽了主机系统分配给容器的内存限额,就会触发 OOM 事件。例如,在容器当中,部署了一个 web 服务。假设主机分配给此容器的内存上限为 1G,当脚本申请的内存大于 1G 时,此容器就会触发 OOM 事件。而在这种情况下,此容器将会被强制关闭。但需要注意的是,此时关闭容器的并非是 Docker Daemon**,而是宿主机操作系统**。因为一个容器其实就是一组运行在宿主机操作系统当中的进程,宿主机操作系统通过cgroups 对这组进程设定资源上限,当这些进程申请的资源到达上限时,触发的是宿主机操作系统的内核 OOM 事件,因此最终是由宿主机内核来关闭这些进程.
(2) 如果用户不想关闭这个容器,那么可以选择--oom-kill-disable 来禁用 OOM-Killer。使用此参数时,仍需要注意,如果使用-m 设置了此容器内存上限,那么当容器到达内存资源上限时,主机不会关闭容器,但也不会继续向此容器继续分配资源,此时容器将处于 阻塞 状态。只需要将最坏的情况封闭在一定范围之内,而不至于蔓延出去。
(3)如果用户使用了--oom-kill-disable,但也没有使用-m 来设定上限,因而此时此容器将会尽可能多地使用主机内存资源。换言之,主机内存有多大,它就将用多大。
容器异常退出
每个容器内部都存在一个 Init 进程,容器中其他所有进程都是此进程的子进程。运行的容器是因为 Init 进程在运行,如果一个子进程因为某种原因造成了退出,那么其父进程也会同步退出,直至 Init 进程也退出。当 Init 进程退出时,也就代表着此容器被关闭。ocker 目前没有办法知道此时的进程退出属于正常退出还是异常退出。当出现容器关闭情况时,Docker Daemon 会尝试再次重新将此容器由 Stopped 状态转为 Running状态。只有设置了--restart 参数的容器,Docker Daemon 才会去尝试启动,否则容器会保持停止状态
容器命令清单
|------------------------|---------------------------|---------------------|
| 命令 | 别名 | 功能 |
| docker create | docerk 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 inspect | docker container insepcet | 查看容器的详细信息 |
| docker kill | docker contaier kill | 杀死容器 |
| docker logs | docker container logs | 查看容器日志 |
| docker ps | docker container ps | 查看容器 |
| docker pause | docker contanier pause | 暂停容器 |
| docker port | docker container port | 查看容器端口映射 |
| docker container prune | | 删除停止的容器 |
| docker rename | docker container rename | 重命名容器 |
| docker rm | docker container rm | 删除容器 |
| docker start | docker container start | 启动容器 |
| docker stats | docker container stats | 查看容器占用资源信息 |
| docker stop | docker contanier stop | 暂停容器 |
| docker top | docker container top | 查看某个容器的资源占用情况 |
| docker unpause | docker container unpause | 继续运行容器 |
| docker updata | docker container undata | 更新容器配置 |
| docker wait | docker container wait | 阻塞一个或多个容器,知道退出获得退出码 |
容器命令详解
docker run
功能:创建并运行一个容器
语法:
docker run OPTIONS IMAGE COMMAND ARG...
关键参数:
**-i:**以交互模式运行容器,通常与 -t 同时使用;
-P:随机端口映射,容器内部端口随机映射到主机的端口
**-p:指定端口映射,格式为:主机(宿主)端口:**容器端口
**-t:**为容器重新分配一个伪输入终端,通常与 -i 同时使用;
**--name="nginx-lb":**为容器指定一个名称;
**-h "mars":**指定容器的 hostname;
**-e username="ritchie":**设置环境变量;
**--cpuset-cpus="0-2" or --cpuset-cpus="0,1,2":**绑定容器到指定 CPU 运行;
**-m :**设置容器使用内存最大值;
**--network="bridge":**指定容器的网络连接类型;
**--link=\[\]:**添加链接到另一个容器;
**--volume , -v:**绑定一个卷
--rm:shell 退出的时候自动删除容器
--restart:自动重启
-d: 后台运行容器,并返回容器 ID;比 create 多了这个参数


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" or --cpuset-cpus="0,1,2":**绑定容器到指定 CPU 运行;
**-m :**设置容器使用内存最大值;
**--network="bridge":**指定容器的网络连接类型;
**--link=\[\]:**添加链接到另一个容器;
**--volume , -v:**绑定一个卷
--rm:shell 退出的时候自动删除容器
--restart:自动重启

docker run 和 docker create的最大区别就是create只是创建一个容器,而run是创建并且运行一个容器,create创建的时候是不会检测创建的端口号是否冲突的只有运行的时候会进行报错
docker ps
功能:列出正在运行的容器
语法:
docker ps OPTIONS
关键参数:
**-a :**显示所有的容器,包括未运行的。
**-f :**根据条件过滤显示的内容。
**--format :**指定返回值的模板文件。如 json 或者 table
**-l :**显示 latest 的容器。
**-n :**列出最近创建的 n 个容器。
--no-trunc : 不截断输出。
**-q :**静默模式,只显示容器编号。
**-s :**显示总的文件大小
docker ps -a:

docker ps -a --format json

docker logs
功能:查看容器日志
语法:
docker logs OPTIONS CONTAINER
关键参数:
**-f ,--follow:**跟踪日志输出
**--since :**显示某个开始时间的所有日志
**-t,--timestamps :**显示时间戳
-n**,****--tail :**仅列出最新 N 条容器日志
docker logs testnginx :

docker logs -n 5 testnginx

docker logs -f testnginx:-f会持续追踪当前容器日志

docker attach
功能:连接到正在运行的容器
语法:
docker attach OPTIONS CONTAINER
关键参数:
--sig-proxy:是否将所有信号代理,默认是 true,如果设置为 false,退出的
话不会影响容器,否则退出会导致容器退出。
未使用--sig-proxy:ctrl+c后会发送2号信号,导致容器终止

使用--sig--proxy:仅退出命令行,未终止容器
docker exec
功能:在指定容器中执行命令
语法:
docker exec OPTIONS CONTAINER COMMAND ARG...
关键参数:
**-d :**分离模式: 在后台运行
**-i :**即使没有附加也保持 STDIN 打开
**-t :**分配一个伪终端
**-e :**设置环境变量
**-u,--user :**指定用户 "<name|uid>:\
" **-w,--workdir:**指定工作目录
docker exec -it testnginx bash:

docker start
功能:启动容器
语法:
docker start OPTIONS CONTAINER CONTAINER...
启动前:

启动后:

docker stop
功能:停止运行的容器
语法:
docker stop OPTIONS CONTAINER CONTAINER...
关键参数:
**-s :**发送的信号


docker restar
功能:重启容器
语法:
docker restart OPTIONS CONTAINER CONTAINER...
关键参数:
-s : 发送信号,给第一步关闭容器发送的信号和stop一样
我们可以发现testnginx的开始时间发生了变化

docker kill
功能:强制关闭容器
语法:
docker kill OPTIONS CONTAINER CONTAINER...
关键参数:
**-s :**发送的信号
Docker stop 发送的是 SIGTERM 信号,docker kill 发送的是 SIGKILL 信号

docker top
功能
查看容器中运行的进程信息,支持 ps 命令参数。
语法
docker top CONTAINER ps OPTIONS
注意事项
容器运行时不一定有/bin/bash 终端来交互执行 top 命令,而且容器还不一定有top 命令,可以使用 docker top 来实现查看 container 中正在运行的进程

docker stats
功能:
显示容器资源的使用情况,包括:CPU、内存、网络 I/O 等。
语法:
docker stats OPTIONS CONTAINER...
关键参数:
**--all , -a :**显示所有的容器,包括未运行的。
**--format :**指定返回值的模板文件。如 table,json
**--no-stream :**展示当前状态就直接退出了,不再实时更新。
**--no-trunc :**不截断输出。
返回报文:
**CONTAINER ID与NAME:**容器 ID 与名称。
**CPU %与MEM %:**容器使用的 CPU 和内存的百分比。
**MEM USAGE / LIMIT:**容器正在使用的总内存,以及允许使用的内存总量。
**NET I/O:**容器通过其网络接口发送和接收的数据量。
**BLOCK I/O:**容器从主机上的块设备读取和写入的数据量。
**PIDs:**容器创建的进程或线程数


docker container inspect
功能
查看容器详细信息
语法
docker container inspect OPTIONS CONTAINER CONTAINER...
关键参数
**-f :**指定返回值的模板文件。如 table、json
**-s :**显示总的文件大小。
注意事项:
docker inspect 会自动检查是镜像还是容器然后显示显示信息

docker port
功能 :用于列出指定的容器的端口映射,或者查找将 PRIVATE_PORT NAT 到面向公众的端口。
语法:
docker port CONTAINER PRIVATE_PORT\[/PROTO]

docker cp
功能:在容器和宿主机之间拷贝文件
语法:
docker cp OPTIONS CONTAINER:SRC_PATH DEST_PATH|-
docker cp OPTIONS SRC_PATH|- CONTAINER:DEST_PATH
将容器中的文件考到宿主机:

将宿主机文件拷贝到容器中:


docker diff
功能:
检查容器里文件结构的更改。
语法 :
docker diff CONTAINER

docker commit
功能:从容器创建一个新的镜像。
语法:
docker commit OPTIONS CONTAINER REPOSITORY\[:TAG]
关键参数:
**-a :**提交的镜像作者;
**-c :**使用 Dockerfile 指令来创建镜像;可以修改启动指令
**-m :**提交时的说明文字;
**-p :**在 commit 时,将容器暂停

docker pause
功能 :暂停容器中所有的进程。
语法
docker pause CONTAINER CONTAINER...

docker unpause
功能:恢复容器中所有的进程。
语法:
docker unpause CONTAINER CONTAINER...

docker rm
功能:删除停止的容器
语法:
docker rm OPTIONS CONTAINER CONTAINER...
关键参数:
**-f :**通过 SIGKILL 信号强制删除一个运行中的容器。

docker export
功能:导出容器内容为 tar 文件
语法:
docker export OPTIONS CONTAINER
关键参数:
**-o:**写入到文件

docker import
功能:配合使用docker export


我们需要知道docker export导出的tar文间和save不同,save会将原来的镜像全部拷贝一边,但是export不会,他会渠道一些如CMD等信息
docker wait
功能:阻塞运行直到容器停止,然后打印出它的退出代码。
语法:
docker wait CONTAINER CONTAINER...


docker rename
功能:重命名容器
语法:
docker rename CONTAINER NEW_NAME

docker container prune
功能:删除所有停止的容器
语法:
docker container prune OPTIONS
关键参数:
-f, --force:不提示是否进行确认

docker update
功能:更新容器配置
语法 :
docker update OPTIONS CONTAINER CONTAINER...
关键参数:
--cpus**:**cpu 数量
**--cpuset-cpus :**使用哪些 cpu
**--memory :**内存限制
--memory-swap:交换内存
--cpu-period:是用来指定容器对 CPU 的使用要在多长时间内做一次重新分配
--cpu-quota**:**是用来指定在这个周期内,最多可以有多少时间用来跑这个容器

