关于Alpine
Alpine介绍
Alpine 操作系统是一个面向安全的轻型 Linux 发行版。它不同于通常 Linux 发行版,Alpine 采用了 musl libc 和 busybox 以减小系统的体积和运行时资源消耗,但功能上比 busybox 又完善的多。在保持瘦身的同时,Alpine 还提供了自己的包管理工具 apk,可以通过 https://pkgs.alpinelinux.org/packages 网站上查询包信息,也可以直接通过 apk 命令直接查询和安装各种软件。
Alpine 由非商业组织维护的,支持广泛场景的 Linux发行版,特别为资深/重度Linux用户而优化,关注安全,性能和资源效能。
Alpine 镜像可适用于更多常用场景,并且是一个优秀的可以适用于生产的基础系统/环境。
Alpine Docker 镜像也继承了 Alpine Linux 发行版的这些优势。相比于其他 Docker 镜像,它的容量非常小,仅仅只有 5 MB 左右(对比 Ubuntu 系列镜像接近 200 MB),且拥有非常友好的包管理机制。官方镜像来自 docker-alpine 项目。
Alpine 中软件安装包的名字可能会与其他发行版有所不同,可在 https://pkgs.alpinelinux.org/packages 网站搜索并确定安装包名称。如果需要的安装包不在主索引内,但是在测试或社区索引中。可按照以下方法使用这些安装包。
$ echo "http://dl-4.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories
$ apk --update add --no-cache <package>
编写Dockerfile
[root@node2 ~]# vim Dockerfile
FROM alpine:3.13.6
RUN set -x; \
echo "http://mirrors.aliyun.com/alpine/latest-stable/main/" > /etc/apk/repositories && \
echo "http://mirrors.aliyun.com/alpine/latest-stable/community/" >> /etc/apk/repositories && \
apk upgrade && \
apk add --no-cache ca-certificates && \
apk add --no-cache unzip curl bash bash-doc bash-completion bash wget vim net-tools && \
rm -rf /tmp/* /var/cache/apk/*
WORKDIR /
ADD jdk-8u301-linux-x64.tar.gz apache-tomcat-9.0.53.tar.gz /
COPY glibc-2.32-r0.apk glibc-bin-2.32-r0.apk glibc-dev-2.32-r0.apk glibc-i18n-2.32-r0.apk /
COPY sgerrand.rsa.pub /etc/apk/keys/sgerrand.rsa.pub
RUN /bin/bash && \
apk add glibc-2.32-r0.apk glibc-bin-2.32-r0.apk glibc-dev-2.32-r0.apk glibc-i18n-2.32-r0.apk && \
rm -rf *.apk /var/cache/apk/* && \
mv /apache-tomcat-9.0.53 /tomcat9 && \
rm -rf /tomcat9/webapps/{docs,examples,host-manager,manager} && \
# install JRE
apk add --no-cache openjdk8-jre-base && \
rm -rf /var/cache/apk/*
COPY Shanghai /etc/localtime
ENV JAVA_HOME=/jdk1.8.0_301
ENV CLASSPATH=JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$PATH:.JAVA_HOME/bin:$PATH
EXPOSE 8080
CMD ["/tomcat9/bin/catalina.sh","run"]
构建镜像
[root@node2 ~]# docker build -t alpine:v1 .
创建容器
该步可自定义添加其他参数
[root@node2 ~]# docker run -itd --name tomcat1 -p 8080:8080 alpine:v1
Alpine包管理
Alpine使用apk进行包管理,下面介绍常用命令
1.apk update
$ apk update #更新最新镜像源列表
2.apk search
$ apk search #查找所以可用软件包
$ apk search -v #查找所以可用软件包及其描述内容
$ apk search -v 'acf*' #通过软件包名称查找软件包
$ apk search -v -d 'docker' #通过描述文件查找特定的软件包
3.apk add
$ apk add openssh #安装一个软件
$ apk add openssh openntp vim #安装多个软件
$ apk add --no-cache mysql-client #不使用本地镜像源缓存,相当于先执行update,再执行add
4.apk info
$ apk info #列出所有已安装的软件包
$ apk info -a zlib #显示完整的软件包信息
$ apk info --who-owns /sbin/lbu #显示指定文件属于的包
5.apk upgrade
$ apk upgrade #升级所有软件
$ apk upgrade openssh #升级指定软件
$ apk upgrade openssh openntp vim #升级多个软件
$ apk add --upgrade busybox #指定升级部分软件包
6.apk del
$ apk del openssh #删除一个软件
Alpine常用命令
[root@node2 ~]# docker exec -it b013b /bin/sh
/ # apk search --no-cache openssh
Alpine安装常用服务
# 配置sshd
/ # apk add --no-cache openssh-server openssh-client
/ # sed -i "s/#PermitRootLogin.*/PermitRootLogin yes/g" /etc/ssh/sshd_config && \
/ # ssh-keygen -t rsa -P "" -f /etc/ssh/ssh_host_rsa_key && \
/ # ssh-keygen -t ecdsa -P "" -f /etc/ssh/ssh_host_ecdsa_key && \
/ # ssh-keygen -t ed25519 -P "" -f /etc/ssh/ssh_host_ed25519_key && \
/ # echo "root:admin" | chpasswd # root用户的密码改为admin
/ # /usr/sbin/sshd -D # 指定此选项后sshd不会分离也不会成为守护进程
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
126: eth0@if127: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
/ # exit
# 本机测试ssh连接
[root@node2 ~]# ssh root@172.17.0.2
root@172.17.0.2's password: # 密码是admin
Welcome to Alpine!
The Alpine Wiki contains a large amount of how-to guides and general
information about administrating Alpine systems.
See <http://wiki.alpinelinux.org/>.
You can setup the system with the command: setup-alpine
You may change this message by editing /etc/motd.
b013b0ebcb2f:~# cat /etc/issue
Welcome to Alpine Linux 3.13
Kernel \r on an \m (\l)
FAQ
提示源没有这个openssh的包
解决方式:
在dockerfile中改为国内的源
http://mirrors.aliyun.com/alpine/latest-stable/main/
http://mirrors.aliyun.com/alpine/latest-stable/community/
创建容器文件修改
[root@docker43 ~]# docker run -it alpine
/ # vi /etc/apk/repositories
http://mirrors.aliyun.com/alpine/latest-stable/main/
http://mirrors.aliyun.com/alpine/latest-stable/community/
#http://dl-cdn.alpinelinux.org/alpine/v3.8/main
#http://dl-cdn.alpinelinux.org/alpine/v3.8/community
# 注释或者删除原来的默认源,添加阿里云的源,然后执行apk update,在进行安装就OK了
2、ssh 启动问题
/ # /etc/init.d/sshd start
/bin/sh: /etc/init.d/sshd: not found
这样的方式不能启动,需要安装一个alpine的管理工具
apk add --no-cache openrc
/ # /etc/init.d/sshd start
* WARNING: sshd is already starting
所以使用 /usr/sbin/sshd -D 方式启动。但是又出现如下错误
/ # /usr/sbin/sshd -D
Could not load host key: /etc/ssh/ssh_host_rsa_key
Could not load host key: /etc/ssh/ssh_host_ecdsa_key
Could not load host key: /etc/ssh/ssh_host_ed25519_key
sshd: no hostkeys available -- exiting.
解决方式:
ssh-keygen -t rsa -P "" -f /etc/ssh/ssh_host_rsa_key
ssh-keygen -t ecdsa -P "" -f /etc/ssh/ssh_host_ecdsa_key
ssh-keygen -t ed25519 -P "" -f /etc/ssh/ssh_host_ed25519_key
再次启动
/ # /usr/sbin/sshd -D
启动成功
3、创建容器后的网络问题
[root@docker43 opt]# docker run -it alpine
WARNING: IPv4 forwarding is disabled. Networking will not work.
解决方式:
[root@docker43 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1 # 添加这一行
[root@docker43 ~]# docker run -it alpine
/ #