1. 程式人生 > >基於Docker的服務部署流程

基於Docker的服務部署流程

本次總結涉及到Docker-io、Docker-ce的安裝、CentOS7映象的製作、Docker私有倉庫搭建、CentOS6.7環境下從CentOS7私有倉庫拉取私有映象、Docker容器執行、CentOS6.5及CentOS7一起執行時相容性處理等內容。

一、Docker基本元件及DevOps運作流程

DockerImage:Docker映象是一個執行容器的只讀模板。

DockerContainer:Docker容器是一個執行應用的標準化單元。

DockerRegistry:Docker註冊伺服器用來存放映象。

DockerEngine:Docker引擎用來在主機上建立,執行和管理容器。

Docker在DevOps體系中的運作流程如下:

二、Docker安裝與配置

         由於Docker國外站點下載較慢或無法正常下載,需要更新為國外源之後再進行快速安裝配置。CentOS6.5安裝docker-io,CnetOS7安裝docker-ce

#建立docker相關的目錄

mkdir -p /data/docker

#安裝docker執行必要工具

sudo yum install -y yum-utilsdevice-mapper-persistent-data lvm2 crontabs

#增加docker下載倉庫,使用阿里雲倉庫下載,國外站點下載太慢

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

sudo yum makecache fast

#安裝docker並檢測docker安裝執行情況

sudo yum -y install docker-ce

docker version

systemctl enable docker.service

systemctl start docker.service

#配置docker

sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json<<-'EOF'

{"graph": "/data/docker"}

EOF

sudo systemctl daemon-reload

sudo systemctl restart docker

三、搭建私有Docker倉庫

         Docker安裝完成後dockerd的配置檔案在/etc/docker/daemon.json中,如果沒有該檔案,可以手動建立。

1、安裝配置registry映象

pull docker官方的registry的第二個版本,docker1.6版本以上支援registry2

docker pull registry:2.6.0

或者不指定版本,表示latest版本

docker pull registry

配置daemon.json,去掉docker預設的https的訪問,否則易出現如下問題:

Get https://120.78.253.133:5000/v2/:http: server gave HTTP response to HTTPS client

開啟配置檔案

vim /etc/docker/daemon.json

裡面的內容是一個json物件,加上一項insecure-registries,地址自己更改:

{

"insecure-registries":["192.168.1.78:5000"]

}

此處設定無效時,直接配置服務程式如下(增加紅色字型內容):

vim/usr/lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd --insecure-registry 172.18.3.242:5000

重啟docker

systemctl daemon-reload

systemctl restart docker

2、無認證啟動registry容器

         上傳到私有倉庫的映象時是預設存放在容器的/var/lib/registry/,為了防止刪除registry時上傳的映象也被刪除,所以啟用一個volume,將上傳的映象持久化儲存在我們物理機上,這裡儲存位置是/opt/registry/。

docker run -d --name registry -p5000:5000 --restart=always -v /opt/registry/:/var/lib/registry/ registry:2.6.0

測試是否啟動容器

curlhttp://192.168.1.78:5000/v2/_catalog

如果返回以下資訊表示啟動成功

{"repositories":["mynginx"]}

3、私有倉庫推拉私有映象

測試上傳到我們自己的私有registry,首先將mynginx映象重新命名tag:

docker tag mynginx 192.168.1.78:5000/mynginx

這裡需要注意的是重新命名的tag必須帶有建立192.168.1.78:5000/這個字首,後面的mynginx是新映象名,二者名稱可以不同。然後開始push到我們建立的私有registry倉庫:

docker push 192.168.1.78:5000/mynginx

檢測推送映象的情況,返回以下結果說明推送正常。

{"repositories":["mynginx"]}

測試私有倉庫映象拉取pull,本機拉取如下:

docker rmi 192.168.1.78:5000/mynginx

docker pull 192.168.1.78:5000/mynginx

其他物理主機拉取私有倉庫映象,在安裝docker前提下配置/etc/docker/daemon.json檔案新增insecure-registries,ip地址自己更改:

{

"insecure-registries":["192.168.1.78:5000"]

}

然後重啟docker,執行pull,同理也可以上傳映象

systemctl daemon-reload

systemctl restart docker

docker pull 192.168.1.78:5000/mynginx

4、Dockerfile建立服務映象

         Dockfile是一種被Docker程式解釋的指令碼,Dockerfile由一條一條的指令組成,每條指令對應Linux下面的一條命令。Docker程式將這些Dockerfile指令翻譯真正的Linux命令。Dockerfile有自己書寫格式和支援的命令,Docker程式解決這些命令間的依賴關係,類似於Makefile。Docker程式將讀取Dockerfile,根據指令生成定製的image。相比image這種黑盒子,Dockerfile這種顯而易見的指令碼更容易被使用者接受,它明確的表明image是怎麼產生的。有了Dockerfile,當我們需要定製自己額外的需求時,只需在Dockerfile上新增或者修改指令,重新生成image即可,省去了敲命令的麻煩。

基於centos7建立映象,首先拉取centos7映象,

docker pull centos7

製作映象的dockerfile如下所示:

FROMcentos:7

MAINTAINERtcy   [email protected]

RUNyum   update    -y && \

yum   install crontabs iproutewget net-tools  gcc automake autoconflibtool make gcc gcc-c++   zlib*  zlib-devel -y

RUN mkdir -p /home/mynginx

COPYoctmts  /home/mynginx/octmts

COPYtools  /home/mynginx/tools

WORKDIR/home/mynginx/octmts

RUNchmod –R 755 *

RUNsh install.sh octmts

編譯建立映象

docker build  -t octmts  -f dockerfile-octmts   .

建立容器

程式檔案和dockerfile放在同一目錄

docker create --name octmts3.0 -v/home/docker_oct/data:/home/mynginx/octmts/log -p 50000:50000 -p 50001:50001 -p50002:50002 octmts1.0

建立容器+執行

docker run -id --net=host --nameoctmts2.0 -v /home/docker_oct/data:/home/mynginx/octmts/log -p 50000:5000octmts1.0

建立CentOS7容器,使用systemctl後臺執行服務程式時遇到以下問題:

Failed to get D-Bus connection

解決方案(此方案在主機是CentOS6.5系統下無效,暫時無法處理):

docker create --privileged --net=host --nameoctmts3.0 -v /home/docker_oct/data:/home/mynginx/octmts/log -p 50000:50000 -p50001:50001 -p 50002:50002 octmts1.0 /usr/sbin/init

或者

docker run --privileged --net=host -id --nameoctmts3.0 -v /home/docker_oct/data:/home/mynginx/octmts/log -p 50000:5000octmts1.0 /usr/sbin/init

四、CentOS6.5系統下使用私有倉庫的相容問題

         CentOS6.5系統下使用私有倉庫時由於版本問題導致pull私有映象失敗,Docker 1.7.1版本pull私有映象倉庫報錯,V1,V2等。Docker 1.7版本和Docker CE的配置檔案的位置不同:

·        Docker 1.7版本 /etc/sysconfig/docker

·        Docker CE版本使用 /etc/docker/daemon.json

         使用docker 1.7版本如果要pulldocker registry v2或harbor裡的映象,如果沒有配置CA證書的話,需要配置insecure-registry,並且需要將這個引數加到docker daemon的啟動引數裡。配置步驟:

1、Docker 1.7解決辦法

⑴ 配置DOCKER_OPTS引數並儲存

[[email protected] ] # vi /etc/sysconfig/docker

other_args=

DOCKER_CERT_PATH=/etc/docker

## add

DOCKER_OPTS="--insecure-registry ip:port"

⑵ 修改啟動項

[[email protected] ] # vi /etc/init.d/docker

## 找到 start 函式,exec處增加剛配置的DOCKER_OPTS,參見下邊空行處

start() {

if [ ! -x $exec ]; then

if [ ! -e $exec ]; then

echo "Docker executable $exec not found"

else

echo "You do not have permission to execute the Docker executable$exec"

fi

exit 5

fi

check_for_cleanup

if ! [ -f $pidfile ]; then

prestart

printf "Starting $prog:\t"

echo "\n$(date)\n" >> $logfile

## addDOCKER_OPTS

$exec -d $DOCKER_OPTS &>> $logfile &

pid=$!

touch $lockfile

# waitup to 10 seconds for the pidfile to exist. see

#https://github.com/docker/docker/issues/5359

tries=0

while [ ! -f $pidfile -a $tries -lt 10 ]; do

sleep 1

tries=$((tries + 1))

done

success

echo

else

failure

echo

printf "$pidfile still exists...\n"

exit 7

fi

}

⑶ 重啟docker並驗證pull功能

[[email protected] ] # service docker restart

⑷其他方法

不這麼費事,直接修改啟動項,原理和結果都是相同的,然後重啟dockerdaemon

[[email protected] ] # vi /etc/init.d/docker

## 找到exec,直接新增--insecure-registry ip:port

prog="docker"

exec="/usr/bin/$prog --insecure-registryip:port"

pidfile="/var/run/$prog.pid"

lockfile="/var/lock/subsys/$prog"

logfile="/var/log/$prog"

2、Docker CE版本

檢查/etc/docker目錄下是否有daemon.json檔案,如果沒有則建立,或者直接vi/etc/docker/daemon.json修改完在:wq也行。

[[email protected] ] # vi /etc/docker/daemon.json

## add

{

"registry-mirrors": ["https://registry.docker-cn.com"],

"insecure-registries" : ["ip:port","ip:port"]

}

新增完成後重啟docker服務

service docker restart