运维神器---Docker

Docker从入门到部署

Posted by 蒋为 on September 27, 2018

运维神器—Docker

Docker 简介

一个应用程序容器,或许你可以理解成一个轻量级虚拟机。它作用是能够帮助你完成很多重复的项目部署工作,比如一个项目需要在服务器集群中部署,集群大约由100台服务器构成,这时如果人工去把项目部署到每台机器上肯定是不现实的,另外如果项目有更新,需要更新整个集群工作量也是巨大的。而如果自己编写自动化脚本部署项目,每台机器的硬件,网络,操作系统版本,等等细微的差别如果编写脚本的时候没有考虑周全,很有可能导致整个集群部署出问题。因此,这个时候如果有个工具能够让你在一台机器上部署好,能够直接同步到其他机器,并且自动处理好服务器的差异问题,那得是多么妙的一件事。很庆幸,Docker就能完成这个工作,而且他的甚至能够帮你在Windows主机上部署好Linux项目,可见他的兼用做得多好!

安装

在不同的操作系统中安装是不同的,但是都非常简单。下面记录Ubuntu16.04的安装过程:

# 安装依赖包
sudo apt-get install   apt-transport-https ca-certificates  curl  software-properties-common
#添加官方密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
#添加仓库
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu  $(lsb_release -cs)  stable"

sudo apt-get update
#安装
sudo apt-get install docker-ce

使用

背景介绍:

你现在浏览的这个博客网站源文件是放在Github上的,使用了Github的Page搭建的这个博客。但是由于曾经的一些事件(你可以Google看看),国内的搜索引擎是搜索不到Github上面的内容的。因此,为了让国内搜索引擎搜索到我的博客,我用了一台单独的服务器对原博客做了反向代理,反向代理服务器使用Python3编写,已经放到我的Github上,地址。但是由于资金有限,我的服务器并不稳定,所以经常要换,经常需要从新部署,以及服务器需要部署一套PHP的运行环境用作他用,所以我将这整个内容打包成了一个Docker镜像,并传到Docker Hub,每次需要从新部署的时候只需要从Docker Hub上Dowload镜像,然后运行即可,整个部署过程不超过3分钟。哈哈!(PS:如果从头部署大概要一天的)

项目架构:

反向代理服务器使用python3+django开发,PHP环境决定使用nginx+php-fpm运行,最后决定在docker中安装Ubuntu16.04然后在Docker里部署Apache2+ mod_wsgi 运行反向代理项目,使用Nginx+php7.0-fpm运行PHP项目。

部署过程

一、在docker中安装Ubuntu镜像

ubuntu镜像已经有现成的,直接使用即可

#下载镜像文件
docker pull ubuntu:16.04
#查看已下载镜像的IMAGE ID
docker images
#使用镜像创建Docker实例,注意替换image id
docker run -i -t  -p 80:80  -p 8088:8088   IMAGE ID  /bin/bash 

其中,-p 8088:8088 表示将docker实例的8088端口映射到本机的8088端口,80同理。我这里8088是php项目端口,80是反向代理端口

执行后你就已经进入到了你创建的docker实例当中。

另外,如果你需要退出docker实例,按ctrl+d,或者输入exit即可。

退出后可以使用

docker ps -a

查看已有实例,使用

#注意:CONTAINER ID替换为docker ps -a命令查询到的相应ID
docker start CONTAINER ID 

重新启动docker实例,使用

#注意:CONTAINER ID替换为docker ps -a命令查询到的相应ID
docker attach  CONTAINER ID 

进入docker中

二、在docker实例中部署环境

在Docker实例中部署项目和直接在操作系统中部署项目没有区别。But,部署完成后Mysql apache nginx …这些服务并不会随docker实例启动而自动启动,而需要自己写sh脚本启动,在启动docker时运行写好的sh脚本。 附上我这里使用的脚本:/home/start.sh

#!/bin/sh
/etc/init.d/mysql start
/etc/init.d/apache2 start
/usr/sbin/php-fpm7.0
/etc/init.d/nginx start
/bin/bash

赋予执行权限,sudo chmod 777 /home/start.sh

三、保存docker实例的修改

首先按ctrl+d退出Docker实例, 提交docker更改

#查看docker实例的 CONTAINER ID 
docker ps -a 
#提交修改,注意替换CONTAINER ID 
docker commit CONTAINER ID 
四、将docker镜像上传到docker hub

docker hub是一个免费的docker镜像仓库,就行github一样,要提交镜像,需要先到官网注册账号。

#登录账号
docker login

#输入你的账号,密码

#上传,账号名是你注册时的账号id,镜像名是你要给这个镜像取的名字
docker push CONTAINER ID  账号名/镜像名

五、使用自己上传的docker镜像
#下载镜像
docker pull 账号名/镜像名
#查看已有镜像IMAGE ID
docker images
#使用镜像创建实例,"/home/start.sh"表示docker启动完既执行的脚本
docker run -i -t  -p 80:80  -p 8088:8088   IMAGE ID  /home/start.sh

自此,以后再需要部署项目的时候只需要安装好docker再执行这3条命令即可部署好一台服务器