Build dockerfile

更多文章

Dockerfile 語法

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"]

建立 LAMP 基本環境

重點說明:
  • 這個範例是以 CentOS 5 + PHP 5.1 為例。
  • 建立的 image 在啟動後,系統所作的任何變更,例如 MySQL 資料等,一旦 container 關閉候,所有資料都不會被保留。(NOTE: 若要保留資料,必須修改 Dockerfile 的部分內容)

 

#> 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 
標籤 (Edit tags)
  • No tags
您必須 登入 才能發佈評論。
Powered by MindTouch Core