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. sql 语句系列(插入系列)[八百章之第五章]

    复制数据到另外一个表 这个不解释,只是自我整理. insert EMP_EAST (DEPTNO,DNAME,LOC) select DEPTNO,DNAME,LOC from DEPT where ...

  2. EPLAN电气绘图笔记

    EPLAN的背景由来发展意义 使用软件的一些思维上规则的东西. 引入一些新的概念性名词术语及区分介绍. 如何完成项目式交付初级标准电气图纸. 如何高效简化. eplan安装后数据库问题. 6.安装后无 ...

  3. CentOS7.9 systemctl

    目录 命令格式 语法 加载配置文件 关机和开机 unit 文件存放位置 unit 格式说明 service unit file 文件构成部分 unit 段的常用选项 service 段的常用选项 in ...

  4. vue 商品sku,笛卡尔算法,商品添加。动态生成table,table添加值后 再生成的table 不改变table之前输入的值

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 轻松复现一张AI图片

    轻松复现一张AI图片 现在有一个非常漂亮的AI图片,你是不是想知道他是怎么生成的? 今天我会交给大家三种方法,学会了,什么图都可以手到擒来了. 需要的软件 在本教程中,我们将使用AUTOMATIC11 ...

  6. 链栈的实现 C语言/C++

    堆栈的链式存储C/C++实现--链栈 与顺序栈相比,链栈的优点在于不存在栈满上溢的问题.链栈通常使用单链表实现,进栈.出栈操作就是在单链表表头的 插入.删除操作.用单链表实现链栈时,使用不带头结点的单 ...

  7. 有赞 Flink 实时任务资源优化探索与实践

    简介: 目前有赞实时计算平台对于 Flink 任务资源优化探索已经走出第一步. 随着 Flink K8s 化以及实时集群迁移完成,有赞越来越多的 Flink 实时任务运行在 K8s 集群上,Flink ...

  8. 技术解析:一文看懂 Anolis OS 国密生态 | 龙蜥专场

    ​ 简介: Anolis OS国密是社区在Anolis OS上做的国密技术解决方案. 编者注:本文系两位演讲者整理,他们在2021年阿里云开发者大会的「开源操作系统社区和生态分论坛」上带了分享,演讲主 ...

  9. 技术干货| 阿里云基于Hudi构建Lakehouse实践探索「内附干货PPT下载渠道」

    ​简介: 阿里云高级技术专家王烨(萌豆)在Apache Hudi 与 Apache Pulsar 联合 Meetup 杭州站上的演讲整理稿件,本议题介绍了阿里云如何使用 Hudi 和 OSS 对象存储 ...

  10. [FAQ] docker-compose MySQL8 ERROR: Different lower_case_table_names settings for server

    MySQL8 启动时 lower_case_table_names 的设置和初始值不一致时,会报 ERROR. 在 docker-compose 中,只需要在命令中加入命令选项即可,并配置一个新的 v ...