1.背景1.1概述Docker使用Google推出的Go语言进行开发和实现。基于Linux内核的cgroup、namespace、AUFS-likeUnionFS等技术,对进程进行封装和隔离,属于操作系统级虚拟化技术。由于隔离进程独立于宿主机和其他隔离进程,所以又称为容器。最初的实现是基于LXC。从0.7版本开始去掉了LXC,改用自研的libcontainer。从1.11版本开始,进一步进化为使用runC和containerd。Docker在容器的基础上进行了进一步的封装,从文件系统、网络互联到进程隔离等,极大地简化了容器的创建和维护。这使得Docker技术比虚拟机技术更轻、更快。1.2为什么使用Docker作为一种新兴的虚拟化方式,Docker与传统的虚拟化方式相比有很多优势。1、更高效地利用系统资源由于容器不需要硬件虚拟化和运行完整操作系统等额外开销,因此Docker对系统资源的利用率更高。无论是应用程序执行速度、内存消耗还是文件存储速度,都比传统的虚拟机技术更高效。因此,与虚拟机技术相比,一台相同配置的主机往往可以运行更多的应用程序。2.更快的启动时间传统虚拟机技术往往需要几分钟才能启动应用服务,而Docker容器应用直接运行在宿主机内核上,无需启动完整的操作系统,因此可以实现秒级甚至毫秒级的启动时间。大大节省了开发、测试、部署的时间。3.一致的运行环境开发过程中一个普遍的问题就是环境的一致性。由于开发环境、测试环境、生产环境的不一致,导致部分bug在开发过程中没有发现。Docker镜像提供了除内核之外完整的运行环境,保证了应用运行环境的一致性,这样就不会再出现“这段代码在我的机器上没问题”等问题。4.持续交付和部署对于开发和运维(DevOps)人员来说,他们最希望的是一次创建或配置一次,在任何地方都能正常运行。使用Docker可以通过自定义应用镜像实现持续集成、持续交付和部署。开发者可以使用Dockerfile构建镜像并结合持续集成(ContinuousIntegration)系统进行集成测试,而运维人员可以直接在生产环境中快速部署镜像,甚至结合持续部署(ContinuousDelivery/Deployment)系统用于自动部署。而且,使用Dockerfile让镜像构建透明化,不仅让开发团队了解应用运行环境,也方便运维团队了解应用运行所需的条件,有助于更好地将镜像部署到生产中环境。5.更容易迁移因为Docker保证了执行环境的一致性,使得应用程序的迁移更容易。Docker可以运行在很多平台上,无论是物理机、虚拟机、公有云、私有云,甚至笔记本电脑,结果都是一样的。因此,用户可以轻松地将运行在一个平台上的应用程序迁移到另一个平台上,而不必担心应用程序因运行环境的变化而无法正常运行。6、更容易维护和扩展Docker采用的分层存储和镜像技术,使得应用中重复的部分更容易复用,也让应用的维护和更新更加容易。在基本镜像的基础上进一步扩展镜像也很简单。此外,Docker团队与各个开源项目团队一起维护了大量高质量的官方镜像,可以直接在生产环境中使用,也可以作为进一步定制的基础,大大降低了镜像制作成本用于应用服务。7、与传统虚拟机相比,总结特点。容器虚拟机在几秒钟和几分钟内启动。硬盘使用量一般是MB,一般是GB。性能接近原生支持,弱于系统支持。单机支持上千个容器,一般是几十个。1.3环境CentOS7Docker18.03.0-ce2。卸载旧版本旧版本的Docker称为docker或docker-engine。如果安装了这些版本,请先卸载它们以及相关的依赖项。sudoyumremovedocker\docker-client\docker-client-latest\docker-common\docker-latest\docker-latest-logrotate\docker-logrotate\docker-selinux\docker-engine-selinux\docker-engine3。安装Docker3。1安装Dockeryum源在新主机上首次安装DockerCE之前,您需要设置Docker的yum源。之后,您可以从存储库安装和更新Docker。设置源1.安装所需的包。yum-utils提供了yum-config-manager功能,devicemapper存储驱动需要device-mapper-persistent-data和lvm2sudoyuminstall-yyum-utils\device-mapper-persistent-data\lvm22。使用以下命令设置稳定的yum源sudoyum-config-manager\--add-repo\https://download.docker.com/linux/centos/docker-ce.repo3.2安装DockerCE1。InstallthelatestversionofDockerCEsudoyuminstalldocker-ce安装了Docker,但是没有启动。2、启动Dockersudosystemctlstartdocker3、使用阿里镜像加速器由于国内网络原因,需要使用阿里镜像加速器,登录你的阿里云官网,找到镜像加速器,根据提示进行配置4.验证sudodockerrunhello-world输入如下Unabletofindimage'hello-world:latest'localest:Pullingfromlibrary/hello-worldca4f61b1923c:PullcompleteDigest:sha256:97ce6fa4b6cdc0790cda65fe7290b74cfebd9fa0c9b8c38e979330d547d22ce1Status:DownloadednewimagefromHelloworld:Downloadednewimage:Docker!此消息表明您的安装似乎正常运行。为生成此消息,Docker采用了以下步骤:1.Docker客户端联系Docker守护进程。2.Docker守护进程从DockerHub拉取“hello-world”图像。(amd64)3.Docker守护进程从该映像创建了一个新容器,该容器运行可生成您当前正在阅读的输出的可执行文件。4.Docker守护进程将该输出流式传输到Docker客户端,后者将其发送到您的终端。要尝试更雄心勃勃的事情,你可以运行一个Ubuntucontainerwith:$dockerrun-itubuntubashShareimages,automateworkflows,andmorewithafreeDockerID:https://cloud.docker.com/有关更多示例和想法,请访问:https://docs.docker。com/引擎/用户指南/5。执行sudodockerversion输出如下Client:Version:18.03.0-ce#ClientversionAPIversion:1.37Goversion:go1.9.4Gitcommit:0520e24Built:WedMar2123:09:152018OS/Arch:linux/amd64Experimental:falseOrchestrator:swarmServer:Engine:Version:18.03.0-ce#Docker-EngineversionAPIversion:1.37(minimumversion1.12)Goversion:go1.9.4Gitcommit:0520e24Built:WedMar2123:13:032018操作系统/Arch:linux/amd64实验:false6。执行sudodockerinfo,输出如下Containers:0#容器数量Running:0#运行容器数量Paused:0#暂停容器数量Stopped:0#停止容器数量Images:0ServerVersion:18.03.0-ceStorageDriver:overlay2#StorageremoveBackingFilesystem:xfs#磁盘文件系统格式Supportsd_type:trueNativeOverlayDiff:falseLoggingDriver:json-fileCgroupDriver:cgroupfsPlugins:Volume:localNetwork:bridgehostmacvlannulloverlayLog:awslogsfluentdgcplogsgelfjournaldjson-filelogentriessplunksyslogSwarm:活动NodeID:y6ulbxd4353ubvpi2p5g3d4zfIs管理器:trueClusterID:k19zirti3fcvq8fygqivg91lx管理器:1节点:2编排:任务历史记录保留限制:5Raft:快照间隔:10000要保留的旧快照数:0心跳滴答声:1选举滴答声:3调度器:心跳周期:5秒CA配置:过期持续时间:3个月强制旋转:0自动锁定管理器:false正在进行的根旋转:false节点地址:10.32.2.202管理器地址:10.32.2.202:2377运行时间:runcDefault运行时间:runcInit二进制文件:docker-initcontainerd版本:cfd04396dc68220d1cecbe686a6cc3aa5ce3667crunc版本:4fc53a81fb7c994640722ac585fa9ca548971871init版本:949e6fa安全选项:seccomp配置文件:默认内核版本:3.10.0-514.el7.x86_64操作系统:CentOSLinux7(核心)OSType:linuxArchitecture:x86_64CPUs:8TotalMemory:31.17GiBName:localhostID:E23S:ORX:2MP3KJ:ACUVVAM:WOV6:6KUF:ABED:LWFQ:OHGJ:RQU6Docker根目录:/var/lib/dockerDebug模式(客户端):falseDebug模式(服务器):falseRegistry:https://index.docker.io/v1/Labels:Experimental:falseInsecureRegistries:127.0.0.0/8LiveRestoreEnabled:false3.3打开DockerRemoteAPI修改配置文件vim/usr/lib/systemd/system/docker.service找到ExecStart=/usr/bin/dockerd这一行,修改为跟随execStart=/usr/bin/dockerd-Htcp://0.0.0.0:2375-Hunix:///var/run/docker.sock编辑配置文件vim/etc/profile,写入内容,执行source/etc/profile刷新exportDOCKER_HOST=127.0.0.1:2375执行命令systemctldaemon-reloadsystemctlrestartdocker执行curlhttp://127.0.0.1:2375/info验证输出如下{"ID":"HPZP:XIWJ:BZP7:YI47:UOLX:YLMM:LBF7:KV4E:Y2A7:ED6B:BHWB:FE4R","容器":2,"容器运行":0,"容器暂停":0,"容器停止":2,"图像":2,"Driver":"overlay2","DriverStatus":[["BackingFilesystem","xfs"],["Supportsd_type","true"],["NativeOverlayDiff","true"]],"SystemStatus":null,"Plugins":{"Volume":["local"],"Network":["bridge","host","macvlan","null","overlay"],"Authorization":null,"Log":["awslogs","fluentd","gcplogs","gelf","journald","json-file","logentries","splunk","syslog"]},"MemoryLimit“:真,”SwapLimit“:真,”内核内存“:真,”CpuCfsPeriod“:真,”CpuCfsQuota”:真,“CPUShares”:真,“CPUSet”:真,“IPv4Forwarding”:真,“BridgeNfIptables”:真的,“BridgeNfIp6tables”:true,“Debug”:false,“NFd”:20,“OomKillDisable”:true,“NGoroutines”:33,“SystemTime”:“2018-04-08T15:41:52.725705339+08:00”,“LoggingDriver”:“json-file”,“CgroupDriver”:“cgroupfs”,“NEventsListener”:0,“内核版本”:“3.10.0-693.21.1.el7.x86_64”,“操作系统”:“CentOSLinux7(核心)”"OSType":"linux","Architecture":"x86_64","IndexServerAddress":"https://index.docker.io/v1/","RegistryConfig":{"AllowNondistributableArtifactsCIDRs":[],"AllowNondistributableArtifactsHostnames":[],"InsecureRegistryCIDRs":["127.0.0.0/8"],"IndexConfigs":{"docker.io":{"Name":"docker.io","Mirrors":["https://0zs97su8.mirror.aliyuncs.com/"],"Secure":true,"Official":true}},"Mirrors":["https://0zs97su8.mirror.aliyuncs.com/"]},"NCPU":1,"MemTotal":1022570496,"GenericResources":null,"DockerRootDir":"/var/lib/docker","HttpProxy":"","HttpsProxy":"","NoProxy":"",“名称”:“localhost”,“标签”:[],“ExperimentalBuild”:false,“ServerVersion”:“18.03.0-ce”,“ClusterStore”:“”,“ClusterAdvertise”:“”,“Runtimes":{"runc":{"path":"docker-runc"}},"DefaultRuntime":"runc","Swarm":{"NodeID":"","NodeAddr":"","LocalNodeState“:”不活动“,”ControlAvailable“:false,”错误“:”“,”RemoteManagers“:null},”LiveRestoreEnabled“:false,”隔离“:”“,”InitBinary“:”docker-init“,”ContainerdCommit":{"ID":"cfd04396dc68220d1cecbe686a6cc3aa5ce3667c","Expected":"cfd04396dc68220d1cecbe686a6cc3aa5ce3667c"},"RuncCommit":{"ID":"4fc53a81fb7c994640722ac585fa9ca548971871","Expected":"4fc53a81fb7c994640722ac585fa9ca548971871"},"InitCommit":{"ID":"949e6fa","Expected":"949e6fa"},"SecurityOptions":["name=seccomp,profile=default"]}3.4设置启动sudosystemctlenabledocker.service4.安装DockerCompose1.运行此命令下载最新版本的DockerComposesudocurl-Lhttps://github.com/docker/compose/releases/download/1.20.1/docker-compose-`uname-s`-`uname-m`-o/usr/local/bin/docker-compose中写的命令是写这篇博客时的最新版本,上面的命令是一个例子,可能已经过时了。为保证最新版本,请到GithubComposerepositoryrelease查看最新版本2.添加文件执行权限sudochmod+x/usr/local/bin/docker-compose3.验证安装docker-compose--version输出如下:docker-composeversion1.20.1,build5d8c71b
