[過程記錄] Mac 上用 Docker 起 apache server

需求: 用 Docker 起 Apache Server,並且將 local (本機) 的 web 資料夾 Mount 到 Docker Container 的 web 資料夾。

安裝 Docker Toolbox
首先要安裝 Docker Toolbox,(昨天發現我還停留在 boot2docker...),進到官網,按下載,因為我是 Mac 所以我選左邊 Download~


下載後接著打開 dmg,接著就是一直 繼續 就對了!



Docker Toolbox 檔案還不小,如果有需要... 記得空間要足夠哦!



安裝的倒數第二個步驟,他會問你要不要直接開始用 Docker 呢?
暫時還不急,這兩個 icon 都會幫你放到桌面,你可以先繼續,離開這個安裝畫面。



我會用 Docker Quickstart Terminal,安裝好之後去找 Docker Quick Terminal。


剛開始開 Quickstart 時,會跑一陣子,因為 Docker 要幫你起 VM (virtual Machine),然後你可以直接透過這個 Terminal 操作 Docker 指令 (quickstart 主要是幫你穿過 vm 的感覺 XD)。

啟動完這個 Docker-Machine 之後,會配你一個 ip,這個 ip 如果忘記也沒關係,透過 docker 指令也能查到。



安裝完 Docker 之後,接下來為了方便我裝一個已經寫好 apache 安裝指令的 image,我決定去 Docker Hub 找找看有沒有現成的。

Docker Hub 有很多別人寫好的 script (嚴格來說是 Dockerfile),幫你準備好一個環境的安裝指令等等,Docker Hub 很像 Docker 版的 github,總之是很多 images 的聚集地,包含一些官方機構, 一般 member 寫的 images 都可以推到 hub 上 (推上去叫做 Repository ),供別人下載 (pull) 使用 。


右上角的 search,我就輸入『 apache php』,查詢結果

Hub 會撈出所有相關的 image,你可以從 Star 星星數量或是 pull 下載數量去看個 Repositories 的熱門程度,但是熱門程度有時候不是你選擇的依據,你還是可以點進去看看個別的說明,以及 Dockerfile 怎麼寫,挑一個最接近你想要的環境。


最後我選擇使用 nimmis/apache-php5 這個 Repo:
通常要看一下 info,可能會教你怎麼使用這個 images 的資訊,另外你也看看 Dockerfile 的內容,看這個 image 到底裝了什麼。



裝好 Docker Machine, 找到適合的 Docker Images 之後,接下來就可以下載這個 image 來用了,Docker Hub 畫面都有個  『Docker Pull Command』,我透過 『docker pull nimmis/apache-php5』 來下載這個 images。

不要離開你剛剛打開的 Docker Machine,如果關掉就回桌面再把它打開一次...

安裝 nimmis/apache-php5

使用指令 docker pull 
docker pull nimmis/apache-php5


確認安裝 images

使用指令 docker images 列出所有的 images:
docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
nimmis/apache-php5   latest              00607556d539        5 days ago          444.3 MB
列出的資訊會看到你裝的 images, 如果你裝很多個,這裡就會很多列


用這個 Images 去 Run 的 Container
(container, images 的概念我先不寫了... 寫不完,也還不是弄的很懂... 下面有寫錯的話請跟我說一下,感謝!)

總之 images 歸 images,你要拿這個 images 做事情,要先準備一個 container 來跑,你把 images 當作開機光碟片,container 就當作機器,一個 images 可以拿來開好幾個 container. 不衝突.

接下來我要做的事情就是把我的本機的 web 資料夾 Mount 到 container 裡面 apache 的 web 目錄下,而且我希望我用 8888 這個 port 去對應到 container 裡面的 80 port (因為 80 是 apache 對外...<- 雖然不一定但是主要看 Dockerfile 或是 Repo 有沒有額外說明,只是"通常是"。)

  • -p 是 port 的對應,8888 會對應到 /Users/win/project/RPOJECTNAME 的內容,而 80 port 會指到 docker 裡面的 80 port。 (註: /Users/win/project/RPOJECTNAME 只是我的網站目錄而已),而最後我會用 docker-machine 起來的 ip 對應到 8888 port 去看我 local/Users/win/project/RPOJECTNAME 資料夾的內容。
  • docker run - Run a container
  • -p - Bind ports.
docker run -d -p 8888:80 -v /Users/win/project/RPOJECTNAME:/var/www/html nimmis/apache-php5
(其實這段指令如果你不了解其中參數的意義,DockerHub 的說明也有寫到怎麼起一個 container)


建立完 container 之後,要查看是否真的有建立起來
1. 檢查 container 存在2. 檢查對應的 port 是否有對應到

查詢正在 run 的 container

$ docker ps
如果你查正在 run 的 container 找不到,表示你剛剛的指令可能有問題,因為他根本沒有 work.
Example: (最好要最照一下 ports 的部分是不是對的)
CONTAINER ID        IMAGE                COMMAND             CREATED             STATUS              PORTS                  NAMES
4f32e5d10afd        nimmis/apache-php5   "/my_init"          22 minutes ago      Up 22 minutes       0.0.0.0:8888->80/tcp   distracted_bhabha

另外,如果你想查詢所有的 container (這個會列出包含沒有正在 run 的 container)

$ docker ps -a


造訪你的頁面

1. 首先要知道 docker machine 提供的 ip 是多少

(1) docker-machine ls 可以看你有幾個 docker machine (<-很廢話我知道 Orz..)
$ docker-machine ls

NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER    ERRORS
default   *        virtualbox   Running   tcp://192.168.99.100:2376           v1.10.2
(2) docker-machine ip 查詢 docker machine 的 ip
$ docker-machine ip
192.168.99.100
(3) 如果有 curl 的話,可以爬爬看你的頁面 (8888 是我前面 run images 指定對照的 port)
$ curl $(docker-machine ip):8888
hello!!% 

(Hello!!) 是因為我只有一頁 php 裡面 echo "Hello!"。

不用 curl 的話也可以直接開 browser,以我的 ip 來說,就是 192.168.99.100:8888 可以看到我的首頁。

以上足以完成 mount 到一個 apache 的事情,下面介紹都是額外的部份。

另外

移除 images

執行 docker images 列出所有 images 時,複製 Repository 的單字或是 IMAGE ID
docker rmi [Repository/IMAGE ID]

移除 comtainer

列出所有 containers (docker ps -a) 之後,記住你要刪掉的 container id:
docker rm [container ID]


SSH 到 Container

如果要改 apache 的設定,可能就需要連進去 container 去修改 httpd.conf

首先你要知道你的 container ID,一樣利用 docker ps -a 列出 container,複製你的 container ID,然後透過 
docker exec -ti [containerID] /bin/bash

連上後你就會發現你的 user 已經變成 root@containerID
## 這個是進去這個 containers ##
docker ps -a
CONTAINER ID        IMAGE                COMMAND             CREATED             STATUS              PORTS                  NAMES
4f32e5d10afd        nimmis/apache-php5   "/my_init"          About an hour ago   Up About an hour    0.0.0.0:8888->80/tcp   distracted_bhabha

$ docker exec -ti 4f32e5d10afd /bin/bash

// 進到 apache2 資料夾
root@4f32e5d10afd:~# cd /etc/apache2/

若有修改 container 的內容,則可以儲存修改的狀態

docker commit [container ID] [新的 image name]

sha256:107af45a0f647a1c6857a82a100957553c213f98f4d4fda8b5b8a63dcefc5836
commit 後會拿到 sha,然後只要列出 images 就會看到你剛剛的 commit
然後用 docker images 看,就可以看到剛剛儲存的 images:
$ docker images
REPOSITORY           TAG                 IMAGE ID            CREATED              SIZE
新的 image name       latest              107af45a0f64        About a minute ago   445.4 MB

打成 tar

  • docker save 新的 image name > [tar的檔名].tar


另外,tar 打起來會非常的肥哦,如果是自己想用,不進 git 的話倒是無所謂 !! 如果會的話還是建議寫 Dockerfile 啦!



參考:




留言

這個網誌中的熱門文章

[Android] 筆記 手機上測試自己的 APP

解決fatal: Not a git repository (or any of the parent directories): .git錯誤

[Android 筆記] 設定 ImageView 的圖檔來源