Dockerfile之nginx(六)

1、Dokcerfile的基本指令
 
1)From 指定構建鏡像的基礎鏡像
2)MAINTAINER 指定鏡像的做者
3)RUN 使用前一條指令建立的鏡像生產容器,並在容器中執行命令,執行結束後會自動提交成爲新的鏡像
4)CMD 爲容器提供運行時的默認值,做爲容器啓動的默認第一條指令,在Dockerfile只有一條,有多條的話以最後一條爲準
5)LABEL 爲生成的鏡像添加描述信息,可使用inspect查看
6)EXPOSE 申明容器在運行時將會監聽的特定端口,即對外暴露的端口,但要真正暴露仍是要在run時使用-p或-P指定,不能使用EXPOSE作端口映射
7)ENV 設置環境變量,做用於Docker後續的全部指令,並且還會做用於生成鏡像所建立出來的容器中
8)ADD 從複製文件到鏡像中,能夠是文件、目錄、甚至是url;也能夠是絕對路徑,也能夠是相對路徑
9)COPY 從複製文件到鏡像中,比起ADD,只能複製本地文件
10)ENTRYPOINT 爲容器提供運行時的默認值,不一樣於cmd的是ENTRYPOINT只能傳入指令,而CMD還能夠傳入參數
11)VOLUME 創建掛載點
12)USER 設置用戶名會uid
13)WORKDIR 指定工做目錄,該目錄能夠用於RUN,CMD,ENTRYPOINT,COPY和ADD指令,能夠是絕對目錄,也能夠是相對目錄
14)ONBUILD 爲鏡像添加觸發器,可使用inspect查看。當該鏡像被做爲其餘Dokcer中From指令的參數時,ONEBUILD註冊的指令會按順序執行,構建完成後,觸發器指定被刪除。注意ONEBUILD不能被嵌套
 
2、實戰
 
1:在我本身的虛擬機上登陸我在阿里雲搭建的docker鏡像倉庫 (帳號密碼有須要的話私聊,哈哈)
 
docker login www.lereun.com:5000 
 
 
 
2:查看遠端倉庫的私有鏡像有哪些
 
curl -u 帳號:密碼 https://www.lereun.com:5000/v2/_catalog
 
 
 
3:下載centos基礎鏡像
 
docker pull www.lereun.com:5000/centos
 
 
 
4:下載完成後,docker images 查看鏡像
 
 
 
5:建立一個目錄,用於存放須要用到的包和Dockerfile文件
 
mkdir /root/Docker
 
把nginx的壓縮包放在此目錄下,並在這目錄下編寫Dockefile文件
 
 
 
Dockerfile的內容以下:
 
#基礎鏡像
FROM www.lereun.com:5000/centos
 
#維護者
MAINTAINER 836217653@qq.com
 
#把nginx的壓縮包拷貝至/usr/local/docker下並解壓
ADD nginx-1.12.2.tar.gz /usr/local/docker
 
#安裝依賴包
RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel
RUN yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel
RUN useradd nginx
 
#改變當前路徑,至關於cd進去了
WORKDIR /usr/local/docker/nginx-1.12.2
 
#編譯安裝
RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module && make && make install
 
#添加環境變量
ENV PATH /usr/local/nginx/sbin:$PATH
 
#運行nginx,這樣在啓動容器的時候就不須要再帶nginx啓動
CMD /bin/sh -c 'nginx -g "daemon off;"'
 
EXPOSE 80
 
 
6:構建鏡像
 
docker build -t centos_nginx .
 
查看鏡像時能夠看到:
 
 
 
7:啓動基於該鏡像的容器,測試訪問nginx是否能成功
 
先建立將掛載的目錄
 mkdir -p /docker/nginx
 
啓動容器:
docker run -d -p 8070:80 -v /docker/nginx/conf.d:/usr/local/nginx/conf/conf.d -v /docker/nginx/nginx.conf:/usr/local/nginx/conf/nginx.conf -v /docker/nginx/log:/usr/local/nginx/logs centos_nginx
 
這裏會報錯:
 
 
意思是不能將nginx.conf文件映射到一個目錄,因此這裏還需作的一個操做就是在宿主機上拷貝一份nginx.conf到/docker/nginx目錄下;這裏得特別注意nginx的配置文件的一些路徑,不然啓動不起來,啓動不起來能夠查看docker的日誌文件/var/log/message裏
 
nginx的配置文件:
user nginx nginx;
 
worker_processes 8;
error_log logs/error.log info;
pid logs/nginx.pid;
worker_rlimit_nofile 65535;
 
events {
use epoll;
worker_connections 65535;
}
 
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"';
 
server_tokens off;
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
gzip on;
 
include /usr/local/nginx/conf/conf.d/*;
 
server {
listen 80;
server_name localhost;
 
location /{
index index.php index.html index.htm;
}
 
}
 
}
 
docker正常啓動以下:
 
注:
-p 8070: 80 表示將容器的80端口映射到宿主機的8070端口
-v /docker/nginx/conf.d: /usr/local/nginx/conf/conf.d   左邊爲宿主機目錄,右邊爲docker下目錄
-v /docker/nginx/nginx.conf:/usr/local/nginx/conf/nginx.conf
-v /docker/nginx/log:/usr/local/nginx/logs
這裏個人理解就是:把docker裏的nginx的配置文件和日誌目錄等掛載出來,能夠直接在宿主機上更改
 
查看是否啓動:docker ps -l
 
docker container ls
 
八、測試
 
測試一:訪問本機的8070端口
 
 
測試二:修改掛載目錄下的nginx配置文件,看是否生效
 
在server裏添加一段:
location /testdocker{
    return 520;
}
 
重啓該容器:
docker container restart 0177578edf39
 
 
測試訪問:能夠看到是訪問成功的,說明在docker容器使用的nginx配置文件就是宿主機的這一個
 
 
也能夠進入到掛載的日誌目錄,訪問日誌與錯誤日誌都是在的
 
 
測試三:刪除該容器後,掛載在容器的目錄是否還在存在
 
 
查看掛載的目錄仍是存在的
 
 
 
九、將此docker鏡像上傳到本身的倉庫
 
1)修改docker的配置文件: vim /etc/docker/daemon.json 添加我本身的私有倉庫地址
{
    "insecure-registries": [
        "www.lereun.com:5000"
    ]
}
 
2)重啓docker
systemctl restart docker
 
3)將centos_nginx tag一下
docker tag centos_nginx www.lereun.com:5000/centos_nginx
 
4)push到私有倉庫
 
 
在本身的私有倉庫端查看鏡像,或者使用curl查看
 

 

 
十、Docker裏nginx爲什麼不在後臺運行
 
在Dockerfile裏能夠看到,運行nginx的時候是這樣的: nginx -g "daemon off;「
 
緣由:
docker容器會把容器內第一個進程,也就是pid=1的程序做爲容器是否正在運行的一句,若是docker容器pid掛了,那麼docker容器變回直接退出;docker run的時候把command做爲容器的內部命令,若是使用nginx,nginx將在後臺運行,這個時候nginx並非pid爲1的程序,而是執行的bash;bash執行完nginx啓動命令後就關了,因此容器也就退出了
 
在上面的例子中,nginx在後臺啓動時,能夠查看掛載出來的日誌目錄,看到nginx的pid爲1
 
 
 
nginx配置文件、Dockerfile、及nginx的安裝包: https://gitee.com/lemon_le/docker_nginx
相關文章
相關標籤/搜索