一、Dockerfile的构建 1、指定镜像 采用FROM指令:FROM指定镜像名称 2、设置标签信息 对镜像进行备注说明:LABELmanageradminlabel1dockerbuild1lable2dockerbuild2 3、运行命令 容器运行后,执行的指令RUNechodockerbuildrun。 4、容器启动指令CMDsleep6;echostartsuccess 5、Dockerfile的编写示例Dockerfile使用的镜像FROMalpine镜像标签配置LABELmanageradminlabel1dockerbuild1lable2dockerbuild2运行的指令RUNechodockerbuildrun。容器启动后的执行命令CMDsleep6;echostartsuccess Dockerfile主要分为四部分:镜像信息、维护信息、操作指令、启动时执行指令。 CMD与ENTRYPOINT的差异:1。CMD指令指定的容器启动时命令可以被dockerrun指定的命令覆盖,而ENTRYPOINT指令指定的命令不能被覆盖,而是将dockerrun指定的参数当做ENTRYPOINT指定命令的参数;例:CMD〔ls,a〕dockerrunxxxl会替换为l执行,会报错。2。CMD指令可以为ENTRYPOINT指令设置默认参数,而且可以被dockerrun指定的参数覆盖;例:ENTRYPOINT〔ls,a〕dockerrunxxxl会拼接为lsal执行。 如果运行JAVA程序,增加ENTRYPOINT:ENTRYPOINT〔sh,c,javaDjava。security。egdfile:dev。urandomJAVAOPTSjarapp。jarPARAMS〕运行命令dockerruneJAVAOPTSXmx512mXms33ePARAMSspring。profilesdevserver。port8080jarappapp。jar 6、运行容器dockerrunnametest1itdockerfile:test1 7、镜像的存储 查看镜像信息:dockerimageinspectmywizard:0。1 存储目录结构:GraphDriver:{Data:{LowerDir:varlibdockeroverlay2b7e19d896235074801e65678900f1eb9e3d42a15961e1c5776e821a48c508602diff:varlibdockeroverlay294c244b15f5d5290dc48ea41fe90e30292169c1ad1316b4b4508a26043a03889diff:varlibdockeroverlay251e4f5054f8035f78df429174458d3511c75086bacd9bc22727ba3b4bdf1ee17diff:varlibdockeroverlay2fe000be05464f9548d95b24c0773ec5fbefd9f18bc6b393d2fe2731e9bd5b929diff:varlibdockeroverlay2d257f693e8aa47470bb2a0ea82fcc833d5560e3b471cb008b8d00ff29979e90cdiff:varlibdockeroverlay23648999483d13c18d34f00d90d843b3aca2abfdc946180730593fecb8585c673diff:varlibdockeroverlay23f469b0f602b3f8bf2d85a867652cb045c86bb44da93599a440c6af66c8c4702diff:varlibdockeroverlay274114f4a8911f8bee5a793d16b9e66417033aaa3b2763920fd4e7203f2a83aebdiff:varlibdockeroverlay27fe7e08fc852d57d1cdf3d8ffce3969da42af3f7c82f01b06501364f86cd615cdiff:varlibdockeroverlay2b59d29226dd54f956383976ee17c2098e351fe73ec27794e35740a4af0467a19diff:varlibdockeroverlay283054ea9dfefb4e0f666a640f82476be7b6ee2f0e050b9afc486a7eef755a0f1diff:varlibdockeroverlay2298e882043803bbafefbbcdd98cdc78df14f4bfa789867be918c60291d1b2ba4diff:varlibdockeroverlay22eed01572ca6f1212afceff327c71b4d6bb92033b17ce7ec1476d72afed7b194diff:varlibdockeroverlay23284164b93f7945defcbb61bb7eb0d78989b69acd0f20acb2a04b3ac9f6478f1diff:varlibdockeroverlay22927eeb30fe0e11cb65dd08a196b9f63e9fd5f6e689aa2e71c58be47d043bef9diff:varlibdockeroverlay292a64758e128809c3d6a5ce4bda56f231d969c9915cdc6891031dfaa13c5bf40diff:varlibdockeroverlay2ad0138bb13e3a6549a967a03be1338680fa79d65f77df0a24e3e3905fa31bb49diff:varlibdockeroverlay23dd833c5349e77df38958ab59080311227c84dffd9e85d476d137ad5404a8417diff:varlibdockeroverlay219b0730a578cbdf1bde44a7c0296c6dcff39d46154435370231e0b090f2989f8diff:varlibdockeroverlay2a4b2e0843b03de43dec536f958cb46072c8b5f33bc4cc2429eb92e098d6c3869diff:varlibdockeroverlay2e659df56cceb80589bfd6d68df3ef703773450158f4f682f5c2b3ac05308264ddiff:varlibdockeroverlay22e950590bd3aff9d24c436e45a8f53afbc6a5dec7c3cf86223473fa6953dffdadiff:varlibdockeroverlay2f82ab6a6e0611a78a95611d281245b2c2edfaa273d29d88de989b081f79651bbdiff:varlibdockeroverlay2c0c628c8cdf5641f1642eff0f42a5f12ab178cb596e6bce7a86efe725a7da333diff:varlibdockeroverlay21041b58a07cfbf956c4a2a2ff2adc93ef1e3f85813dab0bac069452837c5f9fadiff:varlibdockeroverlay20247958590c10ef1c20789c2131413b668357348af09955ac8f118b8723d7f5fdiff:varlibdockeroverlay2a8896150c3e359092e2e6d62b755c440e13ee4f8db990135800e0ef46d7894c1diff,MergedDir:varlibdockeroverlay266e9b11cf699cbdc26eac8dfd363274ac0cf601804ae79999c31265899204d4amerged,UpperDir:varlibdockeroverlay266e9b11cf699cbdc26eac8dfd363274ac0cf601804ae79999c31265899204d4adiff,WorkDir:varlibdockeroverlay266e9b11cf699cbdc26eac8dfd363274ac0cf601804ae79999c31265899204d4awork},Name:overlay2},二、DockerCompose的使用 1、安装DockerCompose 进入https:github。comdockercomposereleases检索docker引擎所对应的版本: 2、执行安装:curlSLhttps:github。comdockercomposereleasesdownload1。29。0dockercomposelinuxx8664ousrlocalbindockercomposesudochmodxusrlocalbindockercompose 3、创建一个python应用脚本 app。pyimporttimeimportredisfromflaskimportFlaskappFlask(name)cacheredis。Redis(hostredis,port6379)defgethitcount():retries5whileTrue:try:returncache。incr(hits)exceptredis。exceptions。ConnectionErrorasexc:ifretries0:raiseexcretries1time。sleep(0。5)app。route()defhello():countgethitcount()returnHelloWorld!Ihavebeenseen{}times。。format(count) 创建依赖信息文件: requirements。txtflaskredis 4、创建Dockerfile文件syntaxdockerdockerfile:1FROMpython:3。7alpineWORKDIRcodeENVFLASKAPPapp。pyENVFLASKRUNHOST0。0。0。0RUNapkaddnocachegccmusldevlinuxheadersCOPYrequirements。txtrequirements。txtRUNpipinstallrrequirements。txtEXPOSE5000COPY。。CMD〔flask,run〕 5、执行构建 创建名称为web的镜像dockerbuildtweb。 6、创建dockercompose配置文件version:3。9指定版本号;查看文档https:docs。docker。comcomposecomposefileservices:所有需要启动的服务web:第一个服务的名字build:可手动执行创建镜像:dockerbuildtxxxfDockerfile。dockerfile:Dockerfilecontext:。image:hello:pyports:指定启动容器暴露的端口5000:5000redis:第二个服务的名字image:redis:alpine 7、启动执行: 通过命令启动:dockercomposeup 加上d参数,以后台方式启动。〔rootlocalhostcomposetest〕dockercomposeupStartingcomposetestweb1。。。doneStartingcomposetestredis1。。。doneAttachingtocomposetestredis1,composetestweb1redis11:C04Nov202217:19:23。281oO0OoO0OoO0OoRedisisstartingoO0OoO0OoO0Ooredis11:C04Nov202217:19:23。281Redisversion7。0。5,bits64,commit00000000,modified0,pid1,juststartedredis11:C04Nov202217:19:23。281Warning:noconfigfilespecified,usingthedefaultconfig。Inordertospecifyaconfigfileuseredisserverpathtoredis。confredis11:M04Nov202217:19:23。281monotonicclock:POSIXclockgettimeredis11:M04Nov202217:19:23。282Runningmodestandalone,port6379。redis11:M04Nov202217:19:23。282WARNING:TheTCPbacklogsettingof511cannotbeenforcedbecauseprocsysnetcoresomaxconnissettothelowervalueof128。redis11:M04Nov202217:19:23。282Serverinitializedredis11:M04Nov202217:19:23。282WARNINGovercommitmemoryissetto0!Backgroundsavemayfailunderlowmemorycondition。Tofixthisissueaddvm。overcommitmemory1toetcsysctl。confandthenrebootorrunthecommandsysctlvm。overcommitmemory1forthistotakeeffect。redis11:M04Nov202217:19:23。282LoadingRDBproducedbyversion7。0。5redis11:M04Nov202217:19:23。282RDBage605secondsredis11:M04Nov202217:19:23。282RDBmemoryusagewhencreated0。82Mbredis11:M04Nov202217:19:23。282DoneloadingRDB,keysloaded:1,keysexpired:0。redis11:M04Nov202217:19:23。282DBloadedfromdisk:0。000secondsredis11:M04Nov202217:19:23。282Readytoacceptconnectionsweb1ServingFlaskappapp。pyweb1Debugmode:offweb1WARNING:Thisisadevelopmentserver。Donotuseitinaproductiondeployment。UseaproductionWSGIserverinstead。web1Runningonalladdresses(0。0。0。0)web1Runningonhttp:127。0。0。1:5000web1Runningonhttp:172。18。0。3:5000web1PressCTRLCtoquit 8、验证访问:〔rootlocalhostbin〕curlhttp:127。0。0。1:5000HelloWorld!Ihavebeenseen4times。〔rootlocalhostbin〕curlhttp:172。18。0。3:5000HelloWorld!Ihavebeenseen5times。 9、停止服务〔rootlocalhostcomposetest〕dockercomposestopredisStoppingcomposetestredis1。。。done〔rootlocalhostcomposetest〕dockercomposestopwebStoppingcomposetestweb1。。。done 这里的服务名字与dockercompose配置文件中的名称对应。三、DockerSwarm集群模式 1、创建Dockerfile 创建一个需要采用集群模式部署的Dockerfile:version:3。7services:app:定义应用程序的容器image:node:12alpinecommand:shcyarninstallyarnrundevports:3000:3000workingdir:appvolumes:。:appenvironment:MYSQLHOST:mysqlMYSQLUSER:rootMYSQLPASSWORD:secretMYSQLDB:todosnetworks:加入application和databases两个网络applicationdatabasesdeploy:安装dockerswarmreplicas:6指定副本:部署到加入swarm集群的不同的节点(负载均衡高可用)mysql:定义mysql数据库的容器image:mysql:5。7volumes:mysqldata:varlibmysqlenvironment:MYSQLROOTPASSWORD:secretMYSQLDATABASE:todosnetworks:这个服务加入hello自定义网络databasesdeploy:安装dockerswarmreplicas:6指定副本:处于不同的服务器(负载均衡高可用)redis:定义redis缓存的容器image:redisnetworks:application定义全局的配置信息,包括volumes与networksvolumes:mysqldata:networks:application:databases: 2、集群初始化 主节点进行初始化:〔rootlocalhost〕dockerswarminitSwarminitialized:currentnode(oyje6kmyqnot8fop89msrs1wf)isnowamanager。Toaddaworkertothisswarm,runthefollowingcommand:dockerswarmjointokenSWMTKN11iq2u7f21fty2wyih2xh6j8jzb87uiwi2gpqclg77ykii642kzbupmi5rixs4a7zaho7i8o8kjf10。10。20。15:2377Toaddamanagertothisswarm,rundockerswarmjointokenmanagerandfollowtheinstructions。〔rootlocalhost〕 其他节点加入执行:dockerswarmjointokenSWMTKN11iq2u7f21fty2wyih2xh6j8jzb87uiwi2gpqclg77ykii642kzbupmi5rixs4a7zaho7i8o8kjf10。10。20。15:2377 3、多个主节点的加入配置(高可用) 在集群主节点执行:〔rootlocalhost〕dockerswarmjointokenmanagerToaddamanagertothisswarm,runthefollowingcommand:dockerswarmjointokenSWMTKN11iq2u7f21fty2wyih2xh6j8jzb87uiwi2gpqclg77ykii642kz1dturcr1g93eak84d2jlvfbop10。10。20。15:2377 在其他集群主节点执行dockerswarmjointokenSWMTKN11iq2u7f21fty2wyih2xh6j8jzb87uiwi2gpqclg77ykii642kz1dturcr1g93eak84d2jlvfbop10。10。20。15:2377