前言

Docker是一种新兴的虚拟化技术,能够一定程度上的代替传统虚拟机。不过,Docker 跟传统的虚拟化方式相比具有众多的优势。开发者可以打包他们的应用以及依赖包到一个可移植的Docker容器中,然后在Linux 机器上进行部署。

直白一点,我们可以不严谨地理解为:一台linux服务器安装了Docker,就好比我们的电脑上安装了Vmware虚拟机管理软件。服务器里面创建的Docker容器好比电脑里面创建的虚拟机。

一、 为什么使用Docker

Docker有很多用途,简化配置、代码管道化管理、开发人员的生产化、应用隔离、服务合并、多租户、快速部署等等。

这里举一个最贴近广大开发者的例子来说明下Docker的强大:运行环境快速部署。

假设有一个程序员小明,某天完成了一个PHP网站的开发,需要把它部署到一台linux服务器A上。传统的做法是,用apt-get或者手动编译安装好LNMP(linux+nginx+mysql+php)环境,然后对nginx.conf、my.cnf、php.ini各种配置和参数进行调整和优化,终于把环境搞好了。

过了一段时间,这个网站的访问量变大了,原来一台服务器已经无法支撑网站服务了,需要扩展一台服务器B进行负载均衡。这时小明需要把原来在服务器A上做的事情,在服务器B上再进行一次,把服务器B的环境弄好。这个过程不仅费心费力,而且容易出错,导致两台服务器的环境不一致。

如果小明使用Docker进行环境部署的话,这个难题就变得容易解决了。小明只需要在A服务器里面创建一个docker容器,在里面进行各种环境的安装和参数配置(PS:这里只是举个例子,不建议把很多服务塞到一个容器里,最好每个服务对应一个容器,有利解耦),然后把这个docker打包成镜像。接着在B服务器创建一个容器并加载这个镜像,就能轻松实现环境搭建以及保持环境一致了。

这个例子的具体实现笔者在下面会进行详细介绍。

二、Docker优点

  • 硬件成本低,虚拟化硬件损耗低,性能好;
  • 快速部署,秒级启动,弹性伸缩;
  • 支持镜像打包管理,“易分享”,保证环境一致性;
  • 动态调度迁移成本低。

三、安装

ubuntu 16.04安装最新版本Docker命令(PS:直接用apt-get、yum安装的版本比较旧):

apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
    
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -

add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
   
apt-get update

apt-get install docker-ce
复制代码

其他操作系统安装方法大家可以参考Docker官网安装指南。

四、基本使用

1.容器管理

(1) 运行容器
  • 例子:

运行一个后台运行、可交互、镜像为ubuntu16.04、名称为salasolo的容器

docker run -dit --name salasolo ubuntu:16.04
复制代码
  • 命令:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
复制代码
  • 参数
-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;

-d: 后台运行容器,并返回容器ID;

-i: 以交互模式运行容器,通常与 -t 同时使用;

-p: 端口映射,格式为:主机(宿主)端口:容器端口

-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;

--name="nginx-lb": 为容器指定一个名称;

--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;

--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;

-h "mars": 指定容器的hostname;

-e username="ritchie": 设置环境变量;

--env-file=[]: 从指定文件读入环境变量;

--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;

-m :设置容器使用内存最大值;

--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;

--link=[]: 添加链接到另一个容器;

--expose=[]: 开放一个端口或一组端口;
复制代码
(2)访问容器
docker exec -it salasolo /bin/bash
复制代码
(3)停止容器
docker stop salasolo
复制代码
(4)启动容器
docker start salasolo
复制代码
(5)移除容器
docker rm salasolo
复制代码
(6) 查看容器列表
  • 命令:
docker ps [OPTIONS]
复制代码
  • 参数:
-a :显示所有的容器,包括未运行的。

-f :根据条件过滤显示的内容。

--format :指定返回值的模板文件。

-l :显示最近创建的容器。

-n :列出最近创建的n个容器。

--no-trunc :不截断输出。

-q :静默模式,只显示容器编号。

-s :显示总的文件大小。
复制代码

2.镜像管理

每个容器初始化时候可以指定一个镜像,有php-fpm环境、mysql环境、ubuntu纯净环境、centos环境、nodejs环境、python环境等等,我们可以去hub.docker.com官网查找我们需要的镜像。

首次使用run命令创建基于远程镜像的容器、或者使用pull命令拉取时会下载镜像缓存到本地,可以在本地镜像列表进行查看。

(1)拉取远程仓库的镜像
docker pull ubuntu:16.04
复制代码
(2)查看本地镜像列表
docker images
复制代码
(3)移除本地镜像
docker rmi ubuntu:16.04
复制代码
(4)容器打包为镜像
docker commit salasolo salasolo:1.0
复制代码

3.国内镜像加速

由于网络原因,下载Docker官方仓库的镜像会比较慢,可以使用国内镜像加速:

www.docker-cn.com/registry-mi…

五、应用实践

1.安装最新版nginx

docker run -d --name container nginx:latest 
复制代码

2.安装php 7.2

docker run -d --name container php:php:7.2-fpm
复制代码

3.安装最新版tomcat

docker run -d --name container tomcat:latest
复制代码

4.安装最新版python

docker run -d --name container python:latest
复制代码

5.安装最新版redis

docker run -d --name container redis:latest
复制代码