記得剛開始玩docker的時候,想着docker上運行一個nginx代理,於是寫了個Dockerfile:
FROM nginx:latest WORKDIR .
COPY demo.conf /etc/nginx/conf.d/demo.conf EXPOSE 80 CMD [ "nginx" ]
然后docker build生成,docker run運行,發現怎么都起不來,或者說起來了又掛了,到/var/lib/docker/containers目錄下查看日志發現啟動也是正常的:
#生成 sudo docker build -t nginx:v1 . #運行 sudo docker run -id nginx:v1
#或者運行
sudo docker run -id nginx:v1 nginx
在百度查到,nginx默認是后台啟動的,一般的我們啟動nginx進程就是直接輸入nginx,然后回車,但是docker的CMD要求命令能將進程掛起來,也就是hold住,顯然,正常使用nginx命令啟動不滿足這個條件
后來查到,添加daemon off;配置可以讓nginx在前台啟動,於是我修改Dockerfile:
FROM nginx:latest WORKDIR . COPY demo.conf /etc/nginx/conf.d/demo.conf EXPOSE 80 RUN echo "daemon off;" >> /etc/nginx/nginx.conf CMD [ "nginx" ]
然后build&run,果然nginx完美的起來了!
其實我們是可以直接使用nginx鏡像的,但是為什么使用Dockerfile就不行了呢?於是我直接使用nginx鏡像創建一個容器,然后ps查看容器啟動的命令:
#創建一個容器 sudo docker run -id nginx:latest #查看運行中的容器狀態,--no-trunc是顯示所有的信息,不進行截取 sudo docker ps --no-trunc
結果顯示:
可以看到它是使用下面命令啟動的:
/docker-entrypoint.sh nginx -g 'daemon off;'
注意后面的daemon off;,於是我將Dockerfile改成:
FROM nginx:latest WORKDIR . COPY demo.conf /etc/nginx/conf.d/demo.conf EXPOSE 80 CMD [ "nginx", "-g", "daemon off;" ]
成功啟動!
另外,我們也可以在docker run時覆蓋這個CMD,如:
#注意,這里的daemon off;需要使用引號包起來! sudo docker run -id nginx:v1 nginx -g 'daemon off;'
其實,我們完全沒有必要在Dockerfile里面添加一個CMD命令啟動!因為添加了就是覆蓋了nginx鏡像原來的命令!