分类: 电脑技术
作者: admin

Docker容器里跑centos、debian、unbuntu的几个常见问题

1.无法使用 systemctl 命令的解决方案
Linux Docker中无法使用 systemd(systemctl) 相关命令的原因是 1号进程不是 init ,而是其他例如 /bin/bash ,所以导致缺少相关文件无法运行。
(System has not been booted with systemd as init system (PID 1). Can't operat)

解决方案:/sbin/init(需要镜像本身安装init,否则使用此命令会出错)

例如:Ubuntu 20.04
docker run -tid --name ubuntu --privileged=true ubuntu:20.04  /sbin/init
docker exec -it ubuntu  /bin/bash
docker run  -d --name debian --hostname debian --net=macnet --ip 192.168.1.10 -i -t --privileged=true --restart=always  debian   /sbin/init
docker exec -it debian  /bin/bash
docker run  -d --name centos --hostname centos --net=macnet --ip 192.168.1.11 -i -t --privileged=true --restart=always  centos   /sbin/init
docker exec -it centos  /bin/bash

PS:--privilaged=true一定要加上的。( /sbin/init可以不加 )

2.在Docker中使用虚拟终端容器运行了 CentOS 8 的镜像,但在执行yum命令时,提示“Failed to set locale, defaulting to C.UTF-8”
例如安装openssh-server
yum install openssh-server
设置语言环境需使用locale命令
运行locale命令出现如下提示:
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory

由上图可知,当前系统并没有安装en_US.UTF-8语言,则使用命令 dnf install glibc-langpack-en
或 dnf install langpacks-en glibc-all-langpacks -y进行语言包安装
然后运行如下命令:
echo "export LC_ALL=en_US.UTF-8"  >>  /etc/profile
echo "export LC_CTYPE=en_US.UTF-8"  >>  /etc/profile
source /etc/profile

即可解决问题。

3.在Docker中使用虚拟终端容器运行了 CentOS 8 的镜像,但在执行passwd命令时,提示“bash: passwd: command not found”
解决方法:
yum search passwd  //查找源文件
passwd.x86_64 : An utility for setting or changing passwords using PAM  //查找到的源  不一定都一样 根据自己系统的
yum install passwd.x86_64  //安装

使用Docker的Debian编译Lede
XML/HTML代码
  1. #启动debian的Docker
  2. docker run -d --name debian --hostname debian -v /opt/lede:/root/lede -p 1122:22 -it --privileged=true --restart=always debian
  3. docker exec -it debian  /bin/bash
  4. apt-get update
  5. apt-get -y install openssh-server
  6. #修改ssh配置
  7. sed -i "s/PermitRootLogin.*/PermitRootLogin yes/g" /etc/ssh/sshd_config
  8. sed -i "s/#PermitRootLogin.*/PermitRootLogin yes/g" /etc/ssh/sshd_config
  9. sed -i "s/PasswordAuthentication.*/PasswordAuthentication yes/g" /etc/ssh/sshd_config
  10. /etc/init.d/sshd restart
  11. #修改root密码
  12. echo root:xiugaiwo | sudo chpasswd root
  13. #安装编译所需组件
  14. apt update -y
  15. apt full-upgrade -y
  16. apt install -y ack antlr3 asciidoc autoconf automake autopoint binutils bison build-essential \
  17. bzip2 ccache cmake cpio curl device-tree-compiler fastjar flex gawk gettext gcc-multilib g++-multilib \
  18. git gperf haveged help2man intltool libc6-dev-i386 libelf-dev libglib2.0-dev libgmp3-dev libltdl-dev \
  19. libmpc-dev libmpfr-dev libncurses5-dev libncursesw5-dev libreadline-dev libssl-dev libtool lrzsz \
  20. mkisofs msmtp nano ninja-build p7zip p7zip-full patch pkgconf python2.7 python3 python3-pyelftools \
  21. libpython3-dev qemu-utils rsync scons squashfs-tools subversion swig texinfo uglifyjs upx-ucl unzip \
  22. vim wget xmlto xxd zlib1g-dev
  23. #下载Lede源代码
  24. cd /root
  25. git clone https://github.com/coolsnowwolf/lede
  26. cd lede
  27. ./scripts/feeds update -a && ./scripts/feeds install -a
  28. make menuconfig
其他详细设置参见博客 LEDE源码编译教程 编译完成,在 /opt/lede 中可以找到编译的bin文件。
以上命令在 alpine 的docker环境中编译没问题,远程命令可以通过docker exec也可以通过映射端口远程ssh设置。
docker run -d --name alpine --hostname alpine -p 1122:22 -it --privileged=true --restart=always alpine
docker run -d --name debian --hostname debian -p 2222:22 -it --privileged=true --restart=always debian
docker run -d --name debian --hostname debian -p 3322:22 -it --privileged=true --restart=always ubuntu
docker run -d --name debian --hostname debian -p 4422:22 -it --privileged=true --restart=always centos
修改最后的镜像地址就可以轻松创建任意版本的Linux基础镜像。