开始使用Docker

发布于 2016-09-19  5.29k 次阅读


随着组件化开发的逐步发展和对软件复用的需求越来越强烈,Java中出现了Maven、gradle这些依赖解决工具。PHP有Composer,NodeJS有npm。而这些工具只解决了代码依赖,没有java环境maven也无能为力。Docker的出现是为了解决代码对环境的依赖。简单的来说,Docker构建出了代码运行所需的完整的运行环境。

随着手头的服务器越来越多,托管的企业网站也越来越多,也更难以管理。前几天爆出了mysql 0day漏洞,我手动把所有服务器从mariadb 5.5升级到mariadb 10.1花了整整6个小时,而且中间各种导出导入的问题、编译依赖问题让我感觉很是不爽。于是我在这中秋佳节闷头琢磨了三天Docker这个“运维神器”。

一、配置开发/线上环境的艰辛路

1.纯手动

很早以前服务器上和自己的电脑上都得手动配置运行环境。那时候一个项目启动的时候光是统一所有人的开发环境就要一整天。

不得不吐槽一下,小学期时老师在她的XP笔记本上教我们配Oracle数据库+Java+Tomcat+Eclipse。很多人到项目中间阶段了Tomcat还没弄好,头一天就配置好的更是寥寥无几。

优点:直接在自己电脑上跑,性能好。

缺点:

  • 配置过程繁琐
  • 难以统一开发和生产环境
  • 不同操作系统(Windows、Mac、Linux)会有差异

2.虚拟机/Vagrant

利用虚拟机这种重型虚拟化软件可以在宿主系统安装一个完整的新系统,然后在新系统中配置环境.

优点:

  • 线上、开发环境高度统一
  • 部署速度快,版本高度一致
  • 不受平台影响

缺点:

  • 性能特别低下

3.Docker

Docker是一种“半虚拟化”的技术,它只是包装了一个应用所需的必要环境,本身占用资源少。而且在linux下Docker应用是直接运行在当前系统内核上的。

优点:

  • 线上、开发环境高度统一
  • 部署速度更快
  • 不受平台影响
  • 性能强

缺点:

  • 性能不如裸机

二、用Docker快速配置Nginx+PHP-fpm+Mysql环境

Docker的最佳实践是每个单独的应用封装在不同的容器。按说Nginx和PHP应该分开装不过因为Nginx不用代理别的应用所以一个容器放Nginx+PHP-fpm,另一个容器放MariaDB,然后数据都做持久存储就行。

1.下载安装Docker

https://www.docker.com/products/docker

各个平台下Docker命令都是一样的。安装完以后可以运行

Docker -version

查看一下。

PS:2016-09-21更新

因为国内的网络封锁,所以大多数时候是连不上docker官方镜像源的,这时候我们可以使用DaoCloud提供的加速器,详见:

https://www.daocloud.io/mirror

2.安装PHP+Mysql

我们找别人已经封好的Docker镜像,比如这个:

https://hub.docker.com/r/richarvey/nginx-php-fpm/

在命令行中输入:

docker pull richarvey/nginx-php-fpm

来拉取镜像。然后运行容器,输入:

docker run -d -p 80:80 -p 443:443 -v /my/custom:/var/www/ richarvey/nginx-php-fpm

解释:

-d : 后台运行

-p : 绑定容器的80端口和443端口到主机

-v : 绑定容器的/var/www目录到主机/my/custom目录。这个镜像的网站的地址是/var/www/default

3.安装MariaDB

官方地址:

https://hub.docker.com/_/mariadb/

命令行中输入:

docker pull mariadb

即可拉取mariadb镜像。然后输入:

docker run -p 3306:3306 --name mydb -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mariadb:latest

mydb : 容器的“别名”

my-secret-pw : 数据库密码

并且把容器的3306端口映射到主机上。

管理的话只需要像正常的本机数据库一样,输入

mysql -uroot -pmy-secret-pw

即可。my-secret-pw是数据库密码。

4.常用docker命令:

列出所有正在运行的容器。注意最左侧就是容器的name:

docker ps

列出所有容器,包括已停止的:

docker ps -a

新建容器:

docker run

启动已经停止的容器:

docker start

停止容器:

docker stop

删除容器:

docker rm

删除镜像:

docker rmi

从Docker官方拉取镜像:

docker pull