假設一個情境,如果今天我們的應用程式已經開發完成了,以前還要把 Source Code 拿去客戶端部署,還要設定一堆參數等等,或是今天內部開發完成,要進行測試,也要部署到測試機上,如今有 Docker 了,有沒有辦法,只用前面介紹的 run -p 這個指令,就直接完成安裝!?
基本上,前面那篇,我們直接登入到 Docker 來進行抓取 Source 的動作,並且在裡面執行,最後 Commit ,的確,這是一種方法,也可以建立一個新的image,但是,我們不可能每次要 Run MVC 的時候,都還要登入進去執行吧,那真的很累人…其次,登入容器後,再去下載 Source 感覺也不是很好,準備環境也很麻煩,所以這篇,我們來看看,怎樣來建立自己的 Image。
準備本地端的 Source Code
首先,我們透過git指令,來取得ASP.NET 的 Source Code
git clone https://github.com/aspnet/Home.git aspnet-home
完成後,我們先進入專案的位置。
cd aspnet-home/samples/HelloWeb
建立 Dockerfile
接下來,我們透過文字編輯器,來新建一個 Dockerfile 的檔案,這個檔案主要是用來設定 Docker 容器的細節。
vi Dockerfile
文字的內容如下,第一行表示要用哪一個Image當作基底,接下來,拷貝目前目錄下的所有東西到 app ,然後進入app目錄,接著就來跑一下 kpm restore 這個指令,完成之後,對外的 port 要開 5004,並且於整個容器準備完成之後執行 k kestrel。除此之外,比較常用到的還有MAINTAINER(維護人)和ADD(同樣將檔案加入到image,但如果是壓縮黨會自動解壓縮)
FROM microsoft/aspnet
COPY . /app
WORKDIR /app
RUN [“kpm”, “restore”]
EXPOSE 5004
ENTRYPOINT [“k”, “kestrel”]
Build Image
接下來,我們就可以透過 build 的指令來建立新的image,並且取名為 myapp,後面的 . 表示路徑位置,也就是要指向 Dockerfile的位置。
sudo docker build -t myapp .
很快地就會完成了,完成之後我們可以透過等下指令看一下是否有增加進去。
sudo docker images
Run
完成後,我們就可以拿這個 Image 來進行建置容器的動作,這邊的 -d 代表的是讓容器在背景執行,最後我們再用 docker ps 來查看,就可以發現,他在背景執行了。
sudo docker run -t -d -p 80:5004 myapp
上傳到 Docker Hub
最後,我們可以把我們準備好的 Image 提供給別的使用者共享,我們可以把我們的影像檔傳到 Docker Hub 上,所以在進行最後一個步驟之前,要先去申請 Docker Hub 的帳號。
申請完成之後,我們就可以透過以下指令進行登入。
sudo docker login
那再上傳之前,有一點需要注意,Docker Hub 的格式為 UserName/Repo,所以這邊我們要先改名一下,不然會傳不上去,我們先用以下指令查看我們目前有哪些 Image。
sudo docker images
接下來,我們就可以用以下指令改名,改成 skychang/mapp。
sudo docker tag myapp2:latest skychang/myapp:latest
最後,我們再用 push ,就可以傳到 Docker Hub 嚕!
sudo docker push skychang/myapp
完成後,就可以在 Docker Hub 看到嚕!!
刪除用不到的 Image
如果有用不到的 Image ,可以透過 rmi 的指令移除 image , rmi 後面的參數是代表 image 的名稱
sudo docker images 來查看所有的資訊
sudo docker rmi myapp
參考資料
- https://github.com/aspnet/aspnet-docker
- http://blogs.msdn.com/b/webdev/archive/2015/01/14/running-asp-net-5-applications-in-linux-containers-with-docker.aspx
- http://blog.aminjam.com/hello-asp-net-5-on-docker/
- http://www.codedata.com.tw/social-coding/docker-layman-abc/
- http://philipzheng.gitbooks.io/docker_practice/content/basic_concept/repository.html
- http://www.openfoundry.org/tw/tech-column/9319-docker-101