引言:
在服务器开发过程中,环境部署无疑是及其繁琐的事情,特别是当项目数量和规模达到一定级别之后,在一台新的机器上部署项目环境无疑是极其漫长而痛苦的,那么什么办法能够实现我们的目标:在开发环境的一次配置编译,就可以批量部署到生产环境。 这就需要用到我们接下来要说到的这个引擎了 —— Docker
简介:
Docker
是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括 VMs
(虚拟机)、bare Metal
、OpenStack
集群和其他的基础应用平台。
docker官网地址:docker
1.应用场景:
- web 应用的自动化打包和发布;
- 自动化测试和持续集成、发布;
- 在服务型环境中部署和调整数据库或其他的后台应用;
- 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的PaaS环境。
上面的内容是网络上最常见的 Docker 原理的分析方式,似乎有点难以理解,我们接下来以一种比较通俗的方式来解释一下:什么是 Docker? 以及 为什么会有 Docker?
参考知乎:如何通俗解释Docker是什么?,作者:刘允鹏
2.什么是 Docker ?
知乎上有一个这样的解释:
Docker 的思想来自于集装箱,集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。那么我就不需要专门运送水果的船和专门运送化学品的船了。只要这些货物在集装箱里封装的好好的,那我就可以用一艘大船把他们都运走。
docker 就是类似的理念。现在都流行云计算了,云计算就好比大货轮。docker 就是集装箱。
3.为什么会有 Docker ?
关于 Docker 存在的原因和意义,在知乎上的解释如下:
- 1.不同的应用程序可能会有不同的应用环境,比如 .net 开发的网站和PHP开发的网站依赖的软件就不一样,如果把他们依赖的软件都安装在一个服务器上就要调试很久,而且很麻烦,还会造成一些冲突。比如 IIS 和 Apache 访问端口冲突。这个时候你就要隔离 .net 开发的网站和 PHP 开发的网站。常规来讲,我们可以在服务器上创建不同的虚拟机在不同的虚拟机上放置不同的应用,但是虚拟机开销比较高。docker 可以实现虚拟机隔离应用环境的功能,并且开销比虚拟机小,小就意味着省钱了。
- 2.你开发软件的时候用的是 Ubuntu,但是运维管理的都是 centos,运维在把你的软件从开发环境转移到生产环境的时候就会遇到一些 Ubuntu 转 centos 的问题,比如:有个特殊版本的数据库,只有 Ubuntu 支持,centos 不支持,在转移的过程当中运维就得想办法解决这样的问题。这时候要是有docker你就可以把开发环境直接封装转移给运维,运维直接部署你给他的 docker 就可以了。而且部署速度快。
- 3.在服务器负载方面,如果你单独开一个虚拟机,那么虚拟机会占用空闲内存的,docker 部署的话,这些内存就会利用起来。
也就是说,解决应用环境隔离的方式有 虚拟机
和 容器
这两种技术可以实现,但是虚拟机的开销太大,所以就选择用像 Docker 这个容器来实现应用环境隔离的作用:
CentOS 安装 Docker:
1.安装准备:
首先,先更新一下安装工具的资源库:
yum update
Docker 要求 CentOS 系统的内核版本高于 3.10 ,那么我们先来查一下当前系统内核的版本:
# uname -r
3.10.0-514.21.1.el7.x86_64
2.安装 docker:
然后,安装 Docker 工具:
yum -y install docker
加上 -y
的作用就是全自动的安装方式,不需要在安装过程中手动选择 y or n
。
3.版本查询:
安装完成后,可以查询一下安装的版本:
# docker --version
Docker version 1.12.6,build 88a4867/1.12.6
还可以看到更详细的信息,包含 docker Client
和 docker Server
:
docker version
Client:
Version: 1.12.6
API version: 1.24
Package version: docker-1.12.6-32.git88a4867.el7.centos.x86_64
Go version: go1.7.4
Git commit: 88a4867/1.12.6
Built: Mon Jul 3 16:02:02 2017
OS/Arch: linux/amd64
Server:
Version: 1.12.6
API version: 1.24
Package version: docker-1.12.6-32.git88a4867.el7.centos.x86_64
Go version: go1.7.4
Git commit: 88a4867/1.12.6
Built: Mon Jul 3 16:02:02 2017
OS/Arch: linux/amd64
4.启动 docker 服务:
# service docker start Redirecting to /bin/systemctl start docker.service
5.执行 hello-world 镜像:
# docker run hello-world
Unable to find image 'hello-world:latest' locally
Trying to pull repository docker.io/library/hello-world ...
latest: Pulling from docker.io/library/hello-world
b04784fba78d: Pull complete
Digest: sha256:f3b3b28a45160805bb16542c9531888519430e9e6d6ffc09d72261b0d26ff74f
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:
https://cloud.docker.com/
For more examples and ideas,visit:
https://docs.docker.com/engine/userguide/
由于刚安装完的 docker 后,本地还不存在 hello-world 镜像,所以执行此镜像时会从远端仓库中去下载 hello-world 镜像,并在容器中运行。再次运行,则不会再有下载过程,会直接输出镜像的执行结果。
实用操作:
推荐一个不错的入门博客系列:大白话Docker入门(一) 和 大白话Docker入门(二)
需要明确两个概念:Image
和 Container
,即镜像与容器,列举一些核心的操作指令:
1.已下载镜像列表:
镜像也就是 Docker Images
docker images
2.容器列表:
容器对应 Docker Container
docker ps
这是正在运行的容器列表,假如想查看全部,使用:
docker ps -a
3.从 Docker hub 仓库的 Registry 中下载一个 Image (镜像):
容器对应 Docker Container
docker pull image-name
image-name
是镜像的名称,可以先在 docker hub 官网 查询镜像是否存在。假如有不同的Tag,可以在最后带上要下载的Tag
@H_180_404@docker @H_180_404@pull @H_180_404@image_name:tag
4.将镜像放进容器中执行:
docker run image-name
其他:
1.FirewallD
CentOS-7 中介绍了 firewalld
,firewall 的底层是使用 iptables 进行数据过滤,建立在 iptables 之上,这可能会与 Docker 产生冲突。
- 当 firewalld
启动或者重启的时候,将会从 iptables 中移除 DOCKER
的规则,从而影响了 Docker 的正常工作。
- 当你使用的是 Systemd 的时候,
firewalld
会在 Docker 之前启动,但是如果你在 Docker 启动之后再启动 或者重启firewalld
,你就需要重启 Docker 进程了。