1. 程式人生 > >05_Dockerfile實戰(上)

05_Dockerfile實戰(上)

在上一章我們介紹了docker映象的概念,並且介紹了構建映象的兩種方式

  1. 使用docker commit命令提交建立的容器。
  2. 使用Dockerfile檔案和docker build命令,這種更為推薦和常見的方式構建docker映象。

Dockerfile

  • 官方倉庫雖然有數十萬的映象資源,但在絕大多數情況下都不符合我們的需求,通常我們都會自己構建映象。Dockfile 是一種被 Docker 程式解釋的指令碼, Dockerfile 由一條一條的指令組成,每條指令對應 Linux 下面的一條命令。Docker 程式將這些 Dockerfile 指令翻譯真正的Linux命令。Docker 程式將讀取 Dockerfile,根據指令生成定製的 image。
  • 每一條指令就相當於給映象加了一層,一共127層,務必惜字如金。
  • 常用命令如下:
options describe
FROM 基於哪個映象構建新映象
LABEL maintainer 映象維護者資訊
RUN 構建映象時執行的Shell命令
COPY 拷貝檔案或目錄到映象中
CMD 執行容器時執行,如果有多個CMD指令,最後一個生效
ENTRYPOINT 執行容器時執行,如果有多個CMD指令,最後一個生效。可單獨使用,也可與CMD配合使用
USER 為RUN、CMD、ENTRYPOINT執行指令指定執行使用者
EXPOSE 宣告容器執行的服務埠
WORKDIR 為RUN、CMD、ENTRYPOINT、COPY和ADD設定工作目錄
VOLUME 指定掛載點,使容器中的一個目錄具有持久化儲存資料的功能
ENV 設定環境變數

注意的是:

  1. 一次 RUN 指令形成新的一層,程序讓shell命令都寫在一行,減少映象層,一個映象是不能超過 127 層的,在使用 RUN 指令時,可以在每條 shell 命令的結尾用轉義換行 ""。
  2. 一次 RUN 形成新的一層,如果沒有在同一層刪除,無論檔案是否最後刪除,都會帶到下一層,所以要在每一層清理對應的殘留資料,減少映象大小。比如 yum 之後,清一下快取。

一、構建部署Nginx

$ tree web/
web/
├── base
│?? └── Dockerfile_nginx
└── project
    ├── Dockerfile_nginx
    └── nginx.conf
  • base資料夾下的Dockerfile_nginx如下:(構建通用的nginx映象)
FROM centos:latest
LABEL maintainer="jhzhang <[email protected]>"
RUN yum install -y gcc gcc-c++ make \
    openssl-devel pcre-devel gd-devel libxslt-devel \
    iproute net-tools telnet wget curl && \
    yum clean all && \
    rm -rf /var/cache/yum/*
 
RUN wget http://nginx.org/download/nginx-1.14.0.tar.gz && \
    tar -zxf nginx-1.14.0.tar.gz && \
    cd nginx-1.14.0 && \
    ./configure --prefix=/usr/local/nginx \
    --with-http_ssl_module \
    --with-http_v2_module \
    --with-http_realip_module \
    --with-http_image_filter_module \
    --with-http_gunzip_module \
    --with-http_gzip_static_module \
    --with-http_secure_link_module \
    --with-http_stub_status_module \
    --with-stream \
    --with-stream_ssl_module && \
    make -j $(grep processor /proc/cpuinfo | wc -l) && make install && \
    cd / && rm -rf nginx-1.14.0*
 
ENV PATH $PATH:/usr/local/nginx/sbin
WORKDIR /usr/local/nginx
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
  • 構建映象
docker build -t nginx1.14 -f Dockerfile_nginx ./
  • 進入專案project資料夾
    project資料夾下的nginx.conf如下:(構建通用的nginx映象)
user  nobody;
worker_processes  1;
error_log  logs/error.log  info;
events {
    worker_connections  4096;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        charset utf-8;
        access_log  logs/host.access.log  main;
        location / {
            root   html;
            index  index.html index.htm;
        }
 
    }
}

project資料夾下的Dockerfile_nginx如下:(構建通用的nginx映象)

FROM nginx1.14
COPY nginx.conf /usr/local/nginx/conf/
  • 構建專案映象
    docker build -t nginx:v1 -f Dockerfile_nginx ./
  • 啟動容器
docker network create web
docker volume create wwwroot
docker container run -d --name web_nginx -p 88:80 --network lnmp -v wwwroot:/usr/local/nginx/html nginx:v1 
  • 瀏覽器訪問127.0.0.1:80

二、構建部署Tomcat

  • Java 程式依賴於 JDK 環境,我們可以把 JDK 放在宿主機上,容器以掛載形式使用,減少映象大小及提高效能。
tar -zxf jdk-8u91-linux-x64.tar.gz
sudo mv jdk1.8.0_91/ /usr/local/jdk1.8
  • 檔案結構
tree java/
java/
├── apache-tomcat-8.5.16.tar.gz
└── Dockerfile
0 directories, 2 files
  • java資料夾下的Dockerfile內容
FROM centos:latest
LABEL maintainer="jhzhang <[email protected]>"
 
ENV VERSION=8.5.35
ENV JAVA_HOME=/usr/local/jdk
 
RUN yum install wget curl unzip iproute net-tools glibc.i686 -y && \
    yum clean all && \
    rm -rf /var/cache/yum/*
 
COPY . /
 
RUN tar zxf apache-tomcat-${VERSION}.tar.gz && \
    mv apache-tomcat-${VERSION} /usr/local/tomcat && \
    rm -rf apache-tomcat-${VERSION}.tar.gz /usr/local/tomcat/webapps/* && \
    mkdir /usr/local/tomcat/webapps/ROOT && \
    echo '<h1>Hello,Tomcat!</h1>' > /usr/local/tomcat/webapps/ROOT/status.html && \
    sed -i '1a JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"' /usr/local/tomcat/bin/catalina.sh && \
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
 
ENV PATH $PATH:/usr/local/tomcat/bin
ENV PATH $PATH:/usr/local/jdk/bin
WORKDIR /usr/local/tomcat
EXPOSE 8080
CMD ["catalina.sh", "run"]
  • 構建映象
    $ docker build -t tomcat8:latest ./
  • 啟動容器
    docker container run -d --name tomcat_srv -p 89:8080 -v /usr/local/jdk1.8/:/usr/local/jdk tomcat8:latest
  • 瀏覽器開啟127.0.0.1:89/status.html

參考

Docker之映象管理及Dockerfile
Dockerfile命令詳解(超全版本)
使用Dockerfile搭建jdk、tomcat執行環境