FROM
用來指定作為 base 的 image 名稱,這裡的 image 可以是 Local 或 Docker Hub 上的。
FROM debian:jessie
MAINTAINER
記錄作者的資訊
MAINTAINER Alang <alanghsu@gmail.com>
ENV
定義變數
呼叫時使用 ${VARIABLE}
ENV DEKIWIKI_VERSION 10.0.8
RUN
這是最常用的指令,用來執行安裝/設定時所需要的各種指令。
RUN export DEBIAN_FRONTEND=noninteractive && \ apt-get update -y -q && \ apt-get install -y -q --no-install-recommends\ fail2ban \ iptables \ exim4 \ bsd-mailx \ whois \ && rm -rf /var/lib/apt/lists/*
ADD
增加外部的檔案至 image 內,常用於設定檔或啟動檔。
ADD docker-entrypoint.sh /usr/bin/entrypoint.sh
EXPOSE
指定 container 開啟後要開放的通訊埠 port,這裡的 port 是用於不同的 container 之間互連,不可用於與 host 的通訊;要與 host 通訊,必須在開啟 container 時,使用 -p 參數作 port forward。
EXPOSE 80 443
COPY
增加整個資料夾的內容
COPY filter.d/ /etc/fail2ban/filter.d/ COPY action.d/ /etc/fail2ban/action.d/ COPY jail.local /etc/fail2ban/
CMD
開啟 container 後,需要執行的預設指令。
這裡的指令常用於 container 在被開啟後,可以自動啟動各項需要的服務。
NOTE:container 裡的 Linux 不同於一般 VM 或實體機的啟動方式,Linux 內建的 SysV 機制在 container 裡無法被執行,替代方法是必須手動寫另一個啟動檔。
單一指令時 CMD ["/bin/bash"] 指令較長時 CMD ["/bin/bash", "/opt/startup.sh"]
ENTRYPOINT
與 CMD 類似用途,但都是用在最後一行。
ENTRYPOINT ["/root/startup.sh"]
#> mkdir centos5-lamp_php51 #> cd centos5-lamp_php51/
新增兩個檔案 Dockerfile,startup.sh
Dockerfile:
############################################################ # Dockerfile to build LAMP with PHP 5.1.x container images # Based on CentOS 5 ############################################################ FROM centos:centos5 MAINTAINER A-Lang <alang.hsu@gmail.com> RUN rpm --import http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5 RUN yum -y update RUN yum -y install mysql-server RUN yum -y install httpd php php-mbstring php-mysql RUN yum -y install wv links pdftohtml tidy html2ps ADD ./startup.sh /opt/startup.sh RUN chmod +x /opt/startup.sh RUN echo "/opt/startup.sh" >> /etc/bashrc EXPOSE 80 3306 CMD ["/bin/bash"]
startup.sh:
#!/usr/bin/env bash #=============================================================================== # # AUTHOR: A-Lang <alang.hsu@gmail.com> # #=============================================================================== echo "Starting mysql:" service mysqld start echo "Starting Apache:" service httpd start
開始 build image
#> docker build -t alang/centos5-lamp_php51 .
build 的程序會按照 Dockerfile 的內容依序完成。
完成後,檢查 image。
#> docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE alang/centos5-lamp_php51 latest 967949717d3f 19 minutes ago 717.8 MB centos centos5 192178b11d36 2 weeks ago 466.9 MB ubuntu latest 5506de2b643b 4 weeks ago 199.3 MB ubuntu 12.04 0b310e6bf058 4 weeks ago 126.7 MB ubuntu 13.10 195eb90b5349 5 months ago 184.7 MB
開啟這個 image 成為一個 container
#> docker run -t -i alang/centos-lamp_php51
NOTE:
contaioner 開啟會直接進入它的 console,想跳離開但又不想結束 container,可以按下 Ctrl P 後再按下 Ctrl Q,就可以跳離至 host。
在 host 時,想重新進入開啟中的 container,可以執行 docker attach <container-ID>
另一種以 daemon 方式開啟 container
#> docker run -d -t alang/centos-lamp_php51
NOTE:
注意:這樣的啟動方式,無法使用 docker attach 進入該 container console;可以改用
docker exec -it <container-id> /bin/bash
檢查 container 開啟狀態
#> docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8e7cae94770e alang/centos5-lamp_php51:latest "/bin/bash" About an hour ago Up About an hour 80/tcp, 3306/tcp sharp_perlman
Dockerfile 範例
Dockerfile 語法