Docker安装CentOS容器并配置静态ip
查看CentOS版本
进入docker镜像官网查看centos版本
拉取CentOS镜像
这里以CentOS7.9为例
[root@localhost yum.repos.d]# docker pull centos:centos7.9.2009
centos7.9.2009: Pulling from library/centos
2d473b07cdd5: Pull complete
Digest: sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4
Status: Downloaded newer image for centos:centos7.9.2009
docker.io/library/centos:centos7.9.2009
安装Docker桥接网络
为了后续给CentOS容器分配ip,需要创建Docker桥接网络。
首先打开网卡文件(/etc/sysconfig/network-scripts目录下),注释掉其中有关IP地址、子网掩码、网关、DNS等的配置;
并在最下方添加 BRIDGE="br0"
创建名为 ifcfg-br0
的网卡文件(网络配置根据实际情况填写)
DEVICE="br0"
NM_CONTROLLED="yes"
ONBOOT="yes"
TYPE="Bridge"
BOOTPROTO=none
IPADDR=10.20.82.25
NETMASK=255.255.0.0
GATEWAY=10.20.0.1
DNS1=114.114.114.114
执行 systemctl restart network
重启网络
查看桥接网络
yum install -y bridge-utils
brctl show
创建CentOS容器并配置ip
docker run -itd --name=centos_demo --privileged=true --hostname=centos_demo --net=none --restart=always --add-host=centos_demo:10.20.82.2 centos:centos7.9.2009 /usr/sbin/init
-t: 终端 -i: 交互式操作 -d: 后台运行
--privileged=true 容器内可以使用真正的root权限
--restart=always 重启docker后自动启动容器
--add-host=centos_demo:10.20.82.2 会将该信息配置到容器的/etc/hosts文件中
/usr/sbin/init 启动容器之后可以使用systemctl方法(使用/bin/bash无法使用systemctl)
容器配置ip需要使用pipework脚本,将该脚本放到/usr/bin/目录下,cp -a /opt/pipework-master/pipework /usr/bin/
下载地址:https://github.com/jpetazzo/pipework
配置ip
# pipework 【网桥名】 【容器名称/ID】 【静态IP地址】/【子网掩码】@【网关】
pipework br0 centos_demo 10.20.82.2/16@10.20.0.1
# 重启容器会失效,需要重新配置
此时使用物理设备ping该容器ip发现已经可以ping通了!
基本配置
# 进入容器
docker exec -it centos_demo /bin/bash
# 安装常用工具
yum install -y openssh-server vim lrzsz wget gcc-c++
yum -y install gcc automake autoconf libtool make
yum install -y net-tools
# 开启ssh服务
systemctl start sshd
# 修改root密码
passwd root
# 安装jdk
yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
可将安装了常用工具的CentOS容器构建镜像,方便后续创建多个容器使用(无需反复配置ssh/root密码等)
# 暂停刚才创建的CentOS容器
docker pause centos_demo
# 基于该容器构建镜像
docker commit centos_demo centos_test:lastest
# 查看镜像是否创建成功
docker images
# 启动所有容器
docker start $(docker ps -a | awk '{ print $1}' | tail -n +2)
# 启动某个容器
docker start 容器名或ID
# 关闭所有容器
docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2)
# 关闭某个容器
docker stop 容器名或ID
# 所有容器批量开启ssh服务
vi startsshd.sh
docker ps -a | awk '{print $NF}' > dockername.txt
while read line
do
if [[ "$line" != "NAMES" && "$line" != "docker-ui-10" ]]; then
echo $line
docker exec $line /usr/sbin/sshd
fi
done < dockername.txt