网站开发岗位之间的关联,公司推广宣传文案,怎么制作网站数据包导入小程序,网站建设前期需要做出的准备Docker为什么会出现#xff1f;一款产品从开发到上线#xff0c;从操作系统#xff0c;到运行环境#xff0c;再到应用部署。作为开发运维之间的协作我们需要关心很多东西#xff0c;这也是很多互联网公司都不得不面对的问题#xff0c;特别是各个版本的迭代之后#xf…Docker为什么会出现一款产品从开发到上线从操作系统到运行环境再到应用部署。作为开发运维之间的协作我们需要关心很多东西这也是很多互联网公司都不得不面对的问题特别是各个版本的迭代之后不同版本环境的兼容对运维人员都是考验Docker 之所以发展如此迅速也是因为它对此给出了一个标准化的解决方案。环境配置如此麻烦换一台机器就要重来一次费时费力很多人想到能不能从根本上解决问题软件可以带环境安装也就是说安装的时候把原始环境一摸一样地复制过来。开发人员利用 Docker 可以消除协作编码时“在我的机器上可以正常工作”的问题。Docker 是什么Docker 打破代码即应用的观念从系统环境开始自下而上的打包。一句话总结 Docker解决了运行环境和配置问题的软件容器方便做持续集成并有助于整体发布的容器虚拟化技术。Docker 能干嘛之前的虚拟机技术虚拟机就是带环境安装的一种解决方案。 它可以在操作系统里面运行另一种操作系统。应用程序对此毫无感知因为虚拟机看上去跟真实系统一模一样而对于底层系统来说虚拟机就是一个普通文件不需要了就删除对其他部分毫无影响。这类虚拟机完美的运行了另一套系统能够使用程序操作系统和硬件三者之间的逻辑不变 虚拟机的缺点 1. 资源占用多 2. 冗余步骤多 3. 启动慢 由于前面虚拟机存在这些缺点Linux发展出了另一种虚拟化技术Linux容器。 Linux容器不是模拟一个完整的操作系统而是对进程进行隔离。有了容器就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同不需要捆绑一整套操作系统只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。比较 Docker 和传统虚拟化方式的不同之处传统虚拟机技术是虚拟出一套硬件后在其上运行一个完整操作系统在该系统上再运行所需要的应用程序而容器内的应用进程直接运行于宿主的内核容器内没有自己的内核而且也没有进行硬件虚拟。几乎没有性能损耗性能优于通过 hypervisor 层与内核层的虚拟化。每个容器之间互相隔离每个容器有自己的系统文件容器之间进程不会互相影响能区分计算资源。Hypervisor又称虚拟机监视器(英语virtual machine monitor缩写为 VMM)是用来建立与执行虚拟机器的软件、固件或硬件。 被Hypervisor用来执行一个或多个虚拟机器的电脑称为主体机器(host machine)这些虚拟机器则称为客体机器(guest machine)。hypervisor提供虚拟的作业平台来执行客体操作系统(guest operating systems)负责管理其他客体操作系统的执行阶段这些客体操作系统共同分享虚拟化后的硬件资源。通过下面这幅图我们可以很直观的反映出这两者的区别所在图片----------跟多注解 Docker 属于 Linux 容器的一种封装提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。每个容器都是相互隔离的、保证安全的平台。可以把容器看作是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。总体来说Docker 的接口相当简单用户可以方便地创建和使用容器把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改就像管理普通代码一样。Docker 的三大特征镜像、容器和仓库需要正确理解仓库/镜像/容器这几个概念镜像Docker 本身是一个容器运行载体或称之为管理引擎我们把应用程序和配置依赖打包好形成一个可交付的运行环境这个打包好的运行环境就是 image 镜像文件。容器只有通过上面说的镜像文件才能生成 Docker 容器。image 文件可以看作是容器的模板Docker 根据 image 文件生成容器的实例。同一个 image 文件可以生成多个同时运行的容器实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看作是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)仓库集中存放镜像文件的场所(仓库和仓库注册服务器是有区别的。仓库注册服务器上往往存放着多个仓库每个仓库又包含了多个镜像每个镜像有不同的标签)仓库氛围公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是Docker Hub()存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云、网易云等。Docker安装和运行参考官网 | 踩坑参考博客安装和配置由于 Docker Hub 是国外仓库可以配置阿里云、网易云镜像拉镜像会快。以阿里云为例可用淘宝账号登录阿里云开发者平台1、获取镜像加速器地址2、配置本机 Docker 运行镜像加速器(平台有写如何在本机配置)3、重新启动 Docker 后台服务service docker restart4、检查配置是否生效ps -ef| grep docker永远的 Hello World都配置好后我们可以测试运行 hello worlddocker run hello-world(一张图解释 run 时都干了什么)底层原理Docker 是怎么工作的Docker是一个Client-Server结构的系统Docker守护进程运行在主机上然后通过Socket连接从客户端访问守护进程从客户端接受命令并管理运行在主机上的容器。容器是一个运行时环境就是我们前面说到的集装箱。为什么Docker比VM快1、Docker有着比虚拟机更少的抽象层。由于docker不需要Hypervisor实现硬件资源虚拟化运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。2、docker利用的是宿主机的内核不需要Guest OS。因此当新建一个容器时docker不需要和虚拟机一样重新加载一个操作系统内核。因而避免引寻、加载操作熊内核比较费时费资源的过程当新疆一个虚拟机时虚拟机软件需要加载Guest OS这个新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统则省略了这个过程因此新建一个docker容器只需要几秒钟。Docker 常用命令帮助命令docker version | docker info | docker --help镜像命令docker images 列出本地镜像名称说明-a列出本地所有的镜像(含中间映像层)-q只显示镜像ID--digests显示镜像的摘要信息--no-trunc显示完整的镜像信息docker search xx(某个镜像名字)网站说明--no-trunc显示完整的镜像描述-s列出收藏数不小于指定值的镜像。eg: docker search -s 1000 tomcat--automated只列出 automated build 类型的镜像docker pull xxdocker pull [镜像名称]:[TAG](拉指定版本的镜像)例如docker pull redis:不写 tag 则默认 latestdocker rmi xx删除镜像的操作删除单个docker rmi -f 镜像ID/唯一镜像名删除多个docker rmi -f 镜像名1:ag 镜像名2:tag删除全部docker rmi -f $(docker images -qa)容器命令有镜像才能创建容器这是根本前提(宿主机 win10虚拟机 centoscentos 装了dockerdocker 拉 centos 镜像。centos 才200多M轻量)新建并启动容器docker run [OPTIONS] IMAGE [COMMAND][ARG...]列出当前所有正在运行的容器docker ps [OPTIONS]-a列出当前所有正在运行的容器历史上运行过的-l显示最近创建过的容器-n显示最近 n 格创建的容器-q静默模式只显示容器编号--no-trunc不截断输出退出容器两种方式exit —— 停止容器退出Ctrl P Q ——容器不停止退出启动容器docker start 容器id/容器名重启容器docker restart 容器id/容器名停止容器docker stop 容器id/容器名强制停止容器docker kill 容器id/容器名删除已停止的容器删除单个容器docker rm 容器id删除多个容器docker rm -f $(docker ps -a -q)重要启动守护式容器docker run -d 容器名使用镜像centos:latest 以后台模式启动一个容器docker run -d centos问题docker ps -a 进行查看会发现容器已经退出很重要的一点Docker容器后台运行就必须有一个前台进程容器运行的命令如果不是那些一直挂起的命令(比如运行toptail)就是会自动退出的。这个是docker的机制问题比如你的web容器我们以NGINX 为例正常情况下我们配置启动服务只需要启动相应的service即可例如service nginx start但是这样做 nginx 为后台进程模式运行就导致docker前台没有运行的应用这样的容器后台启动后会立即自杀因为觉得没事可做所以最佳的解决方案是将你要运行的程序以前台进程的形式运行查看容器日志docker logs -f -t --tail 容器id-t 是加入时间戳-f 跟随最新的日志打印--tail 数字显示最后多少条查看容器内运行的进程docker top 容器id查看容器内部细节docker inspect 容器id(查看挂载容器卷用到)进入正在运行的容器并以命令行交互docker inspect 容器id(docker exec -it 容器id /bin/bash #也可以进入容器)docker exec -it 容器id ls -l /tmp从容器内拷贝文件到主机上docker cp 容器id:容器中路径 宿主机路径小总结Docker 常用命令Docker 镜像是什么UnionFS(联合文件系统)UnionFS(联合文件系统)Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统它支持对文件系统的修改作为一次提交来一层层的叠加同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承基于基础镜像(没有父镜像)可以制作各种具体的应用镜像。特性一次同时加载多个文件系统但从外面看起来只能看到一个文件系统联合加载会把各层文件系统叠加起来这样最终的文件系统会包含所有底层的文件和目录Docker 镜像加速原理docker 的镜像实际上是由一层一层的文件系统组成这种层级的文件系统 UnionFS。bootfs(boot file system)主要包含 BootLoader 和 kernelBootLoader主要是引导加载 kernelLinux刚启动时会加载 bootfs 文件系统在 Docker 镜像的最底层是 bootfs。这一层与我们典型的 Linux/Unix 系统是一样的包含 boot 加载器和内核。当 boot 加载完成之后整个内核就都在内存中了此时内存的使用权已由 bootfs 转交给内核此时系统也会卸载 bootfs。rootfs(root file system)在 bootfs 之上包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs 就是各种不同的操作系统发行版比如 Ubuntucentos等分层的镜像pull 的时候可以看到一层层下载以tomcat为例一层层可能包含 tomcat、jdk8、centos、kernel为什么Docker镜像要采用分层结构呢最大的一个好处是共享资源。比如有多个镜像都从相同的 base 镜像构建而来那么宿主机只需在磁盘上保存一份 base 镜像同时内存中也只需加载一份 base 镜像就可以为所有容器服务了。而且镜像的每一层都可以被共享。特点Docker 镜像都是只读的当容器启动时一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”“容器层”之下的都叫“镜像层”。(自己的理解容器相当于类模型自己不去修改实例化的对象是可读可写的有可塑性)Docker 镜像 commit 操作补充docker commit 提交容器副本使之成为一个新的镜像docker commit -m提交的描述信息 -a作者 容器id 要创建的目标镜像名:[标签名]案例演示Docker 容器数据卷是什么一句话有点类似我们Redis 里面的rdb和 aof 文件能干嘛容器的持久化容器间继承共享数据数据卷容器内添加直接命令添加docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名docker run -it -v /myDatavolume:/dataVolumeContainer 镜像名 查看数据卷是否挂载成功路径可以创建成功容器和宿主机之间数据共享容器停止退出后主机修改后数据是否同步DockerFile(MySQL为例看下 DockerFile) 添加 根目录下新建 mydocker 文件夹并进入可在 Dockerfile 中使用 VOLUME 指令来给镜像添加一个或多个数据卷(出于可移植和分享的考虑用 -v 主机目录:容器目录这种方法不能直接在Dockerfile中实现。由于宿主机目录是依赖于特定宿主机的并不能保证在所有哦的宿主机上都存在这样的特定目录)File 构建 #volume testFROM centosVOLUME [/dataVolumeContainer1,/dataVolumeContainer2]CMD echo finished,------------successCMD /bin/bash意思为每次生成容器都会带有两个容器数据卷可以使用 docker inspect 容器id 查看对应的宿主机数据存储地址build 后生成镜像docker build -f /mydocker/Dockerfile -t jiaolf/centos . run 容器通过上述步骤容器内的卷目录地址已经知道对应的主机目录地址在哪——可以使用 docker inspect 容器id 查看对应的宿主机数据存储地址主机对应默认地址备注Docker 挂载主机目录 Docker 访问出现 cannot open directory .Permission denied 解决办法在挂载目录后面加参数 --privilegedtrue 即可数据卷容器是什么命名的容器挂载数据卷其他容器通过挂载这个(父容器)实现数据共享挂载数据卷的容器称之为数据卷容器总体介绍以上一步新建的镜像 jiaolf/centos 为模板并运行容器 dc01、dc02、dc03他们已经具有容器卷(VOLUME [/dataVolumeContainer1,/dataVolumeContainer2])容器间传递共享(--volumes-form)1、先启动 dc01docker run -it --name dc01 jiaolf/centos2、进入 /dataVolumeContainer2 随意编写东西cd /dataVolumeContainer2touch dc01_add.txt3、创建 dc02 挂载在 dc01docker run -it --name dc02 --volumes-from dc01 jiaolf/centos结果dc02中/dataVolumeContainer2 有 dc01_add.txt4、创建 dc03 挂载在 dc01docker run -it --name dc03 --volumes-from dc01 jiaolf/centos5、删除 dc01进入dc02不受影响并且在dc02中新建文件可以同步到dc03总结容器之间配置信息的传递数据卷的生命周期直到没有容器使用它为止DockerFile 解析是什么1、Dockerfile 是用来构建 Docker 镜像的构建文件是由一系列命令和参数构成的脚本2、写容器卷的主流步骤手动编写一个 dockerfile 文件(必须要符合file的规范)有这个文件后直接 docker build 执行获得一个自定义的镜像Runcentos 为例再次查看 DockerfileDockerfile 构建过程解析Dockerfile 内容基础知识每条保留字指令都必须为大写字母且后面要跟随至少一个参数指令按照从上到下顺序执行每条指令都会创建一个新的镜像层并对镜像进行提交Docker 执行 Dockerfile 的大致流程docker 从基础镜像运行一个容器执行一条指令并对容器作出修改执行类似 docker commit 的操作提交一个新的镜像层docker 再基于刚提交的镜像运行一个新容器执行 dockerfile 中的下一条指令直到所有指令都执行完成小总结Dockerfile 体系结构(保留字指令)CMD [/bin/bash] -------干嘛的每个容器都会有一个pid为1的进程如果这个进程执行结束了容器也就close了COMMAND为/bin/bash说明这个容器的初始进程就是bash进程默认情况下dockerlogs也只会打印pid为1进程的输出FROM centos —— 基础镜像MAINTAINER jiaolfWORKDIR ——指定在创建容器后终端默认登录进来的工作目录一个落脚点ENV —— 用来在构建镜像中设置环境变量RUN —— 容器构建时需要执行的命令ADD —— 将宿主机目录下的文件拷贝进镜像且 ADD 命令会自动处理 URL 和解压 tar 压缩包COPY —— 类似 ADD拷贝文件和目录到景象中VOLUME —— 容器数据卷用于数据保存和持久化工作EXPOSE —— 当前容器对外暴露的端口CMD —— 指定一个容器启动时要运行的命令(Dockerfile中可以有多个 CMD 命令但只有最后一个生效CMD 会被 docker run 之后的参数替换)ENTRYPOINT —— 指定一个容器启动时要运行的命令(ENTRYPOINT 的目的和 CMD 一样不同的是指令是追加的CMD 是覆盖的)ONBUILD —— 当构建一个被继承的 Dockerfile 时运行命令父镜像在被子镜像继承后父镜像的 onbuild 被触发案例Base镜像(scratch)Docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的自定义镜像 mycentos1、编写 DockerfileFROM centosMAINTAINER jiaolfENV MYPATH /tmpWORKDIR $MYPATHRUN yum -y install vimRUN yum -y install net-toolsEXPOSE 80CMD echo $MYPATHCMD echo success--------okCMD /bin/bash2、构建docker build -t 新镜像名字:tag3、运行4、列出镜像的变更历史CMD/ENTRYPOINT 镜像案例CMDtomcat 为例Dockerfile 中最后有 CMD 内容docker 启动 tomcat 正常情况下会有一些信息打印(Ctrlc 退出)尝试在 docker run 时增加参数如docker run -it -p 7777:8080 tomcat ls -l (执行后 docker ps 发现 tomcat 并没有启起来)ENTRYPOINT(制作CMD版可以查询IP信息的容器)关于 curl初始文件内容FROM centosRUN yum install -y curlCMD [curl,-s,]修改后FROM centosRUN yum install -y curlENTRYPOINT [curl,-s,]ONBUILD RUN echo father images onbuild -------successONBUILD验证 ONBUILD 功能在 Dockerfile4 中增加上面的一行生成新的镜像 myip_father创建 Dockerfile5继承 myip_father 这个镜像期望在构建 Dockerfile5 时会执行 Dockerfile4 中 ONBUILD 后面的内容ADD COPY(自定义镜像 tomcat9)1、mkdir -p /jiaolf/mydockerfile/tomcat92、进入上述路径touch c.txt3、将 jdk 和 tomcat 安装的压缩包拷贝进上一步目录apache-tomcat-9.0.8.tar.gzjdk-8u171-linux-x64.tar.gz4、在上述目录下新建 Dockerfile 文件5、构建6、run(截图)7、验证(访问tomcat)8、结合前述的容器卷将测试的 web 服务 test 发布 效果使用容器数据卷本地改内容可以直接在容器内访问到小总结Docker 常用安装总体步骤搜索、拉取、查看、启动、停止、移除安装tomcat安装mysqldocker run -p 3306:3306 --name mysql-v /jiaolf/mysql/conf:/etc/mysql/conf.d-v /jiaolf/mysql/logs:/logs-v /jiaolf/mysql/data:/var/lib/mysql-e MYSQL_ROOT_PASSWORD123456-d mysqldocker exec -it containerid /bin/bashmysql -uroot -p 123456数据库常用操作建库、建表、插入数据外部电脑能访问docker上的数据库安装redisdocker run -p 6379:6379-v /jiaolf/myredis/data:/data-v /jiaolf/myredis/conf/-d redis redis-server /usr/local/etc/redis/redis.conf--appendonly yes本地镜像发布到阿里云docker commit -aauthor -mcommit message containerid 镜像名$ sudo docker login --username1052595200qq.com registry.cn-hangzhou.aliyuncs.com$ sudo docker tag [ImageId] :[镜像版本号]$ sudo docker push :[镜像版本号](阿里云)docker run -p 6379:6379 -v /jiaolf/myredis/data:/data -v /jiaolf/myredis/conf/ -d redis redis-server /usr/local/etc/redis/redis.conf --appendonly yes