開發或者平常使用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
複製代碼
羣暉中,能夠直接配置端口和文件映射使用,不須要使用命令