一. alpine是什么?
alpine是基于Musl-libc和busybox构建起来的linux安全轻量发行版,这怎么理解呢?我们知道linux的内核是基于C语言进行开发,C语言提供了一系列的标准库,linux内核就是基于这些标准C库进行编译构建出来的。Musl-libc就是C语言标准的一个实现,主打轻量。其他的C语言的标准实现还有
- glibc(GUN C),优点:功能齐全兼容性好,移植性好
- eglibc,glibc的变种,优点就是可以通过配置裁剪一些不必要的模块
- uclibc,小型c语言库,用于嵌入式
alpine = 基于Musl-libc编译的linux内核 + busybox命令工具集。
java程序可以使用alpine吗?
java程序依赖的是jdk,jdk依赖的是linux内核,linux内核已经屏蔽了底层细节, 所以直接装标准的jdk就可以了。
期待结果:在k8s上面跑一个linux操作系统,像使用本地shell一样操作这个系统。
环境 | 版本 |
---|---|
操作系统 | macOS Catalina 10.15.7 |
docker-desktop | 4.9.1 |
docker engine | 20.10.16 |
kubernetes | v1.24.0 |
下面我们就来在k8s上面制作这么一个本地的小linux虚拟机,用于日常的linux调试学习使用。
二. 制作带ssh的alpine镜像
编写dockerfile文件
vi alpine-dockerfile
1 2 3 4 5 6 7 8 9
FROM alpine:3.16.0 RUN echo "root:root" | chpasswd \ && echo "alias ll='ls -la'" >> /etc/profile.d/my.sh \ && apk -U --no-cache add openssh-server \ && ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N "" \ && ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N "" \ && ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N "" \ && echo -e "PermitRootLogin yes\nPort 22\nListenAddress 0.0.0.0\nHostKey /etc/ssh/ssh_host_rsa_key\nHostKey /etc/ssh/ssh_host_ecdsa_key\nHostKey /etc/ssh/ssh_host_ed25519_key\nPasswordAuthentication yes" >> /etc/ssh/sshd_config CMD ["/usr/sbin/sshd", "-D"]
构建docker镜像
docker build -f alpine-dockerfile -t alpine-ssh:3.16.0 .
三. 编排启动服务
编写alpine的k8s编排文件
vi alpine.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
apiVersion: apps/v1 kind: Deployment metadata: name: alpine labels: app: alpine spec: replicas: 1 selector: matchLabels: app: alpine template: metadata: labels: app: alpine spec: containers: - image: alpine-ssh:3.16.0 name: alpine command: ["/usr/sbin/sshd", "-D"] imagePullPolicy: IfNotPresent --- apiVersion: v1 kind: Service metadata: name: alpine-cs labels: app: alpine spec: type: NodePort ports: - port: 22 name: client nodePort: 30022 selector: app: alpine
启动编排文件
kubectl apply -f alpine.yaml
四. 本地远程连接
添加centos命令别名
1
echo "alias alpine='ssh -p 30022 root@localhost'" >> ~/.bash_profile
执行centos命令,输入密码
五. 过程遇到的问题
刚开始想启动一个centos7容器,通过
systemctl start sshd
报错Failed to get D-Bus connection: Operation not permitted
原因:需要特权容器才能使用systemctl命令,特权容器是什么?
docker里面的每一个容器其实都不是一个完整的操作系统,只是一个轻量级的运行在宿主机上的一个进程,通过cgroup进行隔离这些进程的资源使用,但实际上这些容器都是共用同一个宿主机的操作系统的,cgroup隔离的资源是独占的,没隔离的资源就是共享的。其中systemd的服务是没有通过cgroup进行隔离的,想要获取这部分的资源就需要设置这个容器为特权容器, 特权容器就是可以访问非共享资源的容器。
另一个从设计层面进行考虑, docker是设计成轻量级进程容器,初衷就是每个容器里面一个前台进程, 如果需要使用systemd启动一个守护的后台进程的话就会多了一个守护进程,当docker接受的容器的销毁停止命令的时候只会给这个容器的前台进程发送停止的指令,后台进程就会变成幽灵守护进程。
docker build -t alpine-ssh:3.16.0 .
失败failed to solve with frontend dockerfile.v0: failed to read dockerfile: open /var/lib/docker/tmp/buildkit-mount3724365558/Dockerfile: no such file or directory
环境:docker-desktop 4.9.1
错误原因:使用docker build的时候默认找的配置文件名为Dockerfile, 如果配置文件改了别的名字要用-f进行指定。
正确命令:
docker build -f alpine-dockerfile -t alpine-ssh:3.16.0 .
使用ssh连接的时候出现permission deny的时候可能的原因。
- 密码错误,我们直接使用
echo "root:root" | chpasswd
进行修改的密码,所以不可能错误 - 使用root用户登录ssh的时候要在sshd_config中配置 PasswordAuthentication yes, 才能允许root用户远程登录
- 密码错误,我们直接使用