**Docker **
-
Docker 概述
-
Docker 安装
-
Docker 命令
--容器命令
--镜像命令
--操作命令
…
-
Docker 操作
-
Docker 容器数据卷
-
DockerFile
-
Docker 网络原理
-
Idea整合Docker
-
Docker Compose
-
Docker集群 --Swarm || Kuberneters
-
CI/CD jenkins
Docker 概述
产品-开发-运维
开发环境|生产环境 两套 应用环境,应用配置
本地可以操作程序 无法在线运行!版本更新后! 莫名其妙不能用!
环境配置很麻烦 该程序无法包装环境 同时在宿主机上运行多程序可能会导致端口冲突
遇到大型架构程序 环境配置特别麻烦 程序可以跨平台,环境不好!
传统模式:开发 -运维
现在:Devops CI/CD
美国成立于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/
虚拟机技术
- 资源占用高
- 冗余步骤多
- 启动慢
容器化技术
虚拟机系统不完整 阉割版 保留核心内容
- 传统虚拟机模拟硬件,运行完整的操作系统 ,然后在此基础上安装和操作软件
- 共享内核应用于容器中 资源 ,容器本身没有内核和内核ip,容器件自然隔离,各有自己的文件系统,互不影响
Devops(开发、运维)
--传统:一堆文件 照打照敲
--Docker : 一站式包装发布
--Images:Tag Update即可
--项目包装扩建 节点ABC拉取Run即可
--容器化后,开发和测试环境高度一致
--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
设置镜像仓库
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" 逗号可以分开
-
镜像 images
-
容器 container
-
仓储 Registry
-
客户端 Docker -client
-
守护进程 Docker Daemon
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rCtDaOpe-1645761685492)(D:\桌面\iamges\docker.webp)]
- 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网络模式 配置 说明 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 -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镜像的仓库
例如 本地的images输出 为本地仓库
测试环境咱们在使用的阿里云云仓库 天翼云仓储 华为云仓储 官方dockerhub 仓库等等 所有在云环境可以被获取到的镜像实例都可以称之为仓储
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nq3kTYj5-1645761685503)(C:\Users\LCY\AppData\Roaming\Typora\typora-user-images\image-20210924014153448.png)]
典型情况为上述图
Dockerfile是什么?
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明
是一个清单文件 ,类似与go语言的mod ,c#的csproj ,k8s的yaml
构建一个镜像的原型模板!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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 帮助理解
为什么要使用容器编排? 解决什么问题?
指定运行一个powershell 命令或者linux命令 这条指令只在本次构建途中有效
-
Add :可以将本地文件或者远程文件在构建途中copy到镜像内
-
Copy:真正意义上的copy
-
User 指定启动的用户
-
ENTRYPOINT: 启动命令 格式可为 谁在什么下启动了什么 详见dockerfile参考讲解
-
cmd :cmd为上条参数提供默认的环境变量
-
env: 指定环境变量 业务程序脚本里存在 可参照
-
Arg: 外部变量 可以传入
-
Expose :指定容器端口
-
Lable:定于元数据 key:value 形式
-
Workdir :先决条件 指定当下所有操作下的资源归属路径
详见业务程序根路径Docker文件夹下文件 及build.sh 帮助理解
为什么要使用容器编排? 解决什么问题?