docker的宿主系统是centos,为啥可以运行ubuntu的镜像

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker的宿主系统是centos,为啥可以运行ubuntu的镜像相关的知识,希望对你有一定的参考价值。

首先需要区分Linux内核与Linux发行版

Linux内核是Linux操作系统的核心, 负责硬件管理, 比如管理内存、管理磁盘(文件系统)、管理CPU(进程)等等...
Linux发行版是在Linux内核的基础上添加了一些工具软件,比如图形界面、函数库、软件包管理系统等等...

CentOS与Ubuntu是不同的Linux发行版, 它们都是基于Linux内核, 只是添加的工具软件不同。比如, 他们的软件包管理系统不同, CentOS使用yum命令安装软件, 而Ubuntu使用apt-get命令安装软件。

因此CentOS与Ubuntu的内核是相同的(版本可能不同), 只是所安装的软件不同, 即文件系统不同。

Docker容器技术是基于Linux内核实现的, 它主要用到了两个内核模块:

Namespace: 用于容器的隔离, 例如PID Namespace使得容器中的进程无法感知宿主机以及其他容器中的进程。
Cgroups: 用于容器的资源控制, 比如限制容器所使用的内存大小或者CPU个数。

在CentOS上运行基于Ubuntu镜像的容器时, 容器使用了CentOS主机的内核以及Ubuntu镜像, Ubuntu镜像中安装了Ubuntu的各种软件(apt-get)。
参考技术A Linux内核是Linux操作系统的核心, 负责硬件管理, 比如管理内存、管理磁盘(文件系统)、管理CPU(进程)等等...
Linux发行版是在Linux内核的基础上添加了一些工具软件,比如图形界面、函数库、软件包管理系统等等...
CentOS与Ubuntu是不同的Linux发行版, 它们都是基于Linux内核, 只是添加的工具软件不同。比如, 他们的软件包管理系统不同, CentOS使用yum命令安装软件, 而Ubuntu使用apt-get命令安装软件。
因此CentOS与Ubuntu的内核是相同的(版本可能不同), 只是所安装的软件不同, 即文件系统不同。
Docker容器技术是基于Linux内核实现的, 它主要用到了两个内核模块:
Namespace: 用于容器的隔离, 例如PID Namespace使得容器中的进程无法感知宿主机以及其他容器中的进程。
Cgroups: 用于容器的资源控制, 比如限制容器所使用的内存大小或者CPU个数。
在CentOS上运行基于Ubuntu镜像的容器时, 容器使用了CentOS主机的内核以及Ubuntu镜像, Ubuntu镜像中安装了Ubuntu的各种软件(apt-get)。
建议看看《Linux就该这么学》
参考技术B docker是类似于虚拟机的一种技术,但不同于虚拟机的是,虚拟机是将整个平台从(pass层)与物理机隔离,而docker是将应用(sass层)隔离,与物理机是什么系统无关

docker搭建

1,宿主机系统与docker版本选型

        从现有的系统来看centos7对虚拟化的支持相对来说更完美,对于docker的版本当然是最新的版本功能更完善;

故选择 Centos7+docker最新版本

 

2kernel升级

现象描述:系统死机

原因描述:centos7.1默认安装的内核为3.10版本,对于运行少量的容器来说不存在任何问题,当运行容器的数量增多时(比如100台)就会发现容器运行一段时间后操作系统会死机,导致整个物理机不可用,经研究发现将系统内核升级到4.2即可解决此问题。

解决方案:

查看系统当前内核版本

技术分享图片

 

技术分享图片

 

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版本

技术分享图片

如需卸载可使用: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条目值的硬限制

技术分享图片

 

解决方案:

修改系统内核参数

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).

 

技术分享图片

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网卡

[[email protected] ~]# 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 网卡文件

[[email protected] ~]# 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

 

技术分享图片

 

    2)配置http代理,如果宿主机能直接链接外网请跳过此步骤

 export http_proxy=http://10.59.19.251:48080 

技术分享图片

 

3)yum安装docker-io

 yum install docker-io

技术分享图片

 

安装完成后修改docker服务的启动参数

vim /etc/sysconfig/docker

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

-b=br0    #容器启动时的网络地址池

--insecure-registry=rocshen.io   #支持使用HTTP协议从仓储rocshen.io下载镜像

 

技术分享图片

 

 

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'

技术分享图片

 

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版本

[[email protected] ~]# docker -v

 

Docker version 1.13.1, build 774336d/1.13.1


技术分享图片

 

6,拉取docker镜像

添加hosts主机名信息

添加 10.59.41.251 rocshen.io /etc/hosts


 

拉取镜像

docker pull rocshen.io/centos6_base

技术分享图片

l

 

至此,docker服务器搭建完

 

7私有仓储搭建:

 

#[[email protected] ~]# yum install docker-registry

#[[email protected] ~]# vim /etc/sysconfig/docker-registry

 

# Port to bind the registry to

    REGISTRY_PORT=80    --->修改端口号未本机80,支持http

 

#[[email protected] ~]# service docker-registry start                   

 

下载or 创建基础镜像

 

1将基础镜像打 tag  并传到本地image

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

技术分享图片

 

 2)通过dockerfile文件定制镜像文件(命令后.表示当前目录加载dockerfile文件

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

技术分享图片

 

# docker histry --no-trunc

 

 

3)将定制好的镜像push到目前docker私有仓库中。

docker   push   roy.com/jboss-test                

技术分享图片

 #到此可以通过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的宿主系统是centos,为啥可以运行ubuntu的镜像的主要内容,如果未能解决你的问题,请参考以下文章

centos7安装docker并配置php运行环境

docker

docker在centos7宿主机上的安装和卸载

docker搭建

宿主机-免密登录Docker容器

mac装docker损害大吗