开发或者平常使用docker容器时,官方的ubuntu镜像和jdk镜像并不能很好的符合本身的需求,这时候就须要定制镜像。git
因为ubuntu的实用性和通用性,因此镜像基于ubuntu制做,这样后续操做或者本身加软件很方便docker
#基于的官方镜像
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文件实现shell
#!/bin/bash
exec /usr/sbin/sshd -D
复制代码
将dockerfile和run.sh文件放一个目录下,而后执行apache
docker build -t xxxxx:v1.0 ./xxx/
复制代码
第一个xx为文件名,第二个是刚才放dockerfile的文件夹,v1.0为tag可自定义 这样就编译成了带ssh的ubuntu镜像了。能够直接在本身的docker中运行了,对22端口映射后,在外能够直接ubuntu
ssh -p 端口 root@ip
复制代码
进入容器,和ubuntu服务起同样vim
docker push zhu260824/ubuntu-base:ssh
复制代码
上面是我编译好的镜像,能够直接拉取实用 运行方式:tomcat
docker run -d --name ubuntujdk -p 7100:22 zhu260824/ubuntu-base:ssh
复制代码
群晖中,能够直接配置端口和文件映射使用,不须要使用命令bash
#基础镜像,上一次制做的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进去后,会没法获取到环境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文件maven
#!/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
复制代码
群晖中,能够直接配置端口和文件映射使用,不须要使用命令