本文主要解释“什么是Docker的原理、体系结构和应用”。感兴趣的朋友不妨看看。本文介绍的方法简单、快速、实用。让边肖带你学习“什么是Docker原理、架构和应用”!
一、云计算介绍
1.Docker通过将运行环境和应用打包在一起,解决了部署的环境依赖问题,真正实现了跨平台的分发和使用。
2.因为容器省略了操作系统,所以整个级别得到了简化,更多的应用程序可以在单个服务器上运行。
3.3.ubuntu的存储部分可以使用AUFS,而CentOS只能使用Devicemapper。前者性能更好。
二、安装码头工人
第三,使用Docker
1.容器实际上是一个运行在操作系统上的进程,只是增加了资源的隔离和限制,以及Docker的三个核心功能:
CGroups:用于限制进程的资源使用。在操作系统上,用户标识和机器名称等资源是全局的,所有正在运行的进程都访问相同的资源。
命名空间:用于划分不同的命名空间。
UnionFS:用于处理分层镜像。
2.镜像是容器中的文件系统,它还集成了容器操作的一些参数,可以看作是容器的模板。
3.一些订单:
Docker信息:查看运行状态和版本信息,这是整个Docker Daemon运行状态的缩影,包括容器数量、镜像数量、Daemon版本、使用的存储驱动等信息。
拉镜子
docker run-I-t ubuntu/bin/bash:-I表示启动一个交互容器,-t表示使用伪TTY,它与容器的stdin和stdout相关联,Ubuntu是正在运行的映像,/bin/bash表示启动容器时要运行的命令,如果想退出交互模式而不影响容器的运行,请使用[Ctrl PQ]
长时间运行容器:-d让容器在后台运行,docker logs容器id检查容器的日志(实际上,它检查容器的标准输出日志)。
码头工人:查看容器,-查看所有容器
四,Docker的深入分析
A.码头工人的建筑
1.Docker Daemon:在主机上运行,用户不直接与Docker Daemon交互,而是通过Docker Client进行交互。
2.Docker客户端:是用户访问Docker的主要渠道,通过它用户可以控制Docker Daemon的访问。
3.Docker Image:它是一个只读模板。
4.Docker注册表:是存储Image的仓库,可以使用公共和私有注册表进行上传和下载。
5.Docker容器:Docker容器就像一个文件夹。容器包含应用程序所需的所有环境。每个容器都源自一个图像。每个容器都可以运行、启动、停止、移动和删除。每个容器都是一个独立且安全的应用程序。
B.码头工人是如何工作的
1.Docker Image是一个只读模板,从容器开始。每个图像包含多个层。联合文件系统用于将这些层组合成一个图像。Union FS可以透明地堆叠文件和目录,形成单个文件系统,每个映像都来自一个基本映像。
2.容器由操作系统、用户文件和元数据组成。在运行时,容器将在联合文件系统的顶部添加一个文件层。
3.3使用的命名空间。Docker: PID命名空间,NET Namesapce,IPC Namesapce,MNT命名空间:PID命名空间;使用的联合文件系统包括AUFS、英国、VFS、设备映射性能等。
4.-p主机端口:集装箱端口
5.输入镜像:docker exec -it容器id /bin/bash
6.docker提交容器id新名称,保存图像和所有更改。
C.镜像制作
1.获得镜像的三种方法:
拉镜:docker拉
将容器转换为镜像:docker提交
制作镜像:通过Dockerfile生成镜像。
2.查找DockerHub图像:docker搜索
3 .推送图像,标签图像优先,dockertag [options]图像[:标签] [Registry host/] [username]名称[3360标签]
4.根据Dockerfile: docker在Dockerfile所在的目录中编译映像。
5.删除镜像
多
cker run 命令
1.语法格式:docker run [OPTIONS] IMAGE[:TAG!@DIGEST][COMMAND][ARG…]
2.前后台运行:后台-d,前台-i -t,后台运行后再次进入容器,可以使用docker attach <cid>,退出时使用【ctrl+pq】
3.容器的标识:—name,Image[:tag],Image[@digest]
4.PID设置:—pid=host,可以在容器里面共享主机的PID Namespace
5.IPC设置:—pic是进程间通信的支持,可以和主机共享
五、容器的网络
A.容器自带网络
1.通过docker network ls来查看,包括bridge、host 、none
B.网络详情
1.通过docker network inspect <net>来查看本机的网络信息
2.当启动一个容器时,都会在全局注册相关的网络信息
C.用户自定义网络
1.包括三种:桥接网络、Overlay网络、插件网络
2.桥接网络:
-
系统默认的桥接是docker0
-
使用docker network create —driver bridge mynet创建mynet桥接网络
-
通过—net属性将容器挂接到mynet中
-
在同一个桥接下,形成了一个私网,相互间是可以通信的,但这仅限于在同一台主机上
2.Overlay网络:
-
Overlay是一种虚拟交接技术,主要是解决不同IP地址段之间的网络通信问题,Docker使用的Overlay技术是VXLAN,是借助于libnetwork实现的
-
Overlay需要一个K-V服务来存储相关的主机信息,可以使用Consul、Etcd和ZooKeeper,Consul是默认的
-
Overlay主机还必须 开放UDP/4789和TCP/UDP/7946,分别用作数据通道和控制通道
六、容器的数据
A.数据卷
1.数据卷提供了一种主机和容器共享数据的方式,有些时候需要用它来做持久化和数据共享。当做持久化时,通常数据卷都会比较大,可以将其放在单独的磁盘、卷或者阵列上,这个时候容器只是一个执行环境。当做数据共享时,可以用于开发和测试分布式系统,如需要用到共享盘、处理fencing等
2.创建数据卷:主要通过-v属性来指定,-v [主机目录]:[容器目录]
3.任何时候都不要将宿主机的根目录映射到容器内部
B.使用数据型容器
1.把容器的卷分享给另一个容器用
2.创建一个包含外部卷的容器,只需要create即可
3.在另一个容器中通过—volumes-from来映射
C.备份、还原和迁移数据卷
1.-v $(pwd):xxxx,$(pwd)表示当前路径
D.容器和代码进行关联
1.数据卷的几个特点:
-
数据卷在容器创建时进行初始化
-
数据卷既可以共享,也可以在容器之间重用
-
对于数据卷的读写是直接下发的
-
Commit命令不会将改动保存到镜像中
-
即使容器被删除了,数据卷仍然存在,因此这一块需要特别注意,避免产生垃圾数据卷
七、镜像仓库
A.仓库相关的Docker命令
1.docker login -u username -p password,登录docker hub或第三方库
2.docker search mysql,查找mysql相关的库
3.docker pull mysql,拉取mysql镜像
4.docker push [OPTIONS] [server/][user/] image name[:TAG],提交镜像
八、镜像和容器的存储结构
A.镜像、容器和存储驱动的关系
1.每个镜像都由多个镜像层组成,这些镜像层是只读的,从下往上,以栈的方式组合在一起,组成容器的根文件系统
2.容器运行时,所有文件变化 的数据都保存在容器层中,如新建文件、修改文件、删除文件
3.Docker在管理镜像和容器时,使用写时复制技术,写时复制采用了共享和复制,针对相同的数据,系统只保留一份数据,所有操作都访问这一份数据。当有操作需要修改或添加数据时,操作系统会把这部分数据复制到新的地方,这个操作会在新的数据区修改或添加数据,其他操作仍然在旧的数据区读取原始数据
4.docker history命令,列出镜像的层信息
5.定时复制技术节约存储空间,加速容器的启动时间,
6.数据卷是宿主机上的一个文件或者目录,启动容器时,会把这个文件或目录挂载到容器中。数据卷不受存储驱动程序管理,数据卷中的数据读写操作会练过存储驱动程序,直接工作在宿主机的文件系统中。容器中挂载 的数据卷数量没有限制 ,多个容器也可以挂载同一个数据卷
B.如何选择存储驱动
1.使用哪种存储驱动取决于用户在宿主机上使用何种文件系统,一些存储驱动可以工作在不同的后端文件系统上,另一些存储驱动必须使用相同的后端文件系统
2.—storage-driver=<name>,设置存储驱动
3.考虑因素:没有哪种存储驱动能够适用于所有场景;每种存储驱动都在不断升级;
4.选择方向:稳定性;熟悉性;成熟性;Overlay和Overlay2
C.AUFS存储驱动
1.AUFS是一种Union FS,将不同的目录合并成一个目录,做成一个虚拟文件系统。AUFS为每个目录设置不同权限 ,并且可以实时的添加、删除、修改已经挂载好的目录
D.Devicemapper存储驱动
1.Devicemapper把镜像和容器存储在虚拟设备上,使用按需分配、写时复制快照技术管理镜像和容器,对块设备进行操作,而不是整个文件
2.在生产环境中应该使用Devicemapper的direct-lvm模式,该模式下,Devicemapper使用真实的块设备为存储介质,在块设备上建立thin pool
E.Btrfs存储驱动
1.Btrfs是下一代存储技术,使用了按需分配、写时复制和快照技术管理镜像和容器,目前还处于开发阶段,生产环境慎用
2.Btrfs把镜像层和容器层保存在独立的子卷或快照中,镜像中的基础层作为一个子卷保存,其他镜像卷和容器卷都作为快照保存
F.ZFS存储驱动
1.ZFS是下一代文件系统,提供卷管理、快照、校验、压缩、消重和多地复制等功能,如果开发者没有使用过ZFS,建议不要在生产环境使用
G.Overlay存储驱动
1.OverlayFS是一种联合文件系统,Linux内核4.0及以上版本支持Overlay2存储驱动
2.Overlay/Overlay2存储驱动很快,比AFUS和Devicemapper都要快,在某些场景下甚至快于Btrfs
九、定制Docker Daemon
A.修改Docker Daemon的三种方式
1.三种方式:命令行修改、修改启动项和修改配置文件,命令行时Docker Daemon运行在前端,适合调试,在生产环境中应使用另外两种方式
B.仓库相关配置
1.—disable-legacy-registry选项:设置不从旧版本的镜像仓库下载镜像
2.—registry-mirror选项:指定镜像仓库,可以设置多个镜像仓库
3.—insecure-registry选项:设置可以从不安全的镜像仓库下载镜像
C.安全相关配置
1.-p,—pidfile选项:设置Docker Daemon使用的pid文件,默认为/var/run/docker.pid
2.-H,—host选项:配置Docker Daemon监听的IP和端口
3.—tls,—tlscacert,—tlscert,—tlskey,—tlsverify选项:配置远程通信的TLS通信及相关证书
D.日志相关
1.-D,—debug选项:开房调试模式
2.—log-level,—log-driver,—log-opt选项:设置日志等级、日志格式等信息
E.存储相关配置
1.-g,—graph选项:设置Docker运行时的根目录
2.—storage-driver选项:配置Docker Daemon的存储驱动
3.—ostorage-opt选项:配置存储驱动的参数
F.网桥相关配置
1.—big选项:设置docker0的IP和子网掩码
2.—fixed-cidr,—fixed-cidr-v6选项:配置容器的IP范围
3.—mtu选项:配置docker0的最大会转单元长度
4.-b,—bridge选项:配置网桥
G.容器与外部通信
1.—ip-forward选项:会自动修改宿主机的ip_forward,默认true
2.—iptables选项:会在iptables中追加转发规则,默认true
3.—ip,—ipv6选项:设置IP地址
H.其他网络配置
1.—default-gateway、—default-gateway-v6选项:设置网关
I.excdriver配置
1—exec-opt选项:设置如何管理容器的CGroups,默认值为cgroupfs,可选systemd
2.—exec-root选项:设置execdriver使用的状态文件的根目录,默认为/var/run/docker
J.其他配置
1.—default-ulimit,设置一个用户能够使用的最大进程数,启动容器时为—ullimit参数
十、如何编写Dockerfile
A.本地编译镜像
1.加入.dockerignore,过滤不需要的文件
2.使用指定Dockerfile文件,-f
3.-t用于打标签
4.—no-cache,编译时不使用缓存
2.dockerignore文件
1.和git类似
C.Dockerfile格式
1.每条指令由指令+参数组成,中间以空格隔离,#为注释
2.一般指令大写,参数小写,第一条指令必须是FROM,设置基础镜像
D.Dockerfile指令详解
1.FROM指令:设置基础镜像,可以设置多个基础镜像,两条FROM指令之间的内容放在一个镜像中,tag和digest是可选项,忽略tag会使用latest镜像
2.MAINTAINER指令:设置镜像作者
3.RUN指令:生成一个新的容器,在容器中执行脚本,脚本正常执行完后,Docker daemon会把该容器提交为一个中间镜像,供后面的指令使用
4.CMD指令:设置容器的启动集合,只能有一条CMD指令,如果写了多条,只有最后一条生效
5.LABEL指令:设置镜像的标签,可以通过docker inspect查看标签,每个标签采用Key=Value的格式,不同标签之前通过空格隔离。每条指令会生成一个镜像层,一个镜像只能有127层,因此最好使用一条LABEL指令设置完成
6.EXPOSE指令:设置镜像暴露端口,记录容器启动时监听在哪些端口
7.ENV指令:设置镜像中的环境变量,支持读取环境变量的指令:ADD、COPY、ENV、EXPOSE、LABEL、USER、WORKDIR、VOLUME、STOPSIGNAL、ONBUILD
8.ADD指令:把文件复制到镜像中,ADD <src>..<dest>,src必须在编译目录中,src为URL时,如果dest结尾没有/则dest作为文件名保存在/tmp,如果有/,则dest作为存储目录,如果src为目录,复制目录内所有内容,包括文件系统的元数据,如果scr是压缩文件(identity,gzip,bzip2,xz)会解压成目录,如果src是文件则复制文件和元数据,如果src使用了通配符或是一个文件列表,则dest必须以/结尾,如果dest不以/结尾则为文件名,如果dest不存在,则ADD会自动创建dest及缺失的上级目录
9.COPY指令:把文件或目录复制到镜像中
10.ENTRYPOINT指令:设置容器的入口程序,计算器程序是容器启动时执行的程序,docker run命令中最后的命令将作为参数传递给入口程序,只有最后的ENTRYPOINT生效
11.VOLUMN指令:设置容器的挂载点
12.USER指令:设置执行RUN、CMD和ENTRYPOINT的用户名或UID
13.WORKDIR指令:设置RUN、CMD、ENTRYPOINT、ADD和COPY指令的工作目录
14.ARG指令:设置编译变量
15.ONBUILD指令:设置子镜像的编译钩子指令,当从父镜像生成子镜像时,子镜像编译过程中,首先会执行父镜像中的ONBUILD指令
16.STOPSIGNAL指令:设置容器退出时,Docker Daemon向容器发送的信号量
E、CMD、ENTRYPOINT和RUN的区别
1.RUN指令是设置编译镜像时执行的脚本和程序,镜像编译完成,RUN指令的生命周期结束
2.CMD叫作容器默认启动命令,在docker run末尾添加Command即可替换掉CMD设置的启动程序
3.ENTRYPOINT叫做入口程序,不能被docker run末尾的Command替换,末尾的Command会被当做字符串,传递给ENTRYPOINT作为参数,可以在docker run中加入—entrypoint替换镜像中的入口程序
4.一些规则 :
-
在Dockerfile中,应至少有一条CMD或ENTRYPOINT指令
-
当使用容器作为一个程序容器时,应使用ENTRYPOINT定义入口程序
-
在Dockerfile中,如果同时定义了ENTRYPOINT和CMD,CMD会作为参数传递给ENTRYPOINT
十一、Dockerfile最佳实践
A.基本原则
1.容器的生命期是短暂的
2.使用.dockerignore
3.只安装需要的包
4.每个容器只运行一个进程
5.减少镜像层
6.把多个参数排在不同的行中
7.编译缓存:Docker Daemon从基础镜像编译出新的镜像;针对ADD和COPY指令,Docker Daemon会检查镜像层中所有源文件的元数据和文件内容;除了ADD和COPY指令外,Docker Daemon在镜像缓存中寻找镜像层时,不会检查文件
B.Dockerfile指令最佳实践
1.RUN指令:具有可读性,apt-get的install和update必须在一行执行,尽量在一条指令中安装需要的包
2.CMD指令:应尽量使用JSON格式,不要使用CMD设置ENTRYPOINT的参数
3.EVN指令:使用容器对外提供服务时,最好通过环境变量设置服务相关配置
4.ADD和COPY指令:推荐使用COPY指令,因为功能更单一,仅把编译目录中的文件复制到镜像中,而ADD还会解压文件并支持远端复制
5.ENTRYPOINT指令:当需要把容器当作一个命令行工具使用时,最好通过ENTRYPOINT指令设置镜像的入口程序
6.VOLUME指令:如果需要在容器中,对数据库、配置文件、用户上传文件夹等文件目录做数据持久化,可以使用VOLUME指令导出这些文件和目录;容器会在主机的/var/lib/docker/volumes目录中创建对应的目录挂载到容器中;
7.WORKDIR指令:设置Dockerfile中其他指令的工作目录,就使用绝对路径
8.USER指令:如果容器中的应用程序不需要特殊权限,则可以通过USER指令把应用程序的所有者设置为非root用户
9.ONBUILD指令:在基础镜像中设置钩子指令,子镜像会先执行基础镜像的ONBUILD设置的指令
C.如何减小镜像体积
1.避免apt/yum update
2.每条指令都会生成一个镜像层,每个镜像层都会占用一些磁盘空间
3.应该在一条RUN指令中,更新安装源、安装程序、清理缓存,这样可以减少镜像体积
十二、使用容器提供服务
A.使用容器提供数据库服务
1.查看启动mysql容器时可以添加的选项:docker run -it —rm mysql —verbose —help
2.-e EVNIRONMENT,可以配置环境变量
3.mysql相关目录:/etc/mysql/my.cnf、/etc/mysql/conf.d/、/var/lib/mysql/
4.mongodb相关目录:/data/db/
B.使用容器提供Web服务
1.apache相关目录:/usr/local/apache2/htdocs/、/usr/local/apache2/conf/httpd.conf
2.gitlab/gitlab-ce(git仓库)相关目录:/etc/gitlab,配置文件、/var/opt/gitlab,保存git所有版本库、/var/log/gitlab,日志
十三、建立私有镜像仓库
1.registry,镜像仓库容器,镜像存储目录:/var/lib/registry,配置文件:/etc/docker/registry/config.yml
十四、Docker常见问题
1.虚拟化就是在一台主机上运行多个相互隔离的实例,这包含两层意思,一是相互隔离,即彼此之间没有影响;二是实例,既可以是一个完整的操作系统
到此,相信大家对“Docker原理、架构与应用是什么”有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/143772.html