vagrant嚐鮮及docker搭建nignx與reids

虛擬化、容器化是這幾年來十分流行的一個理念,它使用「隔離」的手段,將不一樣服務的依賴、配置等隔離開來,
大大下降了管理成本及維護負擔。
vagrant是一款抽象層次更高的虛擬環境配置工具,基於virtualbox或者docker。
經過配置文件定義虛擬環境的各項參數,以後vagrant就能自動幫你搞定這些繁雜事情。
接下來是否是該折騰下vagrant如何模擬集羣、搞devops了?
No、No,我使用這把牛刀的最初目的是爲了殺雞,把它當一個方便的、自動化的linux虛擬機使用,哈哈。html

<!-- more -->前端

沙盒環境

在平時的學習和折騰中,好比說看到了一個新鮮的東西,想搭建一個看看,把玩把玩。
這個時候,若是在本身的主系統中搗鼓各類不熟悉的應用和服務,
一來若是出問題可能會把系統搞炸,二來系統自己的複雜環境也會影響到服務和應用的搭建。python

並且,把服務安裝在本身的系統裏,和把服務安裝到遠程主機上去,不管是ssh上去仍是最終體驗本身的成果,
那感受是徹底不同的。因此,我須要:linux

  1. 一個徹底隔離的沙盒環境,而且是一個完整的linux系統,就像一臺遠程的主機那樣。
  2. 對一個買不起阿里雲的碼農來講,該虛擬環境可以給人一種是遠程主機的錯覺。

一個選擇是virtualbox,可是初始的配置和安裝很麻煩。而且要用virutlabox的命令行工具,有些麻煩。
因此,用vagrant解決這個問題。nginx

vagrant

vagrant的安裝

雖然debian的源裏有vagrant,可是仍是建議去官方網站下載安裝最新版,老版本的vagrant有一些bug,在以前使用的時候就碰到過。使用命令:git

sudo apt-get install virtualbox
wget https://releases.hashicorp.com/vagrant/2.1.4/vagrant_2.1.4_x86_64.deb
sudo dpkg -i vagrant_2.1.4_x86_64.deb

因爲vagrant是virtualbox的前端,所以若是沒有安裝virtualbox的話,得先安裝virtualbox。web

安裝一臺虛擬機

執行命令:redis

mkdir ~/myproject && cd ~/myproject
vagrant init debian/contrib-jessie64
vagrant up # 下載box鏡像而且安裝

vagrant init命令會在本地目錄中建立vagrantFile。打開這個文件,能夠看到:docker

Vagrant.configure("2") do |config|
  config.vm.box = "debian/contrib-jessie64"
end

config.vm.boxdebian/contrib-jessie64,這項配置指定該虛擬機使用什麼鏡像初始化。
vagrant爲咱們預製了大量的豐富鏡像,成爲box。好比說,上面的debian/contrib-jessie64,那麼在vagrant初始化的時候就會下載對應的鏡像而後安裝虛擬機。
更多box能夠在這裏找到:https://app.vagrantup.com/box...vim

好,當vagrant up執行成功時,虛擬機環境也就建立好了。
假如這個時候,打開virtualbox,你會發現實際上vagrant建立了一個virtualbox的虛擬機。

Vagrantfile文件

Vagrantfile中配置了虛擬機的各項基本參數。

網絡配置

首先是虛擬機網絡,和virtualbox同樣,它有三種類型的網絡:

  1. NAT映射。
  2. host-only。
  3. 橋接。

vagrant默認爲在NAT映射,虛擬機是在一個私有網絡內部,而且經過NAT方式訪問外網。
這種方式主機是看不到虛擬機的,所以,須要配置端口映射:

config.vm.network "forwarded_port", guest: 80, host: 8080

這樣,虛擬機的80端口就被映射爲主機的8080端口。

第二種方式,私有網絡,配置以下:

config.vm.network "private_network", ip: "192.168.50.4"

虛擬機和主機在同一個私有網絡內,主機和虛擬機可以互相訪問。
可是,這個私有網絡是被虛擬出來的,根本不鏈接外網,因此虛擬機沒法訪問外網。
固然,從網絡的角度來看,主機也在這個私有網絡裏,並且主機可以鏈接外網。
理論上能夠經過配置將主機做爲跳板(將私有網絡網卡和真實網卡橋接),讓這個私有網絡內的虛擬機也能訪問網絡。

第三鍾方式,橋接網絡:

config.vm.network "public_network" # DHCP獲取ip
config.vm.network "public_network", ip: "192.168.0.17" # 靜態ip
config.vm.network "public_network", bridge: "en1: Wi-Fi (AirPort)" # 指定橋接網卡

橋接網絡即將虛擬機置入和主機同一網絡內。假如主機經過無線網卡鏈接了本身的wifi,那麼虛擬機就像一臺真實機器同樣也鏈接到了這臺wifi,有該wifi網絡的ip地址。

能夠按照本身的須要選擇。好比我,想催眠本身把這臺虛擬機想象成遠程的服務器,就使用第三種方式,而後給個主機名,經過主機名訪問裏面的服務。

共享文件夾

默認vagrant已經將存放vagrantfile文件的目錄映射到虛擬機的/vagrant下。
固然,也能夠本身配置添加更多的目錄:

config.vm.synced_folder "src/", "/srv/website"

主機名

config.vm.hostname = "myserver"

主機名不只用於網絡,當有多臺虛擬機時,也用來標記區分不一樣的虛擬機。

內存和CPu

默認是512M,以下配置修改:

config.vm.provider "virtualbox" do |v|
  v.memory = 1024
  v.cpus = 2
end

vagrant使用

好了,當配置完Vagrantfile文件後,使用vagrant reload命令從新使之生效。
vagrant up啓動虛擬機,vagrant halt命令關閉虛擬機,vagrant status查看運行狀態。vagrant destory刪除虛擬機。
最重要的是,vagrant sshssh到虛擬機上去。

docker和docker-compose的安裝

好了,如今我假象的遠程服務器已經搭建安裝完畢了。
接下來,開始在服務器上安裝些有趣的服務了。

先是安裝docker:

sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates \
     curl gnupg2 software-properties-common
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"
sudo apt-get update
sudo apt-get install docker-ce

Docker Compose是docker的一個輔助工具,能夠將一組docker的配置、啓動參數等寫入到配置文件裏去,而後經過docker compose管理。

安裝docker-compose,這個工具是python編寫的,所以pip安裝它:

pip install docker-compose

docker安裝nginx

因爲使用的是docker-compose,安裝nginx十分方便,所有配置文件化。
首先在本地新建一個目錄,全部與nginx有關的配置文件都放在這裏:

mkdir nginx
cd nginx

而後,編輯docker-compose.yml文件:

# vim: set shiftwidth=2 tabstop=2 softtabstop=-1 expandtab:
version: '2'
services:
  nginx:
    image: nginx:stable-alpine
    network_mode: host
    volumes:
      - ./conf:/etc/nginx
      - ./html:/var/www/html
      - ./log:/var/log/nginx
    ports:
      - "80:80"
    environment:
      - NGINX_HOST=your.domain
      - NGINX_PORT=80

其中,nginx:stable-alpine爲選擇的docker鏡像,在第一次啓動時,會自動下載鏡像並建立docker容器。

在這裏,docker鏡像不存儲任何的狀態信息,鏡像內的服務全部會讀寫的文件目錄,都映射到了主機的文件系統來。

以後,執行docker-compose up來初始化容器。此外:

  1. 若是修改了docker-compose.yml,也是執行該命令從新建立容器。
  2. 該命令會同時會在前臺啓動容器並打印容器內的控制檯日誌,方便查看是否啓動成功。

切記容器內部不存放狀態,全部的文件系統讀寫都要映射出來,以防丟失。

以後,還須要配置nginx的配置文件,從docker-compose.yml能夠看到,
配置文件放在了./conf中。我是直接從原生安裝的nginx的配置文件中直接拷貝過來的一份。
當一切都配置好後,使用docker-compose start啓動服務。以後,使用docker ps就可以看到運行中的服務了。使用docker-compose stop中止服務。

能夠看到,使用docker將nginx容器化後,不只運行實例和整個系統隔離,
並且,nginx的相關的全部配置能夠所有存放在一個局部目錄內。甚至還能夠直接提交到git上去。
在另一臺機器,不管環境如何,只要安裝了docker和docker-compose,就能從這些配置文件中docker-compose up一下,快速建立並部署nginx服務。

docker安裝redis

經過docker部署redis也是十分簡單,不用糾結版本和依賴及配置的問題。

首先是dokcer-compose.yml文件:

# vim: set shiftwidth=2 tabstop=2 softtabstop=-1 expandtab:

version: '2'
services:
  redis:
    image: redis:4.0.5-alpine
    network_mode: host
    volumes:
      - ./data:/data
    ports:
      - "6379:6379"
    command: [redis-server, '--appendonly', 'yes']

好了,以後docer-compose up初始化,docker-compose start便可啓動。

最後

有了vagrant,我就在本地擁有了一個徹底的、方便的linux沙盒環境,能夠用來嘗試各類新玩意,試驗本身的新想法。

有了docker,我能夠先將須要的服務在本地配置、調試好。因爲docker的隔離性,因此只要本地的docker配置和服務配置無誤,那麼就可以用這些配置直接快速的在遠程服務器上部署。

以後有時間,我準備將我在一臺國外vps的小水管上的服務,將其配置抽取爲一組配置文件,以後使用這組配置文件,之後不管在那臺vps上都能快速部署。

相關文章
相關標籤/搜索