当前位置: 首页 > Linux

Docker快速入门

时间:2023-04-06 06:52:25 Linux

Docker核心概念及入门什么是dockerDocker是一个开源软件项目,在软件容器下自动化部署应用程序,从而在Linux操作系统上提供一个额外的软件抽象层,以及运行的自动管理机制系统层虚拟化。Docker利用Linux内核中的资源分离机制,如cgroups,以及Linux内核命名空间(namespaces),来创建独立的容器(containers)。这在单个Linux实体下工作,避免了启动虚拟机的开销。Linux内核对命名空间的支持,将应用在工作环境中的视野完全隔离,包括进程树、网络、用户ID、挂载的文件系统,而核心cgroups提供资源隔离,包括CPU、内存、块I/O、网络.从0.9版本开始,Dockers在使用libvirt的LXC和systemd-nspawn提供的抽象虚拟化接口的基础上,开始包含libcontainer库作为直接使用Linux内核提供的虚拟化设施的一种方式,Docker版本介绍Docker可用有两个版本:社区版(CE)企业版(EE)Docker社区版(CE)非常适合希望开始使用Docker并试验基于容器的应用程序的个人开发人员和小型团队。DockerEnterpriseEdition(EE)专为企业开发和IT团队而设计,他们可以在生产环境中大规模构建、发布和运行关键业务应用程序功能社区版企业版基础版企业版标准企业版高级版容器引擎和内置编排、网络、安全是是经过认证的基础设施、插件和ISV容器由来已久,比较出名的是集成到主流Linux内核中的LXC项目。通过限制操作系统的资源访问,将容器构建成独立的资源池,让应用程序可以运行在一个相对隔离的空间,容器之间也可以相互通信。与虚拟化技术相比,容器技术比虚拟化更轻量级,消耗的资源也少得多。容器操作也更快,启动和停止比虚拟机更快。但是Docker容器需要和宿主机共享操作系统内核,不能像虚拟机那样运行一个独立的内核。Docker是基于LXC技术,基于GO语言开发,遵循Apache2.0协议开源的容器引擎。Docker的发展得益于为用户提供了更好的容器操作界面。它包含了容器、镜像、网络等一系列管理工具,可以让用户轻松创建和使用容器。Docker支持将应用程序打包到一个可移植的容器中,重新定义了应用程序开发、测试、部署和启动的过程。核心概念是一次构建,随处运行。Docker容器技术的一个典型应用场景是在开发和维护上提供持续集成和持续部署服务。镜像Docker的镜像概念类似于虚拟机中的镜像。它是一个只读模板和一个独立的文件系统,包括运行容器所需的数据,可以用来创建一个新的容器。可以基于Dockerfile构建镜像,Dockerfile是一个包含多个命令的描述文件,每个命令都会为底层文件系统创建一个新的层次结构。用户可以通过编写Dockerfile来创建新的镜像,也可以直接从github等DockerHub下载镜像使用。容器Docker容器是从Docker映像创建的运行实例。Docker容器类似于虚拟机,可以支持启动、停止、删除等操作,各个容器之间相互隔离,但隔离效果不如虚拟机。一个特定的应用程序将在容器中运行,包括应用程序特定的代码和所需的依赖文件。在Docker容器中,每个容器之间的隔离是使用Linux的CGroups和Namespaces技术实现的。其中,CGroups限制对CPU、内存、磁盘等资源的访问,Namespaces提供环境隔离。仓库如果你用过git和github,就很容易理解Docker的仓库概念。Docker仓库相当于github上的代码仓库。Docker仓库用于存放镜像的位置。Docker提供了一个注册服务器(Registry)来存放多个仓库,每个仓库可以包含多个不同标签的镜像。Docker使用的默认存储库是DockerHub公共存储库。仓库支持的操作类似于git。创建新镜像后,我们可以push提交到仓库,或者从指定仓库拉取镜像到本地。Docker有以下组件:1.Docker服务器守护进程(serverdaemon)用于管理所有的容器。2.用于控制服务器守护进程的Docker命令行客户端。3.Docker镜像:查找和浏览docker容器镜像。Docker特性文件系统隔离:每个进程容器运行在一个完全独立的根文件系统中。资源隔离:可以使用cgroups为每个进程容器分配不同的系统资源,如CPU、内存等。网络隔离:每个进程容器运行在自己的网络命名空间中,有自己的虚拟接口和IP地址。Copy-on-write:根文件系统使用copy-on-write创建,部署速度极快,节省内存和硬盘空间。日志记录:Docker会收集并记录每个进程容器的标准流(stdout/stderr/stdin),用于实时检索或批量检索。更改管理:可以将对容器文件系统的更改提交给新映像并重新使用以创建更多容器。无需模板或手动配置。交互式Shell:Docker可以分配一个虚拟终端并将其附加到任何容器的标准输入,例如运行一次性交互式shell。Docker的两个基本概念images和containerContainer和Image在Docker的世界里,Image指的是一个只读层(Layer)。这里的layer就是AUFS中的概念。最直观的方法就是看Docker官方给的图。:Docker使用了一个叫做AUFS的文件系统,它允许你一层一层地叠加和修改你的文件。底层文件系统是只读的。如果需要修改一个文件,AUFS会增加一个Write层(Layer),这样有很多好处。比如不同的Container可以共享底层的只读文件系统(同一个Kernel),这样你就可以同时运行N个Container而不至于让你的硬盘爆满!这个只读层是Image!如您所见,可写层是Container。图像和容器有什么区别?很简单,它们之间的区别只是一个只读层和一个可写层。你可以使用dockercommit命令将你的Container变成Image,即提交你正在运行的Container的修改内容。成为一个新的只读Image,这与gitcommit命令非常相似。Docker的前期准备与安装(基于CentOS7安装DockerCE)Docker要求CentOS系统内核版本高于3.10,安装前需要验证CentOS版本是否支持Do??cker。#查看当前内核版本的命令$uname-r#更新yum$sudoyummakecachefast#安装yum-utils$sudoyuminstallyum-utils#使用以下命令设置稳定的存储库$sudoyum-config-manager--add-repohttps://download.docker.com/linux/centos/docker-ce.repo#卸载旧版本(如果你已经安装了旧版本)$sudoyumremovedockerdocker-commondocker-selinuxdocker-engine#需要安装yum-util提供了yum-config-manager功能,另外两个依赖于devicemapper驱动。$sudoyuminstall-yyum-utilsdevice-mapper-persistent-datalvm2#安装Docker$sudoyuminstalldocker-ce#启动、停止和重启Docker服务$systemctlstart|停止|restartdocker.service#设置启动和关闭服务$systemctlenable|disabledocker.service#验证是否安装成功(有client和service两部分,说明docker安装和启动都成功)$dockerversion[root@localhost~]#dockerversionClient:Version:18.03.0-ceAPI版本:1.37Go版本:go1.9.4Git提交:0520e24内置:2018年3月21日星期三23:09:15OS/Arch:linux/amd64实验:falseOrchestrator:swarmServer:引擎:版本:18.03.0-ceAPI版本:1.37(最低版本1.12)Goversion:go1.9.4Gitcommit:0520e24Built:WedMar2123:13:032018OS/Arch:linux/amd64Experimental:false[root@localhost~]##验证docker是否运行hello-world镜像已经正确安装$sudodockerrunhello-worldDocker的常用操作#搜索镜像(我这里是搜索tomcat镜像)$dockersearchtomcat#下载镜像(从搜索到的镜像列表中选择一个下载,我这里下载的是centos官方镜像,速度会有点慢,耐心等待)$dockerpulltomcat#列出本机镜像$dockerimages#根据镜像创建容器,运行后退出$dockerrun[centos]/bin/echo'Helloworld'#运行一个交互式容器,-t表示在容器中指定一个伪tty。#-i表示创建交互式连接。命令运行后,会进入shell交互界面,可以执行任意命令。$dockerrun-t-icentos/bin/bash#创建一个容器,名字为$dockerrun-d--namemywebcentos/bin/bash#start/stop/forcestop/restartacontainer$dockerstart/stop/kill/restart[container]#删除一个容器$dockerrm[container]#输入容器内容$dockerexec-it[container]/bin/bash#列出正在运行的容器,[-a]列出所有状态的容器,[-l]仅列出最后启动的容器。$dockerps[-a][-l]docker容器常用软件安装过程中在docker中运行mysql#-p3306:3306:表示本容器使用3306端口(第二个)映射到端口号本机为3306创建容器(首先)#dockerrun-d\--namemysql\-p3306:3306\-eMYSQL_ROOT_PASSWORD=[password]\-v/xxx/mysql:/var/lib/mysql\-v/etc/my.cnf:/etc/my.cnfmysql:5.7.23#创建用户createuser'user'@'%'identifiedby'password';#authorizegrantreplicationslaveon*.*to'user'@'%';#Refreshflushprivileges;在docker中运行redis#运行一个docker容器dockerrun-d\--nameredis\-p6379:6379\-v/xxx/redis:/dataredisredis-server\--appendonlyyes\--requirepass"[password]"#参数详解dockerrun\#端口映射host:container-p6379:6379\#映射数据目录rw进行读写-v/xxx/data:/data:rw\#挂载配置文件roasreadonly-v/xxx/conf/redis.conf:/etc/redis/redis.conf:ro\#给一些权限--privileged=true\#给容器起个名字--nameredis\#启用数据持久化--appendonlyyes\#Deamon运行服务使用指定的配置文件-dredisredis-server/xxx/conf/redis.confrunnexusdockerrunindocker-d\-p8080:8080\--namenexus\-v/xxx/联系:/var/联系数据\--restart=alwayssonatype/nexus3docker中运行Jenkinsdockerrun-d\-p8080:8080\-p50000:50000\--namejenkins\--privileged=true\-v/xxx/jenkins:/var/jenkins_homejenkinsdocker中安装gitlabdockerrun--detach\--hostname120.76.77.230\--publish444:443\--publish8088:8088\--publish25:22\--namegitlab\--restartalways\--volume/xxx/gitlab/config:/etc/gitlab\--volume/xxx/gitlab/logs:/var/log/gitlab\--volume/xxx/gitlab/data:/var/opt/gitlab\gitlab/gitlab-CE:最新