1. 程式人生 > >CentOS6.x 安裝 Docker 和 Docker Compose

CentOS6.x 安裝 Docker 和 Docker Compose

零、前言

本來,對於 CentOS 系列,Docker 官方要求要 CentOS7.0 及以上系統版本,但是有時候迫不得已,還是要在已有的 CentOS6.x 的系統上安裝。

比如我遇到的:要在一臺已有的 CentOS6.5 的伺服器上部署一個 Java 應用,該 Java 應用基於 Java8 和 Mysql5.6 開發,都用到了相應的特性。但是,已有的 CentOS6.5 上已經在跑著幾個 PHP 和 Java 應用了,裝的 JDK 是 JDK7,Mysql 裝的是 Mysql5.1,第一感覺就是要 GG 了!

好在,Docker 強大的軟硬體隔離特性要發揮威力了!好,就走 Docker 這條路!剩下的問題也就變成了 Docker & Docker Compose 的安裝問題了!

一、安裝 Docker

以下 命令都是在 root 許可權下執行的。

Docker是Enterprise Linux(EPEL)的額外包的一部分,EPEL是用於RHEL發行版的非標準包的社群庫。首先,我們將安裝EPEL倉庫:

# rpm -iUvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
  • 1

更新 yum 源:

# yum update -y
  • 1

現在讓我們通過安裝 docker-io 軟體包來安裝 Docker:

# yum -y install docker-io
  • 1

安裝完成後,我們需要啟動 Docker 守護程序:

# service docker start安裝完成後,發現docker的程序老是顯示 dead狀態,需要切換到其他yum源,之後執行yum-config-manager --enable public_ol6_latestyum install device-mapper-event-libs
  • 1

最後,可選地,我們讓 Docker 在伺服器啟動時啟動:

# chkconfig docker on
  • 1

經過以上步驟,Docker 就已經安裝成功了!來跑跑試試:

下載一個 CentOS image:

# docker pull centos
  • 1

現在,要設定一個帶有 bash shell 的基本 centos 容器,我們只需執行一個命令。 docker 執行將在新容器中執行命令,-i 連線上 stdin 和 stdout,-t 分配一個 tty,我們使用標準的 fedora 容器。

# docker run -i -t centos /bin/bash
  • 1

就這樣!你現在在一個 centos Dockers 容器裡面使用一個 bash shell。

要斷開或分離 shell 而不退出,使用 Ctrl-p + Ctrl-q。(注:就是先按 Ctrl + p,再按 Ctrl + q)。

以上就是在 CentOS6.5 中安裝 Docker 的過程了。

二、安裝 Docker Compose

Docker Compose 是 Python 寫的一個可以同時管理多個 Docker容器 的工具。因為是 CentOS6.x,所以沒辦法直接安裝該工具,要通過 Python 的 pip 管理器工具來安裝。

一般 CentOS6.5 都自帶了 Pyhton2.6,所以要先安裝 Python2.7

2.1、安裝開發工具和Python2.7

# yum groupinstall "Development"
# yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel
# wget https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tar.xz
# tar -xvf Python-2.7.8.tar.xz
# cd Python-2.7.8
# ./configure --prefix=/usr/local
# make && make altinstall
# mv /usr/bin/python /usr/bin/python2.6.6
# ln -s /usr/local/bin/python2.7 /usr/bin/python
vi /usr/bin/yum CHANGE to python2.6.6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

以上是通過原始碼方式安裝了 Python2.7,倒數第三行的命令,把系統原有的 python 程式重新命名成 python2.6.6;倒數第二行命令,把 python2.7 程式連結/替換到原有的 python 程式。倒數第一行並不是一個命令,只是說明要把 /usr/bin/yum yum 程式的第一行宣告,改成原有的 python2.6.6。即:

#!/usr/bin/python
import sys
......
  • 1
  • 2
  • 3

改成

#!/usr/bin/python2.6.6
import sys
......
  • 1
  • 2
  • 3

一句話來說就是:升級了 Python 版本,但是 yum 程式還是用回原來的 Python 版本。

2.2、安裝 pip

# wget https://bootstrap.pypa.io/get-pip.py
# python get-pip.py 
  • 1
  • 2

2.3、安裝 docker-compose

# pip install docker-compose
  • 1

順利的話,以上步驟走完,就完成了 docker-compose 的安裝了,驗證一下是否安裝成功了,檢視版本資訊:

# docker-compose version
  • 1

三、我遇到的坑

3.1、pip 版本問題

執行 2.3節 的 pip install docker-compose 是遇到錯誤提示:

pkg_resources.DistributionNotFound: The 'pip==8.1.0' distribution was not found and is required by the application
  • 1
# cat /usr/bin/pip
打印出如下:

#!/usr/bin/python
# EASY-INSTALL-ENTRY-SCRIPT: 'pip==8.1.0','console_scripts','pip'
__requires__ = 'pip==8.1.0'
import sys
from pkg_resources import load_entry_point

if __name__ == '__main__':
    sys.exit(
        load_entry_point('pip==8.1.0', 'console_scripts', 'pip')()
    )
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

但是考慮到:

# ll /usr/local/lib/python2.7/site-packages | grep pip
列印如下:

drwxr-xr-x 10 root root  4096 Jun 16 13:08 pip
drwxr-xr-x  2 root root  4096 Jun 16 13:08 pip-9.0.1.dist-info
  • 1
  • 2
  • 3
  • 4
  • 5

就把 /usr/bin/pip 裡的所有 8.1.0 改為 9.0.1,然後 pip 就正常了。具體為啥,我也不太清楚了,不懂 Python 的路過。。

我猜是因為,python get-pip.py 安裝了 pip 之後,但是 /usr/bin/pip 裡面呼叫的還是舊版本好的 pip 導致的。

3.2、docker-compose 版本問題

上面 2.3節 的 pip install docker-compose 執行之後就安裝了 docker-compose。

但是當執行 docker-compose build 的時候,就會提示我們的 Dcoker 版本太低要求升級 Docker!預設安裝的 docker-compose 版本太高了!顯然我們目前的處境是無法再升級 Docker 的了,只能降 docker-compose 的版本。

先看一下我們已經安裝的 Docker 版本:

# docker -v
Docker version 1.7.1, build 786b29d/1.7.1
  • 1
  • 2

經查 Docker Compose Github Docs,發現 docker-compose 1.5.2 版本是相容 Docker 1.7.1 的:Note that Compose 1.5.2 requires Docker 1.7.1 or later.

好了,開始降級 docker-compose,先解除安裝:

# pip uninstall docker-compose
  • 1

再安裝指定版本:

# pip install docker-compose==1.5.2
  • 1

至此,docker-compose 降版本成功!

3.3、docker-compose.yml 版本問題

解決完 docker-compse 版本問題適配之後,對著已有的 docker-compose.yml 執行“,會提示不能正常識別 docker-compose.yml 檔案中的內容。究其原因,是因為我們的 docker-compose 1.5.2 只支援 V1 版本的 docker-compose.yml ,那麼好,把現在 V2 版本的 docker-compose.yml 改成 V1 版本的格式。

V1 版本的 docker-compose.yml 只被支援到 docker-compose 1.6.x。再往後的 docker-compose 版本就不再支援 V1 版本的 docker-compose.yml。

V1 版本的 docker-compose.yml 檔案格式主要區別就是: 
- 沒有開頭的 version 宣告 
- 沒有 services 宣告 
- 不支援 depends_on 
- 不支援命名的 volumes, networks, build arguments 宣告 
- 其他我沒用到的所以沒細究的區別

來個例子比較直觀吧!

V2 版本的 docker-compose.yml

version: "2"
services:
  redis:
    image: "redis:alpine"
    ports:
      - "6389:6379"
    volumes:
      - "./data/redis/data:/data"
  mysql:
    build: ./builds/mysql
    ports:
      - "3386:3306"
    volumes:
      - "./data/mysql/data:/var/lib/mysql"
      - "./data/mysql/conf:/etc/mysql/conf.d"
    restart: always   
    environment:
      MYSQL_DATABASE: solar
      MYSQL_USER: root
      MYSQL_PASSWORD: Huofigo2015
      MYSQL_ROOT_PASSWORD: Huofigo2015
  api:
    depends_on:
      - mysql
      - redis
    build:
      context: ./builds/api
    ports:
      - "8388:8080"
    volumes:
      - "./target/solar-app-0.0.1-SNAPSHOT.jar:/app/solar-app.jar"
    entrypoint:
      - "java"
      - "-jar"
      - "/app/solar-app.jar"
    restart: always
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

改成 V1 版本的 docker-compose.yml 後

redis:
  image: "redis:alpine"
  ports:
    - "6389:6379"
  volumes:
    - "./data/redis/data:/data"
mysql:
  build: ./builds/mysql
  ports:
    - "3386:3306"
  volumes:
    - "./data/mysql/data:/var/lib/mysql"
    - "./data/mysql/conf:/etc/mysql/conf.d"
  restart: always
  environment:
    MYSQL_DATABASE: solar
    MYSQL_USER: root
    MYSQL_PASSWORD: Huofigo2015
    MYSQL_ROOT_PASSWORD: Huofigo2015
api:
  build: ./builds/api
  ports:
    - "8388:8080"
  volumes:
    - "./target/solar-app-0.0.1-SNAPSHOT.jar:/app/solar-app.jar"
  links:
    - mysql
    - redis
  entrypoint:
    - "java"
    - "-jar"
    - "/app/solar-app.jar"
  restart: always
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

至此,終於搞定了!也是挺折騰 ):