前言
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
复制代码