深圳网址网站建设公司,福州市有哪些制作网站公司,python流星雨特效代码,wordpress注册邮箱怎么修改docker基础
docker概述 docker的出现#xff1f;docker解决思想docker历史docker链接docker能干什么#xff1f;开发-运维 docker安装 镜像(image)容器(container)仓库(repository)底层原理 docker命令 帮助命令镜像命令 docker-images查看所有本地主机上的镜像docker-searc…docker基础
docker概述 docker的出现docker解决思想docker历史docker链接docker能干什么开发-运维 docker安装 镜像(image)容器(container)仓库(repository)底层原理 docker命令 帮助命令镜像命令 docker-images查看所有本地主机上的镜像docker-search搜索镜像docker-pull下载镜像docker-remove删除镜像 容器命令 docker-run新建容器并启动docker-ps列出运行容器退出容器docker-rm删除容器启动和停止容器的操作 操作命令 后台启动容器查看日志查看容器中进程信息查看镜像元数据进入当前正在进行的容器从容器拷贝文件到主机上 打包操作 加载包修改包保存包 命令实战 安装nginx安装tomcat部署eskibana docker镜像 镜像是什么docker镜像加载原理 UnionFS(联合文件系统)加载原理 分层理解commit镜像 容器数据卷 docker的理念回顾使用数据卷实战具名和匿名挂载 多个mysql共享数据 dockerfile DockerFile介绍DockerFile构建过程DockerFile指令实战测试发布自己的镜像实战 小结docker网络原理 理解docker–link自定义网络网络连通 IDEA整合dockerdocker-composedocker-swarmCI/CD-jenkins docker概述
docker的出现 一款产品开发—上线 两套环境应用环境应用配置 开发—运维。问题我在我的电脑上看可以运行版本更新导致服务不可用对于运维来说考验就十分大 环境配置是十分麻烦每一个机器都要部署环境集群redisESHadoop…!费时费力。 发布一个项目jarredis mysql jdk Es项目能不能带上环境安装打包 之前在服务器配置一个应用环境redis、msyql、jdk、es、hadoop配置超麻烦不能够跨平台。 window/Mac 最后发布到linux 传统开发运维来做 现在开发打包部署上线一套流程做完 docker解决思想 隔离docker核心思想打包装箱每个箱子是相互独立的 docker历史 2010年几个搞IT的年轻人就在美国成立了一家公司dotCloud 做一些pass的云计算服务LXC有关的容器技术 他们将自己的技术容器化技术命名就是docker docker刚刚诞生的时候没有引起行业的注意dotCloud就活不下去 开源开发源代码 2013年docker开源 越来越多的人发现了docker的优点火了docker每个月都会更新一个版本 2014年4月9日docker1.0发布 docker为啥这么火十分的轻巧 在容器技术出来之前我们都是使用虚拟机技术 虚拟机在window中装一个Vmware通过这个软件我们可以虚拟出来一台或者多台电脑笨重 虚拟机也是虚拟化技术docker容器技术也是一种虚拟化技术 vm: linux centos原生镜像一个电脑隔离需要开启多个虚拟几 几个G 几分钟
docker隔离镜像最核心的环境4M jdk mysql十分的小巧运行镜像就可以了 几个M KB秒级启动docker链接
官网
文档
仓库
docker能干什么
虚拟机技术缺点
资源占用十分多冗余步骤多启动很慢
容器化技术
容器化技术不是模拟的一个完整的操作系统
比较docker和虚拟机的不同
传统虚拟机虚拟出一条硬件运行一个完整的操作系统然后在这个系统上安装和运行软件容器内的应用直接在宿主机的内容容器是没有自己的内核的也没有虚拟我们的硬件所以就轻便了每个容器间是相互隔离的每个容器都有一个属于自己的文件系统互不影响。
开发-运维 应用更快的交付和部署 传统一堆帮助文档安装程序 docker打包镜像发布测试一键运行 更便捷的升级和扩缩容 使用了docker之后我们部署应用酒喝搭积木一样 项目打包为一个镜像扩展服务器A服务器B 更简单的系统运维 在容器化之后我们的开发测试环境都是高度一致的 更高效的计算资源利用 docker是内核级别的虚拟化可以在一个物理机上运行很多的容器实例服务器的性能可以压榨到极致
docker安装 镜像(image)
docker镜像就好比是一个模版可以通过这个模版来创建容器服务例如tomcat镜像runtomcat01容器提供服务器通过这个惊喜那个可以创建多个容器最终服务运行或者项目运行就是在容器中的。
容器(container)
docker利用容器技术独立运行一个或者一组应用通过镜像来创建的。
启动、停止、删除、基本命令
目前就可以把这个容器理解为一个建议的linux系统
仓库(repository)
仓库就是存放镜像的地方
仓库分为公有仓库和私有仓库
docker hub默认是国外的
安装文档
底层原理
docker是怎么工作的
docker是一个c-s结构的系统docker的守护进程运行在主机上通过socket从客户端访问
docker-server接收到docker-client的命令就回去执行这个命令 docker为什么比vm快
docker有着比虚拟机更少的抽象层docker利用的是宿主机的内核vm需要的是guest os 所以说新建一个容器的时候docker不需要想虚拟机一样重新加载一个操作系统内核避免引导。虚拟机是加载GuestOS分种级别而docker是利用宿主机的操作系统省略了这个复杂秒级
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8Si1Plck-1677071808849)(./pic/03.docker和vm时间对比.jpeg)]
docker命令
帮助命令
docker version # 查看版本信息
docker info # 查看系统信息
docker 命令 --help # 万能命令镜像命令
docker-images查看所有本地主机上的镜像
dongqizhengdeMacBook-Pro:~ zhengdongqi$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest d1165f221234 5 months ago 13.3kB# 解释
REPOSITORY # 镜像的仓库源
TAG # 镜像的标签
IMAGE ID # 镜像的ID
CREATED # 镜像的创建时间
SIZE # 镜像的大小# 可选项
-a, --all # 列出所有的镜像
-q, --quiet # 只显示镜像的ID docker-search搜索镜像
dongqizhengdeMacBook-Pro:~ zhengdongqi$ docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 11273 [OK]
mariadb MariaDB Server is a high performing open sou… 4279 [OK]# 可选项 通过搜索来过滤
--filterSTARS3000 # 搜索出来的镜像就是STARS大于3000的docker-pull下载镜像
docker pull mysql:1.0docker-remove删除镜像
docker rmi -f 容器ID # 删除一个容器
docker rmi -f 容器ID 容器ID # 删除多个容器
docker rmi -f $(docker images -aq) # 删除多个容器一个一个递归删除容器命令
说明我们有了镜像才可以创建容器linux下载一个centos镜像来测试学习
docker pull centosdocker-run新建容器并启动
docker run [可选参数] image# 参数说明
--nameName # 容器名字用来区分容器
-d # 后台方式运行
-it # 使用交互式方式运行进入容器查看内容
-p # 指定容器的端口-p # ip主机端口容器端口-p # 主机端口容器端口常用-p # 容器端口
-P # 随机指定端口docker run -it centos /bin/bash # 进入容器docker-ps列出运行容器
docker ps # 列出当前正在运行容器
-a # 列出当前正在运行运行的容器历史运行过的容器
-n? # 显示最近创建的容器
-q # 只显示容器的编号退出容器
exit # 直接容器停止并退出容器
Ctrl P Q # 容器不停止退出docker-rm删除容器
docker rm 容器ID # 删除指定的容器不能删除正在运行的容器
docker rm -f $(docker ps -aq) # 删除所有的容器
docker ps -a -q | xargs docker rm # 删除所有的容器启动和停止容器的操作
docker start 容器ID # 启动容器
docker restart 容器ID # 重启容器
docker stop 容器ID # 停止当前正在运行的容器
docker kill 容器ID # 强制停止当前容器操作命令
后台启动容器
docker run -d 镜像名
docker run -d centos# 问题docker ps 发现centos停止了
# 常见的坑docker容器使用后台运行就必须要有一个前台进程docker发现没有应用就会自动停止
# nginx 容器启动后发现自己没有提供服务就会立刻停止就是没有程序了查看日志
docker logs -f -t --tail 容器
docker logs -tf --tail 10 容器ID查看容器中进程信息
docker top 容器ID查看镜像元数据
docker inspect 容器ID进入当前正在进行的容器
# 方式1
docker exec -it 容器ID shell方式
# 方式2
docker attach 容器ID
# 区别
docker exec # 进入容器后开启一个新的终端就可以在里面操作常用
docker attach # 进入容器正在执行的终端不会启动新的进程从容器拷贝文件到主机上
docker cp 容器ID容器内路径 目的主机路径
# docker cp 容器ID:/home/test /home打包操作
加载包
# docker load -i ***.tar
docker load -i image.tar# 查看
docker images修改包
# docker run -it --name *** image
docker run -it --name tmp {image_id}
# 如果docker封装了--entrypoint
docker run -ti --name tmp --entrypoint“/bin/bash” {image_id}
# 修改完成后
exit# 查看
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
160ed9d4c04a 9ce83d5f015b /bin/bash 2 hours ago Exited (0) 2 hours ago transcode_git保存包
# commit
docker docker commit -a zhengdongqi -m update git lfs {container_id} transcode_image:1.1
# 如果docker封装了--entrypoint 需要去还原
docker docker commit -a zhengdongqi -m update git lfs -changeENTRYPOINT [/bin/bash, /launch.sh] {container_id} transcode_image:1.1
# save
docker save -o transcode.tar transcode_image:1.1命令实战
安装nginx
# 1.搜索镜像 docker search
# 2.下载镜像 docker pull
# 3.运行测试
docker run -d --name nginx01 -p 3344:80 nginx
docker ps
curl localhost:3344
# 4.进入容器 docker exec -it nginx01 /bin/bash安装tomcat
# 官方
docker run -it --rm tomcat:9.0
# 下载再启动
docker pull tomcat
# 启动运行
docker run -d -p 3355:8080 --name tomcat01 tomcat
# 测试
# 进入容器
docker exec -it tomcat01 /bin/bash
# linux命令少了没有webapps部署eskibana
# es 暴露的端口很多
# es 十分的耗内存
# es 的数据一般需要防止到安全目录挂载
# --net somenetwork ? 网络配置# 启动 elasticsearch
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e discovery.typesingle-node elasticsearch:7.6.2# docker stats
# 限制内存
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e discovery.typesingle-node -e ES_JAVA_OPTS-Xms64m -Xmx512m elasticsearch:7.6.2docker镜像
镜像是什么
镜像是一种轻量级可执行的独立软件包用来打包软件运行环境和机遇运行环境开发的软件它包含运行某个软件所需的所有内容包括代码运行时库环境变量和配置文件
所有的应用直接打包docker镜像就可以直接跑起来
如何得到镜像
从远程仓库下载朋友拷贝给你自己制作一个镜像DockerFile
docker镜像加载原理
UnionFS(联合文件系统)
UnionFS联合文件系统是一种分层、轻量级并且高性能的文件系统它支持对文件系统的修改作为一次提交来一层层的叠加通过你会死可以将不同目录挂载到同一虚拟文件系统下unite several diretories into a single virtual filesystemUnion文件系统是docker镜像的基础镜像可以通过分层来进行继承给予基础镜像没有父镜像可以制作各种具体的应用镜像
特性一次同时加载多个文件系统但从外面看起来只能看到一个文件系统联合加载会把隔层文件系统叠加起来这样最终的文件系统会抱憾所有底层的文件和目录。
加载原理
docker的镜像实际上由一层一层的文件系统组成这种层级的文件系统UnionFS。
bootfsboot file system主要包含bootloader和kernelbootloader主要引导加载kernellinux刚启动时会加载bootfs文件系统在docker镜像的最底层时bootfs这一层与我们典型的linux/Unix系统是一样的包含boot加载起和内核。当boot加载完成之后整个哪壶酒都早内存中了此时内存的使用权已由bootfs转交给内核此时系统也会卸载bootfs。
rootfsroot file system在bootfs之上包含的就是典型linux系统中的dev//proc/bin/etc等标准目录和文件rootfs就是各种不同的草足哦系统发行版比如ubuntucentos等等。 平时我们安装虚拟机的centos都是好几个G为什么docker这里才200M
对于一个精简的OSrootfs可以很小只需要包含最基本的命令、工具和程序库就可以了因为底层直接用host的kernel自己只需要提供rootfs就可以了由此可见对于不同的linux发行版bootfs基本是一致的rootfs会有差别因此不同的发行版可以公用bootfs
分层理解
在下载一个镜像的时候可以观察的到日志是一层一层的下载 所有的docker镜像都起始于一个基础镜像层当进行修改或增加新的内容时就会在当前镜像层之上创建新的镜像层。
特点
docker镜像都是只读的当容器启动时一个新的可写层被加载到镜像的顶部
这一层就是我们通常说的容器层容器之下的都叫镜像层
commit镜像
docker commit # 提交容器成为一个新的镜像# 命令和git原理类似
docker -m“提交的描述信息” -a“作者” 容器ID 目标镜像名【TAG】实战测试
# 1.启动一个默认的tomcat
# 2.发现这个默认的tomcat是没有webapps应用镜像的原因。官方镜像默认webapps下面是没有文件的
# 3.我自己拷贝进去了基本的文件
# 4.将我们操作过的容器通过commit调剂容器数据卷
docker的理念回顾
将应用和环境打包成一个镜像
数据如果数据都在容器中那么我们容器删除数据就会丢失需求数据持久化
mysql容器删了删库跑路需求mysql数据可以存储在本地
容器之间可以有一个数据共享的技术docker容器中产生的数据同步到本地
这就是卷技术目录的挂载将我们容器内的目录挂载到Linux上面 使用数据卷 方式1 docker run -it -v 主机目录容器内目录# 测试
docker run it -v /home/ceshi:/home centos /bin/bash
# 启动起来时我们可以通过docker inspect 容器ID 来查看一下挂载是否正常实战
安装mysql
思考mysql持久化的问题
# 获取镜像
docker pull mysql:5.7# 运行容器需要做数据挂载
# 安装启动mysql需要配置密码这也是注意点
# 官方测试
docker run --name some-mysql -e MYSQL_ROOT_PASSWORDmy-secret-pw -d mysql:tag
# 启动我们的
-d # 后台运行
-p # 端口映射
-v # 卷挂载
-e # 环境配置
--namedocker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD123456 --name mysql01 mysql:5.7# 启动成功之后我们在本地使用sqlyog测试一下具名和匿名挂载
# 匿名挂载
-v 容器内路径
docker run -d -p --name nginx01 -v /etc/nginx nginx# 查看挂载的情况
docker volume ls
# 这里发现这种就是匿名挂载我们在 -v 只写了容器内的路径没有写容器外的路径# 具名挂载
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginxdocker volume ls
# 看到命名为 juming-nginx# 通过 -v 卷名容器内路径
# 查看一下这个卷
docker volume inspect juming-nginx# 所有的docker容器内的卷没有指定目录的情况下都是在 /var/lib/docker/volumes/xxxx我们通过具名挂载可以方便的找到我们的一个卷大多数情况在使用的具名挂载
# 如何确定是具名挂载还是匿名挂载还是指定路径挂载
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /宿主机路径:容器内路径 # 指定路径挂载拓展
# 通过 -v 容器内路径ro、rw 改变读写权限
ro readonly # 只读
rw readwrite # 可读可写docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx多个mysql共享数据
docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD123456 --name mysql01 mysql:5.7docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD123456 --name mysql02 --volume-from mysql01 mysql:5.7# 这个时候可以实现两个容器数据同步dockerfile
DockerFile介绍
DockerFile就是用来构建docker镜像的构建文件命令脚本先体检一下
通过这个脚本可以生成镜像镜像是一层一层的脚本的一个个命令每个命令都是一层
# 创建一个dockerfile
# 文件中的指令。大写
FROM centos
VOLUME [volume01, volume02] # 匿名挂载CMD echo ----end----
CMD /bin/bash# 这里的每个命令就是镜像的一层基础知识
每个保留关键字指令都是必须是大写字母执行从上到下顺序执行# 表示注释每一个指令都会创建提交一个新的镜像层并提交
dockerfile是面向开发的我们之后要发布项目做镜像就需要编写dockerfile文件这个文件十分简单
docker镜像逐渐成为企业交付的标准必须要掌握
DockerFile构建文件定义了一切的步骤源代码
DockerImages通过DockerFile构建生成的镜像最终发布和运行的产品
Docker容器容器就是镜像运行起来提供服务器
DockerFile构建过程
编写一个dickerfile文件docker build 构建成为一个镜像docker run 运行镜像docker push 发布镜像DockerHub阿里云镜像库
DockerFile指令
FROM # 基础镜像一切从这里开始构建
MAINTAINER # 镜像是谁写的姓名邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤tomcat镜像这个tomcat压缩包添加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 保留端口的配置
CMD # 指定这个容器启动的时候要运行的命令
ENTRYPOINT # 指定这个容器启动的时候要运行的命令可以追加命令
ONBUILD # 当构建一个被继承DockerFile这个时候就会运行ONBUILD的指令触发指令
COPY # 类似ADD将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量实战测试
# 1.编写DockerFile的文件
FROM centos
MAINTINER zhengdongqinickdecodes163.comENV MYPATH /usr/local
WORKDIR $MYPATHRUN yum -y install vim
RUN yum -y install net-toolsEXPOSE 80CMD echo $MYPATH
CMD echo ---end---
CMD /bin/bash# 2.通过这个文件构建镜像# 3.查看镜像构建过程
docker history 容器IDCMD和ENTRYPOINT的区别
CMD # 指定这个容器启动的时候要运行的命令只有最后一个会生效可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令可以追加命令发布自己的镜像
地址https://hub.docker.com 注册自己的账号确定这个账号可以登陆在我们服务上提交自己的镜像Docker push 镜像名
docker login --help实战
tomcat镜像 准备镜像文件tomcat压缩包jdk的压缩包 编写dockeerfile文件 官方命名DockerFile FROM centos
MAINTINER zhengdongqinickdecodes163.comCOPY readme.txt /usr/local/readme.txtADD jdk-8u11-linux-64.tar.gz /usr/local/
ADD apache-tomcat-9.0.22.tar.gz /usr/local/RUN yum -y install vimENV MYPATH /usr/local
WORKDIR $MYPATHENV JAVA_HOME /usr/local/jdk.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat.9.0.22
ENV CATALINA_BASH /usr/local/apache-tomcat.9.0.22
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/binEXPOSE 8000CMD /usr/local/apache-tomcat-9.-.22/bin/startup.sh tail -F /url/local/apache-tomcat-9.0.22/bin/logs/catalina.out构建镜像 # docker build -t diytomcat .启动镜像 访问测试 发布项目由于做了卷挂载我们直接在本地编写项目就可以发布了
小结 docker网络原理
理解docker
清空所有环境 docker exec -it tomcat01 ip addr原理 我们每启动一个docker容器docker就会给docker容器分配一个ip我们只要安装了docker就会有一个网卡docker()桥接模式使用的技术是evth-pair技术 再启动一个容器测试发现有多了一对网卡 # 我们发现这个容器带来网卡都是一对一对的
# evth-pair 就是一对的虚拟设备接口他们都是成对出现一端连接协议一端彼此相连
# 正因为又这个特性evth-pair充当一个桥梁链接各种虚拟网络设备的
# OpenStacDocker容器之间的链接OVS的链接都是使用evth-pair技术结论
tomcat01和tomcat02是公用的一个路由器docker0
所有的容器不指定网络的情况下都是docker0路由的docker会给我们的容器分配一个默认的可用IP Docker 中的所有网络接口都是虚拟的。虚拟的转发效率高内网传递文件
只要容器删除对应网桥一对没了
–link
# 思考一个问题我们编写了一个微服务database urlip项目不重启数据库ip换掉了我们希望可以处理这个问题可以用名字惊醒访问容器docker exec -it tomcat02 ping tomcat01# 如何解决呢
# 通过--link 就可以解决了网络连通问题
docker run -d -P --name tomcat03 --link tomcat02 tomcat# 当然反响是不可以的需要反向链接自定义网络
# 查看所有的docker网络
docker network lsbridge # 桥接docker默认自己桥接也是使用bridge模式
none # 不配置网络
host # 和宿主机共享网络
container # 容器网络来连通用的少局限性很大docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat01 --next bridge tomcat
# docker0特点默认域名不能访问--link可以打通连接# 我们可以自定义一个网络
# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet网络连通
docker network connect 选项 network 容器
# 测试打通 tomcat01 - mynet
# 连通之后就是将 tomcat01 放到了mynet网络下
# 一个容器两个ip[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZfVHk9bP-1677071808850)(./pic/03.网络连通.png)]
IDEA整合docker
docker-compose
docker-swarm
CI/CD-jenkins