# 11. 部署 owncloud 與 phpMyAdmin
#### 1. 介紹
上一篇:[docker部署深入理解(十)](https://www.rails365.net/articles/docker-bu-shu-shen-ru-li-jie-shi)
- [owncloud主頁](https://github.com/owncloud/core)
- [owncloud客戶端](https://owncloud.org/install/#install-clients)
- [owncoud docker文檔](https://github.com/docker-library/docs/tree/master/owncloud)
- [phpMyAdmin docker鏡像](https://github.com/phpmyadmin/docker)
- [docker-compose.yml 2寫法](https://docs.docker.com/compose/compose-file/compose-file-v2/)
[owncloud](https://github.com/owncloud/core)是一款放文件和圖片等數據的應用,它有點類似于網盤這樣的東西,以后再也不用擔心哪個網盤被封殺了,自己搭建一個,上傳和下載速度又快,資料也安全,我最喜歡的是它有兩個特點,第一個是有插件,比如說,我安裝了一個可以寫筆記的插件,還有另外一個,就是它有很多平臺的客戶端,在mac或windows,甚至智能手機下我可以安裝一個軟件,然后能夠通過操作文件資源管理器那樣隨意同步文件。
下面是一些截圖:
放文件的主頁面:

放筆記的主頁面:

mac下的客戶端

這節主要還是介紹owncloud的部署,之所以會介紹phpMyAdmin的部署,是為了去研究docker的其他知識點,也能輕易地用phpMyAdmin去連接已經存在的數據庫,不管是不是docker部署的。
#### 2. 部署owncloud
最簡單的部署可能是這樣的:
```
$ docker run -d -p 28080:80 owncloud
```
然后訪問這個應用,界面如下:

不過這樣并沒有多大的用處,因為這樣只能使用sqlite作為數據庫,其實它可以使用mysql或postgresql作為數據庫的。
我們把上一篇的知識點結合起來,最終用docker-compose來部署,寫了一個部署文件:
```
version: '2'
services:
owncloud:
restart: always
image: owncloud
ports:
- 18080:80
volumes:
- /home/hfpp2012/owncloud/html:/var/www/html:Z
depends_on:
- db
dns:
- 10.202.72.118
- 10.202.72.116
- 8.8.8.8
db:
restart: always
image: mariadb
environment:
- MYSQL_ROOT_PASSWORD=my-secret-pw
- MYSQL_DATABASE=owncloud_pro
volumes:
- /home/hfpp2012/owncloud/datadir:/var/lib/mysql
```
`volumes`是掛載數據卷,這個上篇文章也說過,至于dns是為了讓owncloud裝插件的時候不報超時的錯誤。
重點來看的是`depends_on`,這個跟上篇文章所提的link是對應的。
整個意思是說這樣的:這個`compose`文件包含兩個服務,主要是owncloud這個服務,它又依賴于下面的db服務。也就是說這個owncloud服務可以去連接這個db數據庫服務。因為這個owncloud服務是需要連接數據庫的,必須要有一個數據庫服務,要么是外部的,要么是內部,這里用docker開啟了db服務,供owncloud來連接。
運行`docker-compose up`把這個服務跑起來。
**注意,測試的時候,建議啟動前,把兩個鏡像卷的內容清一下**
```
$ rm -rf /home/hfpp2012/owncloud/html
$ rm -rf /home/hfpp2012/owncloud/datadir
```
啟動起來后,不要再選擇默認的sqlite數據庫,我們要選擇mysql數據庫,如下所示,填上必要的信息:

至于最上面的管理員賬號,你自己指定賬號名和密碼就可以了。
下面的連接數據庫的配置要參照`docker-compose.yml`文件中的db部分,用戶名是`root`,密碼是`my-secret-pw`,數據庫是`owncloud_pro`,最重要的是**數據庫主機**這部分,這部分應該填寫ip地址或域名的,不過這里只要填寫`db`就可以了,它是一個別名,因為配置中`owncloud`中有一個項是`depends_on`,它代表能夠連接到db那個容器上。
這樣點擊`創建完成`就能連接好數據庫,整個應用也能跑起來,如下圖所示:

#### 3. 換別的數據庫postgresql
owncloud能正常跑起來,也能正常使用了,不過這里要介紹一下,如果不用mysql數據庫呢,我要用postgresql,也是可以的。
把compose配置文件中的`db`那部分換一下,如下:
```
version: '2'
services:
owncloud:
restart: always
image: owncloud
ports:
- 18080:80
volumes:
- /home/ubuntu/owncloud/html:/var/www/html:Z
depends_on:
- postgresql
dns:
- 8.8.8.8
- 10.0.2.3
postgresql:
restart: always
image: sameersbn/postgresql:9.5-4
volumes:
- /home/ubuntu/owncloud/postgresql:/var/lib/postgresql:Z
environment:
- DB_USER=gitlab
- DB_PASS=password
- DB_NAME=gitlabhq_production
```
注意,此時,在owncloud安裝頁面中的`數據庫主機`就要填成`postgresql`了。如下圖所示:

按照之前的步驟,最后也是能正常跑起owncloud的。
#### 4. 使用phpmyadmin來連接mysql數據庫
首先,我們不來連接我們之前建立的mysql服務,而是先新建一個mysql服務的容器,然后來連接。
##### 4.1 先跑起來
```
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql
```
然后使用新建一個連接此mysql容器的phpmyadmin的容器:
```
$ docker run --name myadmin -d --link some-mysql:db -p 8080:80 phpmyadmin/phpmyadmin
```
打開8080端口,界面如下圖所示:

不用填寫主機,因為已經用了連接器(--link)db那個別名,用了這個別名,就會導入一些變量給myadmin這個實例,而這些變量的值,又是由`some-mysql`這個容器傳過來的,例如`some-mysql`這個容器的ip地址,端口等。關于這部分的詳細內容可以查看上一篇文章。
你可以試下把`db`那個名稱改一下,換成別的,你會發現會用不了的,因為`myadmin`這個容器已經找不到對應的`some-mysql`容器的ip地址了。
##### 4.2 使用--net參數
使用phpmyadmin的重點不是去連接一個自己的新建的mysql服務器,這樣沒有意義,而是要連接我們目前存在于系統上的,且是用docker-compose部署的。
現在我們就來連接之前使用docker-compose部署owncloud時創建的mysql容器。
按照之前的經驗,你可以會先找mysql容器的名稱,然后把它link起來。
```
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1a069dfd65c owncloud "/entrypoint.sh ap..." 18 seconds ago Up 17 seconds 0.0.0.0:18080->80/tcp owncloud_owncloud_1
8ce43555ef6f mariadb "docker-entrypoint..." 18 seconds ago Up 18 seconds 3306/tcp owncloud_db_1
```
可見,容器名稱為`owncloud_db_1`。
于是我們把phpmyadmin容器啟動起來。
```
$ b3f23a98d638cd2d3a416f4692a77f56541cff44bc9c54527e9df858c348eb26
docker: Error response from daemon: Cannot link to /owncloud_db_1, as it does not belong to the default network.
```
出錯了,意思是說不能連接到owncloud\_db\_1,網絡不對。
確實是,之前運行owncloud容器的時候,如果你有留意到的話,它會先創建一個網絡:
```
Creating network "owncloud_default" with the default driver
Creating owncloud_db_1
Creating owncloud_owncloud_1
Attaching to owncloud_db_1, owncloud_owncloud_1
...
```
我們使用`docker network ls`命令查看一下網絡的情況。
```
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
80b102ef3785 bridge bridge local
925fbce49cb8 host host local
3cc70e86c6eb none null local
29f2f9c181ea owncloud_default bridge local
53afc10ba142 root_default bridge local
```
有一個適配器是由owncloud創建的,名為`owncloud_default`。我們把它利用起來。
我們在運行phpmyadmin容器的時候,加入一個參數`--net`。
```
$ docker run --name myadmin -d --link owncloud_db_1:db -p 8080:80 --net owncloud_default phpmyadmin/phpmyadmin
```
現在就可以運行起來了,記住運行前,要把以前的myadmin容器進程stop和kill掉。
##### 4.3 使用docker-compose部署
這樣用命令來敲,我不太喜歡,因為難記,我喜歡把它寫到一個docker-compose.yml文件中,然后一條命令就可以跑起來。
```
version: '2'
services:
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: phpmyadmin
network_mode: "owncloud_default"
environment:
- PMA_ARBITRARY=1
restart: always
ports:
- 8080:80
volumes:
- /sessions
```
在compose配置文件中使用`network_mode`代替`--net`參數。
`PMA_ARBITRARY=1`這個是phpmyadmin使用的變量,意思就是說,可以自己輸入ip地址。如下圖所示:

`服務器`那里要輸入`db`。
現在可以成功地用docker來運行phpmyadmin了,并且可以連接到自己需要的數據庫進行查看。
至于部署到線上環境,可以參考下面這兩篇文章,使用nginx反向代理過去。
- [使用compose部署gitlab應用(八)](https://www.rails365.net/articles/shi-yong-compose-bu-shu-gitlab-ying-yong-ba)
- [使用compose部署Rocket.Chat應用(九)](https://www.rails365.net/articles/shi-yong-compose-bu-shu-rocket-chat-ying-yong)
完結。
下一篇:[讓 php-fpm 跑的 owncloud 應用 docker 化 (十二)](https://www.rails365.net/articles/php-fpm-owncloud-ying-yong-docker-shi-er-hua-shi-er)
- 0. 介紹
- 1. 安裝 docker
- 2. docker 的鏡像和鏡像源加速
- 3. docker 的容器
- 4. 理解 docker 鏡像的層疊結構
- 5. 使用 Dockerfile 文件
- 6. docker 的數據卷
- 7. Docker Compose 的介紹與安裝
- 8. 使用 compose 部署 GitLab 應用
- 9. 使用 compose 部署 Rocket.Chat 應用
- 10. docker 部署深入理解
- 11. 部署 owncloud 與 phpMyAdmin
- 12. 讓 php-fpm 跑的 owncloud 應用 docker 化
- 13. docker 遷移 GitLab 項目