[297]从零开始学习Docker
最近⼯作中遇到项⽬部署的问题,因为原先旧项⽬还需要继续在线服役,所以⽣产环境的⼀整套东西⼀
直都停留在很低版本的 CentOS 中,很多时候想扩展或想部署⼀个新功能因为⽣产环境的问题⽽不得不花费更多的时间,有时候还不得不放弃.最要命的是我们新项⽬的开发环境是Windows 环境,⽽且都是⽤较新的开发环境;⽽测试环境却⼜是较新的 CentOS 环境,导致很多时候在这个环境运⾏没有问题,在另⼀个环境却⽆缘⽆故出问题,期间为了这些事浪费了很多时间.还好发现有 Docker 能够解决这些头痛的问题,当然 Docker 不单单只能解决以上问题,它还有很多强⼤的功能.接下来就从零开始讲讲 Docker.
什么是 Docker
Docker 是 Docker 公司的开源项⽬,使⽤ Google 公司推出的 Go 语⾔开发的,并于 2013 年 3 ⽉以 Apache 2.0 授权协议开源,主要项⽬代码在 GitHub 上进⾏维护。
下⾯的图⽚⽐较了 Docker 和传统虚拟化⽅式的不同之处。传统虚拟机技术是虚拟出⼀套硬件后,在其上运⾏⼀个完整操作系统,在该系统上再运⾏所需应⽤进程;⽽容器内的应⽤进程直接运⾏于宿主的内核,容器内没有⾃⼰的内核,⽽且也没有进⾏硬件虚拟。因此容器要⽐传统虚拟机更为轻便。
为什么要使⽤ Docker?
Docker 跟传统的虚拟化⽅式相⽐具有以下优势:
更⾼效的利⽤系统资源
由于容器不需要进⾏硬件虚拟以及运⾏完整操作系统等额外开销,Docker 对系统资源的利⽤率更⾼。⽆论是应⽤执⾏速度、内存损耗或者⽂件存储速度,都要⽐传统虚拟机技术更⾼效。因此,相⽐虚拟机技术,⼀个相同配置的主机,往往可以运⾏更多数量的应⽤。
更快速的启动时间
传统的虚拟机技术启动应⽤服务往往需要数分钟,⽽ Docker 容器应⽤,由于直接运⾏于宿主内核,⽆需启动完整的操作系统,因此可以做到秒级、甚⾄毫秒级的启动时间。⼤⼤的节约了开发、测试、部署的时间。
⼀致的运⾏环境
开发过程中⼀个常见的问题是环境⼀致性问题。由于开发环境、测试环境、⽣产环境不⼀致,导致有些 bug 并未在开发过程中被发现。⽽Docker 的镜像提供了除内核外完整的运⾏时环境,确保了应⽤运⾏环境⼀致性,从⽽不会再出现 “这段代码在我机器上没问题啊” 这类问题。
持续交付和部署
对开发和运维⼈员来说,最希望的就是⼀次创建或配置,可以在任意地⽅正常运⾏。
使⽤ Docker 可以通过定制应⽤镜像来实现持续集成、持续交付、部署。开发⼈员可以通过 Dockerfile 来进⾏镜像构建,并结合 持续集成系统进⾏集成测试,⽽运维⼈员则可以直接在⽣产环境中快速部署该镜像,甚⾄结合持续部署系统进⾏⾃动部署。
⽽且使⽤ Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应⽤运⾏环境,也⽅便运维团队理解应⽤运⾏所需条件,帮助更好的⽣产环境中部署该镜像。
更轻松的迁移
由于 Docker 确保了执⾏环境的⼀致性,使得应⽤的迁移更加容易。Docker 可以在很多平台上运⾏,⽆论是物理机、虚拟机、公有云、私有云,甚⾄是笔记本,其运⾏结果是⼀致的。因此⽤户可以很轻易的将在⼀个平台上运⾏的应⽤,迁移到另⼀个平台上,⽽不⽤担⼼运⾏环境的变化导致应⽤⽆法正常运⾏的情况。
更轻松的维护和扩展
Docker 使⽤的分层存储以及镜像的技术,使得应⽤重复部分的复⽤更为容易,也使得应⽤的维护更新更加简单,基于基础镜像进⼀步扩展镜像也变得⾮常简单。此外,Docker 团队同各个开源项⽬团队⼀起维护了⼀⼤批⾼质量的官⽅镜像,既可以直接在⽣产环境使⽤,⼜可以作为基础进⼀步定制,⼤⼤的降低了应⽤服务的镜像制作成本。
###对⽐传统虚拟机总结
基本概念
Docker 包括三个基本概念
镜像(Image)
容器(Container)
仓库(Repository)
理解了这三个概念,就理解了 Docker 的整个⽣命周期。
Docker 镜像
我们都知道,操作系统分为内核和⽤户空间。对于 Linux ⽽⾔,内核启动后,会挂载 root ⽂件系统为其提供⽤户空间⽀持。⽽ Docker 镜像,就相当于是⼀个 root ⽂件系统。⽐如 Docker 官⽅镜像 ubuntu:14.04 就包含了完整的⼀套 Ubuntu 14.04 最⼩系统的 root ⽂件系统。
Docker 镜像是⼀个特殊的⽂件系统,除了提供容器运⾏时所需的程序、库、资源、配置等⽂件外,还包含了⼀些为运⾏时准备的⼀些配置参数(如匿名卷、环境变量、⽤户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
Docker 容器
镜像和容器的关系,就像是⾯向对象程序设计中的类和实例⼀样,镜像是静态的定义,容器是镜像运⾏时的实体。容器可以被创建、启动、停⽌、删除、暂停等。
每⼀个容器运⾏时,是以镜像为基础层,在其上创建⼀个当前容器的存储层,我们可以称这个为容器运⾏时读写⽽准备的存储层为容器存储层。
容器存储层的⽣存周期和容器⼀样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除⽽丢失。
数据卷的⽣存周期独⽴于容器,容器消亡,数据卷不会消亡。因此,使⽤数据卷后,容器可以随意删
除、重新 run,数据却不会丢失。Docker 仓库
安装 Docker
CentOS 操作系统安装 Docker
系统要求
Docker 需要安装在 CentOS 7 64 位的平台,并且内核版本不低于 3.10. CentOS 7.× 满⾜要求的最低内核版本要求,但由于 CentOS 7 内核版本⽐较低,部分功能(如 overlay2 存储层驱动)⽆法使⽤,并且部分功能可能不太稳定。所以建议⼤家升级到最新的 CentOS 版本,并且内核也更新到最新的稳定版本.更新的⽅法可以看看我的
使⽤阿⾥云的安装脚本⾃动安装
为了简化 Docker 安装流程,我们可以使⽤阿⾥云提供的⼀套安装脚本,CentOS 系统上可以使⽤这套脚本安装 Docker :
curl -sSL acs-public-mirror.oss-cn-hangzhou.aliyuncs/docker-engine/internet | sh -
执⾏这个命令后,脚本就会⾃动的将⼀切准备⼯作做好,并且把 Docker 安装在系统中。
Docker 通过运⾏ hello-world 映像验证是否正确安装。
$ docker run hello-world
> Unable to find image 'hello-world:latest' locally
> latest: Pulling from library/hello-world
> b04784fba78d: Pull complete
> Digest: sha256:f3b3b28a45160805bb16542c9531888519430e9e6d6ffc09d72261b0d26ff74f
> Status: Downloaded newer image for hello-world:latest
> Hello from Docker!
> This message shows that your installation appears to be working correctly.
> To generate this message, Docker took the following steps:
> 1. The Docker client contacted the Docker daemon.
> 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
> 3. The Docker daemon created a new container from that image which runs the
> executable that produces the output you are currently reading.
> 4. The Docker daemon streamed that output to the Docker client, which sent it
> to your terminal.
> To try something more ambitious, you can run an Ubuntu container with:
> $ docker run -it ubuntu bash
> Share images, automate workflows, and more with a free Docker ID:
> cloud.docker/
> For more examples and ideas, visit:
> docs.docker/engine/userguide/
此命令下载测试镜像并在容器中运⾏它。当容器运⾏时,它打印⼀条信息消息并退出。如果你没有配置镜像加速器的话,运⾏ hello-world 映像验证也是不会成功的.因为国内⽹络的原因,⽆法下载测试镜像,更别说运⾏测试镜像了,所以这⼀步可以先跳过,继续往下看,等⼀下配置完镜像加速器再来验证.
查看当前 Docker 的版本
$ docker -v
> Docker version 17.05.0-ce, build 89658be
可以看出当前的 Docker 为 Docker CE 17.05.0 版本,CE 代表 Docker 社区版,EE 代表 Docker 企业版.
卸载 Docker CE
卸载Docker软件包:
$ yum remove docker-ce
卸载旧版本 Docker
较⽼版本的 Docker 被称为 docker 或 docker-engine。如果这些已安装,请卸载它们以及关联的依赖关系。
$ yum remove docker docker-common docker-selinux docker-engine
主机上的图像,容器,卷或⾃定义配置⽂件不会⾃动删除。必须⼿动删除任何已编辑的配置⽂件。删除所有图像,容器和卷:
$ rm -rf /var/lib/docker
参考⽂档
镜像加速器
国内访问 Docker Hub 有时会遇到困难,此时可以配置镜像加速器。国内很多云服务商都提供了加速器服务,例如:
⽤ systemctl enable docker 启⽤服务后,编辑 /etc/systemd/system/multi-user.target.wants/docker.service ⽂件,到 ExecStart= 这⼀⾏,在这⾏最后添加加速器地址 --registry-mirror=<;加速器地址>,如:
ExecStart=/usr/bin/dockerd --registry-mirror=jxus37ad.mirror.aliyuncs
注:对于 1.12 以前的版本,dockerd 换成 docker daemon。
重新加载配置并且重新启动。
$ sudo systemctl daemon-reload
$ sudo systemctl restart dockergo语言开发环境搭建
检查加速器是否⽣效
Linux系统下配置完加速器需要检查是否⽣效,在命令⾏执⾏ ps -ef | grep dockerd,如果从结果中看到了配置的 --registry-mirror 参数说明配置成功。
$ sudo ps -ef | grep dockerd
> root 5346 1 0 19:03 ? 00:00:00 /usr/bin/dockerd --registry-mirror=jxus37ad.mirror.aliyuncs
使⽤ Docker 镜像
Docker 运⾏容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker 会从镜像仓库下载(默认是 Docker Hub 公共注册服务器中的仓库)。
获取镜像
获取镜像的命令是 docker pull。其命令格式为:
docker pull [选项] [Docker Registry地址]<;仓库名>:<;标签>
具体的选项可以通过 docker pull --help 命令看到,这⾥我们说⼀下镜像名称的格式。
Docker Registry地址:地址的格式⼀般是 <;域名/IP>[:端⼝号]。默认地址是 Docker Hub。
仓库名:如之前所说,这⾥的仓库名是两段式名称,既 <⽤户名>/<;软件名>。对于 Docker Hub,如果不给出⽤户名,则默认为library,也就是官⽅镜像.⼀定要配置镜像加速器,不然下载速度很慢。
⽐如:
$ docker pull ubuntu:14.04
14.04: Pulling from library/ubuntu
bf5d46315322: Pull complete
9f13e0ac480c: Pull complete
e8988b5b3097: Pull complete
40af181810e7: Pull complete
e6f7c7e5c03e: Pull complete
Digest: sha256:147913621d9cdea08853f6ba9116c2e27a3ceffecf3b492983ae97c3d643fbbe
Status: Downloaded newer image for ubuntu:14.04
上⾯的命令中没有给出 Docker Registry 地址,因此将会从 Docker Hub 获取镜像。⽽镜像名称是 ubuntu:14.04,因此将会获取官⽅镜像library/ubuntu 仓库中标签为 14.04 的镜像。
查看已下载的镜像
要想列出已经下载下来的镜像,可以使⽤ docker images 命令。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest 1815c82652c0 3 weeks ago 1.84kB
ubuntu 14.04 4a2820e686c4 2 weeks ago 188 MB
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论