六、Dokcerfile

一 、 指令

下面列出了 Dockerfile 中最常用的指令,完整列表和說明可參看官方文檔。

FROM
指定 base 鏡像。

MAINTAINER
設置鏡像的作者,可以是任意字符串。

COPY
將文件從 build context 複製到鏡像。
COPY 支持兩種形式:

COPY src dest

COPY ["src", "dest"]

注意:src 只能指定 build context 中的文件或目錄。

ADD
與 COPY 類似,從 build context 複製文件到鏡像。不同的是,如果 src 是歸檔文件(tar, zip, tgz, xz 等),文件會被自動解壓到 dest。
eg:
ADD
ADD https://a.b.c/c.tar.gz /var/www/html
ADD html.tar.gz /var/www/html

ENV
設置環境變量,環境變量可被後面的指令使用。例如:
...

ENV MY_VERSION 1.3

RUN apt-get install -y mypackage=$MY_VERSION

...

EXPOSE
指定容器中的進程會監聽某個端口,Docker 可以將該端口暴露出來。我們會在容器網絡部分詳細討論。

VOLUME
將文件或目錄聲明爲 volume。我們會在容器存儲部分詳細討論。

WORKDIR
爲後面的 RUN, CMD, ENTRYPOINT, ADD 或 COPY 指令設置鏡像中的當前工作目錄。

RUN
在容器中運行指定的命令。

CMD
容器啓動時運行指定的命令。
Dockerfile 中可以有多個 CMD 指令,但只有最後一個生效。CMD 可以被 docker run 之後的參數替換。

ENTRYPOINT
設置容器啓動時運行的命令。
Dockerfile 中可以有多個 ENTRYPOINT 指令,但只有最後一個生效。CMD 或 docker run 之後的參數會被當做參數傳遞給 ENTRYPOINT。

Q1:
RUN CMD ENTRYPOINT指令有什麼區別
1.run在building時可以寫多條
2.CM和ENTRYPOINT在運行container運行時只能寫一條 如果寫了多條只有最後一條才生效
3.CMD在run時可以被command覆蓋 entrypoint不會被command覆蓋,蛋可以指定entrypoint覆蓋

構建命令:

docker buld -t name:tag . 指定名稱 在當前目錄尋找
-f 指定dockerfile位置 同樣也可以指定url等

二 、構建常用網站鏡像書寫

PHP環境的構建

FROM centos:6.6

MAINTAINER shuchao <[email protected]>
##保證服務器與容器有相同的時間
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime  
##安裝yum源以及軟件
RUN rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
RUN rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm
RUN yum install -y php70w libmemcached10
RUN yum install -y php70w-fpm php70w-mbstring php70w-gd php70w-dom php70w-xml php70w-pdo php70w-mysqlnd php70w-mcrypt php70w-process php70w-pear php70w-cli php70w-devel php70w-opcache php70w-soap
RUN sed -E -i "s/^error_log = \/var\/log\/php-fpm\/error.log/error_log = \/data\/logs\/php\/fpm-error.log/" /etc/php-fpm.conf
RUN sed -E -i "s/^listen =.+?$/listen = 0.0.0.0:9000/" /etc/php-fpm.d/www.conf 
RUN sed -E -i "s/^listen.allowed_clients =.+?$/; listen.allowed_clients = 127\.0\.0\.1/" /etc/php-fpm.d/www.conf
RUN sed -E -i "s/^slowlog = \/var\/log\/php-fpm\/www-slow.log/slowlog = \/data\/logs\/php\/php-slow.log/" /etc/php-fpm.d/www.conf 
RUN sed -E -i "s/^php_admin_value\[error_log\] =.+?$/php_admin_value\[error_log\] = \/data\/logs\/php\/php-error.log/" /etc/php-fpm.d/www.conf 
RUN { \
    echo "catch_workers_output = yes"; \
} >> /etc/php-fpm.d/www.conf
RUN sed -E -i "s/^post_max_size =.+?$/post_max_size = 100M/" /etc/php.ini
RUN sed -E -i "s/^upload_max_filesize =.+?$/upload_max_filesize = 100M/" /etc/php.ini
RUN sed -E -i "s/^display_errors .+?$/display_errors = On/" /etc/php.ini
RUN sed -E -i "s/^error_reporting .+?$/error_reporting = E_ALL\ \&\ \~E_DEPRECATED\ \&\ \~E_STRICT\ \&\ \~E_NOTICE/" /etc/php.ini
RUN sed -E -i "s/^;error_log = php_errors.log/error_log = \/data\/logs\/php\/cli_error.log/" /etc/php.ini

#創建php目錄 這裏是最後要掛載出來以便實現代碼更新用的
RUN mkdir -p /data/www && chmod 777 -R /data/www
RUN mkdir -p /data/logs/php && chmod 777 -R /data/logs
##添加擴展庫 比如mysql memcache這些的 
ADD ./ext/*.ini /etc/php.d/
ADD ./ext/*.so /usr/lib64/php/modules/

#crontab 以便於php一些定時腳本能跑起來
RUN yum install -y vixie-cron
RUN chkconfig crond on
RUN sed -E -i "s/account    required   pam_loginuid.so/account    optional   pam_loginuid.so/" /etc/pam.d/crond 

#對外暴露的端口
EXPOSE 9000

CMD ["php-fpm", "-F"]

然後執行docker build -t php7:latest . 就可以把鏡像構建出來了

測試:

[root@docker php7]# docker run -it --name php -p 9000:9000 php7:latest
[07-Nov-2017 17:02:56] NOTICE: fpm is running, pid 1
[07-Nov-2017 17:02:56] NOTICE: ready to handle connections```


測一波:
在真機上
Chain DOCKER (1 references)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 172.17.0.2 tcp dpt:9000
另外
[root@docker php7]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a4293f10e010 php7:latest "php-fpm -F" 29 minutes ago Up 29 minutes 0.0.0.0:9000->9000/tcp php
然後
[root@docker php7]# ss -tpln | grep 9000
LISTEN 0 128 :::9000 :::* users:(("docker-proxy-cu",pid=8485,fd=4))

[root@docker php7]# telnet 127.0.0.1 9000
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

這個時候這個容器就可以作爲即用即銷的php-fpm容器 9000端口就可以用來處理php腳本了。在大型的集成項目中 php集裝箱就做好了,下一次就可以和其他容器堆疊在一起組成一個龐大的底層。

Nginx的構建

FROM centos:6.6

MAINTAINER hexin
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
RUN yum install -y nginx

RUN echo "daemon off;" >> /etc/nginx/nginx.conf
RUN mkdir -p /data/www /etc/nginx/includes && chown -R nginx:nginx /data/www
RUN sed -E -i '/include \/etc\/nginx\/conf\.d\/\*\.conf/ a\    include\ \/etc\/nginx\/sites-enabled\/*\.conf;' /etc/nginx/nginx.conf
RUN sed -E -i 's/worker_processes  1;/worker_processes  4;/' /etc/nginx/nginx.conf
RUN mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.save

EXPOSE 80 443 8000

CMD ["nginx"]
網站的目錄使用nginx掛載的方法實現 

Mysql建議使用官方鏡像 用參數實現mysql密碼 建庫的傳遞

https://github.com/kobe2112240/DockerFile我構建的一些常用的鏡像

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章