Docker容器引导完整CentOS

因为现在的环境还在CentOS5下,但新的库只有在CentOS6下才能用。然后用Docker启动完整OS,这样相对于ESX省资源一点点。

目前的环境是宿主机是ubuntu 16.04, 然后容器就 centos5 和 centos6

首先直接从官方下载相关底包

docker pull centos:5.11
docker pull centos:6.8

然后直接在底包上组安装相关软件

yum groupinstall ...

上面直接组安装法对5.11没问题, 6.8就是没办法折腾。6.8上只要这样安装,再启动容器,发现会卡在

sulogin 这个进程上,然后就没反应了(另外,rc.sysinit 这个进程应该运行一下就消失的却一直都在)。查询了一下这个进程是单用户登录用的,然后只要有这个进程就没办法SSH了。

然后我是按下面的包顺序安装的。

# 先安装的SSH,安装一个 commit 一次, 一行装一次
openssh-server
# 下面的是 Base 包里的
abrt-addon-ccpp abrt-addon-kerneloops abrt-addon-python abrt-cli acpid alsa-utils at authconfig b43-fwcutter bc
biosdevname blktrace bridge-utils centos-indexhtml cpuspeed crontabs cryptsetup-luks cyrus-sasl-plain dbus
fprintd-pam hunspell hunspell-en irqbalance ledmon libaio logrotate
lsof lvm2 man man-pages man-pages-overrides microcode_ctl mlocate mtr nano
ntp ntpdate ntsysv openssh-clients pam_passwdqc pciutils pcmciautils pinfo pm-utils
prelink psacct rdate readahead rfkill       
rng-tools rsync scl-utils 
setserial
setuptool smartmontools sos strace sysstat system-config-firewall-tui system-config-network-tui systemtap-runtime tcpdump tcsh time tmpwatch traceroute unzip vconfig vim-enhanced virt-what wget words xz yum-plugin-security yum-utils zip bind-utils
# 下面的是开发工具组 直接 yum groupinstall ...
"Development tools"
# 下面这些是 Desktop, "X windows", 还有附加开发中的东西,
GConf2-devel NetworkManager NetworkManager-gnome alsa-lib-devel alsa-plugins-pulseaudio at-spi audit-libs-devel binutils-devel boost-devel bzip2-devel
control-center control-center-extra cyrus-sasl-devel dbus-glib-devel elfutils-devel elfutils-libelf-devel eog evolution-data-server-devel firstboot gdm
gdm-plugin-fingerprint gdm-user-switch-applet glx-utils gnome-applets gnome-desktop-devel gnome-keyring-devel gnome-media gnome-packagekit gnome-panel gnome-power-manager
java-1.6.0-openjdk-devel perl-devel mysql-devel python-devel perl-ExtUtils-MakeMaker sqlite-devel libcurl-devel
libacl-devel libattr-devel libcanberra-devel libcap-ng-devel libcgroup-devel  libgnome-devel libnotify-devel  librsvg2-devel libsoup-devel pygtk2-devel readline-devel tbb-devel vnc-server nscd pam_ldap vsftpd
xdg-user-dirs-gtk xorg-x11-drivers xorg-x11-server-Xorg xorg-x11-server-utils xorg-x11-utils xorg-x11-xauth xorg-x11-xinit xvattr yelp
polkit-devel gnome-terminal polkit-gnome spice-vdagent vino wacomexpresskeys wdaemon notification-daemon

最后还有下面这几这个包只要安装就会卡在 sulogin, 暂时不知道乍整

nautilus gok hmaccalc gvfs-devel gnome-vfs2-smb gvfs-archive gvfs-fuse gvfs-smb

引导完整系统官方是不推荐这样做的,毕竟Docker是轻量级的,这样违背了他的初衷了。

要引导完整系统run后面的参数就是 /sbin/init

在安装好 autofs 后,想启动它发现提示:

Starting automount: automount: test mount forbidden or incorrect kernel protocol version, kernel protocol version 5.00 or above required.
                                                           [FAILED]

搜索后发现原来是权限不够。

直接在 run 时加上 --privileged 即可,如:

docker run --rm --privileged -p 3000:22 -v /root/centos6:/root centos6/d1103:D /sbin/init

容器启动后,在宿主机发现 agetty 进程CPU占用100%,再次放狗,解决办法如下

systemctl list-units *getty* 
systemctl stop [email protected]  #主要是这个停止后就OK
systemctl stop system-getty.slice
systemctl stop getty.target

另外容器还要固定IP,然后用的macvlan办法,写了一个小脚本用来启动容器并设置IP

#!/bin/bash
# start container and setting container IP address

if [[ $# -ne 3 ]]
    then
    echo "./script.sh image_name ip_dev_name container_ip"
    echo ""
    echo "./script.sh centos5/new:A enp4s0 192.168.1.6/24"
    echo ""
    exit
fi

config=/local_home/docker/config

docker run -d --privileged -v $config/${1%/*}:/root $1 /sbin/init
docker_pid=$(docker inspect $(docker ps | awk -vt=$2 ‘NR>1&&$2==t{print $1}‘) 2>/dev/null | awk ‘$1~/Pid\"/{print +$2}‘)

if [[ -z "$docker_pid" ]]
    then
    echo "docker container name not found"
    exit
fi

if [[ `ip link | awk -vdev=$2 ‘$2==dev":"{a=1}END{print a}‘` -ne 1 ]]
    then
    echo "ip dev name error"
    exit
fi

ip link add "$2".d link "$2" type macvlan mode bridge
ip link set netns "$docker_pid" "${2}.d"

nsenter -t "$docker_pid" -n ip link set "${2}.d" up
nsenter -t "$docker_pid" -n ip route del default
nsenter -t "$docker_pid" -n ip addr add "$3" dev "${2}.d"
nsenter -t "$docker_pid" -n ip route add default via `ip r | awk ‘/default/{print $3}‘` dev "${2}.d"

# 进入容器
# nsenter --target=$docker_pid --net --mount --uts --pid
时间: 2024-10-26 19:06:21

Docker容器引导完整CentOS的相关文章

Docker容器CPU、memory资源限制

背景 在使用 docker 运行容器时,默认的情况下,docker没有对容器进行硬件资源的限制,当一台主机上运行几百个容器,这些容器虽然互相隔离,但是底层却使用着相同的 CPU.内存和磁盘资源.如果不对容器使用的资源进行限制,那么容器之间会互相影响,小的来说会导致容器资源使用不公平:大的来说,可能会导致主机和集群资源耗尽,服务完全不可用. docker 作为容器的管理者,自然提供了控制容器资源的功能.正如使用内核的 namespace 来做容器之间的隔离,docker 也是通过内核的 cgrou

如何在centos docker容器中支持sshd

### 1 启动容器,以centos 为例,其他没试过 #####root用户执行下面的语句,非root,加个sudo:```shelldocker run -d --privileged=true --name=centos centos /usr/sbin/init whlile true```解释一下--privileged=true可以解决dbus没有权限启动的问题/usr/sbin/init 可以解决不启动dbus的问题,因为centos镜像Dockerfile的默认CMD为/bin/

Centos故障01:Docker容器丢失

问题 一测试环境,配置及应用如下: [Centos ~]# rpm -q centos-release centos-release-7-6.1810.2.el7.centos.x86_64 应用: Docker Docker-Mysql Docker-Mongo dotnetcore-webapi RabbitMq Redis Nginx 年后上班发现dotnetcore-api 和docker应用无法使用. 解决 查找Docker 容器: docker ps -a 返回空. 创建Mysql容

docker 容器 centos + tomcat + jdk

环境: 阿里云ecs服务器 步骤: 1.安装docker 2.获取centos镜像 3.下载tomcat 和 jdk 安装包 4.配置 1.安装docker https://www.cnblogs.com/shijunjie/p/10436293.html 2.获取centos 镜像 1.在docker官方镜像源搜索centos镜像,选择合适的版本下载镜像 https://hub.docker.com/search?q=&type=image&operating_system= 2.举例:

Centos 配置开机启动脚本启动 docker 容器

原文:Centos 配置开机启动脚本启动 docker 容器 Centos 配置开机启动脚本启动 docker 容器 Intro 我们的 Centos 服务器上部署了好多个 docker 容器,因故重启的时候就会导致还得手动去手动重启这些 docker 容器,为什么不写个脚本自动重启呢,于是就有了这篇文章. 批量启动 Docker 容器 之前我们有提到过关于 docker 的一些骚操作 ,可以直接使用 docker start $(docker ps -aq) # 启动所有容器 docker s

Docker容器Centos不能使用systemctl命令问题

注:本文出自博主:chloneda 最近使用Docker搭建Centos容器时遇到这样的问题:Centos系统的不能使用systemctl命令! 具体场景 使用 systemctl 或 service 命令重启服务时. systemctl restart snmpd.service 会报无权限的错误: Failed to get D-Bus connection: Operation not permitted: 这是docker中centos7的bug,官网上也提到了这个问题,并给出了 解决办

ELK 完整部署和使用 - 每天5分钟玩转 Docker 容器技术(90)

上一节已经部署了容器化的 ELK,本节讨论如何将日志导入 ELK 并进行图形化展示. 几乎所有的软件和应用都有自己的日志文件,容器也不例外.前面我们已经知道 Docker 会将容器日志记录到 /var/lib/docker/containers/<contariner ID>/<contariner ID>-json.log,那么只要我们能够将此文件发送给 ELK 就可以实现日志管理. 要实现这一步其实不难,因为 ELK 提供了一个配套小工具 Filebeat,它能将指定路径下的日

centos:解决docker容器内挂载目录无权限 ls: cannot open directory .: Permission denied

docker运行一个容器后,将主机中当前目录下的文件夹挂载到容器的文件夹后 进入到docker容器内对应的挂载目录中,运行命令ls后提示: ls: cannot open directory .: Permission denied 解决: 在docker run一个容器时,加上 --privileged=true 给容器加特权即可. 原文地址:https://www.cnblogs.com/UniqueColor/p/9318815.html

docker容器从入门到精通

第1章 docker容器 1.1 什么是容器? 容器就是在隔离的环境运行的一个进程,如果进程停止,容器就会销毁.隔离的环境拥有自己的系统文件,ip地址,主机名等 1.2 容器和KVM虚拟化的区别 kvm虚拟化: 需要硬件的支持,需要模拟硬件,可以运行不同的操作系统,启动时间分钟级(开机启动流程) linux开机启动流程: bios开机硬件自检 根据bios设置的优先启动项 网卡 硬盘 u盘 光驱 读取mbr引导 UEFI(gpt分区) mbr硬盘分区信息,内核加载路径 加载内核 启动第一个进程i