docker入门教程

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值