1. docker简介和核心概念

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

2. 为什么需要使用到容器

1. 传统服务部署,维护相对繁琐。
2. 资源利用存在浪费
3. 扩容、缩容不够及时
4. 服务器迁移,维护相对繁琐
5. 集群环境一致性差
6. 无法应用突发流量
7. 弹性伸缩
docker的出现能够改善以上问题。

3.docker是什么

1. docker是一个开源的容器引擎
2. 一个操作系统级的虚拟化技术
3. 依赖于系统内核的特性,实现: 1. namespace{资源隔离} 2. cgroup{资源限制}
4. docker也是一个简单的应用程序打包工具。可以将程序封装好,通过docker自身的导出导入能力为迁移提供保障
5. 多环境一致性。docker的出现,从根本解决了环境一致性问题,它能够将环境必备的程序打包到一个容器中,提供他人使用

4.容器和虚拟机区别

VM:   硬件-->操作系统-->虚拟机管理程序-->虚拟机-->操作系统-->服务程序

docker:   硬件-->操作系统-->docker-->服务程序

5.docker适合于哪些应用场景

1. 应用程序打包[能够保证所打包的程序在另一个docker环境中完美运行]
2. 应用程序隔离
3. 持续集成
4. 部署微服务
5. 快速搭建一个测试环境
6. 提供平台及服务

6. 安装docker

1. yum安装
#源添加
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/epel-7.repo
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum clean all
yum install -y bash-completion.noarch # 安装指定版版本
yum -y install docker-ce-18.09.9-3.el7 #也可以查看版本安装
yum list docker-ce --showduplicates | sort -r #启动docker
systemctl enable docker
systemctl start docker
systemctl status docker 2. 离线版安装
#官方下载docker
https://download.docker.com/linux/static/stable/x86_64/docker-19.03.9.tgz
#个人网站下载:
wget https://www.chenleilei.net/soft/docker/docker-19.03.9.tgz tar zxvf docker-19.03.9.tgz
mv docker/* /usr/bin #加入systemd
#--------------------------------------------------------
cat > /usr/lib/systemd/system/docker.service << EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
EOF
#-------------------------------------------------------- #创建配置文件
rm -f /etc/docker/*
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://ajvcw8qn.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
systemctl enable docker.service #个人docker源:
#这个是阿里云配置的加速,直接添加阿里云加速源就可以了,上面显示了配置办法。
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors #设置开机启动和启动即可
systemctl enable docker
systemctl start docker

7. docker镜像

镜像是一个分层存储的文件,不是一个单一文件

一个软件环境

一个镜像可以创建多个容器

一个标准化的交付概念

一个不包含Linux欸和且精简的Linux操作系统

8. docker常用命令

# 查看命令:
docker ps #查看已运行中的容器
docker ps -a #查看所有容器
docker history [容器ID] #查看容器层级
docker image ls #列出镜像,等同于 docker images
docker build #使用dockerfile构建镜像 如:docker build -t nginx-test-v001 -f dockerfile-nginx .
docker inspect [容器ID] #查看一个容器的详细信息。 #容器删除
docker rm [容器id] #删除容器
docker rmi [容器id] #删除容器同时删除镜像 # 运行命令:
docker run #运行一个容器
-d #后台运行,然后返回该容器ID
-t #分配一个tty终端
-i #以交互模式运行容器,通常与 -t 同时使用 # 清除镜像
docker image prune #移除没有使用得镜像,并提示
docker image prune -a #移除所有没有被使用的镜像 # 推送镜像
docker push #其他指令
docker tag 给一个镜像打标签,用于推送镜像到私有仓库
docker export 导出容器文件系统到tar包。 如: docker export 1e682c585342 >dashboard.tar.gz [用的不多]
docker import 导入容器文件系统tar包。 [这个指挥导出容器里的内容 不会导出整个系统,docker export也是如此]
docker save 保存一个或多个[镜像]到tar包 #常用 用法: docker save nginx >nginx.tar
docker load 导入一个docker的[镜像]tar包 #常用 用法: docker load < nginx.tar
docker info 查看docker版本信息 docker search nginx 搜索镜像
docker pull nginx 下载镜像
## 停止容器
docker stop 容器名 一次性停止所有容器
docker stop $(docker ps -a -q) ## 干掉容器
docker kill $(docker ps -a -q) #常用参数:
-v 挂载磁盘 [ -v 宿主机目录:容器目录 ] #进入容器
docker exec -it [容器id] bash #容器相关操作
docker run 运行一个容器
docker exec 进入一个容器
docker ps 查看运行的容器
docker ps -a 查看所有容器
docker stop 停止一个容器
docker start 启动一个容器
docker kill 关闭一个容器
docker rm 删除一个容器
docker rename 重命名一个容器 如:docker rename nginx nginx1
docker top 查看容器内运行进程信息
docker cp 拷贝容器中的文件 示例: docker cp nginx_leilei01:/etc/nginx/nginx.conf ./ docker pause 暂停一个容器:
docker unpause 恢复被暂停的容器 docker stats 显示容器的实时流资源使用统计信息 docker cp /root/1.txt 23er23rs:/www 拷贝文件到docker中,可通过: docker exec nginx1 ls /tmp 查看 #挂载目录和文件
-v /leilei:/usr/share/nginx/html
-v /leilei/nginx.conf:/usr/share/nginx/conf/nginx.conf #指定映射端口
-p 90:80 #将80端口映射到公网90端口 默认随机端口是从/etc/sysctl.conf中定义的随机端口范围.
-P #大写P 映射为随机端口.

9. docker创建容器选项

10. docker资源限制

-m,-memory     设定最大内存量 如: -m='512m'
-memory-swap 允许交换分区的大小
-memory-swappiness=<0-100> 允许使用脚本分区的大小0-100 默认禁用 -1
-oom-kill-disbale #禁用oom
--cpus #限制容器使用的cpu数量
--cpuset-cpus #限制容器使用那些核心,如: 0-3 0,1
--cpu-shares #cpu共享 #查看限制:
docker stats
[root@k8s-master1 ~]# docker stats [id]
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
359042c33b3d zealous_napier 0.00% 1.387MiB / 2.922GiB 0.05% 1.3kB / 0B 0B / 0B 2 资源限制的例子:
#只用一个半cpu
docker run -d --name nginx01 --cpus='1.5' nginx #最多使用50%cpu
docker run -d --name nginx02 --cpus=".5" nginx #允许最多使用500M内存和100mswap,禁用oom
docker run -d --name nginx03 --memory="500m" --memory-swap="600m" --oom-kill-disable nginx 资源扩容:
[对已创建的容器进行在线扩容(仅支持一部分)]
docker update 如:
docker update -m="1000m" [容器ID]

11. docker namespace

Linux内核在2.4.19版本开始引入namespace概念,它是将特定的全局系统资源通过抽象方法让namespace中的进程看起来拥有自己隔离的资源。 docker借助该机制实现的容器资源隔离。
namespace的6中不同命名空间:
IPC: 隔离进程间通信
MOUNT: 隔离文件系统挂载点
NET: 隔离网络协议栈
PID: 隔离进程号,进程命名空间是一个父子结构,子空间对父空间可见
USER: 隔离用户
UTC: 隔离主机名和域名

12. docker CGroups

namespace不会对资源进行限制,如CPU 内存等,如果CPU被频繁调用,它会影响到其他容器的CPU资源。
此时,引入了 CGroups 用于限制容器资源。
cgoups: 所有的人物就是运行在系统的第一个进程,而cgroups以某种标准将一组进程为目标进行资源分配和控制。
例如: cpu 内存 宽带 并且可以动态配置。
cgoups主要功能:
1. 限制进程组使用的资源数量。 设定进程组资源使用上限,例如:限制内存
2. 进程组优先级控制,可以为进程组分配特定的CPU,磁盘I/O吞吐量
3. 记录进程组使用的资源数量: 例如,使用记录某个进程组使用的CPU时间
4. 进程组控制(control): 可以将进程组挂起和恢复

13. docker数据持久化:

1. 搜索镜像
2. 挂载宿主机三个文件: hostname hosts resolv.conf
3. 挂载容器目录 /var/lib/docker/containers

数据持久化:

volumes: docker 管理宿主机文件系统的一部分(/var/lib/docker/volumes) 保存数据最佳方式。
bind mounts:将宿主机上的任意位置文件或者目录挂载到容器中。
tmpfs : 很少用。 挂载存储在主机的内存中,不会写入到主机的文件系统。

13.1 volume持久化方案:

1. 创建volume:
[root@k8s-master1 ~]# docker volume create nginx-volume
nginx-volume
2. 检查volume目录:
[root@k8s-master docker]# docker inspect nginx-volume
[
{
"CreatedAt": "2020-07-05T14:08:27+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/nginx-volume/_data",
"Name": "nginx-volume",
"Options": null,
"Scope": "local"
}
] 2. 使用volume:
第一种方法:
docker run -d -p 80:80 --name=nginx-test --mount src=nginx-volume,dst=/usr/share/nginx/html nginx 第二种方法:
docker run -d -p 80:80 --name=nginx-test -v nginx-volume:/usr/share/nginx/html nginx 3. volume清理办法:
docker stop nginx-test
docker rm nginx-test
docker volume rm nginx-volume 例子:
docker volume create nginx-volume
docker inspect nginx-volume |grep 'Mountpoint' 获取volume目录。
1.方法1 bindmount挂载:
docker run -d -p 80:80 --name=nginx-test --mount type=bind,src=nginx-volume,dst=/usr/share/nginx/html nginx
2.方法2 挂载[常用]:
docker run -d -p 80:80 --name=nginx-test -v nginx-volume:/usr/share/nginx/html nginx
两种方法都是将nginx-volume挂载容器中的网页目录中: /usr/share/nginx/html 检查:
[root@k8s-master docker]# ls /var/lib/docker/volumes/nginx-volume/_data
50x.html index.html
修改:
echo chenleilei01 > /var/lib/docker/volumes/nginx-volume/_data/index.html 注意:
bindmount挂载的方式: 如果容器目录非空,则该目录内容会被隐藏,从而使用宿主机目录覆盖容器中的网页目录
volume挂载方式: docker管理宿主机文件系统的一部分。组词杭甬的数据保存方式。

13.2 bind mount持久化数据方式:

1. 创建volume:
[root@k8s-master1 ~]# docker volume create nginx-volume
nginx01-volume
2. 检查volume目录:
[root@k8s-master docker]# docker inspect nginx-volume
[
{
"CreatedAt": "2020-07-05T14:08:27+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/nginx-volume/_data",
"Name": "nginx-volume",
"Options": null,
"Scope": "local"
}
]
3. 使用bindmount挂载
docker run -d -p 80:80 --name=nginx-test --mount type=bind,src=nginx01-volume,dst=/usr/share/nginx/html nginx

14. docker核心组件之间关系

docker deamon: docker的守护进程,负责与docker client交互,并管理镜像和容器
containerd: 是一个简单的守护进程,向上给docker daemon提供接口,向下通过containerd-shim结合runC管理创建容器。
runC: 一个命令行工具,它根据OCI标准来创建容器和运行容器

总结:

namespace: 一个命名空间,Linux内核提供的一种对资源隔离的机制。 如隔离进程 网络 挂载点等资源
cgroups: Linux内核提供的一种对进程组限制的机制,如: cpu 内存等。
unionfs: 联合文件挂在系统。 支持不同位置的目录挂载到同一个虚拟文件系统,并形成一种分层的模型。

docker资源限制与数据持久化的更多相关文章

  1. Docker深入浅出系列 | 容器数据持久化

    Docker深入浅出系列 | 容器数据持久化 Docker已经上市很多年,不是什么新鲜事物了,很多企业或者开发同学以前也不多不少有所接触,但是有实操经验的人不多,本系列教程主要偏重实战,尽量讲干货,会 ...

  2. Docker:PostgreSQL-11配置数据持久化

    卷的原理图: 主机中的本地目录作为Docker容器内的持久存储卷装载,以便在主机和Docker容器之间共享数据.如果主机希望访问或定期备份在Docker容器内运行的DB服务器写入文件夹的数据或数据库, ...

  3. Docker基础内容之数据持久化

    数据卷的特性 数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS 数据卷可以在容器之间共享和重用,相当于将一个分区挂载到多个目录下面 数据卷内容的修改会立马生效 数据卷的更新,不会影响镜像: ...

  4. docker方式实现redis数据持久化离线安装

    保存镜像 root@hello:~# docker pull redis:latest latest: Pulling from library/redis a2abf6c4d29d: Already ...

  5. docker方式实现postgres数据持久化离线安装

    保存镜像 root@hello:~# docker pull postgres Using default tag: latest latest: Pulling from library/postg ...

  6. docker方式实现minio数据持久化离线安装

    保存镜像 root@hello:~# docker pull minio/minio Using default tag: latest latest: Pulling from minio/mini ...

  7. Docker namespace,cgroup,镜像构建,数据持久化及Harbor安装、高可用配置

    1.Docker namespace 1.1 namespace介绍 namespace是Linux提供的用于分离进程树.网络接口.挂载点以及进程间通信等资源的方法.可以使运行在同一台机器上的不同服务 ...

  8. Docker数据持久化与容器迁移

    上节讲到当容器运行期间产生的数据是不会在写镜像里面的,重新用此镜像启动新的容器就会初始化镜像,会加一个全新的读写入层来保存数据.如果想做到数据持久化,Docker提供数据卷(Data volume)或 ...

  9. docker 系列 - 容器数据持久化和数据共享

    docker 主要有两种数据存储形式, 一种是storage driver(也叫做 Graph driver), 另一种是 volume driver. stroage driver主要是存储那些无状 ...

  10. Docker Swarm volume 数据持久化

    Docker Swarm volume 数据持久化 volume 是将宿主级的目录映射到容器中,以实现数据持久化. 可以用两种方式来实现: volume 默认模式:工作节点宿主机数据同步到容器内. v ...

随机推荐

  1. How Python Handles Big Files

     The Python programming language has become more and more popular in handling data analysis and proc ...

  2. 批处理for 的理解及例子

    前言 首先for的代码形式是: for %i in (set) do command 这里面有一些小知识知识点: 比如说i是变量,那么i可以换成其他字符吗?答案是可以的.但是必须是26个字母中的其中一 ...

  3. mysql 重新整理——索引优化explain字段介绍二 [十]

    前言 紧接上文. 正文 type type字段有如下类型: 1.all 2.index 3.rang 4.ref 5.eq_ref 6.const,system 7.null 最好到最差的顺序为: s ...

  4. 使用WebApi+Vue3从0到1搭建《权限管理系统》:二、搭建JWT系统鉴权

    视频地址:[WebApi+Vue3从0到1搭建<权限管理系统>系列视频:搭建JWT系统鉴权-哔哩哔哩] https://b23.tv/R6cOcDO qq群:801913255 一.在ap ...

  5. 力扣1620(java&python)-网络信号最好的坐标(中等)

    题目: 给你一个数组 towers 和一个整数 radius . 数组  towers  中包含一些网络信号塔,其中 towers[i] = [xi, yi, qi] 表示第 i 个网络信号塔的坐标是 ...

  6. DataV 3D 平面地图 2.0 焕新上线

    ​简介:DataV3月,3D平面地图2.0现已上线~ 3D 平面地图 2.0 现已上线~ 让我们来看看更新了哪些功能吧! 01 交互升级,省市区自由下钻 自带行政区域数据,无需配置: ​ 甚至,可以通 ...

  7. 技术解读:英特尔 x86 平台上,AI 能力是如何进行演进的?(附PPT)

    ​简介:AI 生态系统是怎样的?其中又有哪些关键技术? AI 计算力的指数增长意味着,为了解决越来越复杂的用例,即使是 1000 倍的计算性能增长也很容易被消耗.因此,需要通过软件生态系统的助力,才能 ...

  8. [GPT] 序列模型分类及其模型方案选择

      序列模型可以分为两大类:线性序列模型和非线性序列模型. 线性序列模型:这类模型基于线性关系对时间序列进行建模和预测.常见的线性序列模型包括自回归模型(AR).移动平均模型(MA)和自回归移动平均模 ...

  9. [Trading] 买卖如何移动 ( 影响 ) 市场价格

    大多数人都知道市场价格的变化是因为买卖行为,但却没有多少人了解买卖行为是如何影响市场价格的. 乍一看,这可能令人困惑,因为每一笔市场交易都要求总有一个买家和一个卖家. 首先,重要的是要明白市场上总是有 ...

  10. ASP.NET Core 浅析环境变量与配置的优先级

    本文将简单介绍在 dotnet 6 下的 ASP.NET Core 里的环境变量当成配置的优先级行为.这部分内容在官方文档都有提到,只是我开始粗心没有看仔细,而踩到了坑,特意写篇博客记录一下 在 AS ...