運行環境: MAC
html
Docker 版本: Docker version 17.12.0-ce, build c97c6d6
linux
啓動Nginx 服務器,並進入模擬終端nginx
docker run -p 8080:80 --name nginx_web -it nginx /bin/bash
日誌文件位置:/var/log/nginx 配置文件位置: /etc/nginx 資源存放的位置: /usr/share/nginx/html
上面的配置路徑是我電腦上的虛擬linux中地址,請各位讀者,也本身去看下本身的配置位置web
重要提示:
對於不想折騰的同窗,能夠直接從第四步來運行docker
/usr/share/nginx/html echo "<h1>Hello Docker</h1>" > index.html
到這裏有的朋友,可能會發現,我訪問localhost:8080 端口,第一次出現了Nginx 的歡迎界面,而第二次就出現了404 提示。vim
關於這個問題,本文不展開詳序,若是不明白的,能夠參考:segmentfault
Docker 執行 docker run
以後,先在當前操做系統的基礎上,虛擬化了一個精簡版的linux(僅僅包含系統運行的最精簡功能),而後加載咱們的Nginx鏡像。當Nginx鏡像加載到咱們的虛擬Linux環境中時,至關於在系統裏執行了一個腳本,而這個腳本就是Nginx。瀏覽器
因爲默認的Nginx 是不做爲守護進程運行的。因此當Docker內監聽到80端口的請求後,完成以後,就退出了Nginx的進程。該容器內只有一個進程,而且是非守護的,執行完請求進程就銷燬了。那麼這個容器也就沒有存在的必要了,因此Docker 中這個服務也就停掉了。這也就是咱們執行 docker top
看不到當前運行的容器的緣由。bash
做爲暫時解決Nginx 只執行一次就退出的問題,咱們能夠進入交互式終端,執行 nginx &
讓nginx 做爲守護進程後臺運行。服務器
查看咱們正在運行的容器
roverliang$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
若是什麼內容都沒有,說明當前沒有正在運行的容器。
查看已經運行結束的容器
roverliang$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5bff285f60b3 nginx "/bin/bash" 9 minutes ago Exited (0) 6 minutes ago nginx_web
從新啓動咱們剛剛啓動過的容器
docker start nginx_web
進入到咱們的容器內部
docker attach nginx_web echo "<h1>Hello Docker</h1>" > /usr/share/nginx/html/index.html nginx & 而後 使用快捷鍵 control + Q 退出當前的容器 以後咱們在瀏覽器再次訪問:http://localhost:8080/
折騰了這麼久,終於看到咱們指望的的內容了。
Hello Docker
先建立咱們本機須要映射的文件夾
mkdir -p docker_study/log docker_study/etc docker_study/html
注意:
在本身的家目錄建立
複製咱們docker中nginx 的配置文件
docker cp 65bc23f952db:/etc/nginx/ /Users/roverliang/docker_study/etc/
關閉掉咱們的容器
docker stop nginx_web
刪除掉咱們的練習的demo,咱們從新來構建一個能夠用的。
docker rm nginx_web
將Nginx 鏡像和咱們本機的目錄進行映射,方便咱們修改文件
docker run \ -p 8080:80 \ --name nginx_web \ -v /Users/roverliang/docker_study/log/:/var/log/nginx \ -v /Users/roverliang/docker_study/etc/nginx.conf:/etc/nginx/nginx.conf \ -v /Users/roverliang/docker_study/html/:/usr/share/nginx/html \ -it \ -d \ nginx \ /bin/bash \
運行到這裏,咱們可能仍是會發現訪問http://localhost:8080/ 沒有內容。可是不要急,解決問題的過程,就是學習新東西的過程,繼續網上查資料,參考以下:
摘抄文中讓我豁然開朗的一段:
我以前運行的時候,通常都採用交互式:
-i 保證容器的stdin開啓-t 爲容器生成一個tty終端,在命令的最後加一個/bin/bash來保證能夠交互。可是實際上,nginx並無運行,致使我覺得容器的端口綁定不是持久化的。
接下來咱們須要關掉,並刪除咱們的容器,再按照以下的命令重啓一個:
docker run \ -p 8080:80 \ --name nginx_web \ -v /Users/roverliang/docker_study/log/:/var/log/nginx \ -v /Users/roverliang/docker_study/etc/nginx.conf:/etc/nginx/nginx.conf \ -v /Users/roverliang/docker_study/html/:/usr/share/nginx/html \ -d \ nginx
修改咱們剛剛複製過來的nginx 配置
cd /Users/roverliang/docker_study/etc vim nginx.conf 在Http 模塊中添加以下配置: server { listen 80; server_name www.test_nginx.com; index index.html; root /usr/share/nginx/html; } 而後回到宿主機,綁定host 127.0.0.1 www.test_nginx.com
大功告成