日升时奋斗,日落时自省
目录
1、容器
1.1、容器的生命周期
1.1.1、容器OOM
1.1.2、容器异常退出
1.1.3、容器暂停
1.2、容器命令
1.2.1、创建容器
1.2.2、启动容器
1.2.3、容器日志
1.2.4、容器交互
1.2.5、容器停止
1.2.6、扩展
1.3、综合演示
2、存储卷
2.1、简述
2.2、存储卷分类
2.3、管理卷
2.3.1、-v挂载方式
2.3.2、--mount挂载方式
2.4、绑定卷
2.4.1、-v绑定方式
2.4.2、--mount绑定方式
2.5、临时卷
2.5.1、--tmpfs方式创建
2.5.2、--mount指定参数创建
2.6、展示样例
3、 docker网络
3.1、网络的重要性
3.2、常见网络类型
3.2.1、bridge网络
3.2.2、host网络
3.2.3、container网络
3.2.4、none网络
3.3、docker网络管理命令
3.3.1、网络命令
3.3.2、创建网络
3.3.2、网络详情
3.4、样例演示
注:认识docker中的容器,docker中设置网络和存储卷绑定
1、容器
容器就是镜像运行的实体;简单来说就是环境,环境中存在很多东西,都处于运转中,容器就是这样的环境,容器中的进程属于运行状态,那容器就缺不了创建、运行、删除等状态了
1.1、容器的生命周期
容器的生命周期是容器可能处于的状态:
- created:初建状态
- running:运行状态
- stopped:停止状态
- paused: 暂停状态
- deleted:删除状态
注:下图红色数字是一个启动到停止的流程,仅仅只是停止,想要删除的话,需要的是将镜像先停止stop再rm命令删除
参数解释:
- create :创建容器
- run :运行容器
- start: 容器转为运行状态
- stop:停止状态
- kill:故障死机,执行kill(或者断电),容器转入停止状态,这种操作容易丢失数据
- restart:重启容器,容器进入运行状态
- pause:容器进入暂停状态
- unpause:取消暂停状态,容器进入运行状态
- rm:删除容器(需要容器在停止运行状态)
- OOM:宿主机内存被耗尽,非计划终止,需要杀死最吃内容的容器
1.1.1、容器OOM
Docker 在处理 OOM 事件时分为三种情况
(1)容器中的应用耗尽了主机系统分配给容器的内存限额,触发OOM事件,容器被强制关闭
(2)用户不想关闭这个容器,那么可以选择--oom-kill-disable 来禁用 OOM-Killer,首先不满足(1)就是不能超过这个限度,只需要将最坏的情况封闭在一定范围之内
(3)如果用户使用了--oom-kill-disable,但也没有使用-m 来设定上限,因而此时此容器将会尽可能多地使用主机内存资源。换言之,主机内存有多大,它就将用多大(限制分配内存)
1.1.2、容器异常退出
容器的异常可能由于某个子进程退出,影响到init进程,导致其也退出(init进程是docker容器中的主要运行者,它的退出代表容器下线),Docker Daemon 会尝试再次重新将此容器由 Stopped 状态转为 Running状态。只有设置了--restart 参数的容器, Docker Daemon 才会去尝试启动,否则容器会保持停止状态。
1.1.3、容器暂停
Docker“剥夺”了此容器的 CPU 资源。而其他资源,如 Memory 资源、 Network 资源等还保留未动。如此一来,失去了 CPU 资源的进程,是不会被主机内核系统所调度的
1.2、容器命令
注:所有之前需要一个基础命令来支持下面的操作:
docker ps(查看运行容器)
docker ps -a (查看所有容器)
1.2.1、创建容器
docker create [options] image [command] [arg]
docker container create
简单介绍几个参数:
- --name="容器名称"
- -e 就是设置环境变量
- -m :设置内存最大值
- --restart:自动重启
简单的拿一个命令来尝试一下:docker create --name mynginx nginx:last
1.2.2、启动容器
docker run [options] image [command] [arg...]
参数:
- -d : 后台运行容器,并返回容器ID 比create多了个这个参数
- -i : 以交互模式运行容器,通常与-t 同时连用
- -p:指定端口映射,格式为 : 主机(宿主)端口:容器端口
- --rm:shell退出的时候自动删除容器
简单的拿一个命令来尝试一下:docker run -p 80:80 -d nginx:latest
1.2.3、容器日志
docker logs [options] container
参数:
- -f :跟踪日志输出
- --since:显示某个开始的所有日志
- -t :显示时间戳
- -n :最新n调日志
注:首先需要你有一个自己的镜像
简单的拿一个命令来尝试一下: docker logs --since="2024-01-05" --tail=10 mynginx
1.2.4、容器交互
docker exec [options] container command [arg...]
参数:
- -d : 分离模式 在后台运行
- -it : 交互
- -w:指定工作目录
注:前提你需要有一个容器 以下命令就是为来进入到容器中的
简单的拿一个命令来尝试一下:docker exec -it mynginx bash
1.2.5、容器停止
docker stop conntainer(停止 需要有指定的容器名称)
docker container stop(也可以这么写)
简单的拿一个命令来尝试一下:docker stop mynginx
1.2.6、扩展
命令需要了,来官网查查
文档处:
详细内容看这里,每个命令与详细参数
1.3、综合演示
这里就把redis作为演示吧
docker进行redis7版本的拉取,同时绑定端口号,设置一个容器名称,-d表示后台运行
docker run --name redistest -p 8300:6379 -d redis:7
注:docker ps 就是查看是否运行成功了
下面我们进入都redistest镜像中设置以下参数看看是否能用
docker exec -it redistest bash
进入容器之后不是就进入了redis本身,还需要redis命令进入redis中 redis-cli进行
友友们可以尝试以下,连接你们服务器端口号就是你绑定的,我这里绑定服务器8300,开发端口号后Redis界面连接即可查看
2、存储卷
2.1、简述
就是将宿主机的本地文件系统中存在的某个目录直接与容器内部的文件系统上的某一目录建立绑定关系。这就意味着,当我们在容器中的这个目录下写入数据时,容器会将其内容直接写入到宿主机上与此容器建立了绑定关系的目录(简单点:本地文件目录与容器内容文件目录建立绑定关系)
特点:可以在宿主机和容器内共享数据库内容、容器和宿主机的数据读写是同步的
2.2、存储卷分类
目前 Docker 提供了三种方式将数据从宿主机挂载到容器中管理卷、绑定卷、临时数据卷
- volume docker 管理卷,默认映射到宿主机的/var/lib/docker/volumes 目录下, 只需要在容器内指定容器的挂载点是什么
- bind mount 绑定数据卷在宿主机上的路径要人工的指定一个特定的路径, 在容器中也需要指定一个特定的路径, 两个已知的路径建立关联关系
- tmpfs mount 临时数据卷,映射到于宿主机内存中,一旦容器停止运行, tmpfs mounts 会被移除,数据就会丢失,用于高性能的临时数据存储
2.3、管理卷
相关命令:
命令 | 别名 | 功能 |
docker volume create | 创建存储卷 | |
docker volume inspect | 显示存储卷详细信息 | |
docker volume ls | docker volume list | 列出存储卷 |
docker volume prune | 清理所有无用数据卷 | |
docker volume rm | 删除卷,使用中的无法删除 |
这里就不在对这些命令在一一解释了,下面我们直接上干货
docker volume ls
注:下面是展示我曾经使用的存储卷,友友首次使用该命令可能是没有的
也是可以有参数:-f 过滤参数条件进行显示,在存储卷较多的情况下采用
下面来看看这绑定卷里面都有什么?
docker volume inspect 卷名
Mountpoint:挂在的位置
每次操作的时候就cd 到挂载的位置去修改信息
删除就友友们私下玩的时候删吧,这个没有啥演示的
2.3.1、-v挂载方式
参数挂载
docker run -v name:directory[:options]
- 第一个参数:卷名称
- 第二个参数:卷映射到容器的目录
- 第三个参数:选项,如ro表示readonly
举例演示:docker run -d --name devtest -v myvol2:/app nginx:latest
容器目录就是/app
myvol2是一个管理卷名,系统会给他分一个路径作为本地绑定卷的路劲
2.3.2、--mount挂载方式
基本上就是格式不同
--mount '<key>=<value>,<key>=<value>'
- 参数 type :类型表示bind ,volume ,or tmpfs
- source , src :对于命名卷,这是卷的名称。对于匿名卷,省略此字段
- destination, dst,target:文件或目录挂载在容器中的路径
- ro,readonly: 只读方式挂载
举例演示:docker run -d --name devtest --mount source=myvol2,target=/app nginx:latest
2.4、绑定卷
2.4.1、-v绑定方式
bind mount (绑定卷)
命令规则:
docker run -v name:directory[:options]
参数:
- 第一个参数:宿主机目录,这个和管理卷是不一样的
- 第二个参数:卷映射到容器的目录
- 第三个参数:选项,如ro表示readonly
举例演示:docker run -d -it --name devtest -v /root/data/test1:/app nginx:latest
2.4.2、--mount绑定方式
--mount '<key>=<value>,<key>=<value>'
- 参数 type :类型表示bind ,volume ,or tmpfs
- source , src :宿主机目录,这个和管理卷不一样
- destination, dst,target:文件或目录挂载在容器中的路径
- ro,readonly: 只读方式挂载
举例演示:docker run -d -it --name devtest --mount type=bind,source=/root/data/test1,target=/app nginx:latest
2.5、临时卷
tmpfs(临时卷)
临时卷数据位于内存中,在容器和宿主机之外
tmpfs局限性
不同与管理卷和绑定卷挂载,不能在容器之间共享tmpfs挂载
这个功能只有在linux上运行docker时才可以用
注:因为临时卷是在内存中,所以其他容器使用不了
2.5.1、--tmpfs方式创建
创建规则: --tmpfs 容器目录
docker run -d -it --name tmptest --tmpfs /app nginx:latest
2.5.2、--mount指定参数创建
--mount '<key>=<value>,<key>=<value>'
- type : 类型表示 bind, volume, or tmpfs
- destination, dst,target:挂载在容器中的路径
- tmpfs-size: tmpfs 挂载的大小(以字节为单位)。默认无限制
- tmpfs-mode: tmpfs 的八进制文件模式。例如, 700 或 0770。默认为 1777或全局可写
举例演示:docker run -d -it --name tmptest --mount type=tmpfs,destination=/app nginx:latest
2.6、展示样例
绑定本地文件是因为,容器中不能进行文件修改
注:这里采用管理卷进行操作演示
首先运行一个nginx启动,管理卷绑定nginx页面,不难看出进入到交互模式之后vim命令就适用不了
注:看管理卷能看到
数据共享:这里可以直接修订nginx的html进行操作
修改index.html后进行的
3、 docker网络
3.1、网络的重要性
多个容器之间通信、容器和宿主机的通信、容器和外界主机通信
3.2、常见网络类型
3.2.1、bridge网络
bridge 驱动会在 Docker 管理的主机上创建一个 Linux 网桥。默认情况下,网桥上的容器可以相互通信。也可以通过 bridge 驱动程序配置,实现对外部容器的访问。
Docker 容器的默认网络驱动.当我们需要多个容器在同一个 Docker 主机上通信时,桥接网络是最佳选择
容器1-----bridge----容器2-----bridge----容器3-----bridge----容器4
3.2.2、host网络
对于独立容器,移除容器和 Docker 主机之间的网络隔离,并直接使用主机的网络。当网络堆栈不应该与 Docker 主机隔离,但是希望容器的其他资源被隔离时,主机网络是最佳选择
3.2.3、container网络
这个模式指定新创建的容器和引进存在的一个容器共享一个网络 ,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 ip,而是和一个指定的容器共享 ip,端口等,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离
注:感觉跟bridge网络很像是吧,bridge网络是横向的,而容器网络是纵向的
容器1----依托---容器2----依托----容器3---创建网络1
这样多个容器就是使用网络1
3.2.4、none网络
Docker 容器拥有自己的 Network Namespace,但是,并不为 Docker 容器进行任何网络配置。也就是说,这个 Docker 容器没有网卡、 IP、路由等信息。容器完全网络
注:是不是感觉这个网络没有啥用,自己一个人把自己孤立起来,实际上可以用来存储一些数据,这些数据是不能通过网络来获取安全性也有了保障
这里还有一个overlay网络,友友们有兴趣的话可以去看看了解一下
3.3、docker网络管理命令
3.3.1、网络命令
命令 | 别名 | 功能 |
docker network create | 创建网络 | |
docker network connect | 连接网路 | |
docker network disconnect | 断开网络 | |
docker network ls | docker network list | 列出网络列表 |
docker network prune | 删除不使用的网络 | |
docker network inspect | 查看网络详情 | |
docker network rm | docker network remove | 删除1个或者多个网络 |
3.3.2、创建网络
docker network create [option] network
参数:
- -d,--dirver :网络驱动
- --gateway:网关地址
- --subnet:表示网段的CIDR格式的子网
- --ipv6:启用ipv6
举例演示:docker network create --dirver=bridge --subnet=192.168.0.0/16 br0
注:创建网络为桥接网络,网段 192.168 子网掩码16位 br0是网络名称
3.3.2、网络详情
docker network inspect [options] network [network...](查看网络详情)
参数:
- -f :指定格式
举例演示:docker network inspect mynetwork
3.4、样例演示
当前我的docker下有这么些网路
我们这里从新创建一个事例
连接的网络需要存在
注:创建好的默认为桥接网络
docker run -itd --name mynginx --network mynetwork nginx:1.22.0
查看相关网络是否绑定
下面可以看详细配置信息:(这里截图不全,友友们可以自省尝试,看看)
如果需要删除
docker network rm 网络名 (不在演示)
注:docker有基础的使用能力