软件服务化——把应用交给Docker吧

在传统的应用部署实践中,我们需要在应用发布之前在服务器上准备好其所需的环境(如项目所依赖的库、语法解释器、Web容器等),Docker则为我们提供了一种更优雅的方式来解决这一问题。

  • 什么是Docker

    Docker可以帮助你把项目应用及相关所有依赖打包成一个标准化的单元。Docker容器是由Docker提供的虚拟化环境,在一个Docker容器中包含了运行项目所需的一切:代码、系统库、其他软件,总之,包括了你可以在服务器上安装的一切。

  • 为什么用Docker

    Docker的意义就在于将运行项目所需的外部依赖统统作为项目的组成部分包含在项目下的一个Docker配置文件中,通过它我们可以直接让项目在Docker中运行起来,这样的做的好处是显而易见的:

1. 不再需要提前在服务器上安装及配置项目所依赖的环境  
2. 降低项目在开发过程中,开发环境不断迭代更新的成本以及搭建项目环境的成本  
3. 多个应用在同一台服务器运行时,可以方便的隔离环境,避免依赖冲突  
4. 所有项目都运行在Docker的虚拟容器中,物理机干干净净!爽!!  
  • 实践

    Docker容器为应用提供了独立的运行环境,Docker提供了一组命令行工具,让我们可以方便的对Docker容器进行管理。对于非Linux的平台,我们还需要先安装docker-machine(这相对于一个linux虚拟机),再将docker容器放在docker-machine中。

    docker-compose是Docker提供的另一个非常有用的管理工具,我们可以通过定义docker-compose的配置文件,对多个Docker容器统一进行管理。下是一个docker-compose.yml文件的例子:

version: '2'

services:  
  mysql:
    image: mysql:5.7
    container_name: mysql
    ports:
      - "3309:3306"
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/etc/conf.d:/etc/mysql/conf.d
      - ./mysql_run.sh:/mysql_run.sh
    command: /mysql_run.sh
    env_file: .env
    restart: always

  nginx:
    image: nginx:1.9.8
    container_name: nginx
    ports:
      - "80:80"
    volumes:
      - ./nginx/etc/conf.d:/etc/nginx/conf.d
      - ./www:/usr/share/nginx/html
    links:
      - web
      - phpmyadmin
    restart: always

  web:
    #image: php:5.6-fpm
    build: ./web
    container_name: web
    links:
      - "mysql"
      - "beanstalkd"
    ports:
      - "9009:9001"
    volumes: 
      - ./web/cron:/etc/pam.d/cron
      - ./web/crontab:/etc/crontab
      - ./web/log:/var/log
      - ./web/supervisor:/etc/supervisor/conf.d
      - ./www:/usr/share/nginx/html
    restart: always

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: phpmyadmin
    env_file: .env
    links:
      - mysql:db
    ports:
      - "8888:80"
    restart: always

  beanstalkd:
    image: schickling/beanstalkd
    container_name: beanstalkd
    ports:
      - "11300:11300"
    restart: always

需要注意的是,根据Docker的设计理念,一个容器中只应包含一个进程,整个项目再由多个Docker容器组合而成。但是,如果确实需要在一个Docker容器中 运行多个程序的话,可以用类似supervisor的方式来实现,这里可以参考官方给出的例子。上面说的这种情况,比较常见的是需要通过crontab定时执行项目中的某个任务,在这里也提供了一个具体的例子可供参考

解耦是软件工程中重要的思想之一,Docker所做的工作正是解除了项目与平台间的耦合,将项目生命的整个生态系统封装在一个个独立的集装箱里,服务器本身则如同运载货物的甲板,无须再提供额外的服务。随着项目规模的增长及分布式方案的应用,相较于传统的部署方式,Docker的优势会变得更加明显。所以,如果有兴趣,不妨试着把自己的项目封装成一个Docker容器,也来体验一把一键部署的快感!

Show Comments