- 論壇徽章:
- 18
|
從安裝docker開(kāi)始計(jì)述,直到構(gòu)建ambari平臺(tái),其間讀者對(duì)某些命令不了解請(qǐng)自行查閱相關(guān)文檔,大致內(nèi)容如下:
基于Centos7安裝docker
創(chuàng)建固定IP的容器
遺留問(wèn)題
安裝docker
基于Centos7安裝docker不需要使用amaza的repo,直接就可使用shell命令:
1.安裝docker: yum install docker-io -y
(ps:在centos6.5上可能會(huì)出現(xiàn)這樣的錯(cuò)誤:
WARN[0000] You are running linux kernel version 2.6.32-431.el6.x86_64, which might be unstable running docker. Please upgrade your kernel to 3.8.0.
請(qǐng)升級(jí)內(nèi)核,網(wǎng)上說(shuō)的用命令:yum upgrade device-mapper-libs,是不行的,)
2.創(chuàng)建Dockerfile,內(nèi)容如下:
# 選擇一個(gè)已有的os鏡像作為基礎(chǔ),由于為做ambari進(jìn)行hdp進(jìn)行升級(jí),這里我選用了centos6的環(huán)境作為容器環(huán)境;
FROM centos:centos6
# 鏡像的作者
MAINTAINER moxuqiang "moxuqiang_dm@163.com"
# 安裝openssh-server和sudo軟件包,并且將sshd的UsePAM參數(shù)設(shè)置成no
RUN yum install -y openssh-server sudo
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
# 添加測(cè)試用戶admin,密碼admin,并且將此用戶添加到sudoers里
RUN useradd admin
RUN echo "admin:admin" | chpasswd
RUN echo "admin ALL=(ALL) ALL" >> /etc/sudoers
# 下面這兩句比較特殊,在centos6上必須要有,否則創(chuàng)建出來(lái)的容器sshd不能登錄
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
# 啟動(dòng)sshd服務(wù)并且暴露22端口
RUN mkdir /var/run/sshd
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
創(chuàng)建image: docker build -t centos6-ssh .
其中centos6-ssh是上面創(chuàng)建創(chuàng)鏡像的名稱,.表示Dockerfile路徑;
創(chuàng)建可固定分配IP的容器
docker在創(chuàng)建容器的時(shí)候,如果不指定其網(wǎng)絡(luò)格式,那么將默認(rèn)使用橋接模式,但這種模式無(wú)法固定容器的IP地址,docker容器有四種網(wǎng)格模式,分別為:bridge,host,container,none;創(chuàng)建固定IP的容器必須使用none的模式;
創(chuàng)建容器命令
docker run -itd --net=none --privileged=true -v /home/docker/centos_1:/usr/hdp -v /home/docker/data/centos_1:/datas --hostname=hdp1.urun --name=centos_1 centos6-ssh
–privileged=true:這是因?yàn)樵赾entos7才需要特別設(shè)置的,否則會(huì)出現(xiàn)掛載目無(wú)權(quán)限訪問(wèn)的情況;
-v: 從上面可以看到容器掛載了兩個(gè)目錄,也就是說(shuō)掛載兩個(gè)目錄必須用兩個(gè)-v來(lái)聲明;
–hostname:聲明容器主機(jī)名稱;
–name:聲明容器名稱;
創(chuàng)建完容器后,為容器分配固定IP,使用如下腳本:
#!/bin/bash
resetIP()
{
if [ `id -u` -ne 0 ];then
echo '必須使用root權(quán)限'
exit
fi
if [ $# != 2 ]; then
echo "使用方法: $0 容器名字 IP"
exit 1
fi
container_name=$1
bind_ip=$2
container_id=`docker inspect -f '{{.Id}}' $container_name 2> /dev/null`
if [ ! $container_id ];then
echo "容器不存在"
exit 2
fi
bind_ip=`echo $bind_ip | egrep '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$'`
if [ ! $bind_ip ];then
echo "IP地址格式不正確"
exit 3
fi
container_minid=`echo $container_id | cut -c 1-10`
container_netmask=`ip addr show docker0 | grep "inet\b" | awk '{print $2}' | cut -d / -f2`
container_gw=`ip addr show docker0 | grep "inet\b" | awk '{print $2}' | cut -d / -f1`
bridge_name="veth_$container_minid"
container_ip=$bind_ip/$container_netmask
pid=`docker inspect -f '{{.State.Pid}}' $container_name 2> /dev/null`
if [ ! $pid ];then
echo "獲取容器$container_name的id失敗"
exit 4
fi
if [ ! -d /var/run/netns ];then
mkdir -p /var/run/netns
fi
ln -sf /proc/$pid/ns/net /var/run/netns/$pid
ip link add $bridge_name type veth peer name X
brctl addif docker0 $bridge_name
ip link set $bridge_name up
ip link set X netns $pid
ip netns exec $pid ip link set dev X name eth0
ip netns exec $pid ip link set eth0 up
ip netns exec $pid ip addr add $container_ip dev eth0
ip netns exec $pid ip route add default via $container_gw
}
if [ $1 == "start" ]; then
for conf in `cat host_ip.list`
do
name=`echo $conf |cut -d ":" -f 1`
ip=`echo $conf |cut -d ":" -f 2`
docker start $name
resetIP $name $ip
echo "start container:"$name "success in ip:"$ip
done
elif [ $1 = "stop" ]; then
for conf in `cat host_ip.list`
do
name=`echo $conf |cut -d ":" -f 1`
ip=`echo $conf |cut -d ":" -f 2`
docker stop $name
echo "stop container:"$name "success"
done
else
echo "usage:container.sh start / stop"
fi
以上腳本需要配置容器:IP對(duì),需要修改路徑以及配置文件名稱的請(qǐng)修改代碼;
遺留問(wèn)題
1.無(wú)法修改主機(jī)名稱
2./etc/hosts的修改結(jié)果無(wú)法保存; |
|