【docker简介】一、什么是docker 官方地址:https:docs。docker。com Docker是一个基于go语言开发的开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。 二、docker核心概念 docker三大核心概念:镜像Image、容器Container、仓库Repository镜像(Image):Docker镜像(Image),就相当于是一个root文件系统。比如官方镜像ubuntu:16。04就包含了完整的一套Ubuntu16。04最小系统的root文件系统。容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。基于镜像可以创建容器,同一个镜像可以创建多个容器; docker 面向对象 容器 对象 镜像 类仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。镜像存放在仓库中,可以从仓库中拉取。 三、docker架构及原理 Docker使用客户端服务器(CS)架构模式,使用远程API来管理和创建Docker容器。架构上可以分为客户端和服务端;DockerDaemon是docker的守护进程;containerd是容器运行的进程,是实现容器的核心;客户端通过内部的API和服务端的守护进程进行交互,守护进程再通过containerd分发到各个容器; 概念 说明 Docker镜像(Images) Docker镜像是用于创建Docker容器的模板。基于镜像可以创建容器,同一个镜像可以创建多个容器; Docker容器(Container) 容器是独立运行的一个或一组应用,是镜像运行时的实体。 Docker客户端(Client) Docker客户端通过命令行或者其他工具使用DockerSDK(https:docs。docker。comdevelopsdk)与Docker的守护进程通信。 Docker主机(Host) 一个物理或者虚拟的机器用于执行Docker守护进程和容器。 DockerRegistryDocker仓库用来保存镜像,可以理解为代码控制中的代码仓库。 镜像仓库分为公共镜像仓库DockerHub和一些私有化部署的仓库比如:Harbor(这两种类似于github和gitlab) DockerHub(https:hub。docker。com)提供了庞大的镜像集合供使用。 一个DockerRegistry中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。 通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过仓库名:标签的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以latest作为默认标签。 DockerMachine DockerMachine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、DigitalOcean、MicrosoftAzure。四、docker轻量级的实现原理 docker容器本质上是宿主机的进程,Docker通过namespace实现了资源隔离,通过cgroups实现了资源限制,通过写时复制机制(copyonwrite)实现了高效的文件操作。namespace资源隔离 linux内核提拱了6种namespace隔离的系统调用: namespace 系统调用参数 隔离内容 UTS CLONENEWUTS 主机名或域名(sinceLinux2。6。19) IPC CLONENEWIPC 信号量、消息队列和共享内存(sinceLinux2。6。19) PID CLONENEWPID 进程编号(sinceLinux2。6。24) Network CLONENEWNET 网络设备、栈、端口等(sinceLinux2。6。24) Mount CLONENEWNS 挂载点(文件系统)(sinceLinux2。6。24) User CLONENEWUSER 用户组和用户组(startedinLinux2。6。23andcompletedinLinux3。8)五、docker的优缺点1。优点更高效利用系统资源更快速的启动时间一致的运行环境持续交付和部署更轻松的迁移2。缺点Docker是基于Linux64bit的,无法在32bit的linuxWindowsunix环境下使用Docker并非适合所有应用场景,Docker只能虚拟基于Linux的服务Docker实例是无状态的,不会保存当前操作行为的数据:容器销毁后,再次创建容器不会保存之前的数据,一种方法是通过数据挂载技术将数据挂载到宿主机指定目录来解决此问题,另一种方法是通过dockercommit命令来基于已有容器构建为新的镜像,从而达到环境持久化的目的。【docker安装与启动】一、docker安装与启动1。安装docker的几种方式1)安装最新版本docker 先卸载旧版本的dockeryumremovedockerdockerclientdockerclientlatestdockercommondockerlatestdockerlatestlogrotatedockerlogrotatedockerengine 指定Docker下载源(可选,适用于首次安装)yuminstallyyumutilsyumconfigmanageraddrepohttps:download。docker。comlinuxcentosdockerce。repo 安装Docker(默认安装最新版本)yuminstallydockercedockerceclicontainerd。io 验证是否安装成功dockerversion 2)安装指定版本的dockeryumlistdockerceshowduplicatessortr查看所有可用版本yuminstalldockerceVERSIONSTRINGdockercecliVERSIONSTRINGcontainerd。io安装指定版本 3)通过脚本一键安装docker 脚本内容如下:!binbashechosetdefaultdockerinstallrepoyuminstallyyumutilsyumconfigmanageraddrepohttp:mirrors。aliyun。comdockercelinuxcentosdockerce。repoechoinstalldocker。。。yuminstallydockercedockerceclicontainerd。iosystemctlstartdockersystemctlstatusdocker2。启动dockersystemctlstartdocker启动服务systemctlstatusdocker查看状态systemctlstopdocker停止服务systemctlrestartdocker重启服务二、创建第一个docker容器1。创建容器 按照国际惯例,先运行一个helloworld的容器dockerrunhelloworld如果网络等一切正常的话,会出现如下提示,表示容器已经创建成功Unabletofindimagehelloworld:latestlocallylatest:Pullingfromlibraryhelloworld2db29710123e:PullcompleteDigest:sha256:18a657d0cc1c7d0678a3fbea8b7eb4918bba25968d3e1b0adebfa71caddbc346Status:Downloadednewerimageforhelloworld:latestHellofromDocker!Thismessageshowsthatyourinstallationappearstobeworkingcorrectly。Togeneratethismessage,Dockertookthefollowingsteps:1。TheDockerclientcontactedtheDockerdaemon。2。TheDockerdaemonpulledthehelloworldimagefromtheDockerHub。(amd64)3。TheDockerdaemoncreatedanewcontainerfromthatimagewhichrunstheexecutablethatproducestheoutputyouarecurrentlyreading。4。TheDockerdaemonstreamedthatoutputtotheDockerclient,whichsentittoyourterminal。Totrysomethingmoreambitious,youcanrunanUbuntucontainerwith:dockerrunitubuntubashShareimages,automateworkflows,andmorewithafreeDockerID:https:hub。docker。comFormoreexamplesandideas,visit:https:docs。docker。comgetstarted2。查看容器dockerpsa查看所有容器创建成功,容器列表中就会有helloworld的容器,但名字不是helloworld,因为我们在运行容器时并未指定名称CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMESa07f1a8ea1a4helloworldhello21secondsagoExited(0)20secondsagoadoringchatterjee三、卸载docker1。常规方式卸载 停止docker服务systemctlstopdocker 搜索已经安装的docker安装包yumlistinstalledgrepdockerrpmqagrepdockeryumyremovedockerce。x8664yumyremovedockercecli。x8664yumyremovecontainerd。io。x8664 移除所有相关安装包yumyremovecontained。io。x8664 删除docker镜像及相关文件夹rmrfvarlibdocker2。脚本卸载 所谓的使用脚本安装和卸载,通俗理解就是把上述多个操作步骤的命令放在一个脚本中批量执行,内容如下:!binbashsystemctlstopdockeryumyremovedockerce。x8664yumyremovedockercecli。x8664yumyremovecontainerd。io。x8664rmrfvarlibdockerrmrfetcdockerdaemon。json【docker常用操作命令】一、镜像操作命令 命令 说明 pull 拉取镜像 search 搜索相关镜像 tag 重命名镜像 rmi 删除镜像 images或imagels 查看所有镜像 build 基于Dockerfile构建镜像 commit 基于已有容器构建镜像1。拉取镜像 使用dockerpull镜像名称,拉取远程仓库的镜像到本地(先校验本地是否存在,本地不存在时再默认从官网拉取最新版本的镜像) 以busybox为例: BusyBox是一个集成了三百多个最常用Linux命令和工具的软件。BusyBox包含了一些简单的工具,例如ls、cat和echo等等,还包含了一些更大、更复杂的工具,例grep、find、mount以及telnet。有些人将BusyBox称为Linux工具里的瑞士军刀。简单的说BusyBox就好像是个大工具箱,它集成压缩了Linux的许多工具和命令,也包含了Linux系统的自带的shell。dockerpullbusybox拉取镜像 在拉取镜像前,也可以通过dockersearch命令搜索不同类型的镜像dockersearchbusybox搜索相关镜像 2。查看镜像 使用dockerimagels或dockerimages命令查看本地已经存在的镜像dockerimages查看所有镜像dockerimagesgrepbusybox查看指定镜像 3。修改镜像名称 使用dockertag原始镜像名称新名称命令重命名镜像,如:dockertagbusybox:latestmybusybox:V1。0,重命名镜像会新增一条镜像,相当于创建了一个副本,但ID相同。dockertagbusybox:latestmybusybox:V1。0 4。删除镜像 使用dockerrmi镜像名称命令删除无用镜像,通过镜像名称删除,只会删除指定名称的镜像;通过镜像ID删除,会删除所有ID相同的镜像。dockerrmimybusybox:V1。0dockerrmifff4a8eb070e1 二、容器操作命令 容器操作命令: 命令 说明 create 创建容器 run 运行容器,runpullcreatestart exec。。。it。。。sh 进入容器内部 start 启动容器 restart 重启容器 stop 停止容器 rm 删除容器 commit 基于已有容器构建镜像 ps 查看容器状态:dockerpsa:查看所有容器dockerpsl:查看最近操作的容器 logs 查看容器日志:dockerlogs容器名:查看指定容器的运行日志dockerlogsf容器名:实时查看指定容器的运行日志 容器操作相关参数: 命令 说明 name 指定容器名称:name容器名name容器名 d 后台运行 p 映射端口,宿主机端口:容器端口,例如:p3307:3306 v 挂载目录到本地,宿主机目录:容器目录,例如:vusrlocalnginx:usrlocalnginx restart 自动重启,例如:restartalways,跟随docker服务的重启而重启1。创建容器 dockercreate(name容器名)镜像名,例如:dockercreatenamemybusyboxbusybox2。查看容器状态dockerpsa查看所有容器dockerpsagrepmybusybox过滤查看指定容器dockerpsl查看最近操作的容器 通过create命令创建完成后的容器是Created状态的,可以通过start命令来启动容器 3。启动容器dockerstartmybusybox4。进入容器 通过dockerexecit容器名sh命令进入容器内部,例如:dockerexecitmybusyboxsh5。运行容器 dockerrundockerpulldockercreatedockerstartdockerrunnamemynginxdp81:80nginx6。停止容器 dockerstop容器名或容器ID,例如:dockerstopmybusyboxdockerstop6fbf5a7a580b7。删除容器 dockerrm容器名或容器ID,删除前要先停止容器,例如:dockerstopmybusyboxdockerrmmybusyboxdockerrm6fbf5a7a580b8。查看容器日志dockerlogs容器名或容器ID:以文件形式查看日志,类似dockerlogs容器名或容器ID:实时查看日志,类似 例如:dockerlogssonicsonicservercontroller1dockerlogsfsonicsonicservercontroller19。基于已有容器构建为新的镜像模板 用法:dockercommit〔OPTIONS〕CONTAINER〔REPOSITORY〔:TAG〕〕 OPTIONS 释义 a 标注作者信息 c 使用Dockerfile指令来生成镜像 m 提交说明信息,类似于gitcommitmxxxx p 在提交时,暂停容器 例如:当前有个需求,将当前服务器上正在运行的一个容器,无痕迁移到另一台服务器上运行。意味着需要执行以下步骤: 将当前正在运行的容器构建为新的镜像A将新镜像A的镜像文件复制到另一台服务器或直接将镜像A提交到镜像仓库在另一台服务器上将镜像A从镜像仓库下载下来基于镜像A创建容器并运行 打包容器 为了便于演示,先将一个文件复制到已有容器内dockercpjdkinstall。shmysql:home 查看容器内文件dockerexecitmysqlsh 可以看到,已经将jdkinstall。sh文件复制到了mysql容器的home目录下: 基于容器构建新的镜像dockercommitachenjigangmysqlnewmysql 通过dockerimages命令查看当前镜像列表,可以看到名为newmysql的镜像: 基于新镜像运行容器dockerrundnamenewmysqlcontainereMYSQLROOTPASSWORD123456p3308:3306newmysql 查看容器内文件dockerexecitnewmysqlcontainersh 通过下图可以看出,之前复制到容器内的jdkinstall。sh文件,已经保存到镜像中、并跟随出现在新的容器内: 【docker使用技巧】一、更换镜像源 1。配置文件路径:etcdockerdaemon。json,若不存在则新建此文件{registrymirrors:〔http:registry。dockercn。com,http:docker。mirrors。ustc。edu。cn,http:hubmirror。c。163。com,http:cr。console。aliyun。com,https:8wb4g36l。mirror。aliyuncs。com〕} 2。配置完成后重启docker服务systemctlrestartdocker。service二、更换存储目录 docker安装完成后,默认存储路径为varlibdocker。创建容器后,每个容器的数据卷容量上限与varlibdocker所在的挂载的磁盘大小有关。例如下图所示:挂载的磁盘大小为50GB,则docker容器数据卷上限就是50GB,如果有多个容器,则这些容器共享50GB的容量,而且同时也与挂载磁盘下的其他目录共享使用。那么如果运行的容器数量较多,或是遇到需要存储大量数据如gitlab这类容器,50G显然就有些捉襟见肘。此时可以通过修改docker存储路径的方式扩容容器的容量上限。特别提一句,docker存储路径最好尽早修改,这样可以避免后期因磁盘写满导致的各种容器运行异常问题。 三种方式修改docker存储路径,分别为:1。方式一:修改docker配置文件 编辑docker配置文件viusrlibsystemdsystemdocker。service 使用graph或g参数指定存储位置ExecStartusrbindockerdgraphhomedockerhome 修改完成后重新加载配置文件并重启docker服务reload配置文件systemctldaemonreload重启dockersystemctlrestartdocker。service2。方式二:创建daemon。json文件 docker1。12或以上版本,可以创建或修改daemon。json文件来指定存储位置。docker查看版本命令dockerversionvietcdockerdaemon。json 在最后添加graph字段,定义docker目录{registrymirrors:〔http:registry。dockercn。com,http:docker。mirrors。ustc。edu。cn,http:hubmirror。c。163。com,http:cr。console。aliyun。com,https:8wb4g36l。mirror。aliyuncs。com〕,graph:homedockerhome} 修改完成后同样需要重新加载配置文件、重启docker服务systemctldaemonreloadsystemctlrestartdocker。service3。方式三:创建软链接(推荐) 前两种方式适用于首次安装docker后没有pull过镜像、创建过容器。即使修改了存储路径,因为没有镜像和容器,所以也不会产生任何影响。 创建软链接的方式,适用于已经创建过容器、并且容器已经产生数据的情况。这种方式可以避免对镜像及现有容器数据造成破坏,以及更改存储路径后找不到数据的情况。具体步骤如下: 查看docker路径 默认情况下Docker的存放位置为:varlibdocker,也可以通过如下命令查看docker存储路径dockerinfogrepDockerRootDir 停掉docker服务systemctlstopdocker 移动docker目录mvvarlibdockerhomedockerhome 创建软链接homedockerhome为源文件目录,也就是新设置的docker存储目录varlibdocker为软链接目标目录,与此目录建立链接后,相当于原来的docker配置保持不变,但真正的存储目录是其背后所指向的homedockerhomelnshomedockerhomevarlibdocker 启动docker服务systemctlstartdocker 修改完成后,我们可以通过以下命令查看docker的存储目录:dockerinfogrepRootDir修改成功会返回以下内容:DockerRootDir:homedockerhome 查看varlib目录,docker目录是一个软链接,指向homedockerhome,配置正确。 三、修改时区1。创建容器时设置时区 创建时增加映射使用主机时区vusrsharezoneinfoAsiaShanghai:etclocaltime2。创建容器后修改时区 查看宿主机时区 通过dateR命令可以看出,宿主机的时区为东八区,查看etclocaltime,可以看出localtime实际上是一个软链接,背后指向的是usrsharezoneinfoAsiaShanghai〔roottesthosthome〕dateRThu,08Sep202211:05:370800〔roottesthosthome〕lsletclocaltimelrwxrwxrwx。1rootroot358月2917:17etclocaltime。。usrsharezoneinfoAsiaShanghai 拷贝本地时区到docker容器内部dockercpusrsharezoneinfoAsiaShanghaidocker。ui:etclocaltime 进入容器内部查看时区dockerexecitdocker。uish进入docker。ui容器lsetc查看etc下是否存在已经复制的localtime文件dateR查看时区 通过下图可以看出,etc下已经存在了宿主机复制过来的localtime文件,时区为东八区,已经修正。 四、拷贝文件 主要用到dockercp命令1。从宿主机拷贝到容器 dockercp宿主机文件路径容器名:目录,例如:dockercpredislogmysql:home2。从容器内拷贝到宿主机 dockercp容器名:文件路径宿主机目录,例如:dockercpmysql:homemayflygo。sqlhome五、常见问题解决1。容器报错ipv4网络不可用运行容器时报错 如果是容器运行直接报这个错,解决方式: 在宿主机上执行echonet。ipv4。ipforward1usrlibsysctl。d00system。conf 重启network和docker服务systemctlrestartnetworksystemctlrestartdocker创建容器时报错 WARNING:IPv4forwardingisdisabled。Networkingwillnotwork。 如果是运行镜像、创建容器的时候报这个错,则直接重启docker服务:systemctlrestartdocker【docker一键快速搭建环境】1。docker一键搭建Jenkins拉取镜像dockerpulljenkins运行容器dockerrundnamejenkinsvhomejenkins:varjenkinshomep8088:8080urootrestartalwaysjenkins 前台访问:http:192。168。1。122:8088 注意:首次访问需输入密码,宿主机上密码文件路径为homejenkinssecretsinitialAdminPassword,或是进入容器内查看:varjenkinshomesecretsinitialAdminPassword 初始化完成后,原始密码文件自动删除: 2。docker一键搭建Gitlab拉取镜像dockerpullgitlabgitlabce创建gitlab环境变量exportGITLABHOMEhomegitlab运行容器dockerrundnamegitlaburootrestartalwaysvGITLABHOMEconfig:etcgitlabvGITLABHOMElogs:varloggitlabvGITLABHOMEdata:varoptgitlabp443:443p8081:80p2222:22gitlabgitlabce http:192。168。1。122:8081首次访问会提示修改密码,用户名为root 3。docker一键搭建Nginx 官网地址:https:hub。docker。commysql拉取镜像dockerpullnginx运行容器dockerrundnamemynginxp81:80nginx 浏览器端访问:http:192。168。1。123:81 4。docker一键搭建MySQL 官网地址:https:hub。docker。commysql拉取镜像dockerpullmysql运行容器dockerrundeMYSQLROOTPASSWORD123456namemymysqlp3307:3306mysql进入mysql容器dockerexecitmysqlsh登录mysqlmysqlurootp123456 mysql命令行操作 使用工具连接mysql数据库 5。一键搭建RabbitMQ拉取镜像dockerpullrabbitmq:3。7management启动容器dockerrunnamerabbitmqdrestartalwaysp15672:15672p5672:5672vhomerabbitmq:varlibrabbitmqrabbitmq:3。7management 注:如果dockerpullrabbitmq后面不带management,启动rabbitmq后是无法打开管理界面的,所以我们需要下载带management插件的rabbitmq 浏览器端访问:http:192。168。1。123:15672,登录账号和密码都是:guest 【dockerfile定制镜像】一、Dockerfile是什么?1。简介 Dockerfile是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。 2。作用 Dockerfile的作用:定制镜像,所谓定制镜像,就是以一个镜像为基础,在其上进行定制,丰富功能、提前作一些配置等。二、Dockerfile常用指令1。常用指令释义 指令 说明 FROM 指定基础镜像 MAINTAINER 增加说明信息,如维护者姓名邮箱等,非必须 RUN 执行具体的linux命令(用于构建镜像时执行相关的命令) USER 基于哪个用户运行容器 ADD 将本地的文件添加到镜像内(支持正则表达式拷贝,支持更多的文件类型的拷贝,如网络文件的下载后拷贝,ADDhttp:xxxxtest。tar。gztest) COPY 将本地文件拷贝到镜像内(只支持基本的文件、文件夹的拷贝,推荐使用COPY),最好将要拷贝的文件置于Dockerfile同一目录下 WORKDIR 目录切换指令,类似于linux的cd命令WORKDIRhomejenkinshomeconf等同于以下指令:WORKDIRhomeWORKDIRjenkinshomeconf EXPOSE 指定容器监听的端口,仅作为说明,不会真正生效,还是需要使用dockerrunp参数进行端口映射 CMD 类似于RUN指令,区别与CMD是在启动容器时执行相关的命令,CMDechohelloworld或〔ECHO,helloworld〕都可以,推荐使用后者列表形式 ENTRYPOINT 指定ENTRYPOINT参数后,使用dockerrunxxxx启动容器时,dockerrun后面的参数不会被覆盖 ENV 指定运行容器时的环境变量,格式为KEYVALUE或KEYVALUE,如ENVVERSION2。0在后续指令中可以使用VERSION进行替换2。0 VOLUME 数据栈声明,做匿名挂载用,假设指令为VOLUMEusrlocal,则在启动容器后会在服务器上docker默认路径varlibdockervolumes下自动生成一个文件夹,用于挂载usrlocal,常用于执行dockerrun命令时忘记指定v参数,从而自动保存一些重要的数据时使用2。CMD、ENTERPOINT、dockerrunxxx三者之间的区别与联系若指定了CMD〔ECHO,helloworld〕,同时使用了dockerrunp8080:80xxx,则dockerrun后面的参数会覆盖CMD后面的指令;若指定了ENTRYPOINT〔nginx〕,同时使用了dockerrunp8080:80xxx,则会把dockerrun后面的参数作为参数传递给ENTRYPOINT,与ENTRYPOINT后面的参数拼接起来;若CMD〔ECHO,helloworld〕,同时指定了ENTRYPOINT〔nginx〕,则会把CMD后的参数作为参数传递给ENTRYPOINT,与ENTRYPOINT后面的参数拼接起来; 总结:CMD相对更为灵活,用户可以通过dockerrun更改dockerfile中CMD的指令,而ENTRYPOINT则更为单一,使用dockerrun命令行参数启动容器时无法修改dockerfile中ENTRYPOINT的指令;3。Dockerfile示例自定义Dockerfile基于centos7镜像FROMcentos:7维护者信息MAINTAINERchenjigang基于root用户运行容器USERroot运行命令RUNechotestdockerfile。。。RUNmkdirphomedockerhome本地复制文件到镜像内COPYdockerinstall。shhomedockerhomedockerinstall。sh切换目录WORKDIRhomedockerhomeRUNlsalRUNyuminstallynettoolsRUNifconfigmysql示例 三、从Dockerfile构建镜像 Dockerfile创建完成后,可以使用dockerbuild命令根据Dockerfile构建一个镜像。Dockerbuild常用的指令包括两个参数:t指定镜像的名字f显示指定构建镜像的Dockerfile文件,若当前操作目录与Dockerfile文件处于同一目录,则使用。也可以,否则需使用f参数指定Dockerfile文件路径(注:Dockerfile命名为非固定命名,可更改) 基于上面第一个Dockerfile提交构建:运行当前目录下的Dockerfile文件,生成一个名为mycentos7的镜像dockerbuildtmycentos7。 如下图所示,运行dockerbuild构建镜像命令后,正在按照上述自定义的Dockerfile中的步骤顺序执行: 从下图可以看出,已经成功构建了一个镜像:mycentos7:latest 查看镜像列表,存在新构建的镜像mycentos7: 基于mycentos7镜像创建一个容器:dockerrunitnamemycentos7mycentos7:latestsh 此时,启动容器,进入镜像shell环境内会发现Dockerfile文件中定义的命令已生效:指定的dockerinstall。sh已复制到mycentos镜像的homedockerhome文件夹下;nettools工具已提前安装成功,ifconfig命令可以正常执行; 四、Dockerfile构建镜像原理 https:docs。docker。comdevelopdevelopimagesdockerfilebestpractices 每多一行命令,镜像就会多一层 【dockercompose容器编排】一、DockerCompose介绍1。简介 DockerCompose项目是Docker官方的开源项目,负责实现对Docker多容器编排管理系统。使用Dockercompose,可以用一个YAML文件定义一组要启动的容器,以及容器运行时的属性。DockerCompose的工程配置文件默认为dockercompose。yml 项目地址:https:github。comdockercompose 2。DockerCompose前世今生 DockerCompose的前身是Fig,现阶段DockerCompose是Docker官方的单机多容器管理系统(不能跨机器),它本质是一个Python脚本,它通过解析用户编写的yaml文件,调用DockerAPI实现动态的创建和管理多个容器。二、DockerCompose安装1。使用curl命令安装(推荐)下载DockerCompose的安装包sudocurlLhttps:github。comdockercomposereleasesdownload1。29。2dockercompose(unames)(unamem)ousrlocalbindockercompose修改DockerCompose执行权限sudochmodxusrlocalbindockercompose 2。使用PIP安装 需提前安装Python环境pipinstallUdockercompose三、DockerCompose常用指令组成 DockerCompose文件主要分为三部分:services(服务)、networks(网络)和volumes(数据卷) 1。常用指令说明 指令 说明 image 镜像名称,基于哪个镜像,使用现有的镜像 build 使用自定义的镜像,若当前dockercompose。yml和Dockerfile在同一路径下,则build的键值用。也可以,若不在同一路径下,或Dockerfile文件不是用的默认名称Dockerfile,则需指定Dockerfile的路径 command 启动镜像时用的命令,类似于Dockerfile中的CMD指令 containername 容器名称 dependson 指定服务启动顺序,如存在多个服务nginx、db、Jenkins时,则在Jenkins服务下定义dependson:db,会优先启动db服务 links 解决容器之间的链接,使用db可以链接到db服务,使用别名testdb也可以 ports 指定端口,端口映射时使用,类似于docker命令中的p参数 volumes 数据挂载时使用,类似于docker命令中的v参数2。dockercompose。yml示例 支持四种命名格式:dockercompose。yml,dockercompose。yaml,compose。yml,compose。yaml sonic私有云真机平台:http:192。168。1。20:3000IndexDevices 下面就以前面分享过的《开源云真机平台Sonic应用实践》中的sonic服务的dockercompose。yml为例,一起来看看上述指令的用法:version:3版本services:服务,sonicservereureka:容器名(sonic微服务注册中心)image:registry。cnhangzhou。aliyuncs。comsoniccloudsonicservereureka:v1。5。0releasehostname:sonicservereurekaenvironment:环境,读取配置文件中eureka的用户名密码等SONICEUREKAUSERNAMESONICEUREKAPASSWORDSONICEUREKAPORTSONICEUREKAHOSTsonicservereurekavolumes:目录映射。logs:logsnetworks:网络名sonicnetworkports:端口映射{SONICEUREKAPORT}:{SONICEUREKAPORT}sonicservergateway:容器名(sonic微服务网关)image:registry。cnhangzhou。aliyuncs。comsoniccloudsonicservergateway:v1。5。0releasehostname:sonicservergatewayenvironment:同样也是一些环境配置,用于和eureka容器通信SONICEUREKAUSERNAMESONICEUREKAPASSWORDSONICEUREKAPORTSONICEUREKAHOSTsonicservereurekaSECRETKEYEXPIREDAYvolumes:。logs:logsdependson:指定服务启动顺序,先启动sonicservereureka容器sonicservereurekanetworks:网络,各个容器必须处于同一网络下才能相互通信sonicnetworkrestart:onfailuresonicservercontroller:容器名image:registry。cnhangzhou。aliyuncs。comsoniccloudsonicservercontroller:v1。5。0releaseenvironment:环境配置,读取数据库、账号等配置SONICEUREKAUSERNAMESONICEUREKAPASSWORDSONICEUREKAPORTSONICEUREKAHOSTsonicservereurekaMYSQLHOSTMYSQLPORTMYSQLDATABASEMYSQLUSERNAMEMYSQLPASSWORDSONICSERVERHOSTSONICSERVERPORTSECRETKEYEXPIREDAYREGISTERENABLENORMALUSERENABLELDAPUSERENABLELDAPUSERIDLDAPBASEDNLDAPBASELDAPUSERNAMELDAPPASSWORDLDAPURLnetworks:sonicnetworkvolumes:。logs:logsdependson:sonicservereurekarestart:onfailuresonicserverfolder:image:registry。cnhangzhou。aliyuncs。comsoniccloudsonicserverfolder:v1。5。0releaseenvironment:SONICEUREKAUSERNAME 通过上述配置我们能够发现,dockercompose。yml这个配置文件,就是由前面我们介绍的一个个指令按照一定的格式、顺序、规则进行排列、相结合组成,从而实现不同容器的排编,相互通信,进而实现强大的功能。四、DockerCompose操作命令用法: DefineandrunmulticontainerapplicationswithDocker。 Usage: dockercompose〔f。。。〕〔profile。。。〕〔options〕〔〕〔COMMAND〕〔ARGS。。。〕 dockercomposehhelp1。dockercompose操作命令官方所有指令 常用指令 指令 说明 up 启动容器编排(前提是当前目录存在dockercompose。yml文件) down 删除容器编排,适用于dockercompose。yml文件发生变更、或安装出错时的卸载重装 ps 查看所有服务状态,类似于dockerpsa start 启动服务 stop 指定服务启动顺序,如存在多个服务nginx、db、Jenkins时,则在Jenkins服务下定义dependson:db,会优先启动db服务 logs 查看dockercompose操作日志2。dockercompose操作参数官方所有选项 常用选项 参数 说明 f 指定yml文件启动,当前目录下不存在dockercompose。yml文件时使用 d 后台运行3。容器编排操作实践启动容器编排dockercomposeup启动容器(前提是当前目录存在dockercompose。yml文件)dockercomposefdockercompose。ymlupd指定yml文件启动并设置后台运行 启动容器编排:创建网络创建并运行各个容器各个容器之间建立连接 在使用dockercomposeup和dockercomposedown命令时,若当前目录下不存在以下四种中的任一格式文件:dockercompose。yml,dockercompose。yaml,compose。yml,compose。yaml,或也未使用f参数指定其他文件时,会报错提示: 删除容器编排dockercomposedown 删除容器编排:停止各个容器移除各个容器删除容器创建的网络 查看容器状态dockercomposeps查看所有服务状态,类似于dockerpsa 启动服务dockercomposestart启动所有服务dockercomposestart〔SERVICE。。。〕启动指定服务dockercomposestart 停止服务dockercomposestop停止所有服务dockercomposestop〔options〕〔SERVICE。。。〕停止指定服务dockercomposestop 与down命令不同,stop只会停止相关容器,但不会删除相关容器 查看日志dockercomposelogs五、利用DockerCompose搭建wordpress博客系统 前面对一些常用指令作了说明,以及通过sonic前后台服务的dockercompose。yml案例对容器编排作了简单介绍,下面我们结合一个dockercompose搭建WordPress的案例来搭建我们自己的容器编排服务,官方配置文件内容如下:1。配置dockercompose。yml 官网地址:https:docs。docker。comcomposewordpressservices:db:Weuseamariadbimagewhichsupportsbothamd64arm64architectureimage:mariadb:10。6。4focalIfyoureallywanttouseMySQL,uncommentthefollowinglineimage:mysql:8。0。27command:defaultauthenticationpluginmysqlnativepasswordvolumes:dbdata:varlibmysqlrestart:alwaysenvironment:MYSQLROOTPASSWORDsomewordpressMYSQLDATABASEwordpressMYSQLUSERwordpressMYSQLPASSWORDwordpressexpose:330633060wordpress:image:wordpress:latestvolumes:wpdata:varwwwhtmlports:88:80restart:alwaysenvironment:WORDPRESSDBHOSTdbWORDPRESSDBUSERwordpressWORDPRESSDBPASSWORDwordpressWORDPRESSDBNAMEwordpressvolumes:dbdata:wpdata: 【注意】上述配置内容是可以自由修改的,并不一定要按照它的来,比如我本地就有MySQL,那就不需要再配置一个mysql或mariadb的容器yml文件中冒号后面要带空格,严格规范格式2。查看容器状态dockercomposepsa 3。前端访问 启动dockercompose,各个容器处于up状态,此时就可以访问前端页面,http:192。168。1。123:88,会先进行安装配置,如:设置数据库、站点取名 个人博客主页如下: 因为我是内网服务器,只能在局域网内访问,公网无法访问。如果你有一台带有公网的云服务器,如阿里云,那么妥妥的就可以搭建自己的个人网站了,这种对服务器要求不高,入门级的就可以。现在的云服务器都挺便宜,一年才几十块钱,像阿里云服务器个人用户可以免费体验一个月。关于WordPress详细搭建方法可以参考我前面介绍的《用2核2G的华为云服务器搭建WordPress博客系统》【docker镜像仓库】 在前面的文章中,我们介绍了如何定制镜像、容器编排,但仿佛对镜像管理并没有提及,那么镜像文件我们是否可以像管理代码一样实现push、pull的操作呢?答案是有的,dockerhub就是一款公共仓库,在上面可以搜索到别人创建好的各种各样的镜像,以及管理自己的镜像;Harbor是一款私有化镜像仓库,我们可以把镜像上传上去,同一内网下的其他用户均可以下载使用,因为是部署在自己的服务器,因此对于安全性这方面更有保障。dockerhub和Harbor的关系我们可以类比成GitHub和Gitlab。一、公共镜像仓库Dockerhub1。dockerhub简介 公共镜像仓库一般是Docker官方或者其他第三方组织(阿里云,腾讯云,网易云等)提供的,允许所有人注册和使用的镜像仓库。DockerHub是全球最大的镜像市场,目前已经有超过10w个容器镜像。 2。提交镜像到仓库 具体步骤:注册账号登录创建仓库linux命令行docker登录修改镜像名称(保持与仓库名称一致)提交镜像到仓库创建镜像仓库 类似于github上创建代码仓库,分为public(公开的,互联网可见)和private(受保护的,尽自己可见)两种。 Linux命令行登录Docker账号dockerlogin登录dockerhub 修改镜像名称,保持与镜像仓库一致dockertagjoinsunsoftdocker。ui:latestchenjigangautotest:v1。1 提交镜像到公共仓库dockerpushchenjigangautotest:v1。1 查看镜像仓库 二、私有化镜像仓库Harbor1。Harbor简介 Harbor是由VMware公司开源的企业级的DockerRegistry管理项目,它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能。 作为一个企业级私有Registry服务器,Harbor提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。Harbor支持安装在多个Registry节点的镜像资源复制,镜像全部保存在私有Registry中,确保数据和知识产权在公司内部网络中管控。另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。基于角色的访问控制用户与Docker镜像仓库通过项目进行组织管理,一个用户可以对多个镜像仓库在同一命名空间(project)里有不同的权限。镜像复制镜像可以在多个Registry实例中复制(同步)。尤其适合于负载均衡,高可用,混合云和多云的场景。图形化用户界面用户可以通过浏览器来浏览,检索当前Docker镜像仓库,管理项目和命名空间。ADLDAP支持Harbor可以集成企业内部已有的ADLDAP,用于鉴权认证管理。审计管理所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。国际化已拥有英文、中文、德文、日文和俄文的本地化版本。更多的语言将会添加进来。RESTfulAPIRESTfulAPI提供给管理员对于Harbor更多的操控,使得与其它管理软件集成变得更容易。部署简单提供在线和离线两种安装工具,也可以安装到vSphere平台(OVA方式)虚拟设备。 gitee地址:https:gitee。comprojectharborharbor?utmsourcealadingutmcampaignrepo2。Harbor搭建 安装说明:Harbor的所有服务组件都是在Docker中部署的,所以官方安装使用Dockercompose快速部署,所以需要安装Docker、Dockercompose。由于Harbor是基于DockerRegistryV2版本,所以就要求Docker版本不小于1。10。0,Dockercompose版本不小于1。6。0。 下载并解压安装包 在线下载:wgethttps:github。comgoharborharborreleasesdownloadv2。2。2harboronlineinstallerv2。2。2。tgztarxvfharboronlineinstallerv2。2。2。tgz编辑配置文件cpharbor。yml。tmplharbor。yml复制一份harbor。yml文件viharbor。yml 按照如下内容编辑:hostname改为本机ip端口默认80,可以改为其他指定端口注释掉https的相关配置 准备安装环境。prepare执行prepare脚本 执行完成后,本地会多一个dockercompose。yml文件和common目录 安装harbor。install。sh安装harbor 安装过程中会自动下载harbor镜像并启动相关容器。访问harbor 安装成功后,即可访问harbor:http:192。168。1。122:8087,其中:ip为本机ip,端口为配置文件harbor。yml中配置的端口。默认账号和密码为:adminHarbor12345 harbor。yml文件中可查看或修改密码 安装过程中常见问题及解决报错redis容器重复 原因:本地已存在redis容器,harbor无法启动redis容器 解决办法:修改harbor目录下dockercompose。yml中的redis容器名称,重新启动 dockercomposeupd 查看harbor各个容器状态: 报错registry容器重复 若本地之前已存在registry容器时,harbor安装过程会报错,解决方案:删除原registry容器,重新执行。install。sh进行安装;若此方式仍报错,则执行dockercomposeupd启动各个服务;3。推送本地镜像到Harbor创建项目 Docker登录 由于之前登录过dockerhub,所以再次使用dockerlogin命令登录时,默认登录的还是dockerhub的地址。因此,如果想要登录harbor,需要在登录时指定登录地址。dockerlogin192。168。1。122:8087 首次登录,根据提示输入harbor用户名及密码即可,与前端登录使用的账号密码一致。 由于我前面登录过一次这个地址,本地会保存认证记录,因此再次登录时无需输入用户名密码即可登录成功。 如遇以下报错: 则要在etcdockerdaemon。json文件中将本机ip(端口非80时需要带上端口号)加入到insecureregistries列表中,并重载配置。{registrymirrors:〔http:registry。dockercn。com,http:docker。mirrors。ustc。edu。cn,http:hubmirror。c。163。com,http:cr。console。aliyun。com,https:8wb4g36l。mirror。aliyuncs。com〕,insecureregistries:〔192。168。1。122:8087〕,graph:homedockerhome} systemctldaemonreloadsystectlrestartdocker 再次登录后登录成功: 本地镜像打tag 镜像名称需要命名为:ip:端口号项目名称镜像名:tag名,才能上传到该指定项目下,例如rabbitmq镜像,则名称为:192。168。1。122:8087harborrabbitmq:5。7。33 为了方便测试,我直接复制本地的一个镜像,并重新命名:dockertagrabbitmq:3。7management192。168。1。122:8087harborrabbitmq:3。7management 推送本地镜像到Harbordockerpush192。168。1。122:8087harborrabbitmq:3。7management 查看名为harbor的项目下,存在rabbitmq:3。7management,测试成功。 从Harbor拉取镜像拉取镜像dockerpull192。168。1。122:8087librarymysql:5。7。33 从下图可以看出,MySQL镜像已经拉取成功 同时,Harbor管理端也能看到最新的拉取时间: 创建容器dockerrunitdeMYSQLROOTPASSWORD123456namemysqlp3307:3306192。168。1。122:8087librarymysql:5。7。33 登录MySQL 【docker可视化管理工具DockerUI】一、简介 DockerUI是一款开源的、强大的、轻量级的Docker管理工具。DockerUI覆盖了dockercli命令行95以上的命令功能,通过可视化的界面,即使是不熟悉docker命令的用户也可以非常方便的进行Docker和DockerSwarm集群进行管理和维护。 DockerUI后端使用Go语言开发,前台框架使用CubeUI。通过DockerRestfulAPI,经过Go语言编写的Proxy端,实现和DockerDaemon进行通信,从而实现Docker的管理命令和维护命令。 官网:https:github。comgohutooldocker。ui二、特征Docker主机管理管理数据卷管理、镜像管理、容器管理、构建管理、仓库配置管理、网络配置管理Dockerswarm集群管理集群配置信息、节点管理、服务管理、任务管理、密码管理、配置管理任务安排Docker任务调度、dockerswarm任务调度三、安装1。常规方式安装1)下载docker。ui源码gitclonehttps:github。comgohutooldocker。ui。git2)安装golang运行环境 创建go文件夹cdhomemkdirgo 下载go压缩包并解压缩 https:golang。google。cndl,选择对应系统下载文件 也可以通过wget命令下载:wgethttps:golang。google。cndlgo1。19。1。linuxamd64。tar。gztarxvfgo1。19。1。linuxamd64。tar。gz 添加到环境变量 编辑etcprofile,添加如下内容:exportGOHOMEhomegolanggoexportPATHPATH:GOHOMEbin 重载环境变量sourceetcprofile 验证是否安装成功gohelp 出现以下信息表示安装配置成功: 3)项目配置 进入docker。ui项目目录,执行以下命令exportGO111MODULEonexportGOPROXYhttps:goproxy。cn,directgomodtidygomoddownloadgobuildoserver。执行完成后目录下会多出一个server文件4)启动服务。server2。通过容器安装1)拉取镜像dockerimagepulljoinsunsoftdocker。ui2)创建容器dockerrunrestartalwaysnamedocker。uidvhomedockerdatadocker。uidocker。sock:varrundocker。sockp8999:8999joinsunsoftdocker。ui3。浏览器访问 http:192。168。1。122:8999 默认账号密码:ginghan123456 四、操作快照镜像列表 搜索拉取镜像 构建镜像 导入导出镜像 推送镜像 执行镜像