這裡将展示使用Dockerfile來建立帶Apache服務的Docker鏡像的具體過程。
(1) Apache
這裡将展示使用Dockerfile來建立帶Apache服務的Docker鏡像的具體過程。
準備工作:
首先,建立一個apache_centos工作目錄,在其中
[root@docker1 ~]# mkdir apache_centos && cd apache_centos
[root@docker1 apache_centos]# touch Dockerfile run.sh
[root@docker1 apache_centos]# mkdir sample
-------------------------------------------------------------------------------------------------------------------------------
下面是Dockerfile的内容和各個部分的說明:
[root@docker1 apache_centos]# cat Dockerfile
FROM docker.io/centos:latest
#設定繼承來自我們建立的centos:latest鏡像
MAINTAINER waitfish from dockerpool.com
#建立者的基本資訊
#設定環境變量,所有操作都是非互動式的
ENV DEBIAN_FRONTEND noninteractive
RUN echo "Asia/Shanghai" > /etc/timezone #&& \
# dpkg-reconfigure -f noninteractive tzdata #這也是設定時區的
#注意這裡要更改系統的時區設定,因為在Web應用中經常會用到時區這個系統變量,預設的centos會讓你的應用此程式發生不可思議的效果哦
#安裝wget
RUN yum update
RUN yum install -y wget
WORKDIR /usr/local/src
#下載下傳并解壓源碼包
RUN wget http://mirrors.shuosc.org/apache//httpd/httpd-2.2.34.tar.gz
RUN tar -xf httpd-2.2.34.tar.gz
WORKDIR httpd-2.2.34
#編譯安裝apache
RUN yum install -y gcc make apr-devel apr apr-util apr-util-devel pcre-devel
RUN ./configure --prefix=/usr/local/apache2 --enable-mods-shared=most --enable-so
RUN make
RUN make install
#修改apache配置檔案
RUN sed -i 's/#ServerName www.example.com:80/ServerName localhost:80/g' /usr/local/apache2/conf/httpd.conf
#啟動apache服務
RUN /usr/local/apache2/bin/httpd
#複制服務啟動腳本并設定權限
ADD run.sh /usr/local/sbin/run.sh
RUN chmod 755 /usr/local/sbin/run.sh
#添加一個示例的Web站點,删除預設安裝在apache檔案夾下面的檔案,并将我們添加的執行個體用軟連結到/var/www/html目錄下面
RUN mkdir -p /app && rm -fr /usr/local/apache2/html && ln -s /app /usr/local/apache2/html
COPY sample/ /app
#開放80端口
EXPOSE 80
WORKDIR /app
CMD ["/usr/local/sbin/run.sh"]
--------------------------------------------------------------------------------------------------------------------------------------
這個sample站點的内容很簡單,就輸出一句話Hello Docker! 在sample目錄下建立index.html檔案,内容為:
[root@docker1 apache_centos]# cd sample/
[root@docker1 sample]# vim index.html
<!DOCTYPE html>
<html>
<body>
<p>Hello, Docker!</p>
</body>
</html>
run.sh腳本内容也很簡單,隻是啟動Apache服務:
[root@docker1 apache_centos]# vim run.sh
#!/bin/bash
/usr/sbin/sshd &
/usr/local/apache2/bin/httpd -D FOREGROUND
此時,apache_centos目錄下面的檔案結構為:
[root@docker1 apache_centos]# tree
.
├── Dockerfile
├── run.sh
└── sample
└── index.html
1 directory, 3 files
建立apache:centos鏡像
使用docker build指令建立apache:centos鏡像,注意指令最後的"."。
[root@docker1 apache_centos]# docker build -t apache:centos .
......
Successfully built ...... 表示建立鏡像成功
此時鏡像已經建立成功了。下面,檢視本地已有的鏡像清單,可見新增的apache:centos鏡像:
[root@docker1 apache_centos]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
apache centos fe364d4ee9ec 5 minutes ago 419.1 MB
[root@docker1 apache_centos]# docker run -d -P apache:centos
0fadd02039d6b16ae308faada8497f3ab9d72de73d5dd36a655e188eee9f1859
[root@docker1 apache_centos]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0fadd02039d6 apache:centos "/usr/local/sbin/run." 4 seconds ago Up 3 seconds 0.0.0.0:32769->22/tcp, 0.0.0.0:32768->80/tcp happy_jones
[root@docker1 apache_centos]# curl 127.0.0.1:32768
<html><body><h1>It works!</h1></body></html>
Docker建立的鏡像具有繼承性
[root@docker1 apache_centos]# docker port 0fadd02039d6
22/tcp -> 0.0.0.0:32769
80/tcp -> 0.0.0.0:32768
預設會同時啟動SSH和Apache服務。
映射本地目錄
[root@docker1 apache_centos]# docker run -i -d -p 100:80 -p 103:22 -e APACHE_SERVERNAME=test -v `pwd`/www:/var/www:ro apache:centos
f452f8f192bfda6fa5830ee67cac03694279a10e10c20e6d1c162aa863735a63
[root@docker1 www]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f452f8f192bf apache:centos "/usr/local/sbin/run." 37 minutes ago Up 37 minutes 0.0.0.0:103->22/tcp, 0.0.0.0:100->80/tcp amazing_mcnulty
[root@docker1 www]# docker rm f452f8f192bf
Error response from daemon: You cannot remove a running container f452f8f192bfda6fa5830ee67cac03694279a10e10c20e6d1c162aa863735a63. Stop the container before attempting removal or use -f
[root@docker1 www]# docker stop f452f8f192bf
f452f8f192bf
[root@docker1 apache_centos]# ls #會自動在目前目錄建立www目錄,放上自定義的頁面index.html,内容為:
Dockerfile httpd run.sh sample www
以上錯誤:apache的頁面目錄為/usr/local/apache2/html
[root@docker1 www]# docker run -i -d -p 100:80 -p 103:22 -e APACHE_SERVERNAME=test -v `pwd`/www:/usr/local/apache2/html:ro apache:centos
ab27e092fef8513ffe89c3f81498fe1b097e48d82dcdb3292059e8475a97d37e
…………………………………………………………………………………………………………………………………………
本文轉自 Mr_sheng 51CTO部落格,原文連結:http://blog.51cto.com/sf1314/1980710