**Docker **
-
Docker 概述
-
Docker 安装
-
Docker 命令
--容器命令
--镜像命令
--操作命令
…
-
Docker 操作
-
Docker 容器数据卷
-
DockerFile
-
Docker 网络原理
-
Idea整合Docker
-
Docker Compose
-
Docker集群 --Swarm || Kuberneters
-
CI/CD jenkins
Docker 概述
Docker 起溯
产品-开发-运维
开发环境|生产环境 两套 应用环境,应用配置
程序在本地可以运行 线上无法运行!版本更新后 莫名其妙无法使用!
环境配置很麻烦 程序无法打包环境 多程序同时运行在一个宿主机上有可能造成端口冲突
遇到大型架构程序时 环境配置尤为麻烦 程序可跨平台,环境不行!
传统模式:开发 -运维
现在:Devops CI/CD
Docker 历史
2010年,美国成立一家dotCloud公司 目的做Pass型云计算服务!LXC虚拟机有关容器技术。他们将自己的技术定义了统一化的命名 docker 。
docker刚诞生的时候 ,没有引起行业注意,生死关头 dotcloud将docker进行开源.
2013年 宣布docker开源!
后续越来越多人发现了docker优点 起飞!
技术社区愈加庞大,大约每个月更新一个版本! 至此docker全面宣布跨入下一个时代!
虚拟化技术
-
虚拟机:vm 庞大笨重 程序更新最小单位也为分钟级
-
docker:轻量化 沙箱级
vm:linux centos原生镜像
docker:images 内核环境 只提供内核运行基础环境即可 阉割版 使用运行镜像即可
- Docker官网:https://www.docker.com/
- 文档:https://docs.docker.com/
Docker 作用
虚拟机技术
技术缺点
- 资源占用高
- 冗余步骤多
- 启动慢
容器化技术
不是一个完整的虚拟机系统 阉割版 保留最核心内容
比较Docker 盒虚拟机技术不同:
- 传统虚拟机,模拟出一条硬件,运行一个完整的操作系统 ,然后在基础上安装及运行软件
- 容器内应用共享内核 资源 ,容器本身没有内核及ip,容器件天然隔离,各自拥有属于自己的文件系统,互不影响
Devops(开发,运维)
- 应用快速交付及部署
--传统:一堆文档 照打照敲
--Docker : 打包发布一条龙
- 便捷的升级及扩容
--Images:Tag Update即可
--项目打包拓展 节点ABC拉取Run即可
- 更简单的系统运维
--容器化之后,开发,测试环境高度一致
- 更极致的资源利用
--docker 内核级别虚拟化,在同一台虚拟机上运行多实例!将服务器性能压缩到极致
Docker 安装
卸载旧版本 Linux
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
环境准备
-
Win https://www.docker.com/products/docker-desktop Docker 桌面版 WSL2基于win的linux内核
-
Linux
Docker -ce 社区版 -ee企业版
$ wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
$ yum -y install docker-ce-18.06.1.ce-3.el7
$ systemctl enable docker && systemctl start docker
$ docker --version
Docker 镜像仓储
设置镜像仓库
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
Docker-Desktop镜像仓库配置
Docker Engine下
registry-mirrors:"https://registry.docker-cn.com" 逗号分隔即可
Docker 基本组成
-
镜像 images
-
容器 container
-
仓储 Registry
-
客户端 Docker -client
-
守护进程 Docker Daemon
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rCtDaOpe-1645761685492)(D:\桌面\iamges\docker.webp)]
Docker 原理
- Run流程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-APytLuzO-1645761685495)(C:\Users\LCY\AppData\Roaming\Typora\typora-user-images\image-20210923235402519.png)]
run命令发起->判断本地是否存在镜像->存在 run | | 不存在 ->远程下载到本地->run
- 底层原理
docker 是一个client-server结构的系统 ,client发其请求后,server依据其命令执行 ,双方通过socket进行连接,docker的守护进程运行在宿主机上,由hosts守护进程进行监管
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nc4q7f3Q-1645761685496)(C:\Users\LCY\AppData\Roaming\Typora\typora-user-images\image-20210924000919410.png)]
-
Docker 为什么比虚拟机快?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cmCh8YfA-1645761685498)(D:\桌面\iamges\src=http___img-blog.csdnimg.cn_img_convert_91868a37481f41dbc2b53a2303ce8fff.png&refer=http___img-blog.csdnimg.jpg)]
- 资源共享
- 资源隔离
- 秒级启动
- 网络隔离
- 弹性伸缩
- 硬件级分布式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nhvllB6T-1645761685499)(D:\桌面\iamges\u=3428228214,452175879&fm=26&fmt=auto.webp)]
Docker 网络模式
Docker网络模式 配置 说明 host模式 –net=host 容器和宿主机共享Network namespace。 container模式 –net=container:NAME_or_ID 容器和另外一个容器共享Network namespace。 kubernetes中的pod就是多个容器共享一个Network namespace。 none模式 –net=none 容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等。 bridge模式 –net=bridge (默认为该模式)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iZpdUHoN-1645761685501)(D:\桌面\iamges\src=http___img.meiyoubug.com_blog_697113_201609_697113-20160921211323293-119309106.jpg&refer=http___img.meiyoubug.jpg)]
- host模式 共享主机网络 容器没有自己的IP
- container模式 指定与某个容器进行网络共享 也没有自己的IP 网卡 而是选择与指定的容器进行网卡,端口范围的共享
- none模式 啥都没有
- bridge模式 默认且最常见的模式 桥接网络模式 将容器端口映射进宿主机网卡 并写进iptables规则里 目前咱们纯docker环境运行的容器为此模式 较安全,省事; 缺点 牺牲网络性能
Docker 常用命令
帮助命令
docker -v #版本信息
docker info #基本信息
docker -help #帮助
帮助文档地址:https://docs.docker.com/engine/reference
镜像命令
docker images #查看本地所有镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
docker/desktop-kubernetes kubernetes-v1.21.2-cni-v0.8.5-critools-v1.17.0-debian a502c6d66bd7 3 months ago 299MB
# REPOSITORY 镜像名称
# TAG 镜像标签
# IMAGE ID 镜像ID
# CREATED 镜像创建时间
# SIZE 镜像大小
#可选项
Options:
-a :显示所有镜像信息;
-f :显示满足条件的镜像;
--format :指定返回值的模板文件;
--no-trunc :显示完整的镜像信息;
-q :只显示镜像ID。
docker rmi 镜像Id #删除镜像
docker pull 镜像名称:Tag #拉取镜像
#如果不写Tag 默认拉取Latest版本 建议每次拉取加上Tag养成好习惯
docker push 镜像名称:Tag #推送镜像
#镜像名称为仓储地址/命名空间 如果docker识别到这个地址 则会开始推送 否则报错 例如我们的阿里云仓储
#规则为 仓储地址/命名空间/镜像名称:Tag 注意推送时权限问题 默认情况下 安装docker后登录一次仓储即可 若中中途卸载,则需要重新登录
docket Tag 当前镜像名称:tag 更改后镜像名称:Tag #更改镜像名称
docker build [OPTIONS] PATH | URL | - #build为关键命令 提供n多option可选参数 重点!!!
#可选项 关键内容联合dockerfile中会有讲解
#--build-arg=[] :设置镜像创建时的变量;
#--cpu-shares :设置 cpu 使用权重;
#--cpu-period :限制 CPU CFS周期;
#--cpu-quota :限制 CPU CFS配额;
#--cpuset-cpus :指定使用的CPU id;
#--cpuset-mems :指定使用的内存 id;
#--disable-content-trust :忽略校验,默认开启;
#-f :指定要使用的Dockerfile路径;
#--force-rm :设置镜像过程中删除中间容器;
#--isolation :使用容器隔离技术;
#--label=[] :设置镜像使用的元数据;
#-m :设置内存最大值;
#--memory-swap :设置Swap的最大值为内存+swap,"-1"表示不限swap;
#--no-cache :创建镜像的过程不使用缓存;
#--pull :尝试去更新镜像的新版本;
#--quiet, -q :安静模式,成功后只输出镜像 ID;
#--rm :设置镜像成功后删除中间容器;
#--shm-size :设置/dev/shm的大小,默认值是64M;
#--ulimit :Ulimit配置。
#--squash :将 Dockerfile 中所有的操作压缩为一层。
#--tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
#--network: 默认 default。在构建期间设置RUN指令的网络模式
#例子 docker build -t 镜像名称:v1 .
# docker build -f /path/to/a/Dockerfile 镜像名称:v1 .
容器命令
docker run 镜像Id #运行一个镜像实例
#可选项
# -d 后台运行
# --name= 定义容器名称
# -p 以映射的方式将容器端口映射到宿主机上
# -i: 交互式操作
# -t: 终端
# 进入容器终端后 ctrl+D退出
# -e 添加环境变量
# -v 数据持久化 规则为 -v 指定路径:容器路径
# --rm:容器退出时自动清理容器内部的文件系统
# -h HOSTNAME 或者 --hostname=HOSTNAME: 设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts
docker ps #获取当前所有运行中的容器
# -l 最后一次创建的容器
# -a 获取所有容器
docker -it 容器id/名称 bash #进入此容器
docker start 容器Id/name #运行指定容器
docker stop 容器Id/name #停止指定容器
docke人 restart 容器Id/name #重启指定容器
docker rm 容器Id/name #删除指定容器
docker kill 容器Id/name #立即杀死该容器并抛弃该进程
# 删除所有docker容器
docker rm $(docker container ls -a -q)
# 删除所有docker镜像
docker rmi $(docker image ls -a -q)
#注意删除时候容器必须为stop状态 可选择的操作在删除前stop /kill
容器连接
docker run -d --name=test -p 1000:80 镜像Id/name #以后台方式运行镜像 网络模式为桥接 本地1000桥接到容器内80端口 容器名称为test
docker network create -d bridge test-net #新建容器网络
# -d:参数指定 Docker 网络类型,有 bridge、overlay
docker run -itd --name test1 --network test-net 镜像Id/name #指定刚才新建的容器网络
docker run -d --net=host 镜像Id/name #host模式运行
docker run -d --net=none 镜像Id/name #none模式运行
docker run -d --net=bridge 镜像Id/name #bridge 可以不设定 默认模式下为此设置 在不填写--net参数情况下
docker run -d --net=镜像Id/name 镜像Id/name #container模式运行
docker 仓库
仓库 顾名思义存储docker镜像的仓库
例如 本地的images输出 为本地仓库
测试环境咱们在使用的阿里云云仓库 天翼云仓储 华为云仓储 官方dockerhub 仓库等等 所有在云环境可以被获取到的镜像实例都可以称之为仓储
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nq3kTYj5-1645761685503)(C:\Users\LCY\AppData\Roaming\Typora\typora-user-images\image-20210924014153448.png)]
典型情况为上述图
DockerFile
Dockerfile是什么?
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明
是一个清单文件 ,类似与go语言的mod ,c#的csproj ,k8s的yaml
构建一个镜像的原型模板!
Dockerfile 定制镜像
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2N3tcBaX-1645761685505)(D:\桌面\iamges\src=http___img2020.cnblogs.com_blog_821814_202101_821814-20210109102912082-1978951306.png&refer=http___img2020.cnblogs.jpg)]
-
Form :全文关键 指定依赖基础镜像 例如webapi dockerfile中form的.net5运行时环境 也可以form一个外来镜像或者本地镜像 总之这个镜像是你本清单文件的底层依赖
-
Run :可以指定运行一个powershell 命令或者linux命令 这条指令只在本次构建途中有效
-
Add :可以将本地文件或者远程文件在构建途中copy到镜像内
-
Copy:真正意义上的copy
-
User 指定启动的用户
-
ENTRYPOINT: 启动命令 格式可为 谁在什么下启动了什么 详见dockerfile参考讲解
-
cmd :cmd为上条参数提供默认的环境变量
-
env: 指定环境变量 业务程序脚本里存在 可参照
-
Arg: 外部变量 可以传入
-
Expose :指定容器端口
-
Lable:定于元数据 key:value 形式
-
Workdir :先决条件 指定当下所有操作下的资源归属路径
详见业务程序根路径Docker文件夹下文件 及build.sh 帮助理解
DockerCompose
容器编排
为什么要使用容器编排? 解决什么问题?
指定运行一个powershell 命令或者linux命令 这条指令只在本次构建途中有效
-
Add :可以将本地文件或者远程文件在构建途中copy到镜像内
-
Copy:真正意义上的copy
-
User 指定启动的用户
-
ENTRYPOINT: 启动命令 格式可为 谁在什么下启动了什么 详见dockerfile参考讲解
-
cmd :cmd为上条参数提供默认的环境变量
-
env: 指定环境变量 业务程序脚本里存在 可参照
-
Arg: 外部变量 可以传入
-
Expose :指定容器端口
-
Lable:定于元数据 key:value 形式
-
Workdir :先决条件 指定当下所有操作下的资源归属路径
详见业务程序根路径Docker文件夹下文件 及build.sh 帮助理解
DockerCompose
容器编排
为什么要使用容器编排? 解决什么问题?