1.docker基础命令
在我们学习具体的命令之前,我们先要注册一个docker的账号
https://www.docker.com/(进入网址即可注册)
镜像仓库命令
下面是使用实战
docker login
关键参数
○
-u :
登陆的用户名
○
-p :
登陆的密码
docker pull

关键参数
○
-a :
拉取所有
tagged
镜像
○
--disable-content-trust :
忽略镜像的校验
,
默认开启


可以直接拉取对应的名字+标签或者对应的digest也可以。
docker push

○
-a :
推送所有
tagged
镜像
○
--disable-content-trust :
忽略镜像的校验
,
默认开启
(不过由于中国ip被墙了,暂时无法推送到docker的仓库,后期可以改成阿里云或者私人仓库)

docker search
关键参数
○
--no-trunc :
显示完整的镜像描述;
○
-f <
过滤条件
>:
列出收藏数不小于指定值的镜像。
#
从
Docker Hub
查找所有镜像名包含
nginx
,并且
star
数大于
10
的镜像
docker search -f stars=10 nginx

docker logout

docker logout即可登出仓库
2.Docker Image(镜像)
1.Docker 镜像是什么
•
Docker image 本质上是一个
read-only
只读文件, 这个文件包含了文件系统、
源码、库文件、依赖、工具等一些运行
application
所必须的文件。
•
我们可以把 Docker image
理解成一个模板, 可以通过这个模板实例化出来很多
容器。
•
image 里面是一层层文件系统
Union FS
。联合文件系统,可以将几层目录挂载到
一起,形成一个虚拟文件系统。
每一层文件系统我们叫做一层
layer
,联合文件系统可以对每一层文件系统设置三
种权限,只读(
readonly
)、读写(
readwrite
)和写出(
whiteout-able
),但是
docker
镜像中每一层文件系统都是只读的。
构建镜像的时候,从一个最基本的操作系统开始,每个构建的操作都相当于做一层
的修改,增加了一层文件系统。一层层往上叠加,上层的修改会覆盖底层该位置的可
见性,这也很容易理解,就像上层把底层遮住了一样。当你使用的时候,你只会看到
一个完全的整体,你不知道里面有几层,也不清楚每一层所做的修改是什么。
2.为什么需要镜像
在部署应用时,通过手工或写一些脚本的方式进行部署。这样部署面临问题就是云端
和本地环境一致问题。用户为每个应用打包过程比较繁琐,需要配置和给中修改等操
作,非常费劲。
然而,
Docker
镜像就是为了解决这个小小的
打包
功能,突然一夜之间成名。那么,你
可能说
Docker
镜像就是个压缩包,是的,你猜对了,它就像一个压缩包文件。它是如
何解决
Paas
时代所面临的云端和本地一致性问题?很简单,它是把一个镜像制作成
一个完整的操作系统所有文件和对应的目录结构,这样的压缩包是跟你本地和测试环
境用的操作系统一摸一样。
docker
最大的贡献就是定义了容器镜像的分层的存储格式
,
docker
镜像技术的基础
是联合文件系统
(UnionFS)
,其文件系统是分层的。这样既可以充分利用共享层,又可
以减少存储空间占用。
docker
镜像提供了一种打包应用程序和预配置服务器环境的便捷方式,可以很方便的
将其用于个人用途或与其他
Docker
用户公开
共享
。
删除本地镜像
镜像命令[部分]
1.docker images
关键参数
○
-a :
列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
○
--digests :
显示镜像的摘要信息;
○
-f :
显示满足条件的镜像;
○
--format :
指定返回值的模板文件;
○
--no-trunc :
显示完整的镜像信息;
○
-q :
只显示镜像
ID
。


2.docker image inspect

查看镜像详细信息

3. docker tag
4.docker rmi
○
-f :
强制删除;
○
--no-prune :
不移除该镜像的过程镜像,默认移除;
5.docker save
○
-o :
输出到的文件。
6.docker load
○
--input , -i :
指定导入的文件,代替
STDIN
。
○
--quiet , -q :
精简输出信息

7.docker history
○
-H , --human :
大小和日期采用人容易读的格式展现
○
--no-trunc :
显示全部信息,不要隔断;
○
-q, --quiet:
只显示镜像
id
信息;

8.docker image prune
删除不使用的镜像。
○
-a , --all :
删除全部不使用的镜像;
○
--filter filter:
指定过滤条件;
○
-f, --force :
不提示是否删除;

3.容器
什么是容器?
通俗地讲,容器是镜像的运行实体。镜像是静态的只读文件,而容器带有运行时需要
的可写文件层,并且容器中的进程属于运行状态。即容器运行着真正的应用进程。容
器有初建、运行、停止、暂停和删除五种状态。
虽然容器的本质是主机上运行的一个进程,但是容器有自己独立的命名空间隔离和资
源限制。也就是说,在容器内部,无法看到主机上的进程、环境变量、网络等信息,
这是容器与直接运行在主机上进程的本质区别。
容器是基于镜像创建的可运行实例,并且单独存在,一个镜像可以创建出多个容器。
运行容器化环境时,实际上是在容器内部创建该文件系统的读写副本。 这将添加一个
容器层,该层允许修改镜像的整个副本

为什么需要容器?
镜像是静态的文件,并不能提供服务,就像我拿了个
Linux
或者
Windows
的光盘一样,
只有安装到主机里面运行起来才能对外提供服务,我们才能使用。
容器带来哪些收益呢,参考我们之前讲解的为什么要虚拟化、容器化。
容器的生命周期
容器的生命周期是容器可能处于的状态。
1.
created
:初建状态
2.
running
:运行状态
3.
stopped
:停止状态
4.
paused
: 暂停状态
5.
deleted
:删除状态
各生命周期之间的转换关系如图所示:

容器 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
进程退出时,也就代表着此容器被关
闭。
ocker
目前没有办法知道此时的进程退出属于正常退出还是异常退出。当出现容器
关闭情况时,
Docker Daemon
会尝试再次重新将此容器由
Stopped
状态转为
Running
状态。只有设置了
--restart
参数的容器,
Docker Daemon
才会去尝试启动,否则容器
会保持停止状态。
容器暂停
Docker“
剥夺
”
了此容器的
CPU
资源。而其他资源,如
Memory
资源、
Network
资源
等还保留未动。如此一来,失去了
CPU
资源的进程,是不会被主机内核系统所调度的,
所以此容器就处于
“
冰封
”
状态。
容器命令[部分]
1. docker run
功能
创建一个新的容器并运行一个命令
关键参数
○
-d:
后台运行容器,并返回容器
ID
;
○
-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
退出的时候自动删除容器


我们先先拉一个centos:7下来,然后运行这个容器。

映射端口的使用

其余的大家可以自己尝试,不过多赘述
2.docker ps
关键参数
○
-a :
显示所有的容器,包括未运行的。
○
-f :
根据条件过滤显示的内容。
○
--format :
指定返回值的模板文件。如
json
或者
table
○
-l :
显示
latest
的容器。
○
-n :
列出最近创建的
n
个容器。
○
--no-trunc :
不截断输出。
○
-q :
静默模式,只显示容器编号。
○
-s :
显示总的文件大小。

3.docker create
创建一个新的容器但不启动它
○ -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几乎一样,只是少一个-d选项。
4.docker logs
○
-f ,--follow:
跟踪日志输出
○
--since :
显示某个开始时间的所有日志
○
-t,--timestamps :
显示时间戳
○
-n
,
--tail :
仅列出最新
N
条容器日志
.

5. docker attach
连接到正在运行中的容器
○ --sig-proxy:是否将所有信号代理,默认是 true,如果设置为 false,退出的 话不会影响容器,否则退出会导致容器退出。
6. docker exec
在容器中执行命令
○
-d :
分离模式
:
在后台运行
○
-i :
即使没有附加也保持
STDIN
打开
○
-t :
分配一个伪终端
○
-e :
设置环境变量
○
-u,--user :
指定用户
"<name|uid>[:<group|gid>]"
○
-w,--workdir:
指定工作目录
(通常使用-it配合bash命令,进入容器进行操作)

7. docker start
8. docker stop
-s 发送SIGTERM信号
9. docker kill
-s发送SIGKILL信号
Docker stop 发送的是 SIGTERM 信号,docker kill 发送的是 SIGKILL 信号
10. docker restart
11. docker top
容器运行时不一定有
/bin/bash
终端来交互执行
top
命令,而且容器还不一定有
top
命令,可以使用
docker top
来实现查看
container
中正在运行的进程。
12. docker stats
○
--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:
容器创建的进程或线程数。

13. docker container inspect
○
-f :
指定返回值的模板文件。如
table
、
json
○
-s :
显示总的文件大小。

14. docker port
用于列出指定的容器的端口映射,或者查找将
PRIVATE_PORT NAT
到面向公众
的端口。
15. docker cp
在容器和宿主机之间拷贝文件
16. docker diff
检查容器里文件结构的更改