日升时奋斗,日落时自省
目录
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中设置网络和存储卷绑定
容器就是镜像运行的实体;简单来说就是环境,环境中存在很多东西,都处于运转中,容器就是这样的环境,容器中的进程属于运行状态,那容器就缺不了创建、运行、删除等状态了
容器的生命周期是容器可能处于的状态:
注:下图红色数字是一个启动到停止的流程,仅仅只是停止,想要删除的话,需要的是将镜像先停止stop再rm命令删除
参数解释:
Docker 在处理 OOM 事件时分为三种情况
(1)容器中的应用耗尽了主机系统分配给容器的内存限额,触发OOM事件,容器被强制关闭
(2)用户不想关闭这个容器,那么可以选择--oom-kill-disable 来禁用 OOM-Killer,首先不满足(1)就是不能超过这个限度,只需要将最坏的情况封闭在一定范围之内
(3)如果用户使用了--oom-kill-disable,但也没有使用-m 来设定上限,因而此时此容器将会尽可能多地使用主机内存资源。换言之,主机内存有多大,它就将用多大(限制分配内存)
容器的异常可能由于某个子进程退出,影响到init进程,导致其也退出(init进程是docker容器中的主要运行者,它的退出代表容器下线),Docker Daemon 会尝试再次重新将此容器由 Stopped 状态转为 Running状态。只有设置了--restart 参数的容器, Docker Daemon 才会去尝试启动,否则容器会保持停止状态。
Docker“剥夺”了此容器的 CPU 资源。而其他资源,如 Memory 资源、 Network 资源等还保留未动。如此一来,失去了 CPU 资源的进程,是不会被主机内核系统所调度的
注:所有之前需要一个基础命令来支持下面的操作:
docker ps(查看运行容器)
docker ps -a (查看所有容器)
docker create [options] image [command] [arg]
docker container create
简单介绍几个参数:
简单的拿一个命令来尝试一下:docker create --name mynginx nginx:last
docker run [options] image [command] [arg...]
参数:
简单的拿一个命令来尝试一下:docker run -p 80:80 -d nginx:latest
docker logs [options] container
参数:
注:首先需要你有一个自己的镜像
简单的拿一个命令来尝试一下: docker logs --since="2024-01-05" --tail=10 mynginx
docker exec [options] container command [arg...]
参数:
注:前提你需要有一个容器 以下命令就是为来进入到容器中的
简单的拿一个命令来尝试一下:docker exec -it mynginx bash
docker stop conntainer(停止 需要有指定的容器名称)
docker container stop(也可以这么写)
简单的拿一个命令来尝试一下:docker stop mynginx
命令需要了,来官网查查
文档处:
详细内容看这里,每个命令与详细参数
这里就把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界面连接即可查看
就是将宿主机的本地文件系统中存在的某个目录直接与容器内部的文件系统上的某一目录建立绑定关系。这就意味着,当我们在容器中的这个目录下写入数据时,容器会将其内容直接写入到宿主机上与此容器建立了绑定关系的目录(简单点:本地文件目录与容器内容文件目录建立绑定关系)
特点:可以在宿主机和容器内共享数据库内容、容器和宿主机的数据读写是同步的
目前 Docker 提供了三种方式将数据从宿主机挂载到容器中管理卷、绑定卷、临时数据卷
相关命令:
命令 | 别名 | 功能 |
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 到挂载的位置去修改信息
删除就友友们私下玩的时候删吧,这个没有啥演示的
参数挂载
docker run -v name:directory[:options]
举例演示:docker run -d --name devtest -v myvol2:/app nginx:latest
容器目录就是/app
myvol2是一个管理卷名,系统会给他分一个路径作为本地绑定卷的路劲
基本上就是格式不同
--mount '
= , = '
举例演示:docker run -d --name devtest --mount source=myvol2,target=/app nginx:latest
bind mount (绑定卷)
命令规则:
docker run -v name:directory[:options]
参数:
举例演示:docker run -d -it --name devtest -v /root/data/test1:/app nginx:latest
--mount '
= , = '
举例演示:docker run -d -it --name devtest --mount type=bind,source=/root/data/test1,target=/app nginx:latest
tmpfs(临时卷)
临时卷数据位于内存中,在容器和宿主机之外
tmpfs局限性
不同与管理卷和绑定卷挂载,不能在容器之间共享tmpfs挂载
这个功能只有在linux上运行docker时才可以用
注:因为临时卷是在内存中,所以其他容器使用不了
创建规则: --tmpfs 容器目录
docker run -d -it --name tmptest --tmpfs /app nginx:latest
--mount '
= , = '
举例演示:docker run -d -it --name tmptest --mount type=tmpfs,destination=/app nginx:latest
绑定本地文件是因为,容器中不能进行文件修改
注:这里采用管理卷进行操作演示
首先运行一个nginx启动,管理卷绑定nginx页面,不难看出进入到交互模式之后vim命令就适用不了
注:看管理卷能看到
多个容器之间通信、容器和宿主机的通信、容器和外界主机通信
bridge 驱动会在 Docker 管理的主机上创建一个 Linux 网桥。默认情况下,网桥上的容器可以相互通信。也可以通过 bridge 驱动程序配置,实现对外部容器的访问。
Docker 容器的默认网络驱动.当我们需要多个容器在同一个 Docker 主机上通信时,桥接网络是最佳选择
容器1-----bridge----容器2-----bridge----容器3-----bridge----容器4
对于独立容器,移除容器和 Docker 主机之间的网络隔离,并直接使用主机的网络。当网络堆栈不应该与 Docker 主机隔离,但是希望容器的其他资源被隔离时,主机网络是最佳选择
这个模式指定新创建的容器和引进存在的一个容器共享一个网络 ,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 ip,而是和一个指定的容器共享 ip,端口等,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离
注:感觉跟bridge网络很像是吧,bridge网络是横向的,而容器网络是纵向的
容器1----依托---容器2----依托----容器3---创建网络1
这样多个容器就是使用网络1
Docker 容器拥有自己的 Network Namespace,但是,并不为 Docker 容器进行任何网络配置。也就是说,这个 Docker 容器没有网卡、 IP、路由等信息。容器完全网络
注:是不是感觉这个网络没有啥用,自己一个人把自己孤立起来,实际上可以用来存储一些数据,这些数据是不能通过网络来获取安全性也有了保障
这里还有一个overlay网络,友友们有兴趣的话可以去看看了解一下
命令 | 别名 | 功能 |
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个或者多个网络 |
docker network create [option] network
参数:
举例演示:docker network create --dirver=bridge --subnet=192.168.0.0/16 br0
注:创建网络为桥接网络,网段 192.168 子网掩码16位 br0是网络名称
docker network inspect [options] network [network...](查看网络详情)
参数:
举例演示:docker network inspect mynetwork
当前我的docker下有这么些网路
我们这里从新创建一个事例
连接的网络需要存在
注:创建好的默认为桥接网络
docker run -itd --name mynginx --network mynetwork nginx:1.22.0
查看相关网络是否绑定
下面可以看详细配置信息:(这里截图不全,友友们可以自省尝试,看看)
如果需要删除
docker network rm 网络名 (不在演示)
注:docker有基础的使用能力