共計 4663 個字符,預計需要花費 12 分鐘才能閱讀完成。
這篇文章主要介紹“如何構建一個 Docker 鏡像”,在日常操作中,相信很多人在如何構建一個 Docker 鏡像問題上存在疑惑,丸趣 TV 小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何構建一個 Docker 鏡像”的疑惑有所幫助!接下來,請跟著丸趣 TV 小編一起來學習吧!
8. 高級
本節我介紹如何自己構建一個 Docker 鏡像,我們將構建一個支持 scala 的運行環境,并且對外開放 SSH 服務。
8.1. 構建鏡像的兩種方法
構建鏡像有兩種方法:
運行并進行一個基礎容器(如 centos, docker run -it centos /bin/bash),然后安裝需要的環境,再用 commit 將容器保存成新的鏡像
使用 Dockerfile 構建,這也是推薦的做法
本節我們僅介紹第 2 種方法。
8.2. Dockerfile 介紹
Dokcerfile 是用于構建 Docker 鏡像的元文件,它的說明及語法見: http://docs.docker.com/engine/reference/builder/
8.3. 構建規劃
根據需求可以發現我們安裝的主要環境有三個:SSH 服務、Java 環境(Scala 依賴它)、Scala 環境,與軟件開發一樣,我們也可以分模塊構建,即構建三個鏡像:
只包含 SSH 服務的基礎鏡像
帶 SSH 及 Java 環境的鏡像
帶 SSH、Java 及 Scala 環境的鏡像
8.4. SSH 鏡像
FROM centos:centos7 1
MAINTAINER gudaoxuri 2
#---------------Use 163 mirrors--------------- 3
RUN yum install -y wget \
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup \
wget -P /etc/yum.repos.d/ http://mirrors.163.com/.help/CentOS7-Base-163.repo \
yum clean all \
yum makecache 4
#---------------Install Common Tools---------------
RUN yum install -y sed curl tar gcc gcc-c++ make git passwd sudo
#---------------Modify Time Zone---------------
ENV TZ Asia/Shanghai 5
ENV TERM xterm
RUN yum install -y ntpdate \
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#---------------Support Chinese---------------
#RUN yum groupinstall -y Fonts \
# echo LANG=\ zh_CN.UTF-8\ /etc/sysconfig/i18n
#---------------Install SSH---------------
RUN yum install -y openssh-server openssh-clients \
sed -i s/UsePAM yes/UsePAM no/g /etc/ssh/sshd_config \
echo root:123456 | chpasswd \
ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key \
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key \
mkdir /var/run/sshd
#---------------Setting Common Path---------------
RUN chmod 777 -R /opt/ \
mkdir /opt/env/ \
mkdir /opt/workspaces/
EXPOSE 22 6
CMD [/usr/sbin/sshd , -D] 7
1 FROM 表示此鏡像是基于哪個鏡像構建的 2 MAINTAINER 開發者的信息 3 # 注釋 4 RUN 常用命令,用于執行 Linux 的命令,多用于安裝組件 5 ENV 常用命令,用于設置環境變量 6 EXPOSE 表明默認對外暴露的端口(docker run -P) 7 CMD 要執行的服務,多條 CMD 只執行最后一條
RUN 參數的學問,Docker 鏡像是分層的,一個鏡像可能由多個層組成,一次 RUN 實際上就產生了一層,在編譯 Dockerfile 的過程中可能出錯,重新編譯時我們會發現之前已成功編譯的層不會再次被編譯 8.5. 編譯 SSH 鏡像
root@ubuntu:/opt/test/dockerfile/ssh# ls
Dockerfile
root@ubuntu:/opt/test/dockerfile/ssh# docker build -t gudaoxuri/ssh .
Sending build context to Docker daemon 3.072 kB
Sending build context to Docker daemon
Step 0 : FROM centos:centos7
Pulling repository centos
ce20c473cd8a: Download complete
ce20c473cd8a: Pulling image (centos7) from centos
168a69b62202: Download complete
812e9d9d677f: Download complete
4234bfdd88f8: Download complete
Status: Downloaded newer image for centos:centos7
--- ce20c473cd8a
Step 1 : MAINTAINER gudaoxuri
--- Running in 889ea744c458
--- 5b1151e6cb0b
Removing intermediate container 889ea744c458
Step 10 : CMD /usr/sbin/sshd -D
--- Running in ce563073b686
--- b61a4adad85f
Removing intermediate container ce563073b686
Successfully built b61a4adad85f
root@ubuntu:/opt/test/dockerfile/ssh# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
gudaoxuri/ssh latest b61a4adad85f 10 minutes ago 966 MB
...
8.6. Java 鏡像
FROM gudaoxuri/ssh:latest 1
MAINTAINER gudaoxuri
#---------------Install Java---------------
RUN wget -P /opt/env/ --no-check-certificate --no-cookies --header Cookie: oraclelicense=accept-securebackup-cookie http://download.oracle.com/otn-pub/java/jdk/8u60-b27/jdk-8u60-linux-x64.tar.gz \
tar -xzf /opt/env/jdk-8u60-linux-x64.tar.gz -C /opt/env/ \
rm /opt/env/jdk-8u60-linux-x64.tar.gz \
mv /opt/env/jdk1.8.0_60 /opt/env/java \
echo export JAVA_HOME=/opt/env/java /etc/profile
ENV JAVA_HOME /opt/env/java
RUN echo PATH=$PATH:$JAVA_HOME/bin /etc/profile
ENV PATH $PATH:$JAVA_HOME/bin
1 gudaoxuri/ssh:latest 就是我們之前編譯的鏡像 8.7. Scala 鏡像
FROM gudaoxuri/java:latest
MAINTAINER gudaoxuri
#---------------Install Scala---------------
RUN wget -P /opt/env/ http://downloads.typesafe.com/scala/2.10.6/scala-2.10.6.tgz \
tar -xzf /opt/env/scala-2.10.6.tgz -C /opt/env/ \
rm /opt/env/scala-2.10.6.tgz \
mv /opt/env/scala-2.10.6 /opt/env/scala \
echo export SCALA_HOME=/opt/env/scala /etc/profile
ENV SCALA_HOME /opt/env/scala
RUN sed /^PATH=/d /etc/profile /etc/profile \
echo PATH=$PATH:$JAVA_HOME/bin:$SCALA_HOME/bin /etc/profile
ENV PATH $PATH:$JAVA_HOME/bin:$SCALA_HOME/bin
8.8. 編譯 Java/Scala 鏡像
過程同上,略
8.9. 發布鏡像
有了新的鏡像后我們希望把這個鏡像發布到 hub.docker.com 上去分享,有兩種方式:
使用 docker push 發布前要先登錄 docker login
使用 github 發布
介于國內網絡環境惡劣,第 1 種方式失敗概率很高,因為它上傳的是生成的鏡像(幾百 MB 到幾 G 不等),所以推薦使用第 2 種方式
請先注冊 hub.docker.com 及 github.com 的賬號 8.9.1. 使用 github 發布鏡像
不要用 IE 操作,筆者使用 IE11 在 hub.docker.com 上操作時發生過不小的困擾。
在 hub.docker.com 上建立 github 連接
在 github 中設置權限
在 github 中建一個開源項目,注意要包含 Dockerfile 文件
在 github 中設置這個項目的權限
在 hub.docker.com 上建立自動構建項目
在 hub.docker.com 上選擇 github 上的項目
在 hub.docker.com 上設置項目屬性
不多時就構建好了
到此,關于“如何構建一個 Docker 鏡像”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注丸趣 TV 網站,丸趣 TV 小編會繼續努力為大家帶來更多實用的文章!