精品軟體與實用教程
Docker 的前世今生
Docker 的核心理念是 Build, Ship, and Run Any App, Anywher,即一次封裝,到處運作。
從前,我們在伺服器設定一個應用程式的運作環境,要安裝各種元件,就拿JavaWeb 的環境來說吧,要安裝Tomcat、MySQL 等。安裝和配置這些東西有多麻煩就不說了,它還不能跨平台。假如我們是Windows 上安裝的這些環境,到了 Linux 又得重新裝。況且就算不跨作業系統,換另一台同樣作業系統的伺服器,要移植應用程式也是非常麻煩的。
Linux 容器技術 的出現就解決了這樣一個問題,而Docker 就是在它的基礎上發展出來的。將應用程式運行在 Docker 容器上面,而Docker 容器在任何作業系統上都是一致的,這實現了跨平台、跨伺服器。只需要一次配置好環境,換到別的機子上就可以一鍵部署好,大大簡化了操作。
Docker 的安裝配置
這裡我主要介紹一下Docker 在Ubuntu 和Windows 的安裝。其他的作業系統可自行搜尋安裝教學。
由於Docker 官網在國內的存取速度不好,所以這裡推薦去 DaoCloud 下載鏡像,速度非常快:
Windows
先進入到Docker 的下載頁面:
如果是 win10 系統就直接下載 Docker for Windows,如果是win10 之前的系統就下載Docker Toolbox。下載完成之後預設一直點下一步就安裝完成了。
注意:windows 運行Docker 需要在BIOS 中開啟 Intel Virtual Technology,如果打不開Docker 並提示有該類錯誤請自行根據自己電腦型號搜尋相關教程。
Ubuntu
- 可以用Ubuntu 內建的安裝來源安裝Docker,只需要執行以下兩個指令:
$ sudo apt-get update
$ sudo apt-get install docker.io
- 不過用自備安裝來源安裝的Docker 並不是最新版,建議用以下方式安裝最新版:
$ curl -sSL https://get.daocloud.io/docker | sh
- 安裝完成之後可以用 docker version指令查看docker 版本資訊。
注意:正常情況下,應該顯示Client 和Server 的訊息,如果沒有Server 的訊息,則代表服務沒有啟動。此時需要用 service docker start 指令啟動它。
Ubuntu 卸載Docker
如果裝錯版本了可以卸載了重新裝
$ sudo apt-get remove --purge docker.io
$ rm -rf /var/lib/docker
Docker 核心概念
Docker 有三大核心概念:
- 倉庫(repository)
- 鏡像(image)
- 容器(container)
Docker 利用倉庫管理映像的設計與Git 非常相似。我們要配置的應用程式運行環境就是鏡像,如 nginx 鏡像,當我們本地沒有該鏡像的時候,就需要從遠端倉庫pull 下來,當我們啟動這個鏡像時,就會有一份鏡像被複製並運行在容器中。如果我們改動了容器裡面的內容,也可以將其commit 儲存成新的鏡像。
第一個Docker 實例
這裡以Nginx 為例來示範在docker 中啟動一個應用程式的過程。
啟動Nginx 分為三個步驟:
- pull nginx 鏡像
- 運行nginx 容器
- 映射nginx 端口
pull 鏡像
首先要Docker 官方倉庫裡搜尋nginx,找到有 official 字樣的,點進去把pull 指令複製下來。
執行該條指令就把鏡像pull 到本地了。執行“docker images”即可查看本機映像。
其實 docker pull nginx這條指令是簡寫形式,完整指令應該是:
$ docker pull registry.hub.docker.com/library/nginx
完整的命令是在nginx 前面加上了註冊伺服器的位址,由於docker pull 的預設位址是這個,所以該位址是可以不加的。
為什麼要說這個呢,因為從官方倉庫下載鏡像實在是非常的慢,有時候還下載不了。如果我們更改了這個註冊伺服器的位址,把它換成國內的,就可以實現加速。
鏡像加速
國內有非常多的鏡像倉庫,本文介紹使用阿里雲的,後文我們也會介紹把自己的鏡像上傳到阿里雲,並且該服務是免費的。
訪問這個地址:
如果沒有阿里雲帳號的就自己註冊一個。在上面這個地址的頁面就可以看到自己的專屬加速地址了,並且有不同系統的安裝方法,根據給的教程安裝即可。
運行nginx 容器
pull 了鏡像之後,執行以下指令就可以啟動它了。
$ docker run -d nginx
這條指令是後台啟動nginx ,不加 -d 就是前台啟動。啟動了之後我們暫時還是無法存取帶它的,我們還需要將容器內的nginx 連接埠映射到容器外面,才可以存取。
映射nginx 端口
$ docker run -d -p 8080:80 nginx
跟上條指令比起來只加了一個 -p
參數,後面跟上端口,這裡我是把本機的8080 端口映射到容器內的80 端口上,瀏覽器訪問 localhost:8080 就可以看到nginx 的歡迎頁面了。
鏡像和容器的基本操作
鏡像操作
- 查看本地鏡像
$ docker images
- 為鏡像添加標籤
$ docker tag old-tag new-tag
新的標籤跟原標籤鏡像的ID 是完全一樣的,它們實際上都指向同一個鏡像文件,只是別名不同而已。
- 刪除鏡像
$ docker rmi image-id/image-tag
注意:刪除鏡像需要先刪除使用了此鏡像的容器,雖然可以強制刪除,但並不建議這麼做。另外刪除鏡像,可以用tag 或ID 刪除,如果ID 是一樣的就用tag 刪除
容器操作
- 查看正運轉的容器
$ docker ps
- 停止正在運行的容器
$ docker stop container-id
容器的ID 不需要全部輸完,只要能分辨兩個容器就可以了。
- 查看所有容器
$ docker ps -a
- 刪除容器
$ docker rm container-id
刪除容器之前需要先停止它
- 將正在運行的容器儲存為鏡像
$ docker commit container-id image-tag
特別注意:如果更改了容器後不將它儲存為新的鏡像,在容器被刪除後,所有的變更都不會被儲存。下一文會介紹另Docker 的資料儲存可以解決這個問題。另外,此指令後面的tag 可以不寫只寫名字,預設latest。
- 進入容器內部
$ docker exec -it container bash
Docker 容器也有一個類別Linux 的檔案系統,還可以用一些linux 指令。若要退出容器可輸入
注意:有的映像像是沒有帶bash 的,像是 docker pull daocloud.io/library/nginx:1.13.8-alpine-perl,這條指令就會報錯,這時就可以用sh 建立連線:
$ docker exec -it container /bin/sh
- 複製文件到容器內
$ docker cp file container-id:newfile
- 複製容器內的檔案到容器外
$ docker cp container-id:file newfile
複製容器內的檔案到容器外命令是在容器外執行的
導入匯出鏡像和容器
導入和匯出鏡像
- 匯出鏡像
$ docker save -o name.tar image-tag
- 導入鏡像
$ docker load --input name.tar
匯入和匯出容器
- 導出容器
$ docker export -o name.tar container-id
- 導入容器(docker import name.tar image-tag)
容器導入其實導成了鏡像。
push 自己的鏡像到遠端倉庫
先來了解docker 是如何管理倉庫和映像的。
倉庫是放在註冊伺服器上的,一個倉庫只管理一個鏡像,一個鏡像可以有多個版本。
push 映像檔到Docker Hub
- 造訪Docker Hub(註冊伺服器):
- 如果沒有帳號的話自己註冊一個,然後點擊 Create Repository ,在如下頁面建立一個倉庫。
- 例如我取的名字是:web-server,我的倉庫名稱就是
stormxing/web-server
- 接著在本機用以下指令登入Docker Hub
- 如果我們想把映像上傳到Docker Hub,我們的映像名字就得跟倉庫名稱一致。要做到這一點,我們可以用為鏡像建立一個新的標籤。例如將nginx 映像重新建立一個標籤 stormxing-webserver,如果版本不填寫就預設是latest。
- 最後,直接push 就可以了,完成之後在倉庫頁面的tags 選項中可以看到自己的鏡像。
push 鏡像到阿里雲倉庫
雖然Docker Hub 可以push 映像,但是速度太慢了。最好還是用國內的速度比較快,這裡介紹阿里雲的。
- 先登陸這個位址,建立一個倉庫,然後設定下登入密碼:
- 建立倉庫選擇本地倉庫
- 最後阿里雲的操作指南非常詳細,跟上面的步驟基本上一致,這裡就不再贅述了。
總結
本篇文章主要介紹了Docker 的作用、Docker 三大核心
(倉庫、鏡像、容器)的基本操作,也介紹如何push 自己的鏡像到遠端倉庫。