docker搭建

1,宿主機系統與docker版本選型

        從現有的系統來看centos7對虛擬化的支持相對來說更完美,對於docker的版本當然是最新的版本功能更完善;

故選擇 Centos7+docker最新版本

 

2kernel升級

現象描述:系統死機

原因描述:centos7.1默認安裝的內核爲3.10版本,對於運行少量的容器來說不存在任何問題,當運行容器的數量增多時(比如100臺)就會發現容器運行一段時間後操作系統會死機,導致整個物理機不可用,經研究發現將系統內核升級到4.2即可解決此問題。

解決方案:

查看系統當前內核版本

blob.png

 

blob.png

 

yum升級kernel至4.x

    rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

    yum install http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm

    yum --enablerepo=elrepo-kernel install kernel-ml

    grub2-set-default 0

 

cat /boot/grub2/grub.cfg |grep menuentry

 

 grub2-set-default "CentOS Linux (3.10.0-327.el7.x86_64) 7 (Core)"   設置第一個內核選項爲默認啓動項

 

 grub2-editenv list  查看是否設置成功

 

 

 

重啓操作系統

    reboot

再次查看nerker版本

blob.png

如需卸載可使用:yum remove kernel-ml

 

repo.org

3,內核調優

現象描述:網絡高延時、丟包

原因描述:單臺宿主機運行百臺以上容器時,對宿主機的壓力相應增加,其中網絡方面表現最爲明顯;

以ARP爲例:容器使用br0的網絡與外面通信,這樣每臺容器都會將arp信息緩存下來,如果100臺容器分別將網關、宿主機這兩條信息存入ARP緩存表,那麼物理機上的arp緩存表就有200條;而系統默認的arp緩存條目爲128條,所以將導致一部分arp信息被覆蓋掉。如果容器間進行頻繁的網絡通信,就會表現出大量的延時甚至丟包。

cat /proc/sys/net/ipv4/neigh/default/gc_thresh1   #系統默認的ARP緩存條目

cat /proc/sys/net/ipv4/neigh/default/gc_thresh2  #系統ARP條目值的軟限制

cat /proc/sys/net/ipv4/neigh/default/gc_thresh3   #系統ARP條目值的硬限制

blob.png

 

解決方案:

修改系統內核參數

vim /etc/sysctl.conf 

 

# System default settings live in /usr/lib/sysctl.d/00-system.conf.

# To override those settings, enter new settings here, or in an /etc/sysctl.d/<name>.conf file

#

# For more information, see sysctl.conf(5) and sysctl.d(5).

 

blob.png

net.ipv4.ip_forward=1

net.ipv4.neigh.default.gc_thresh1=25600

net.ipv4.neigh.default.gc_thresh2=51200

net.ipv4.neigh.default.gc_thresh3=102400

net.core.rmem_default = 2097152

net.core.rmem_max=16777216

net.core.wmem_max=16777216

net.core.wmem_default = 2097152

net.ipv4.neigh.default.base_reachable_time = 172800

net.ipv4.neigh.default.gc_stale_time = 172800

kernel.msgmax=65536

kernel.msgmnb=65536

kernel.pid_max=65535

 

 sysctl -p


 

/etc/security/limits.d/20-nproc.conf

*          soft    nproc     65535

 

ulimit -n 65535

echo "* soft nproc 65535"  >> /etc/security/limits.conf

echo "* hard nproc 65535"  >> /etc/security/limits.conf

4,設置橋接網卡

1    安裝包

yum install  bridge-utils -y 

 

2)設置bond網卡

[root@docker011 ~]# cat /etc/sysconfig/network-scripts/ifcfg-bond0

BOOTPROTO=none

DEVICE=bond0

ONBOOT=yes

BONDING_OPTS='mode=1 miimon=100'     (mode=1,網卡綁定模式爲主備)

BRIDGE=br0

 

3)設置 ifcfg-br0 網卡文件

[root@docker011 ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0

DEVICE=br0

TYPE=Bridge

ONBOOT=yes

BOOTPROTO=none

IPADDR=21.68.26.247

PREFIX=23

GATEWAY=21.68.27.254

 

結尾  Service  network  restart  重啓網卡

 

5,安裝docker

    1)配置yum源

cd /etc/yum.repos.d/

vim docker.repo 

[docker-epel]

name=docker-epel

baseurl=http://mirrors.aliyun.com/centos/$releasever/extras/$basearch/

gpgcheck=0

 

blob.png

 

    2)配置http代理,如果宿主機能直接鏈接外網請跳過此步驟

 export http_proxy=http://10.59.19.251:48080 

說明: C:\Users\Administrator\AppData\Local\YNote\data\qq4E39918B940506173AB62B13339FC373\04ee06f6bc6f44ae84efc5972fd60f80\clipboard.png

 

3)yum安裝docker-io

 yum install docker-io

blob.png

 

安裝完成後修改docker服務的啓動參數

vim /etc/sysconfig/docker

修改other_args=""other_args="-b br0 --insecure-registry=rocshen.io"

-b=br0    #容器啓動時的網絡地址池

--insecure-registry=rocshen.io   #支持使用HTTP協議從倉儲rocshen.io下載鏡像

 

blob.png

 

 

Stg1 :OPTIONS='--insecure-registry=1qianbao.com -b=br0 --storage-driver=devicemapper --storage-opt dm.basesize=80G --selinux-enabled=false -H unix:///var/run/docker.sock -H tcp://0.0.0.0:9999'

/etc/sysconfig/docker-storage-setup

CONTAINER_THINPOOL=docker-pool

目前我的docker環境:OPTIONS='--selinux-enabled=false --storage-driver=devicemapper --storage-opt dm.basesize=100G --insecure-registry=mrroy.io -b br0'

blob.png

 

Rm -rf /var/lib/docker/*

 cd /var/lib/docker      -----清除全部內容

 mkdir -p  /var/lib/docker/devicemapper/devicemapper/       ---創建兩個devicemappe目錄

 

然後再進入devicemappe目錄下創建:

dd if=/dev/zero of=data bs=1G count=0 seek=1500

dd if=/dev/zero of=metadata bs=1G count=0 seek=2

 

 

 

啓動docker服務

 systemctl start docker.service

查看docker版本

[root@docker3 ~]# docker -v

 

Docker version 1.13.1, build 774336d/1.13.1


blob.png

 

6,拉取docker鏡像

添加hosts主機名信息

添加 10.59.41.251 rocshen.io /etc/hosts


 

拉取鏡像

docker pull rocshen.io/centos6_base

blob.png

l

 

至此,docker服務器搭建完

 

7私有倉儲搭建:

 

#[root@docker5 ~]# yum install docker-registry

#[root@docker5 ~]# vim /etc/sysconfig/docker-registry

 

# Port to bind the registry to

    REGISTRY_PORT=80    --->修改端口號未本機80,支持http

 

#[root@docker5 ~]# service docker-registry start                   

 

下載or 創建基礎鏡像

 

1將基礎鏡像打 tag  並傳到本地image

    docker tag  roy-web  roy.com/jboss-test    

blob.png

 

 2)通過dockerfile文件定製鏡像文件(命令後.表示當前目錄加載dockerfile文件

    docker  build  -t  roy.com/jboss-test  .     

blob.png

 

# docker histry --no-trunc

 

 

3)將定製好的鏡像push到目前docker私有倉庫中。

docker   push   roy.com/jboss-test                

blob.png

 #到此可以通過docker客戶端通過以上私有倉庫進行pull鏡像文件,(需要修改docker客戶端/etc/sysconfig/docker OPTIONS='--insecure-registry= roy.com

 

4.docker run -id --name cip-web --privileged roy.com/jboss-test /init.sh -h cip-web

   啓動剛build的鏡像系統,並-id在後臺運行,--name 啓動時添加的別名。

 

5.docker exec -it  cip-web  /bin/bash                                                                     進入到cip-web系統

 

6docker stop cip-web                                                                                                停止剛啓動的系統,可以使用docker ps查看哪些系統在啓動

 

7.docker rmi  b989f592aed2                                                                                     刪除鏡像文件

 

 

 

 

 

腳本方法:

1.bash dockerbuild.sh -v 1224 -h cip-web --build --push               使用dockerbuild.sh腳本構建cip-web子系統鏡像文件

2.rundocker -v 0121 -h abp-web                                                                      -v 指定本次需要啓動的版本,-h 系統名稱

 

docker導出鏡像

docker save -o 文件名 鏡像名


docker導入鏡像

docker load < 文件名


docker images  查看當前機器所有鏡像

docker inspect 容器名字    獲取容器/鏡像的元數據。

docker stop 容器名字

docker rm 容器名字

docker stats $(docker ps --format={{.Names}}) --no-stream


docker exec -i 容器ID bash ps -a

docker tag 66ee80d59a68 1qianbao.com/centos7




docker磁盤動態擴容

重啓docker後會無法啓動容器

需要先啓動docker start centos7 忽略報錯

在運行一遍擴容腳本disk.sh centos 250(大於等於之前的容量)

在啓動dcoker start centos7 就好了 

#!/bin/bash
#This script is dynamic modify docker container disk
if [ -z $1 ] || [ -z $2 ]; then
    echo "Usage: container_name increase_capacity"
    echo "Example: I want increase 11G to test"
    echo "The command is:   sh `basename $0` test 11"
    exit 1
                                                                                                                                                        fi
if [ `docker inspect $1 &>>/dev/null &&  echo 0 || echo 1` -eq 1 ];then
    echo "The container $1 is no exist!"
    exit 1
fi
#container_id=`docker inspect -f '{{ .Id }}' $1`
container_id=`docker inspect $1 | grep DeviceName | awk -F '"' '{print $4}'`
now_disk=`dmsetup table /dev/mapper/$container_id|awk '{print $2}'`
disk=$(($2*1024*1024*1024/512))
if [ $disk -lt $now_disk ];then
    echo "I can't shink container $1 from $(($now_disk*512/1024/1024/1024))G to ${2}G!I only modify contanier increase disk!"
    exit 1
fi
dmsetup table /dev/mapper/$container_id|sed "s/0 [0-9]* thin/0 $disk thin/"|dmsetup load /dev/mapper/$container_id
dmsetup resume /dev/mapper/$container_id
xfs_growfs /dev/mapper/$container_id
if [ $? -eq 0 ];then
    echo "dynamic container $1 disk to ${2}G is success!"
else
    echo "dynamic container $1 disk to ${2}G is fail!"
fi


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章