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_latest
yum 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
至此,終於搞定了!也是挺折騰 ):