Docker 实战教程之从入门到提高 (四)
本系列的前三篇文章,我們學習了如何在 Ubuntu 操作系統安裝 Docker,并且通過實戰練習,了解了 Docker 和宿主機操作系統文件目錄互相隔離的實現原理,以及 Docker Volume 的工作原理。通過動手對 Nginx Docker 鏡像進行修改,達到自定義其首頁顯示的目的。
- Docker 實戰教程之從入門到提高 (一)
- Docker 實戰教程之從入門到提高 (二)
- Docker 實戰教程之從入門到提高 (三)
其中系列的第三篇文章,包含了使用 Dockerfile 基于已有的 Nginx 鏡像制作一個支持 SSL 訪問的 Nginx Docker 鏡像的步驟。
本文繼續我們的 Docker 學習之路。
練習1:從頭基于空鏡像 scratch 創建一個新的 Docker 鏡像
我們在使用 Dockerfile 構建 docker 鏡像時,一種方式是使用官方預先配置好的容器鏡像。優點是我們不用從頭開始構建,節省了很多工作量,但付出的代價是需要下載很大的鏡像包。
比如我機器上 docker images 返回的這些基于 nginx 的鏡像,每個都超過了 100MB,而一個簡單的 Ubuntu 的容器超過了 200MB,如果安裝了相關的軟件,尺寸會更大。
如果我們的需求是在構建一個符合我們實際業務需求的 Docker 鏡像的前提下,確保鏡像尺寸盡可能的小,應該怎么做呢?
思路是使用空鏡像 scratch.
新建一個文件夾,用 wget 下載 rootfs.tar.xz 壓縮包。
wget -O rootfs.tar.xz https://github.com/debuerreotype/docker-debian-artifacts/raw/b024a792c752a5c6ccc422152ab0fd7197ae8860/jessie/rootfs.tar.xz
這個將近 30MB的壓縮包是個什么東東?
解壓之后看內容就知道了,包含了操作系統大部分常用命令。
wget -O nginx.conf https://github.diablo.corp/raw/slvi/docker-k8s-training/master/docker/res/nginx.conf
新建一個 dockerfile 文件,將下列內容粘貼進去:
FROM scratch# set the environment to honour SAP's proxy servers ENV http_proxy http://sap.corp:8080 ENV https_proxy http://sap.corp:8080 ENV no_proxy .sap.corp# give yourself some credit LABEL maintainer="Jerry Wang"# add and unpack an archive that contains a Debian root filesystem ADD rootfs.tar.xz /# use the apt-get package manager to install nginx and wget RUN apt-get update && \ apt-get -y install nginx wget# use wget to download a custom website into the image RUN wget --no-check-certificate -O /usr/share/nginx/html/cheers.jpg https://github.diablo.corp/raw/slvi/docker-k8s-training/master/docker/res/cheers.jpg && \ wget --no-check-certificate -O /usr/share/nginx/html/index.html https://github.diablo.corp/raw/slvi/docker-k8s-training/master/docker/res/cheers.html# copy the custom nginx configuration into the image COPY nginx.conf /etc/nginx/nginx.conf# link nginx log files to Docker log collection facility RUN ln -sf /dev/stdout /var/log/nginx/access.log && \ ln -sf /dev/stderr /var/log/nginx/error.log# expose port 80 - the standard port for webservers EXPOSE 80# and make sure that nginx runs when a container is created CMD ["nginx", "-g", "daemon off;"]執行命令進行鏡像的構建:
docker build -t nginx-from-scratch1.0 .
產生的日志:
最后看到鏡像成功構建的消息。
基于這個名為 nginx-from-scratch 的鏡像啟動一個新的 nginx 容器:
localhost:1083, 看到首頁,說明這個新構建的鏡像工作正常。
練習2:刪除所有正在運行和退出的 Docker 實例
經過本系列三篇文章的練習,我們本機想必已經創建了不少 Docker 實例了,是時候對它們進行一次清理了。
docker ps -a 能顯示所有 docker 實例的狀態,包含已經退出了的:
加上-q參數,只顯示container id
使用這個命令,把 docker ps -aq 產生的輸入作為輸入傳入到 docker rm 命令,達到刪除所有容器實例的效果。
docker rm $(docker ps -aq)
練習3:在一個 Docker 容器里運行指定的 web 應用
實現題目描述的這個需求有很多種辦法,作為入門,讓我們從最簡單的辦法開始。
首先使用命令 docker ps 確保當前沒有正在運行的 Docker 實例。
運行命令 docker run -it nginx:
然后我們另外開一個終端,用 docker ps 命令查看這個運行起來的容器實例,Status 的 Up 54 seconds 意思是從該實例啟動到現在已經經過了 54 秒。
使用命令進入這個容器實例:
docker exec -it bbc5d48a761c /bin/sh
進入之后看到 shell 提示符 #,我們就可以在 nginx 容器內執行一些常用命令了。
/usr/share/nginx/html 就是 nginx 服務器內存放 web 應用的位置,現在我們只要想辦法將我們的 web 應用放到這個文件夾里就可以了。
問題就是如何把這個 web 應用搞到容器內的對應文件夾里。
我使用的是通過 docker volume 實現 docker 和宿主機之間的數據共享。使用 docker stop 將原來的 docker 實例停掉,然后啟動新的實例。
假設我把 webapp 文件夾下載到 ~目錄,然后用下面的命令行將 webapp 文件夾掛接到 nginx 容器內的同名文件夾:
docker run -d -p 1081:80 -v pwd/webapp:/usr/share/nginx/html/webapp --name jerry-custom nginx
最后使用 url localhost:8081/webapp, 就能訪問到這個運行在 Docker 容器里的 web 應用了。
總結
本文首先介紹了如何基于 scratch 空鏡像來創建新的 Docker 鏡像,以此來減小最后制作出來的鏡像文件大小。接著介紹了如何用命令行刪除所有正在運行和退出的 Docker 實例。最后是一個實際的例子,如何將一個開發好的 Web 應用,在 Docker 容器里運行。
本系列前三篇文章的鏈接:
- Docker 實戰教程之從入門到提高 (一)
- Docker 實戰教程之從入門到提高 (二)
- Docker 實戰教程之從入門到提高 (三)
總結
以上是生活随笔為你收集整理的Docker 实战教程之从入门到提高 (四)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 维珍银河将于6月下旬开始商业飞行 股价大
- 下一篇: webp 格式转 png 格式的一种便捷