Docker基础入门
Docker基本命令
Dockerfile用法
制作小镜像上
多阶段制作小镜像下
Scratch空镜像
Docker基础入门Docker:它是一个开源的软件项目,在Linux操作系统上,docker提供了一个额外的软件抽象层及操作系统层虚拟化的自动管理机制。
物理机:
安装系统
依赖环境
应用程序
多个物理机提高并发量
虚拟机:
把一个物理机虚拟机虚拟成多个机器
把依赖环境打成一个系统的模板
容器化:
镜像基础(依赖环境的镜像;根据基础镜像放入自己的代码或者包;按层存储)
启动时间特别快,秒级启动
容器:把自己的应用程序,根据某个依赖的基础镜像,生成一个应用程序镜像
应用程序镜像,可以运行在任何部署了Docker环境的机器上。
查看Docker版本
Docker详细信息
搜索镜像
拉取镜像
推送镜像
启动镜像
查看容器
查看日志
进入容器
复制文件
删除镜像
修改记录
保存状态
查看Docker版本[root@k8s-master01~]dockerinfoClient:Context:defaultDebugMode:false官方推荐的存储驱动,要求文件系统是xfs,必须支持d_type(目录条目类型,内核上的一个数据,安装系统的时候必须把ftype设置为1,不然的话很影响docker的性能),目前流行的StorageDriver有aufs(ubuntu支持)、overlay、brtfsBackingFilesystem:xfsSupportsd_type:trueNativeOverlayDiff:trueLoggingDriver:json-file容器编排工具,inactive未启动Runtimes:runcDefaultRuntime:runc内核版本低于3.18不能使用overlay2存储驱动,才加入的OperatingSystem:CentOSLinux7(Core)OSType:linuxArchitecture:x86_64CPUs:2TotalMemory:1.923GiBName:k8s-master01ID:PYSL:2OAV:4C7N:WAI3:7G3J:IBR5:6BXI:7OEG:YNCL:6RAR:3CTF:CTDDDockerRootDir:/var/lib/docker如果使用的非官方镜像仓库地址不是https,需要把链接加入到此非安全列表127.0.0.0/8LiveRestoreEnabled:falsexfs_info/meta-data=/dev/mapper/centos-rootisize=512agcount=4,agsize=1113856blks=sectsz=512attr=2,projid32bit=1=crc=1finobt=0spinodes=0data=bsize=4096blocks=4455424,imaxpct=25=sunit=0swidth=0blksnaming=version2bsize=4096ascii-ci=0ftype=1log=internalbsize=4096blocks=2560,version=2=sectsz=512sunit=0blks,lazy-count=1realtime=noneextsz=4096blocks=0,rtextents=0
进入DockerRootDir,进入任何一个容器目录既可查看对应容器的日志,每次docker重启的时候日志就会被清除
[root@k8s-master01~]lltotal0drwx-----x4rootroot165Jul1210:5410b58a593a5f417d466fbb2eba54c6ac0e8322a3712cbc6eb46f9cae5b48e4d8[root@k8s-master0110b58a593a5f417d466fbb2eba54c6ac0e8322a3712cbc6eb46f9cae5b48e4d8]vim/etc/docker/{"registry-mirrors":["","",""],"exec-opts":["=systemd"],"max-concurrent-downloads":10,并发上传的线程数"log-opts":{"max-size":"300m",日志保存最大数量},"live-restore":truedockersearchcentosNAME[OK]ansible/centos7-ansibleAnsibleonCentos7134[OK]consol/centos-xfce-vncCentoscontainerwith"headless"VNCsession…129[OK]jdeathe/centos-sshOpenSSH/Supervisor/EPEL/IUS/SCLRepos-…118[OK]centos/[OK]centos//centos6-lnmp-php56centos6-lnmp-php5658[OK]tutum/centosSimpleCentOSdockerimagewithSSHaccess48centos/postgresql-96-centos7PostgreSQLisanadvancedObject-Relational…45jdeathe/[OK]kinogmt/centos-sshCentOSwithSSH29[OK]guyton/centos6Fromofficialcentos6containerwithfullup…10[OK]nathonfowlie/centos-jreLatestCentOSimagewiththeJREpre-install…8[OK]centos/toolsDockerimagethathassystemsadministration…7[OK]drecom/centos-rubycentosruby6[OK]mamohr/centos-javaOracleJava8DockerimagebasedonCentos73[OK]darksheer/centosBaseCentosImage--Updatedhourly3[OK]miko2u/centos6CentOS6日本語環境2[OK]amd64//centos-7CentOS7imageforkitchen-dokken2indigo/centos-mavenVanillaCentOS7withOracleJavaDevelopmen…2[OK]mcnaughton/centos-basecentosbaseimage1[OK]blacklabelops/centosCentOSBaseImage!BuiltandUpdatesDaily!1[OK]starlabio/centos-native-buildOurCentOSimagefornativebuilds0[OK]smartentry/centoscentoswithsmartentry0[OK]OFFICIAL的值是ok代表官方容器,一般都是使用官方的
拉取镜像alpine可以作为基础镜像,拉取镜像的时候如果本地已经存在,则不会重复拉取
可以通过官网搜索镜像:
拉取镜像,如果本地已有该镜像,则不会重复拉取
[root@k8s-master01~]dockerimagesREPOSITORYTAGIMAGEIDCREATEDSIZEnginxlatest4cdc5dd7eaad7daysago133MBkubernetesui//dotbalo//dotbalo//dotbalo///dotbalo//dotbalo//google_containers/
镜像打标签到自己的镜像仓库
[root@k8s-master01~]d'thaveaDockerID,headoverto!Yourpasswordwillbestoredunencryptedin/root/.docker/
登录到指定仓库
推送镜像
[root@k8s-master01~]dockerrun-ticentos:8bashUnabletofindimage'centos:8'locally8:Pullingfromlibrary/centos7a0437f04f83:PullcompleteDigest:sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1Status:Downloadednewerimageforcentos:8[root@a4cb8f5d6bd5/]dockerrun-dcentos:8bash617a1213ae5ce5c4bed0716fd5b3212b25ed7bcc2099ba329db54cccd3c0b8d5[root@k8s-master01~]dockerpsCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES617a1213ae5ccentos:8"bash"AboutaminuteagoExited(0)Aboutaminuteagovigilant_boyd04b21dff00f5centos:8"bash"2minutesagoExited(0)2minutesagoobjective_satoshia4cb8f5d6bd5centos:8"bash"5minutesagoExited(127)2minutesagoreverent_elgamal
查看所有状态的容器
[root@k8s-master01~]dockerps-qa3db403fd0be8cd76e9123b3dbec965d88da610909969be1
查看所有的容器的id
[root@k8s-master01~]dockerlogs-fa3db403fd0be
对应日志路径
/var/lib/docker/containers/a3db403fd0be5eacb8aa1769cc8d215da93eb74da84262aa1aac11551c37a84d进入容器
启动容器
[root@k8s-master01~]
Xshell7新建一个链接到服务器
查看运行中的容器
[root@k8s-master01~]dockerexec-ti2ef850f11136shexit[root@k8s-master01~]dockerrun-tid-p12345:80nginx:latestb75ad319e61326e05905d41d67616112be51af4d1234f51bef5d21807e9bc42d[root@k8s-master01~]dockerexec-tib75ad319e613bashroot@b75ad319e613:/@b75ad319e613:/usr/share/nginx/htmlecho"testcp"[root@k8s-master01~]dockercpb75ad319e613:/usr/share/nginx/html/删除镜像
[root@k8s-master01~]dockerrmi4cdc5dd7eaadErrorresponsefromdaemon:conflict:unabletodelete4cdc5dd7eaad(cannotbeforced)-imageisbeingusedbyrunningcontainerb75ad319e613dockerrmb75ad319e613Errorresponsefromdaemon:Youcannotremovearunningcontainerb7575ad319e613b75ad319e613[root@k8s-master01~]dockerrmi4cdc5dd7eaadErrorresponsefromdaemon:conflict:unabletodelete4cdc5dd7eaad(mustbeforced)-imageisbeingusedbystoppedcontainercd2a20f47459[root@k8s-master01~]dockerrmi4cdc5dd7eaadUntagged:nginx:latestUntagged:nginx@sha256:353c20f74d9b6aee359f30e8e4f69c3d7eaea2f610681c4a95849a2fd7c497f9Deleted:sha256:4cdc5dd7eaadff5080649e8d0014f2f8d36d4ddf2eff2fdf577dd13da85c5d2fDeleted:sha256:63d268dd303e176ba45c810247966ff8d1cb9a5bce4a404584087ec01c63de15Deleted:sha256:b27eb5bbca70862681631b492735bac31d3c1c558c774aca9c0e36f1b50ba915Deleted:sha256:435c6dad68b58885ad437e5f35f53e071213134eb9e4932b445eac7b39170700Deleted:sha256:bdf28aff423adfe7c6cb938eced2f19a32efa9fa3922a3c5ddce584b139dc864Deleted:sha256:2c78bcd3187437a7a5d9d8dbf555b3574ba7d143c1852860f9df0a46d5df056aDeleted:sha256:764055ebc9a7a290b64d17cf9ea550f1099c202d83795aa967428ebdf335c9f7修改记录
[root@k8s-master01~]/google_containers/pause-amd64:3.2IMAGECREATEDCREATEDBYSIZECOMMENT80d28bedfe5d17monthsagoENTRYPOINT["/pause"]0/pause-amd64/pause拉取镜像[root@k8s-master01~]后台启动容器[root@k8s-master01~]获取容器ID[root@k8s-master01~]复制文件到容器中[root@k8s-master01~]提交修改记录[root@k8s-master01~]查看镜像[root@k8s-master01~]启动容器,加上--rm,则关闭之后会删除,不会产生大量状态为Exited的容器[root@k8s-master01~]cd/usr/share/nginx/html/root@c657e57078c1:/usr/share/nginx/htmlexitexitdockerpsDockerfile用法
Dockerfile指令
Dockerfile用法
Dockerfile指令FROM:继承基础镜像
MAINTAINER:镜像制作作者信息
RUN:用来执行shell命令
EXPOSE:暴露端口号
CMD:启动容器默认执行的命令
ENTRYPOINT:启动容器真正执行的命令
VOLUME:创建挂载点
ENV:配置环境变量
ADD:添加文件到容器
COPY:复制文件到容器
WORKDIR:设置容器的工作目录
USER:容器使用的用户
nginx官方Dockerfile:
继承alpine基础镜像
FROMalpine:%%ALPINE_VERSION%%
MAINTAINER:镜像制作作者信息,新版本推荐使用LABEL
LABELmaintainer="NGINXDockerMaintainersdocker-maint@"
执行shell命令
RUNset-x
apk是alpine安装包的工具
暴露端口号
EXPOSE80
启动容器默认执行的命令
CMD["nginx","-g","daemonoff;"]
CMD命令可以被覆盖,比如bash
[root@k8s-master01~]dockerrun-ti-ea=b-ec=d
ADD:复制文件到容器,如果复制压缩文件会自动解压
COPY:复制文件到容器,不会解压,直接复制
WORKDIR:设置容器的工作目录,如果有设置则进入容器时会进入到该目录下
USER:容器使用的用户,系统默认用户是root,但是在业务容器容器化的时候不建议使用root,因为不安全,可能会造成对宿主机有危险的操作
[root@k8s-master01~]mkdirdockerfiles[root@k8s-master01~]vimDockerfiledockerbuild-tcentos:/5:FROMcentos:8---300e315adb2fStep2/5:LABELmaintainer="testdockerfile"---Runningincccd20f9b0f5Removingintermediatecontainercccd20f9b0f5---f6dc016add09Step3/5:LABELtest=dockerfile---Runningine4d1962c630bRemovingintermediatecontainere4d1962c630b---3977dc88a2f2Step4/5:RUNuseraddmingsonzheng---Runningind3905f2c7dc4Removingintermediatecontainerd3905f2c7dc4---30968f5c2285Step5/5:RUNmkdir/opt/mingsonzheng---Runningin811c4ceb3e70Removingintermediatecontainer811c4ceb3e70---0cd811c2fadfSuccessfullybuilt0cd811c2fadfSuccessfullytaggedcentos:user
启动镜像
[root@k8s-master01dockerfiles]
调试的时候一定要加上--rm,不然会有很多Exited记录
查看用户
[root@828f29ae30bf/]vimDockerfileRUNuseraddmingsonzhengvimDockerfileRUNuseraddmingsonzheng/opt/mingsonzheng
构建镜像
[root@k8s-master01dockerfiles]mkdirt[root@k8s-master01dockerfiles]dockerbuild-tcentos:cmd-ft/Dockerfile
查看镜像
[root@k8s-master01dockerfiles]dockerrun-ti--rmcentos:cmd1
可以看到打印了一个1就退出了
使用bash覆盖CMD命令
[root@k8s-master01dockerfiles]exitexit
可以看到它就不打印了,覆盖了CMD命令
在k8s中不建议将CMD命令打到镜像中,因为我们遵循的构建策略是一次构建到处运行,启动的命令可能不是统一的,可以指定配置文件让启动命令根据配置文件变成不同环境的命令,这样可以使用k8s的arg或者cmd去覆盖掉它的启动参数,所以CMD可以不打到镜像中,当然也可以使用变量的注入方式
使用ENTRYPIOINT,CMD可以被覆盖,如果有ENTRYPIOINT的话,CMD就是ENTRYPIOINT的参数
[root@k8s-master01dockerfiles]修改为以下内容FROMcentos:8LABELmaintainer="testdockerfile"LABELtest=dockerfileRUNuseraddmingsonzhengRUNmkdir/opt/mingsonzhengENTRYPOINT["echo"]CMD["3"]dockerbuild-tcentos:ep.
运行容器
[root@k8s-master01dockerfiles]dockerrun-ti--rmcentos:epmingsonzhengmingsonzheng
可以看到CMD就是ENTRYPIOINT的参数,CMD可以被覆盖,我们可以把命令相同的部分打入到ENTRYPIOINT,不同的部分通过CMD覆盖
ENV:配置环境变量[root@k8s-master01dockerfiles]修改为以下内容FROMcentos:8LABELmaintainer="testdockerfile"LABELtest=dockerfileENVtest_env1env1ENVtest_env2env2RUNuseraddmingsonzhengRUNmkdir/opt/mingsonzhengRUNuseraddmingsonzheng/opt/mingsonzheng
构建镜像
[root@k8s-master01dockerfiles]dockerrun-ti--rmcentos:envtest_env1test_env2
环境变量也可以这么写
ENVenv1=test1env2=test2
正式应用的ENV变量不要写在Dockerfile里面,应该使用k8s资源文件,或者docker的-e参数注入进去,这样也能减少构建镜像的层数
ADD:添加文件到容器/vimDockerfileENTRYPOINT["echo"]ENVenv1=test1env2=test2ADD.//opt/CMDecho"test_env1test_env2"dockerbuild-tcentos:add.
启动容器
[root@k8s-master01dockerfiles]cd/opt/[root@b2dacca0f34fopt]vimDockerfileENTRYPOINT["echo"]ENVenv1=test1env2=test2ADD.//opt/COPY./t/opt/mingsonzheng/CMDecho"test_env1test_env2"dockerbuild-tcentos:add.
启动容器
[root@k8s-master01dockerfiles]cd/opt/mingsonzheng/[root@3ca8cddbf8b3mingsonzheng]vimDockerfileENTRYPOINT["echo"]ENVenv1=test1env2=test2ADD.//opt/COPY./t/opt/mingsonzheng/CMDecho"test_env1test_env2"WORKDIR/opt/mingsonzhengCMDpwd;lsdockerbuild-tcentos:workdir.
启动容器
[root@k8s-master01dockerfiles]启动容器[root@k8s-master01dockerfiles]查看当前用户[root@87983e2581damingsonzheng]查看系统其他用户[root@87983e2581damingsonzheng]vimDockerfileENTRYPOINT["echo"]ENVenv1=test1env2=test2ADD.//opt/COPY./t/opt/mingsonzheng/CMDecho"test_env1test_env2"WORKDIR/opt/mingsonzhengUSER1000CMDpwd;lsdockerbuild-tcentos:workdir.
启动容器
[root@k8s-master01dockerfiles]/centos:workdir.
查看镜像
[root@k8s-master01dockerfiles]vimDockerfileENTRYPOINT["echo"]ENVenv1=test1env2=test2ADD.//opt/COPY./t/opt/mingsonzheng/CMDecho"test_env1test_env2"WORKDIR/opt/mingsonzhengRUNuseraddmingsonzheng/opt/mingsonzheng
构建镜像
[root@k8s-master01dockerfiles]dockerrun-ti--rmcentos:workdirbash[root@6aecced2b780mingsonzheng]lsbindatadevetchomeliblib64lost+foundmediamntoptprocrootrunsbinsrvsystmpusrvar
可以看到data目录,它会与本地/var/lib/docker/volumes/的目录下生成一个volume的目录,然后挂载到容器中的data下,退出容器则会清除本地目录下的data
通过-v将mysql_data目录挂载到容器中,使用-v则系统不会自动创建挂载目录
[root@k8s-master01~]dockerrun-ti-v/root/mysql_data/://centos:workdirbash制作小镜像
一定不要使用centos基础镜像,可以使用alpine,busybox,scratch,debian
修改基础镜像
[root@k8s-master01dockerfiles]修改为以下内容ENTRYPOINT["echo"]ENVenv1=test1env2=test2ADD.//opt/COPY./t/opt/mingsonzheng/WORKDIR/opt/mingsonzhengRUNuseraddmingsonzheng/opt/mingsonzheng
构建镜像
[root@k8s-master01dockerfiles]dockerimagesREPOSI
alpine与centos相比,SIZE非常小,适合做为基础镜像,基础镜像可以在官方仓库查找,不需要自己制作
如果需要用到glibc,可以使用node:slim,python:slim,net作为基础镜像
多阶段制作小镜像分开两个步骤:编译操作和生成最终镜像的操作
新建一个go文件
[root@k8s-master01dockerfiles]修改为以下内容packagemainimport"fmt"funcmain(){("HelloWorld")}新建一个Dockerfile文件
[root@k8s-master01dockerfiles]vimDockerfiledockerbuild-thello:single_build.
启动容器
[root@k8s-master01dockerfiles]dockerimagesREPOSITORYTAGIMAGEIDCREATEDSIZEhellosingle_buildca11178a0c1344secondsago372MB
查看包大小
[root@k8s-master01dockerfiles]:30main-rw-r--r--1rootroot77Jul1608:24/optvimDockerfilebuildstepFROMgolang:1.14.4-alpineWORKDIR//optRUNgobuild/opt/"./main"createrealappimage上面的操作)构建镜像
[root@k8s-master01dockerfiles]dockerrun-ti--rmhello:alpinesh/./mainHelloWorld查看镜像
[root@k8s-master01dockerfiles]vimDockerfilebuildstepFROMgolang:1.14.4-alpineasbuilderWORKDIR//optRUNgobuild/opt/"./main"dockerbuild-thello:alpine.查看镜像
[root@k8s-master01dockerfiles]mvDockerfilegoDockerfile[root@k8s-master01dockerfiles]修改为以下内容FROMphp:7.1.22-fpm-alpineRUNapkadd--no-cachebinutilsfreetypelibpnglibjpeg-turbofreetype-devlibpng-devlibjpeg-turbo-devlibc6-compatlibxml2libxml2-devlibmcryptlibmcrypt-devlibc-devicu-devgettext-devopenssl-devbzip2-devRUNdocker-php-ext-installpdopdo_mysqlmcryptzipgdpcntlopcachebcmathRUNapkadd--no-cachephp7-sysvsemphp7-pdo_dblibphp7-socketsphp-soapphp7-xmlrpcRUNapkadd--no-cachephp7-sysvsemphp7-pdo_dblibphp7-socketsphp-soapphp7-xmlrpcRUNapkadd--no-cachefreetds-devRUNdocker-php-ext-installpdo_dblibRUNdocker-php-ext-installsocketsRUNdocker-php-ext-installxmlrpcRUNdocker-php-ext-installpdo_dblibRUNdocker-php-ext-install-j$(nproc)gdCOPY--from=0/usr/local/lib/php/extensions/no-debug-non-zts-20160303/usr/local/lib/php/extensions/no-debug-non-zts-20160303cpDockerfilet/phpDockerfile[root@k8s-master01dockerfiles]vimDockerfilebuildstepFROMgolang:1.14.4-alpineasbuilderWORKDIR//optRUNgobuild/opt/"./main"dockerbuild-thello:scratch.查看镜像
[root@k8s-master01dockerfiles]dockerrun-ti--rmhello:scratch/mainHelloWorld基于最基础的镜像,制作依赖环境的镜像可以使用,但是建议使用官方制作好的镜像
如果Dockerfile中引用的镜像发生了更新,需要使用pull参数
课程链接