如何通过docker容器安装LNMP服务器环境
安装 系统环境
硬件型号: ThinkPad T520
系统版本: ubuntu 1404
CPU: i7
RAM: 8G
添加软件源
由于Ubuntu源中的最先版本为09无法满足要求,所以需要使用Docker的官方源
添加密钥:
$ sudo apt-key adv --keyserver hkp://keyserverubuntucom:80
--recv-keys \
36A1D7869245C8950F966E92D8576A8BA88D21E9
源地址: deb http://getdockerio/ubuntu docker main
添加源可以通过"软件和更新->其它软件->添加"来操作
添加后执行如下命令:
$ sudo apt-get update
$ sudo apt-get install lxc-docker-111
注: 官方给出的源地址为https连接的,但是总是出现ssl验证失败的错误,最后改为非
ssl连接之后正常
测试
执行如下命令获取容器镜像,创建一个实例并打开一个实例shell
$ sudo docker run -t -i centos:latest /bin/bash
注:第一次运行由于需要下载镜像可能需要多等一会儿
运行成功后会有一个新的shell提示符
制作镜像 要求
web容器安装Nginx+PHP服务
数据库容器安装Mysql服务
web服务和数据库分离
web服务容器可以访问数据库容器
制作nginx+php镜像
启动一个容器实例:
$ sudo docker run -t -i centos:latest /bin/bash
安装nginx与PHP:
Nginx可以使用源码或rpm包进行安装,PHP可以使用源码或yum安装具体安装和配置这里
不进行具体讲述
注:需要把nginx与php-fpm添加到系统服务中并设置开机启动
我设置的站点根目录为/opt/web
退出shell并执行如下命令制作镜像:
$ sudo docker commit -m="web service image nginx+php" -a="username" \
sudo docker ps -lq username/web:v1
这是一个组合命令:
sudo docker commit根据已有实例制作镜像
sudo docker ps -lq返回最后一个运行的实例id
已有镜像可以使用sudo docker images 查看
至此创建了第一个镜像 username/web:v1
制作mysql镜像
启动实例:
$ sudo docker run -t -i centos:latest /bin/bash
安装Mysql
设置Mysql服务开机启动:
$ chkconfig mysqld on
启动mysql
修改mysql登陆权限:
mysql> grant all privileges on to 'root'@'%'
identified by 'dbpasswd';
mysql> flush privileges;
mysql服务默认只能本地连接,制作镜像的时候需要注意否则是无法连接到数据库的
退出shell并执行如下命令制作mysql容器镜像:
$ sudo docker commit -m="mysql service image" -a="username" \
sudo docker ps -lq username/mysql:v1
清除不再需要的实例:
$ sudo docker rm sudo docker ps -aq
启动并关联实例
web实例依赖与mysql,所以先打开一个mysql实例:
$ sudo docker run -d --name db username/mysql:v1
/sbin/init
-d参数是让实例以dameon的形式运行 /sbin/init是创建实例后执行的操作,此处为初
始化系统服务,包括运行mysql
启动web实例并与数据库实例进行关联:
$ sudo docker run -d --name web --link db:db -p 8080:80 -v /path/to/src:/opt/web username/web:v1 /sbin/init
--link参数设置关联的容器,可以设置多个关联之后会自动更新web容器的host,把db
的地址指向到数据库容器的地址
-p 参数用来进行ip映射此处把容器的80端口映射到了本地的8080端口web服务可是
通过localhost:8080访问
-v 参数把数据挂载到容器指定目录此处为把站点源码目录挂载到容器的站点目录
在web容器中访问数据库容器的mysql服务可以使用db这个主机地址
容器包含了应用和所需的依赖,但不需要独占资源,没有一个虚拟系统,而是和宿主机共享硬件资源和操作系统,和其他容器共享内核,从而实现资源的动态分配。多个容器在同一个宿主机操作系统中的用户空间以独立的进程运行。因此,容器相比虚拟机要轻量许多,在一个主机上可以同时启动近百个容器,一个应用要在数量上横向扩展非常便捷,而虚拟机则几乎不可能启动同样多的数量。对于重启操作,容器近似于重启一个进程,而虚拟机则相当于重启操作系统。
用很火的集装箱比喻形容就是,“货物”(应用)在“汽车”,“火车”,“轮船”(私有云、公有云等服务)之间迁移交换时,只需要迁移符合标准规格和装卸方式的“集装箱”(docker container),削减了耗时费力的人工“装卸”(上线、下线应用),带来的是巨大的时间人力成本节约,这使未来仅有少数几个运维人员运维超大规模装载线上应用的容器集群成本可能。
看到这里,有没有觉得非常眼熟近几年大热的物联网平台,宣传的不也就是这些点吗
物联网平台商往往会这么告诉你:在我们的平台上提供了多种多样的开发工具,你可以使用拖拽式的手法开发程序,完全不用操心底层的操作系统和所依赖的环境,只需专注于客户的需求和应用程序本身。。。。
就像OpenStack、Cloudstack这样的技术是解决IaaS层的问题,容器技术的诞生其实主要解决了PaaS层的技术实现。
现在最常用的开源云平台架构Kubernetes、Cloud Foundary还是Serverless,其背后驱动都是容器技术。而市面上多达上百家的物联网平台,几乎都是PaaS平台。
0条评论