在 Ubuntu 安裝 Docker 和 Docker Compose

以往要在一台電腦上建立更多主機時,我們會用上像是 VMware 這樣的虛擬技術軟體,也就是所謂的「虛擬機」,但在 Docker 出來之後這一切就改變了。

Docker 的用途就像是 VMware,但因為環境並不是「虛擬」出來的⋯⋯等種種原因,令 Docker 啟動一個「系統」的速度不到五秒,比起傳統的虛擬機的三分鐘快上了至少三十五倍左右。

好吧,實際上那並不叫「系統」。在 Docker 中這種東西叫做「容器」,且 Docker 的執行效率就像原生級般地快速,因此可以把 MySQLPHPApache 分開成「三個容器」來執行,如此一來其中一個容器掛掉時,不會影響到其他的服務。

而傳統的虛擬機則會把這三個服務執行在同個「系統」中。Docker 十分地方便且多數人都已用此技術取代傳統虛擬機(當然有時還是會用上虛擬機),更多詳細資訊可至維基百科觀看。


1. 安裝 Docker

在新版的 Ubuntu 16.04 版本中安裝 Docker 已經變得夭壽簡單,透過下列指令就可以安裝 Docker 了。

$ apt install docker.io

這將會在你的電腦上用上至少 120 MB 的空間,應該是沒什麼啦。

檢查 Docker 版本

安裝完之後我們可以輸入 docker version 或是 docker -v(簡略資訊)檢查已安裝的 Docker 版本。

$ docker version
Client:  
 Version:      1.12.3
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   6b644ec
 Built:        Mon, 19 Dec 2016 09:20:48 +1300
 OS/Arch:      linux/amd64

Server:  
 Version:      1.12.3
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   6b644ec
 Built:        Mon, 19 Dec 2016 09:20:48 +1300
 OS/Arch:      linux/amd64

通常會用到這個指令通常都是要去 GitHub 那邊回報問題的⋯⋯。

2. 安裝 Docker Compose

一般來說我們可以用 Docker 啟動單個容器。倘若你要啟動「一套服務」例如建立一個部落格需要:PHP、MySQL、Apache,這個時候就至少需要三個容器,一個一個啟動太慢了,所以我們可以把這些東西寫成一個 docker-compose.yml 檔案,然後透過 Docker Compose 協助我們一次啟動三個容器。

首先透過下列指令安裝 Docker Compose。

$ curl -L "https://github.com/docker/compose/releases/download/1.10.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

安裝完畢之後我們需要給予 Docker Compose 一定的執行權限。

$ chmod +x /usr/local/bin/docker-compose

接著我們就可以透過 docker-compose --version 檢查剛才安裝的 Docker Compose 版本為何。

$ docker-compose --version
docker-compose version 1.10.0, build 4bd6f1a  

接下來我們就能夠開始建立 docker-compose.yml 檔案然後啟動一套服務。

3. 透過 Compose 建立 WordPress

這裡會舉一個官方範例作為參考,這個範例會啟動 MySQL 和 WordPress 兩個容器。在我們開始之前,建議你先建立一個資料夾,然後進入該資料夾再進行下一個步驟。

$ mkdir my_wordpress/
$ cd my_wordpress/

然後就可以繼續啦。

建立 Compose 檔案

現在建立一個 docker-compose.yml 檔案,這包含了兩個容器:MySQL 5.7WordPress,內容如下。

version: '2'

services:  
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: wordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_PASSWORD: wordpress
volumes:  
    db_data:

注意:在 volumes 的部分建議你閱讀「数据卷 · Docker —— 从入门到实践」文章。

透過 Compose 啟動服務

在同個目錄下透過 docker-compose up -d 就能夠以剛才建立的設定檔啟動那兩個容器。

$ docker-compose up -d
Creating network "my_wordpress_default" with the default driver  
Pulling db (mysql:5.7)...  
5.7: Pulling from library/mysql  
efd26ecc9548: Pull complete  
a3ed95caeb02: Pull complete  
...
Digest: sha256:34a0aca88e85f2efa5edff1cea77cf5d3147ad93545dbec99cfe705b03c520de  
Status: Downloaded newer image for mysql:5.7  
Pulling wordpress (wordpress:latest)...  
latest: Pulling from library/wordpress  
efd26ecc9548: Already exists  
a3ed95caeb02: Pull complete  
589a9d9a7c64: Pull complete  
...
Digest: sha256:ed28506ae44d5def89075fd5c01456610cd6c64006addfe5210b8c675881aff6  
Status: Downloaded newer image for wordpress:latest  
Creating my_wordpress_db_1  
Creating my_wordpress_wordpress_1  

如果你是第一次啟動這些容器,你可能還沒有該容器所需的映像檔,此時 Docker 會自動到 DockerHub 獲取,會花上一些時間,未來重複做這些事情時就會自動省略這些過程。

拜訪 WordPress

現在你的 WordPress 已經在 :8000 埠口提供服務了,你能透過瀏覽器前往查看,然後就會看到下面這樣的頁面。