-
开发或者日常使用docker容器时,官方的ubuntu镜像和jdk镜像并不能很好的符合自己的需求,这时候就需要定制镜像。
-
由于ubuntu的实用性和通用性,所以镜像基于ubuntu制作,这样后续操作或者自己加软件很方便
制作ubuntu的ssh镜像
#基于的官方镜像
FROM ubuntu:18.04
#作者
MAINTAINER ZHULIN <871707394@qq.com>
#RUN执行命令
RUN apt-get update && apt-get install -y openssh-server && apt-get install -y vim && apt-get install -y git && apt-get install -y wget
RUN mkdir /var/run/sshd
#xxxx为自己的root密码
RUN echo 'root:xxxx' |chpasswd
RUN sed -ri 's/^#?PermitRootLogin\s+.*/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config
RUN mkdir /root/.ssh
RUN apt-get clean && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
#设置时区,不然运行的容器时间错误,并且无法修改
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
ADD run.sh /run.sh
RUN chmod +x /*.sh
EXPOSE 22
CMD ["/run.sh"]
添加run.sh,为了方便以后添加开机启动的任务,后续自己的开机启动任务可以ssh进容器,通过修改/run.sh文件实现
#!/bin/bash
exec /usr/sbin/sshd -D
将dockerfile和run.sh文件放一个目录下,然后执行
docker build -t xxxxx:v1.0 ./xxx/
第一个xx为文件名,第二个是刚才放dockerfile的文件夹,v1.0为tag可自定义
这样就编译成了带ssh的ubuntu镜像了。可以直接在自己的docker中运行了,对22端口映射后,在外可以直接
ssh -p 端口 root@ip
进入容器,和ubuntu服务起一样
docker push zhu260824/ubuntu-base:ssh
上面是我编译好的镜像,可以直接拉取实用
运行方式:
docker run -d --name ubuntujdk -p 7100:22 zhu260824/ubuntu-base:ssh
群晖中,可以直接配置端口和文件映射使用,不需要使用命令
制作带Java环境的镜像
#基础镜像,上一次制作的ssh镜像
FROM zhu260824/ubuntu-base:ssh
#作者
MAINTAINER ZHULIN <871707394@qq.com>
#环境变量
#在这个镜像中,我将所有的环境文件加映射为外部文件,这样可以减小镜像的大小,同时在多个镜像使用时,外部存在一个环境文件夹即可。
ENV JAVA_HOME=/mnt/jdk1.8.0_202
ENV JRE_HOME=$JAVA_HOME/jre
ENV CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
ENV M2_HOME=/mnt/maven
ENV GRADLE_HOME=/mnt/gradle
ENV PATH=$JAVA_HOME/bin:$M2_HOME/bin:$GRADLE_HOME/bin:$PATH
ADD run.sh /run.sh
RUN chmod +x /*.sh
RUN rm -rf /etc/profile
ADD profile /etc/profile
VOLUME ["/mnt/maven"]
VOLUME ["/mnt/gradle"]
VOLUME ["/mnt/jdk1.8.0_202"]
EXPOSE 22
CMD ["/run.sh"]
添加/etc/profile文件,如果不添加,ssh进去后,会无法获取到环境
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).
if [ "${PS1-}" ]; then
if [ "${BASH-}" ] && [ "$BASH" != "/bin/sh" ]; then
# The file bash.bashrc already sets the default PS1.
# PS1='\h:\w\$ '
if [ -f /etc/bash.bashrc ]; then
. /etc/bash.bashrc
fi
else
if [ "`id -u`" -eq 0 ]; then
PS1='# '
else
PS1='$ '
fi
fi
fi
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
export JAVA_HOME=/mnt/jdk1.8.0_202
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export M2_HOME=/mnt/maven
export GRADLE_HOME=/mnt/gradle
export PATH=$JAVA_HOME/bin:$M2_HOME/bin:$GRADLE_HOME/bin:$PATH
run.sh文件
#!/bin/bash
#nohup sh /usr/lib/apache-tomcat-8.5.37/bin/catalina.sh run > tomcat.log 2>&1 &
exec /usr/sbin/sshd -D
编译执行即可
我编译的版本:
docker push zhu260824/ubuntu-base:jdk8
运行方式
docker run -d --name ubuntujdk -p 7100:22 -v /your/maven:/mnt/maven -v /your/gradle:/mnt/gradle -v /your/jdk1.8.0_202:/mnt/jdk1.8.0_202 zhu260824/ubuntu-base:jdk8
群晖中,可以直接配置端口和文件映射使用,不需要使用命令