在公有雲端平台部署Docker
最后更新于:2022-04-01 23:04:37
# 在公有雲端平台上安裝Docker
目前CoreOS中的Docker支援大部分的雲端平台,你可以到[http://alpha.release.core-os.net/amd64-usr/current/查看所有可佈署的VM檔案,主要的有:](http://alpha.release.core-os.net/amd64-usr/current/查看所有可佈署的VM檔案,主要的有:)
- 大部分的Hypervisor(VMware, VirtualBox, Xen, QEMU, Hyper-V等)
- Microsoft Azure
- BrightBox
- CloudSigma
- CloudStack
- DigitalOcean
- exoScale
- OpenStack/RackSpace
- Vagrant
- Amazon
當然大部分的IDC也可部署,如筆者自己使用的GoDaddy就可在其Ubuntu 14.04的VPS中直接安裝Docker使用,但安裝時要注意使用VPS的Linux版本,再照著不同Linux進行安裝。
有關常見雲端平台的安裝,我們會在本書稍後關於Docker叢集部署的章節有詳細說明。
';
生產環境vSphere CoreOS
最后更新于:2022-04-01 23:04:34
# 生產環境vSphere部署CoreOS
如果你要將CoreOS部署到vSphere上,由於vSphere需要對其上的每一個VM都進行嚴格的控管,因此所有在vSphere下的VM都必須安裝VMware Tools。如此一來,你就必須下載已經預先安裝好VMware Tools的CoreOS的VMware Image。
下載網址為
[coreos_production_vmware_image.vmdk.bz2](http://alpha.release.core-os.net/amd64-usr/current/coreos_production_vmware_image.vmdk.bz2)(要先解壓)
[coreos_production_vmware.vmx](http://alpha.release.core-os.net/amd64-usr/current/coreos_production_vmware.vmx)
下載回來有兩個檔案,一個是`vmx`,另一個則是壓縮後的`vmdk`。使用前必須先將這個VM轉換成OVF格式,Windows/Mac下使用VMware Workstation/Fusion內建程式,Linux下則可以至VMware的官網下載OVF Tool來轉換,下載網址為
[https://developercenter.vmware.com/web/dp/tool/ovf/3.5.2](https://developercenter.vmware.com/web/dp/tool/ovf/3.5.2)
此版本的CoreOS雖預先安裝了vSphere 的VMware Tools,但預設沒有使用者帳號密碼,如果要使用,必須透過雲端工具或設定開機參數,下面就是完整的部署步驟。
_預先安裝了VMware Tools才能在開機後回報IP_

### 在vSphere下部署雲端版的CoreOS
1. 將下載回來的`bz2`檔案解壓,內容是一個`vmdk`檔案。

1. 使用VMware Workstation打開這個`vmx`。
1. 選擇`File/Export to OVF`,並且儲存在確定位置。

1. 進入vSphere Client視窗,選擇`Deploy OVF Template`。

1. 此時會出現匯入視窗,一直按「下一步」即可,最後會在vSphere的列表中出現該VM,直接啟動即可。



1. 可以看到這個VM已經預設安裝好VMware Tools了。

1. 啟動這個VM,並且快速進入主控介面。

1. 在還沒完全啟動前,請快速按下`e`鍵,直到啟動選項出現為止。
1. 在圖中的位置輸入`coreos.autologin`,之後按下F10重新啟動,這次就會直接進入桌面,不需要帳號密碼。


1. 在這個VMware中輸入`sudo passwd core`來建立帳號密碼,下次才可正常登入,你也可以輸入`sudo passwd root`來建立root的帳號密碼方便操作docker。

1. 可以從`docker version`或`docker info`查看。

1. 一樣輸入`docker run -d --name web -p 8080:80 joshhu/webdemo`來查看安裝是否成功。


';
更換CoreOS不安全的ssh key
最后更新于:2022-04-01 23:04:32
# 更換CoreOS不安全的ssh key
`coreos_production_vmware_insecure`的登入方式使用公開的ssh key,任何一個下載同一份`zip`檔案的人,都可以利用相同的ssh key登入,十分危險。本小節說明如何把這不安全的ssh key刪除掉,並換成使用者自己安全的ssh key。使用Ubuntu Linux作為ssh的客戶端示範。
### 換成安全的ssh key
1. 先確定你擁有自己的ssh key,輸入`ls ~/.ssh -al`,要有`id_rsa.pub`這個檔案。

1. 將自己的ssh key加入CoreOS主機中安全ssh key的清單中。CoreOS中有一個更新ssh key的專門script檔`update-ssh-keys`,用來把自己安全的ssh key更新到CoreOS的主機ssh key允許清單中。假如CoreOS的 IP是192.168.1.109,則輸入:`cat ~/.ssh/id_rsa.pub | ssh core@192.168.1.109 -i insecure_ssh_key update-ssh-keys -a safeuser`
1. 完成之後,直接進入CoreOS,不需要舊的`insecure_ssh_key`了。輸入:`ssh core@192.168.1.109`。

1. 進入CoreOS之後查看目前的key,包括了舊有不安全的,和剛才加入安全的Key。

1. 把舊的不安全的key移除,輸入`update-ssh-keys -D coreos-cloudinit`即可。

1. 此時用原來舊的KEY已經進不去了。

1. 如果你的CoreOS在重新開機後IP變了,你可能會進不去了,會出現如下的畫面
~~~
joshhu@ubuntu:~$ ssh core@192.168.1.109
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is
5e:a8:6e:7f:36:21:8c:1d:24:c7:37:0d:df:96:44:ae.
Please contact your system administrator.
Add correct host key in /home/joshhu/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /home/joshhu/.ssh/known_hosts:1
remove with: ssh-keygen -f "/home/joshhu/.ssh/known_hosts" -R 192.168.1.109
ED25519 host key for 192.168.1.109 has changed and you have requested strict checking.
Host key verification failed.
~~~
此時只要輸入`ssh-keygen -f "/home/joshhu/.ssh/known_hosts" -R 192.168.1.109`來更新ssh key,就可以正常登入了。
';
建立自動登入的CoreOS
最后更新于:2022-04-01 23:04:30
# 建立自動登入的CoreOS
本小節將說明使用SSH的Private key進行登入的CoreOS VM,其中已經安裝好最新版本的Docker了。
### 啟動CoreOS的VM並獲得IP
1. 前往[http://alpha.release.core-os.net/amd64-usr/current/index.html,](http://alpha.release.core-os.net/amd64-usr/current/index.html,)並且下載[coreos_production_vmware_insecure.zip](http://alpha.release.core-os.net/amd64-usr/current/coreos_production_vmware_insecure.zip)。
1. 下載回來後解壓可以看到標準VMware格式的`vmx`及`vmdk`,及`insecure_ssh_key`,放入一個固定的地方,如`D:\VM\Coreos`中。

1. 直接使用VMware Workstation開啟這個虛擬機,並且將此VM啟動。
1. 進入登入界面時,直接按下enter,就會出現IP位置。

### Windows下使用puttygen轉換insecure_ssh_key
Linux/Mac客戶端直接進入終端命令列操作ssh沒問題,這邊特別嘉惠Windows下的使用者,看如何PieTTY套用ssh key。先下載puttygen.exe吧
[先下載Windows專用的puttygen.exe](http://the.earth.li/~sgtatham/putty/latest/x86/puttygen.exe)
1. 進入puttygen的介面,選擇`Load`。

1. 選擇CoreOS資料夾的`insecure_ssh_key`。

1. 載入成功後,按下`Save private key`,將這個key輸出到`\CoreOS\`的同目錄下,出現圖中的視窗時直接按Enter,檔名自己取即可。



1. 此時可以看到這個CoreOS專用的Private key已經建立了。


### 使用Private key無帳號密碼ssh登入CoreOS
1. 首先進入PuTTY或PieTTY的介面,選擇`PuTTY`模式。

1. 輸入剛才開機CoreOS的IP,並且將這個連線存檔為CoreOS,最方便的還是使用標準ssh格式,如`core@192.168.1.108`,將使用者名稱放在前面。

1. 選擇`SSH/Auth`的地方,將剛才產生的key選過來。


1. 選擇`Session`,並且別忘了按下`Save`。


1. 此時按下`Open`,就可以直接ssh入這個CoreOS而不需要帳號密碼了。第一次連線時會出現圖中的視窗,直接按`Yes`。

1. `core`這個使用者已經是root權限,因此可以直接使用,不需要`sudo`輸。入`docker version`,可以看到docker的版本,而輸入`docker run -d --name web -p 8080:80 joshhu/webdmo`,可以直接執行。

1. 如果看到圖中的網頁畫面,表示這個CoreOS也部署完成了。


1. 如果你也想將這個VM部署到vSphere下,請參考下一小節有關轉換到OVF的步驟。
### Mac/Linux下直接進入
在Mac/Linux的終端機視窗中,與`insecure_ssh_key`的同目錄下,直接輸入`ssh -i insecure_ssh_key core@`
如`ssh -i insecure_ssh_key core@192.168.1.109`

### CoreOS的docker scripts加入
CoreOS VM中的Docker,由於所有使用者的設定檔都連結到`/usr/share/skel/.bashrc`,要先將core這個使用者.bashrc的連結移動到獨立自主的.bashrc,再執行上面的指令,先用core這個使用者名稱ssh連入這個VM,再輸入下列指令:
~~~
cp ~/.bashrc ~/.bashrc.my
rm ~/.bashrc
mv ~/.bashrc.my ~/.bashrc
wget -P ~ https://github.com/joshhu/docker/raw/master/docker_scripts/.bashrc_docker;
echo "[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker" >> ~/.bashrc; source ~/.bashrc;
wget -P ~ https://github.com/joshhu/docker/raw/master/docker_scripts/showmem.coreos;
mv ~/showmem.coreos ~/showmem;
chmod +x ~/showmem;
~~~

';
CoreOS簡介
最后更新于:2022-04-01 23:04:27
# CoreOS簡介
CoreOS是一個叢集專用的Linux,在Docker的初期,也是和Docker合作最密切的Linux版本,但隨著Docker的商業化及日漸走紅,CoreOS也漸行漸遠。雖然CoreOS也提供了自己格式的Container Rocket,但目前成熟度還有待加強。
_CoresOS支援非常多安裝方式,包括常見的VM_

儘管如此,對Docker叢集支援最好的Linux仍然還是CoreOS,CoreOS也提供了VMware的VM方便部署Docker。針對同一個版本編號的CoreOS有兩個不同應用的VM,分別為:
1. **針對測試用的(如VMware Workstation)VM**:使用ssh無帳號密碼登入,**主要用於本機使用**,其檔案名稱為`coreos_production_vmware_insecure.zip`。

1. **針對生產環境用的(vSphere ESXi)VM**,有預先安裝VMware Tools,其中沒有建立任何使用者帳號及密碼,**主要用於叢集使用**,其檔案名稱為`coreos_production_vmware_image.vmdk.bz2`的`vmdk`檔案,以及`coreos_production_vmware.vmx`的虛擬機檔案。

這兩個CoreOS的VM在使用上不儘相同,從名字就可看出不同。`coreos_production_vmware_insecure`使用公開的ssh key,因此拿來部署生產環境相當危險,在正式使用前必須更換ssh key。
`coreos_production_vmware`因為安全性較佳,並且有預設安裝`open-vm-tools`,適合用在雲端及生產環境,但由於沒有預設使用者帳號密碼,因此使用上必須經過設定。設定方法有:
- 建立帳號密碼
- 使用雲端`config-drive`方式
本小節會介紹第一種方式,第二種方式則留在本書後半部有關雲端部署Docker時再細談。
';
使用雲端專用CoreOS
最后更新于:2022-04-01 23:04:25
# 使用雲端專用CoreOS
在雲端上要執行Docker主要的目的之一就是為了Cluster。Docker本身可以和不同的私有雲平台整合,如vSphere 或是OpenStack。但在這種私有雲平台上,使用Ubuntu就不太方便了。前面我們曾提到最適合Cluter用的Linux版本為CoreOS,這一節我們就直接從CoreOS的網站下載已經安裝好的Docker VM並部署到vSphere中。

';
讓Docker更好用的工具
最后更新于:2022-04-01 23:04:23
# 讓Docker更好用的工具
本節介紹讓Docker的操作更方便的軟體,包括Windows下的PieTTY及一些Linux下的Docker專用scripts檔案。
### 方便Docker操作的小工具
- [PieTTY](http://ntu.csie.org/~piaip/pietty/archive/pietty0400b14.zip)(Windows):Windows下的SSH軟體,以PuTTY為基礎但更好用。
- [WinSCP](http://winscp.net/download/winscp570.zip)(Windows):Windows和Linux之間傳送檔案的工具。
- Screen(Linux Terminal):多個登入TTY之間的切換工具。
### 進入Docker Container的好用scripts
Docker的Container被看成虛擬機的一種,我們常要進入Docker建立的VM中進行作業。此外也常需獲得執行中Container的資訊。雖然Docker提供了`docker inspect`,但需要配合正規表示法以及json的文字處理。為了方便,筆者把這些使用`docker inspect`的語法簡化成一些指令,分別為:
- denter:進入容器中,如:`denter web`,即會直接進入這個容器內。
- dip:取得執行容器的IP,如:`dip web`。
- dpid:取得容器在宿主Linux下的pid,如`dpid web`,取得該容器的pid。
讀者可以下載這些指令,然後導入Linux下使用者的.bashrc設定檔。**注意,不同的Linux使用者都需要重新執行一次這兩行指令。**執行完畢之後先用`exit`登出系統,然後再登入就可以使用了。輸入的指令如下**(請以root身份執行)**:
~~~
$ wget -P ~ https://github.com/joshhu/docker/raw/master/docker_scripts/.bashrc_docker;
$ echo "[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker" >> ~/.bashrc; source ~/.bashrc
$ exit
~~~

另一個工具則是顯示目前執行中的Container,佔用了多少系統記憶體,以及一開始宣告多少記憶體的值,這個工具稱之為`showmem`。安裝方法一樣簡單,**請以root身份執行,且此script只適用於Ubuntu**:
~~~
$ wget -P ~ https://github.com/joshhu/docker/raw/master/docker_scripts/showmem
$ chmod +x ~/showmem
$ mv ~/showmem /usr/bin
$ showmem
~~~

';
手動安裝Docker
最后更新于:2022-04-01 23:04:21
# 手動安裝Docker
如果你已經有了現成使用中的Linux,不想在虛擬機中安裝Docker,視使用的Linux distro,Docker的安裝方法也不同。在Docker的官網上有列出所有Linux下的安裝指南,這邊就不多作說明,但官網指出,Docker最適合的環境就是Ubuntu,安裝起來也是最簡單的。讀者這邊要確定的,就是**不要**使用傳統的`apt-get install docker.io`來安裝,因為這樣就無法獲得最新的Docker版本了。
_[這邊有完整的Docker安裝](https://docs.docker.com/installation/),幾乎Linux全包了_

注意 - 本書預設使用root帳號進行操作
本書的操作均以root帳號為基礎,因此別忘了啟用電腦的root帳號,如果你的Ubuntu還沒有root帳號,請使用有sudo權限的帳號,在Linux的終端機中輸入:`sudo passwd root`,之後會要求你輸入目前使用帳號的密碼,以及指定給root的密碼(兩次)。輸入完之後,你可以輸入`su`,之後輸入root的密碼後,就可以進入root身份了。
### 安裝Docker
1. 先更新Ubuntu,輸入`apt-get update`。
1. 再輸入`apt-get upgrade`。
1. 在Ubuntu的終端機視窗中,輸入
~~~
curl -sSL https://get.docker.com/ubuntu/ | sudo sh
~~~
1. 如果沒有錯誤訊息,在安裝完畢之後,輸入`docker version`,應就會出現下圖的畫面。
接下來我們就執行幾個Docker的指令來驗證Docker的安裝成功。以下的指令讀者目前還不需要了解其意義,本書稍後都會有完整的解釋。
### 檢驗Docker是否安裝成功
1. 輸入`docker info`則會出現下圖的系統資訊畫面,包括CPU數,記憶體大小以及目前有的docker映像檔數等等。
1. 輸入`ifconfig docker0`則應該出現如圖的畫面,表示Docker的網路部分也安裝成功。
1. 輸入`docker run -d --name web -p 8080:80 joshhu/webdemo`。如果出現了下圖的畫面,表示Docker已經安裝成功了。
';
使用本書所附的VM
最后更新于:2022-04-01 23:04:18
# 使用本書所附的VM
使用Docker最快的方式,就是直接使用本書所建立好的VM,直接到本書的VM下點下載。是一個zip檔。
[本書的Docker VM下載點](https://www.dropbox.com/sh/mbsi3rqfkykgrs3/AACuvW0QZ0Pytiw7bpayOYpsa?dl=1)
### 使用VMware Workstation/Fusion產品開啟
下載`dockerbook.zip`後解壓,會有`dockerbook.vmx`及`dockerbook.vmdk`兩個檔案,如果你使用的是VMware桌面系列的產品(VMware Workstation/Fusion),直接開啟`dockerbook.vmx`即可。以下用Mac OS下的VMware Fusion示範:
1. 開啟這個`dockerbook.vmx`

1. 此時VMware Fusion會要求你將這虛擬機昇級,選擇不要。

1. 這邊選擇`I Copied It`。

1. 其它都是`ok`過了就行。
1. 開啟完成

### 在VirtualBox中使用本書所附的VM安裝Docker
如果你使用的是VirtualBOX,則必須建立一個新的VM,再將下載回來解壓縮的虛擬碟碟的`dockerbook.vmdk`附加成一個VirtualBox的虛擬磁碟,以下為Mac OS下的步驟:
1. 先將本書所附的`dockerbook.vmdk`放到使用者Home目錄下的`VirtualBox VMs/dockerbook`下。

1. 開啟VirtualBox,選擇`new`。

1. 輸入這個VM的名字,作業系統以及種類,如圖所示。

1. 這個VM的記憶體大小,一般我們會給2GB。

1. 這邊要選擇`use an existing virtual hard drive file`,並且選擇剛才的那個`dockerbook.vmdk`,然後按下`Create`。

1. 此時該VM建立完成,可以在VirtualBox的列表中看到。

1. 開啟這台VM,並且可以進入該VM的主控台,進入後,帳號為`docker`,密碼為`dockerbook`,並且輸入`su`取得root權限,密碼也是`dockerbook`。
1. 輸入`docker run -d --name web -p 8080:80 joshhu/webdemo`。

1. 看一下主機的IP:`ifconfig`。
1. 進入瀏覽器,並且輸入`http://192.168.1.113:8080`。出現下圖的畫面表示安裝成功。

注意 - 使用ssh連入較方便
一般我們建立了VM,並不會在Hypervisor的主控台下操作,因為不但不方便,也無法使用複製貼上功能。通常將安裝好Docker的VM開啟後,會使用ssh進入該VM,筆者習慣使用Linux的標準終端視窗,您也可以使用Windows上的PieTTY或Mac本身的終端視窗。

';
在Ubuntu Linux下安裝Docker
最后更新于:2022-04-01 23:04:16
# 在Ubuntu Linux下安裝Docker
時至今日大部分的Linux版本都可正常執行Docker,只要該Linux核心的版本編號夠新。如果你已經習慣於某一個版本的Linux,可以參考該Linux廠商的官方安裝方式,本書的教學示範全部使用Ubuntu Linux。
另外一個對Docker支援較強的Linux即為CoreOS。通常CoreOS本身會發佈VM格式,因此只要到CoreOS的官網下載對應Hypervisor的VM即可使用。本小節就針對這兩個Linux的版本來安裝Docker,另外也會在本章最後一小節列出安裝Docker時常見的問題。
### 注意 –Docker部署在實體伺服器 vs 部署在VM中
本書使用對Docker支援最好的Ubuntu作為主要版本,叢集部署則使用CoreOS。其它版本的Linux當然對Docker的支援也完全沒問題,但除了版本不夠新的問題之外,許多工具(如`nsenter`)也不一定有安裝,不是使用這兩個版本Linux的讀者必須自行安裝這些工具。
###
';
使用標準VM安裝
最后更新于:2022-04-01 23:04:14
# 在Mac OS/Windows中的VM安裝Docker
另一個方法,即循正規安裝,在Mac OS或Windows下先安裝習慣用的Hypervisor,推薦的有:
### 自行在VM中安裝Ubuntu
讀者可以先去下載下列幾個虛擬化的Hypervisor,如:
- VirtualBox(Mac OS/Windows/Linux,**本書推薦**)
- VMware Workstation (Windows/Linux)
- VMware Fusion (Mac OS)
然後再自行安裝或下載Ubuntu Linux ISO檔案,先安裝好Linux,然後再安裝Docker,這個方法彈性大,同時也方便示範後面章節所提的Docker叢集,由於正規方式和在Linux下安裝Docker完全一樣,讀者直接參考Linux的安裝部分即可。
Ubuntu ISO下載:[http://www.ubuntu.com/download/server](http://www.ubuntu.com/download/server)
### 注意 – Hypervisor的選擇,Hosted或是Bare Metal
在本書的示範章節,都會使用Hosted的Hypervisor,這是大部分測試環境最方便使用的。在測試完後需要上生產環境時,才會應用到Bare Metal的企業版Hypervisor,主要是為了快速大量部署,本書稍後會有專門的章節介紹。
';
在Windows下使用boot2docker
最后更新于:2022-04-01 23:04:12
# 在Windows下使用boot2docker
要安裝Windows下的boot2docker,必須確定你的電腦CPU有支援VT-X,但這並不是Docker需要的,而是VirtualBox需要的,可使用CPU-Z來檢查。另外也必須到BIOS中確定VT-X有開啟,如果都OK的話,即可直接安裝。
### 在Windows下安裝boot2docker
1. 先到[https://github.com/boot2docker/windows-installer/releases下載](https://github.com/boot2docker/windows-installer/releases下載) boot2docker的安裝檔docker-install.exe。
1. 下載回來後直接執行,不更改預設值按「Next」即可,這邊就略過。
1. 在安裝完畢後,桌面上會出現一個boot2docker Start的圖示,直接點擊執行。
1. 此時會出現如下圖的畫面,這時是將精簡的Linux VM載入記憶體,如果中間有任何詢問視窗,都選擇「Y」即可。
1. 當出現下圖的畫面,表示載入成功。
1. 輸入`docker run busybox echo Hello Docker`,如果出現下圖的畫面時,表示安裝成功。
### 如果無法執行
在某些64位元的Windows 7/8/10系統下,boot2docker會一直無法啟動VirtualBox,此時你只要去VirtualBox的官方安裝重新安裝最新版的VirtualBox後即可。
另外如果按下boot2docker start圖示一直會跳出記事本或是無法進去,可以用下列方便解決。
1. 從Windows的檔案總管進入boot2docker的安裝目錄,預設為`C:\Program Files\Boot2Docker for Windows\`。
1. 在該目錄下按滑鼠右鍵,選擇`Git bash`。
1. 出現bash視窗時,輸入`./start.sh`即可。
本書的重點不在boot2docker,也不推薦使用,如果一定要在Windows/Mac下使用Docker,還是安裝一個Hypervisor,再下載本書專用的VM,或自行安裝Ubuntu,再正式安裝Docker比較方便。
';
Mac OS下的boot2docker
最后更新于:2022-04-01 23:04:09
# Mac OS下的boot2docker
由於Mac OS是一個類UNIX的封閉系統,因此在操作上雖然很像Linux,但核心是使用蘋果自己的系統。要使用Docker也必須使用boot2docker的Mac版,操作較Windows版多幾個步驟,我們就來看看。
### 安裝boot2docker
Mac OS下的boot2docker安裝和Windows差不多,我們就來看看。
1. 確定Mac OS的版本在10.6以上。
1. 到[https://github.com/boot2docker/osx-installer/releases/tag/v1.5.0下載Boot2Docker-1.5.0.pkg。](https://github.com/boot2docker/osx-installer/releases/tag/v1.5.0下載Boot2Docker-1.5.0.pkg。)
1. 下載後直接執行該檔案,此時會將Boot2Docker放到Mac OS的Applications的資料夾下,而將docker及boot2docker放到`/usr/local/bin`的資料夾下(和Linux一樣)。
1. 照著一般Mac OS的程式安裝即可(其實就是安裝VirtualBox,一直Next即可)。
1. 安裝完畢後,會在「應用程式」的資料夾出現boot2docker的圖示。
1. 直接執行,第一次會出現如圖的視窗,要等一下。
1. 跑完之後,輸入`docker run -d --name web -p 8080:80 joshhu/webdemo`,出現下圖的畫面時表示安裝成功。
1. 但這個服務成功了嗎?照道理來說,應該是這台Mac的IP位址的8080埠對應到Docker中Container的80埠,我們試著輸入[http://localhost:8080/,應該可以看到服務,但是並沒有。](http://localhost:8080/,應該可以看到服務,但是並沒有。)
### boot2docker和標準docker的差別
在一般的Linux下使用Docker時,docker daemon是運作在該Linux的主機上,但是在boot2docker中,docker daemon是運作在Windows/Mac OS主機下的一個VM中,因此無法直接使用本機的資源(如IP位址、磁碟對應等)。
_這是標準Linux_

_這是boot2docker_

舉例來說,使用Linux主機上的Docker時,你可以設定該Linux主機的IP位置和Docker Container的對應,但在boot2docker中,Windows/Mac OS主機的IP位置是完全無法對應到Docker的Container中,只能讓VirtualBox VM的IP位置和Docker的Container對應。
### 使用Mac OS在VirtualBox網段的IP才行
1. 在正常的Linux Docker中,可以直接存取主機的IP以及對應的埠,就可以看到Apache啟動。
1. 但在Mac OS的boot2docker之下無法看到網頁,這是因為boot2docker是在一個VirtualBox的VM中執行的,只能先取得Mac的VirtualBox NAT IP。輸入`boot2docker ip`獲得Container執行VM的主機IP。
1. 此時再在Mac OS的瀏覽器中輸入剛才獲得的VM IP即對應埠,才能看到測試網站的產生。
Boot2docker只是把一個VirtualBox的VM隱藏在記憶體中,因此並無法完全發揮正常Docker的功能,本書不推薦。另外有關Docker的IP位址對應在後面章節有詳細的說明。
';
boot2docker簡介
最后更新于:2022-04-01 23:04:07
# boot2docker簡介
Boot2docker是一個專門在Mac及Windows下使用Docker的套件,包括了:
- 一個VirtualBox程式
- VirtualBox格式的極小Linux VM
- 位於該VM中的Docker程式
- Boot2Docker管理工具。
除了Docker本身之外,boot2docker元件中的VirtualBox VM非常小,完全不佔磁碟空間只存在記憶體中,大小僅為24MB,開機時間只要5秒。此外,Boot2Docker管理工具本身就是一個輕量級的Linux VM,專門用來在Mac OS中執行Docker Daemon。
';
在Mac及Windows下安裝Docker
最后更新于:2022-04-01 23:04:05
# 在Mac及Windows下安裝Docker
Docker所產生出來的Container只能是Linux,因此Docker**只能**運行/安裝在**純Linux環境**下,Docker支援絕大部分的Linux,只要該Linux的核心版本編號夠新。
**為了方便起見,本書一律使用Docker指定的Ubuntu 14.04以後的Linux,以及CoreOS,這兩個是原生就支援Docker的Linux版本。**
Mac OS及Windows下則無法直接原生使用Docker,必須使用Linux的VM才行。使用VM的方法分為兩種,一種是直接自行架設VM(如VMware Workstation/Fusion、VirtualBox),再自安裝Linux的VM,然然後再在這個VM中安裝Docker。
另一個使用VM的方式,則是使用官方的`boot2docker`,雖然也是用VM+Linux的方式,但會一次會幫你完成上面的所有動作,並且使用類似Windows Shell指令及Mac OS的終端視窗來操作。
### 注意 –Docker部署在實體伺服器 vs 部署在VM中
雖然本書不斷強調原生硬體的效能遠遠超過VM的模擬硬體效能,將Docker直接安裝在實體伺服器的Linux中,一定比先安裝VM Linux,再在此VM中執行Docker要快上許多。但企業考量的重點除了效能之外 更有部署的便利性、現存系統的穩定度、整個系統的HA、FT、DRS高可用性等重點,筆書建議還是將Docker部署在VM中,犧牲一點點效能,換來的是更方便的部署、更穩定的環境以及更彈性的設定,這是絕對值得的。
';
安裝前說明
最后更新于:2022-04-01 23:04:03
# 安裝前說明
Docker支援絕大部分的Linux,只要該Linux的核心版本編號夠新。另外在Mac OS及Windows下則無法直接支援Docker,必須使用特殊方法,或是使用VM,我們就來看看。
### 注意:本書使用環境說明
本書操作**主要**使用原生的Linux終端視窗,有關圖型環境操作,則主要使用Mac OS及Windows 10。在Windows/Mac的虛擬機方面,本書使用VirtualBox及VMware Workstation/Fusion,讀者只要有上述的作業系統及虛擬化環境的任一組合即可。
也可以使用Windows下的SSH工具,PieTTY最好用

[VirtualBox下載](https://www.virtualbox.org/wiki/Downloads)
[VMware Workstation下載](https://my.vmware.com/web/vmware/info/slug/desktop_end_user_computing/vmware_workstation/11_0)
[VMware Fusion下載](https://my.vmware.com/web/vmware/info/slug/desktop_end_user_computing/vmware_fusion/7_0)
';
全環境Docker的完整安裝
最后更新于:2022-04-01 23:04:00
# 本章重點
Docker是一個原生的Linux產物,只要安裝了正確版本的Linux,就可以直接使用Docker。但大部分的我們不太可能生活在純Linux的環境, 事實上,大部分的電腦使用及操作都是在Windows或Mac OS之下,因此我們在這一章,就來看看最完整的Docker執行環境及操作環境的架設。
- 最常使用的工具
- 最常使用的虛擬機軟體
- Mac及Windows下安裝及簡單使用boot2docker(**不推薦**)
- 在標準VM中安裝Docker
- 在Ubuntu下安裝Docker
- 使用現成安裝好Docker的VM
- 雲端專用Linux CoreOS的VM安裝
- CoreOS安裝後的校調
';
看個實例
最后更新于:2022-04-01 23:03:58
# 看個實例
我們就來看一個實際的例子來說明上一小節的Docker運行原理。
1. 先確定這個Linux環境是可以執行Docker的。包括安裝了Docker,Linux的版本正確,以及有連上公網。

1. 輸入Docker的指令,即準備呼叫docker daemon:`docker run -d --name web -m 512m -p 8080:80 joshhu/webdemo`。這邊要注意的是,Docker的選項,全部以參數方式表現,如記憶體限制,名稱,通訊埠對應,映像檔名稱等。

1. 按下Enter之後,即使用`unix://var/run/unix.sock`呼叫docker daemon。由於`joshhu/webdemo`這個映像檔已經存在了,因此就直接用此映像檔,填入名為`web`的Container中。

1. 可以輸入`showmem`看一下記憶體的使用情況。

1. 如果這個`joshhu/webdemo`影像檔沒有在本機,就會先去下載,下載回來後,再填入空的Container `web`中。

注意 - Container的ID及名稱
在Docker執行時,如果你沒有使用`--name <名稱>`的參數,Docker會主動幫這個Container取一個好玩的名稱。而不管你有沒有幫這個Container命名,Docker一定會產生一個全世界獨一無二的Container id。

';
這些元件如何合作建立Docker環境
最后更新于:2022-04-01 23:03:56
# 這些元件如何合作建立Docker環境
Docker的執行非常簡單,就是docker client呼叫Docker daemon,然後daemon透過`libcontainer`呼叫Linux的核心模組來完成建立容器的的步驟,下面看圖說故事。
### Docker執行過程
1. 首先當然要有**安裝了Docker的Linux及硬體**。
_x86硬體,版本正確的Linux以及Docker_

1.
當準備建立Container時,**輸入指令**即執行docker client。呼叫Docker daemon,預設使用的通訊協定是`unix:///var/run/docker.sock`。

1.
Docker daemon透過`libcontainer`要求Linux核心建立Container。

1. 此時Linux核心收到指示,即啟動核心的`namespace`建立一個獨立的空間,包括`pid、network、IPC、UTS、mount`等namespace,daemon根據client的參數定義來分配CPU、記憶體或磁碟IO等。**注意虛線,此時Container中沒有任何東西**!只有空殼沒有內容。Container的空殼建立完成,需要將真正的作業系統及應用程式放入這個空殼中。

1. Damone檢查本機的現有映像檔列表,看要填入此Container空殼的映像檔之前有沒有下載過,
1. 有的話,直接從本機載入Container中,此時Container建立完成並啟動。
1. 若本機沒有此映像檔,daemon到預設的Docker Registry, 根據client的參數,下載適當的映像檔。
1. 下載回來即將此映像檔,填入Container的空殼,此時Container即啟動完成。
從上面的流程可以得知,Docker Container執行的調整方式就是我們下的參數。事實上,執行Docker時的參數,就是決定Linux核心建立Namespace以及設定網路、儲存的方法,這在本書稍後會有詳細說明。
注意 - Docker client可以在另一台主機此時和 Daemon的之間的連線可以用https取代unix://,但十分危險,除非你很確定安全性沒問題才要這麼做!
';
Docker的元件– Docker核心部分
最后更新于:2022-04-01 23:03:53
# Docker的元件– Docker核心部分
系統要能執行Docker,除了前述的Linux核心元件外,就是Docke部分了。Docker必要條件分為本機的三個元件之外,真的靈魂其實是雲端上的映像檔資料庫。本書稍後會 有映像檔資料庫的完整介紹
### Docker的執行元件
- Docker client – 呼叫Docker Daemon (本機或其它客戶端)
- Docker daemon – 執行Docker功能並用 (本機)
- libcontainer - 和Linux核心溝通的library (本機)
- Docker Image – 建立容器用的映像檔 (本機或雲端映像庫)
_圖中紫色部分為Docker的核心元件_

通常在安裝Docker時,就是同時安裝Docker客戶端、Docker daemon以及libcontainer,此時客戶端和daemon是在同一台電腦上的(使用unix:///var/unix.sock呼叫)。當然也可以讓Docker的客戶端和daemon不在同一台電腦(使用,但會有安全上的疑慮。此外你也可以利用Docker提供的API來撰寫自己的客戶端,預設的Docker客戶端介面就是我們安裝Docker時的輸入指令。
';