DockerコンテナブートフルCentOS
6953 ワード
現在の環境はCentOS 5ではありますが、新しいライブラリはCentOS 6でのみ使用できます.その後、Dockerで完全なOSを起動し、ESXに比べてリソースをわずかに節約します.
現在の環境では、ホストはubuntu 16.04であり、コンテナはcentos 5とcentos 6である.
まずは公式ダウンロードから
その後、バックパックに直接関連ソフトウェアをインストールします.
CentOS 6ダイレクトグループのインストールが完了すると、直接起動するとsuloginに引っかかる可能性があります.
完全なシステムを導く公式はこのようなことをお勧めしません.結局、Dockerは軽量級で、彼の初志に反しています.
完全なシステムrunを起動するパラメータは/sbin/initです.
Autofsをインストールした後、発見プロンプトを起動します.
検索してみると権限が足りなかった.
runに--privilegedを直接付けると、次のようになります.
コンテナ起動後、ホストコンピュータでagettyプロセスCPUが100%占有していることを発見し、再び犬を放し、解決方法は以下の通りである.
また、コンテナはIPを固定し、macvlanメソッドを使用して、コンテナを起動してIPを設定するための小さなスクリプトを書きました.
上のシナリオはしばらくかかりましたが、やはり面倒な感じがして、叩きすぎます.そしてまたpythonの
このスクリプトは最新のミラーが何なのか考えないで、便利なcommitです.
使用中にホスト名が設定されていないため、NFSで次のエラーが発生しました.
上のdocker起動スクリプトを変更し、-hというパラメータを追加しますが、-hは/etc/hostnameのみ変更されることがわかります.
一方、/etc/hostsおよび/etc/sysconfig/networkは変化しなかった.そこで以下のスクリプトを/etc/rcに加える.これで終わりだ
現在の環境では、ホストはubuntu 16.04であり、コンテナはcentos 5とcentos 6である.
まずは公式ダウンロードから
docker pull centos:5.11
docker pull centos:6.8
その後、バックパックに直接関連ソフトウェアをインストールします.
yum groupinstall ...
CentOS 6ダイレクトグループのインストールが完了すると、直接起動するとsuloginに引っかかる可能性があります.
vi /etc/rc.d/rc.sysinig
426 if [ -z "$fastboot" -a "$READONLY" != "yes" ]; then
427
428 STRING=$"Checking filesystems"
429 echo $STRING
430 fsck -T -t noopts=_netdev -A $fsckoptions
# , 。
431 echo "Disable FSCK" > /dev/null
432 rc=$?
433
434 if [ "$rc" -eq "0" ]; then
435 success "$STRING"
436 echo
完全なシステムを導く公式はこのようなことをお勧めしません.結局、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 [[ $# -lt 2 ]] || [[ $# -gt 3 ]]
then
echo "./script.sh p_w_picpath_name container_ip hostname [ip_dev_name]"
echo ""
echo "./script.sh centos5/new:A 192.168.10.5/26 test1 [enp4s0]"
echo ""
exit
fi
if [[ $# -eq 4 ]]
then
if [[ `ip link | awk -vdev=$4 '$2==dev":"{a=1}END{print a}'` -ne 1 ]]
then
echo "ip dev name error"
exit
fi
ip_dev=$4
fi
if [[ $# -eq 3 ]]
then
ip_dev=`ip -4 a | awk -F'[ :]+' '/UP group/{print $2;exit}'`
fi
config=/docker
if [[ `docker p_w_picpaths "$1" 2>/dev/null | wc -l` -ne 2 ]]
then
echo "Docker Images Not Found"
exit
fi
if [[ `ping ${2%/*} -c 3 | grep -c "100% packet loss"` -eq 0 ]]
then
echo "IP address Already Use"
exit
fi
docker run -d --privileged --net=none --name ${1%/*} -v $config/config/${1%/*}:/root -v $config/local_home:/local_home -h $3 $1 /sbin/init
sleep 8
docker_pid=$(docker inspect -f '``.`State`.`Pid`' ${1%/*})
ip link add "$ip_dev".d link "$ip_dev" type macvlan mode bridge
ip link set netns "$docker_pid" "${ip_dev}.d"
nsenter -t "$docker_pid" -n ip link set "${ip_dev}.d" up
nsenter -t "$docker_pid" -n ip route del default
nsenter -t "$docker_pid" -n ip addr add "$2" dev "${ip_dev}.d"
nsenter -t "$docker_pid" -n ip route add default via `ip r | awk '/default/{print $3}'` dev "${ip_dev}.d"
# enter container
#nsenter --target=$docker_pid --net --mount --uts --pid
上のシナリオはしばらくかかりましたが、やはり面倒な感じがして、叩きすぎます.そしてまたpythonの
このスクリプトは最新のミラーが何なのか考えないで、便利なcommitです.
#!/usr/bin/env python
import time
import sys
import os
ser = {"centos5":["test09","192.168.10.5/24"], "centos6":["test10","192.168.10.6/24"]}
config = {0:None, 1:"run", 2:None, 3:None} # 0:os, 1:run_type, 2:ip, 3:netcard
if len(sys.argv) == 1:
print '''
./script.py os [run(default)|commit] [ipaddress] [netcard]
./script.py centos5
'''
sys.exit(1)
for i,j in enumerate(sys.argv[1:]):
config[i] = j
if config[0] not in ser:
print "Docker Image Not Found"
sys.exit(1)
if not config[3]:
config[3] = os.popen("ip -4 a | awk -F'[ :]+' '/UP group/{print $2;exit}'").read()[:-1]
if not config[2]:
config[2] = ser[config[0]][1]
p_w_picpath = os.popen("""docker p_w_picpaths | awk '/%s/{print $1":"$2;exit}'""" % sys.argv[1]).read()[:-1]
if p_w_picpath:
if sys.argv[1] in os.popen("docker ps").read():
print "Docker Container Allready Running!"
sys.exit()
os.system("docker rm %s" % sys.argv[1])
if config[1] == "run":
os.system("docker run -d --privileged --net=none --name %s -v /docker/config/%s:/root -v /local_home:/local_home --hostname %s %s /sbin/init" % (config[0],config[0],ser[config[0]][0],p_w_picpath))
time.sleep(8)
pid = os.popen("docker inspect -f '``.`State`.`Pid`' %s" % sys.argv[1]).read()[:-1]
os.system('ip link add %s.d link %s type macvlan mode bridge' % (config[3],config[3]))
os.system('ip link set netns %s %s.d' % (pid,config[3]))
os.system('nsenter -t %s -n ip link set %s.d up' % (pid,config[3]))
os.system('nsenter -t %s -n ip route del default' % pid)
os.system('nsenter -t %s -n ip addr add %s dev %s.d' % (pid,config[2],config[3]))
os.system("nsenter -t %s -n ip route add default via `ip r | awk '/default/{print $3}'` dev %s.d" % (pid,config[3]))
else:
os.system("docker run --rm -it --privileged --name %s -v /docker/config/%s:/root -v /local_home:/local_home %s bash" % (config[0],config[0],p_w_picpath))
# enter container
#nsenter --target=$docker_pid --net --mount --uts --pid
使用中にホスト名が設定されていないため、NFSで次のエラーが発生しました.
Dec 1 13:44:39 localhost rpc.statd[8211]: gethostbyname error for localhost.localdomain
Dec 1 13:44:39 localhost rpc.statd[8211]: STAT_FAIL to localhost.localdomain for SM_MON of 192.168.10.7
Dec 1 13:44:54 localhost rpc.statd[8211]: gethostbyname error for localhost.localdomain
Dec 1 13:44:54 localhost rpc.statd[8211]: STAT_FAIL to localhost.localdomain for SM_MON of 192.168.10.7
Dec 1 13:44:54 localhost kernel: [2062569.786565] lockd: cannot monitor test04
上のdocker起動スクリプトを変更し、-hというパラメータを追加しますが、-hは/etc/hostnameのみ変更されることがわかります.
一方、/etc/hostsおよび/etc/sysconfig/networkは変化しなかった.そこで以下のスクリプトを/etc/rcに加える.これで終わりだ
#!/bin/bash
# setting hostname
hostname `cat /etc/hostname`
name=`hostname`
echo "127.0.0.1 ${name} ${name}.test.net" >> /etc/hosts
sed -i "s/\(HOSTNAME=\).*$/\1$name/" /etc/sysconfig/network