进行大数据开发,需要虚拟一个Hadoop集群,原来都是在Win下开发的,前段时间刚换成M1 pro的02021款的mbp,遇到很多很多问题,到最后也根本没有办法使用号称支持M1 Mac的Paralles以及VMWare Fusion,ARM架构的Linux也没有办法使用,最终无奈转投Docker。但Docker原来从来都没有用过,遇到很多问题,记录在下。
开发环境介绍:M1 Macbookpro(2021)+Docker+CentOS8
无法找到命令,安装的时候提示无法找到镜像(Cannot prepare internal mirrorlist: No URLs in mirrorlist)
问题:
在CentOS 8中,使用yum时出现错误,镜像列表中没有url,类似如下:
Error: Failed to download metadata for repo ‘appstream’: Cannot prepare internal mirrorlist: No URLs in mirrorlist
原因
在2022年1月31日,CentOS团队终于从官方镜像中移除CentOS 8的所有包。
CentOS 8已于2021年12月31日寿终正非,但软件包仍在官方镜像上保留了一段时间。现在他们被转移到https://vault.centos.org
解决方法
更换Centos7或者9
如果你仍然需要运行CentOS 8,你可以在/etc/yum.repos.d中更新一下源,可以使用阿里云的源来代替原本无法使用的源
#下载阿里源文件
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo
#更新源里面的地址
sed -i -e "s|mirrors.cloud.aliyuncs.com|mirrors.aliyun.com|g " /etc/yum.repos.d/CentOS-*
sed -i -e "s|releasever|releasever-stream|g" /etc/yum.repos.d/CentOS-*
#清除、生成缓存
yum clean all
yum makecache
注意:这里如果使用wget可能提示找不到wget,Docker中自带的镜像没有此命令,请务必使用curl!
在执行完上述操作之后,就可以正常使用yum啦,这时候可以先更新一下yum,执行如下指令
#只升级所有包,不升级软件和系统内核, 建议使用这个指令
yum -y upgrade
#升级所有包同时也升级软件和系统内核,可能导致一些包失效
yum -y update
#然后就可以先安装一些常用的包
yum install wget
yum install vim
yum install net-tools#使用ifconfig指令
修改Docker虚拟机的hostname
只有在启动的时候才可以修改,使用如下命令指定
docker run --hostname {hostname} ...
Docker中container的启动与关闭
在Docker中,我们首先要pull一个相关镜像,例如Ubuntu等,作为imagine,随后我们就可以针对这个静态的imagine启动无数个container,这里的每一个container相当于是一个基于imagine操作系统的虚拟机。
#启动名为UbuntuTest的Container,并进入bash(即以管理员身份进入用户目录)
docker run -i -t --name ubuntuTest ubuntu bash
#暂时退出Container
exit
#再次进入Container(有两步,第一步是启动这个Container,第二步是进入命令行中)
docker start ubuntuTest
docker attach ubuntuTest
#另一种进入的方式
docker start -i ubuntuTest
#删除Container
docker container rm -f 4cb #-f的含义是,删除正在运行中的container
从零开始到完全搭建好一个可用的Docker环境
docker --version #娱乐
docker pull ubuntu # 获取 ubuntu 镜像
docker image ls # 查看当前安装的Docker镜像
docker run -i -t --name ubuntuTest ubuntu bash # 创建并运行一个ubuntu 容器,名字为ubuntuTest,并且在命令行运行
exit # 退出容器
docker ps # 查看当前运行的容器
docker ps -a # 列出所有容器信息,包括已经关闭的。
docker start -i ubuntuTest # -i启动容器,可以进入终端交互。
apt-get update # 更新软件源信息
apt-get install vim # 安装 vim
apt-get install git python3 # 安装 git 和 python3
apt-get install -y openjdk-8-jdk #安装JDK
#修改环境变量
vim /.bashrc
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
apt-get install openssh-server # 安装 openssh-server,用于开启 ssh 服务供外部连接。
# 安装中途选择的 6-Asia 70-shanghai
vim /etc/ssh/sshd_config # 更改 sshd 的默认配置 去掉下面3处的注释符#
34行,PermitRootLogin prohibit-password
39行,PubkeyAuthentication yes
42行,AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2
/etc/init.d/ssh restart # 重启sshd
mkdir ~/.ssh
touch ~/.ssh/authorized_keys
# 在本机mac终端,cat ~/.ssh/id_rsa.pub 如果没有该文件,终端输入ssh-keygen,连续回车enter,即生成该文件;
# 将本机id_rsa.pub的一行内容,vim复制到docker容器的 ~/.ssh/authorized_keys中
exit
# 以上完成了ubuntu的基本配置+ssh支持; 以下生成新的镜像版本
docker commit -m 'ssh&python&java' -a 'ppw' aa55b64d3e29 ubuntu-pjs
# -m,指定提交信息; -a,指定提交者; aa55b64d3e29是CONTAINER ID; ubuntu-pjs 是新镜像的名称
docker rm ubuntuTest #可以搞一波卸磨杀驴,但个人感觉没必要
docker run -d -p 22222:22 --name ubuntupro ubuntu-pjs /usr/sbin/sshd -D
# -d 后台运行; -p 绑定宿主机的22222端口到ubuntu容器的22端口; --name 给容器取名为ubuntuTest;
# ubuntu-pjs 使用镜像ubuntu-pjs创建容器; /usr/sbin/sshd -D 指定容器启动使用的应用及参数;
ssh -p 22222 root@localhost # 不输密码,直接进入容器ubuntuTest;
# 在本机 macOS,vim ~/.ssh/config,添加如下内容:
Host ubuntuTest
HostName localhost
User root
Port 22222
# 然后可以 ssh ubuntuTest 连接容器。
一些报错们以及解决方案
#时间不正确
benull@37c7dedb7a13:~# tzselect
/usr/bin/tzselect: line 180: /usr/share/zoneinfo/iso3166.tab: No such file or directory
/usr/bin/tzselect: time zone files are not set up correctly
#解决方案
apt-get install tzdata
#无法远程连接(使用Termius)
#首先,Docker的操作系统之中本来就没有密码,为了方便我们远程登录的需求,我们首先要给root账户设置一个密码,但是默认也是没有密码的,于是我们需要先下载一个passwd,下载安装完了之后,我们就可以使用passwd命令来设置一个当前账户的密码(Docker默认是root用户)
vi /etc/ssh/sshd_config
经过一番检查,发现/etc/ssh/sshd_config配置选项中”PremitRootLogin"中禁止了Root的登录权限
更改如下:PremitRootLogin yes
重启ssh服务,即可正常完成远程连接