Mac OS X 下安裝使用 Docker (2017年7月)

兩年前的一篇 Mac OS X 下安裝使用 Docker 安裝時仍是用的 boot2docker, 現在進化到了在 Mac OS X 下用 Docker Toolbox, 並且命令也由 boot2docker 換成了 docker-machine. 固然因爲是非 Linux 系統, 因此Mac OS X 仍然須要藉助於 VirtualBox 中的 linux 虛擬機做爲橋樑, Docker Toolbox 建立的虛擬機名是 default (boot2docker 建立的虛擬機名是 boot2docker-vm) 就是這一橋樑, 咱們稱之爲 DOCKER_HOST. 文中的 default 虛擬機指的就是這個 DOCKER_HOST.html

如今來看下安裝步驟及體驗, 由於我係統中已安裝好了 VirtualBox, 因此這一步驟等會就省略了.linux

一. 安裝 docker 和 docker-machine
官方的指南是經過下載 DockerToolbox 來安裝 docker, docker-machine 和其餘輔助工具. 但若是你偏於極客, 並不習慣於圖形界面來安裝的話, 那麼安裝 docker 和 docker-machine 就只要下面兩個指令docker

1shell

2apache

brewinstalldockerubuntu

breainstalldocker-machine
若是你已選擇了使用上面的兩條命令來安裝 docker, docker-machine 的話, 那麼請跳到下一步.緩存

若是你熱愛圖形界面來安裝應用的話, 能夠到頁面 https://www.docker.com/products/docker-toolbox 中下載 Mac 的版本的 DockerToolbox-1.10.3.pkg, 當前版本是 1.10.3bash

能夠看到 Docker Toolbox 包含了如下五個組件app

. Docker Client docker binary —- docker 命令
. Docker Machine docker-machine binary —- docker-machine 命令
. Docker Compose docker-compose binary
. Kitematic – Desktop GUI for Docker
. Docker Quickstart Terminal appssh

而後就 Continue, 選擇安裝路徑, 按提示輸入 sudo 密碼, 因爲 Docker Toolbox 檢測到我已安裝了 Virtual Box, 因此未曾提示我去下載安裝 Virtual Box.

將要完成之際你要選擇使用 Docker Quickstart Terminal 仍是 Kitematic (Beta) 來開始使用 Docker. 這兩個東西均可以在第一次啓動的時候自動建立 Virtual Box 的 default 虛擬機.

二. 初始化 Virtual Box 的 default 虛擬機
若是你是使用的 brew install 來安裝的 docker 和 docker-machine 的話, 能夠用命令

1

docker-machine
create --driver virtualbox default
來手動建立 default 虛擬機. 建立過程與下面使用 Docker quickstart Terminal 是同樣的.

若是安裝的是 Docker Toolbox 的話, 能夠執行 Docker Quickstart Terminal 來建立 default 虛擬機. 我在 Launchpad 中點擊 Docker Quickstart Terminal 後沒什麼效果, 因此是直接執行相應的命令文件

/Applications/Docker/Docker Quickstart Terminal.app/Contents/Resources/Scripts/start.sh

或者打開 Docker Toolbox 中的 Kitematic 工具, 建立 default 虛擬機也是自動完成的. Kitematic 還有更爲豐富的功能, 省去了記憶那些 docker-machine 和 docker 命令, 不過極客們可不這麼想.

雖然咱們新的虛擬機名稱變成了 default, 但安裝的鏡像依舊是 boot2docker.iso. 因爲我之前安裝過 boo2docker, 因此上面直接從緩存的 boot2docker.iso 建立了 default 虛擬機. 再看看在 Virtual Box 中的樣子

三. 初始化環境變量

docker-machine env default 顯示宿主機須要爲 default 虛擬機設置的環境變量的指令
eval (docker-machine env default) 將在宿主機中設置相應的環境變量 — 個人機器的 shell 是 fish, 若是 bash 將是 eval $(docker-machine env default)

env 顯示宿主機的環境變量

不設置好環境變量將沒法使用 docker 命令, 好比執行 docker images 時會看到 Cannot connect to the Docker daemon. Is the docker daemon running on this host? 錯誤, 由於 docker 沒法與 default 虛擬機鏈接起來. 爲了每次都有效還必須把 eval (docker-machine env default) 加到 ~/.config/fish/config.fish 文件中. 使用 bash 則加一行 eval $(docker-machine env default) 到 ~/.bash_profile 中.

四. 最簡單的使用 Docker

[I]
➜ ~ docker
images

REPOSITORY
TAG IMAGE ID CREATED SIZE

[I]
➜ ~ docker
run -it busybox /bin/sh

Unable
to findimage
'busybox:latest'locally

latest:
Pulling from library/busybox

385e281300cc:
Pull complete

a3ed95caeb02:
Pull complete

Digest:
sha256:4a887a2326ec9e0fa90cce7b4764b0e627b5d6afcb81a3f73c85dc29cea00048

Status:
Downloaded newer image forbusybox:latest

/#
uname -a

Linux
5427a4ee9eaa 4.1.19-boot2docker #1
SMP Mon Mar 7 17:44:33 UTC 2016 x86_64 GNU/Linux

/#
exit

[I]
➜ ~ docker images

REPOSITORY
TAG IMAGE ID CREATED SIZE

busybox
latest 47bcc53f74dc 9 days ago 1.113 MB

[I]
➜ ~ dockerps-a

CONTAINER
ID IMAGE COMMAND CREATED STATUS PORTS NAMES

5427a4ee9eaa
busybox "/bin/sh" 20
seconds ago Exited (0) 8 seconds ago grave_kowalevski

第一個 docker images 時是沒有一個鏡像的, 用 docker run -it busybox /bin/sh 安裝並啓動一個交互時的 busybox 容器, 退出後 docker images 列出咱們安裝了一個 busybox 鏡像.

五. 基於 Dockerfile 構建
固然目錄下建立 Dockerfile 文件, 內容以下:

FROM
ubuntu:14.04

USER
root

RUN
apt-get install-y
apache2

EXPOSE
80
由 Dockerfile 構建鏡像

$ docker builder -t ubuntu:apache2 ./

……

$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu apache2 511aaac08bc1 2 minutes ago 224 MB
ubuntu 14.04 97434d46f197 9 days ago 188 MB

加載鏡像, 啓動容器

docker run -P -d ubuntu:apache2 apachectl -D FOREGROUND

那麼 Docker 會在 default 虛擬機上開啓一個隨機的端口與容器的 80 端口進行映射, 像 docker ps 能夠看到

$ docker ps
Container ID IMAGE COMMAND CREATED STATUS PORTS NAMES
91fd870d5e18 ubuntu:apache2 「apachectl -D FOREGRO」 7 seconds ago Up 7 seconds 0.0.0.0:32768->80/tcp furious_borg

容器的 80 映射到了 default 虛擬機的 32768 端口. 查看到 default 虛擬機的 ip

docker-machine
ip default

192.168.99.106

這時能夠在 Mac 本機訪問容器中的 Apache2 服務

curl
-I http://192.168.99.106:32769

HTTP/1.1
200 OK

Date:
Mon, 28 Mar 2016 00:49:08 GMT

Server:
Apache/2.4.7
(Ubuntu)

Last-Modified:
Sun, 27 Mar 2016 22:38:30 GMT

ETag:"2cf6-52f0f748d8580"

Accept-Ranges:
bytes

Content-Length:
11510

Vary:
Accept-Encoding

Content-Type:
text/html

若是但願非本機也能訪問容器中的 Apache2 服務, 則須要把 Mac 的端口映射到 default 虛擬機上去, 好比 Mac 下能夠用 pf 實現, 也能夠設置在 default 虛擬機上

$ VBoxManage controlvm default natpf1 「tcp-port_80,tcp,,20080,,10080」

上面的命令配置了 Mac OS X 的 20080 映射到 default 虛擬機的 10080 端口. Mac:20080 -> default:10080

而後在啓動容器時用 -p 參數指定 default 虛擬機到容器的端口映射. default:10080 -> 容器:80

docker run -p 10080:80 -d ubuntu:apache2 apachectl -D FOREGROUND

docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
200f14210914 ubuntu:apache2 「apachectl -D FOREGRO」 About a minute ago Up About a minute 0.0.0.0:10080->80/tcp pensive_bohr

如今能夠用 Mac 的 20080 端口訪問到容器的 80 端口

curl
-I http://localhost:20080

HTTP/1.1
200 OK

Date:
Mon, 28 Mar 2016 00:49:08 GMT

Server:
Apache/2.4.7
(Ubuntu)

Last-Modified:
Sun, 27 Mar 2016 22:38:30 GMT

ETag:"2cf6-52f0f748d8580"

Accept-Ranges:
bytes

Content-Length:
11510

Vary:
Accept-Encoding

Content-Type:
text/html

固然其餘機器在沒有防火牆的限制下也能夠經過 Mac 的 IP 地址訪問容器的 Apache2 服務了.

關於端口映射的配置

前面是用 VBoxMange controlvm 添加端口映射時不須要用 docker-machine stop 中止 default 虛擬機

VBoxManage modifyvm default –natpf1 「tcp-port_80,tcp,,20080,,10080」 命令不能對運行中的虛擬機操做.

VBoxManage controlvm default natpf1 delete tcp-port_80 能夠刪除運行中的 default 虛擬機的端口映射規則.
VBoxManage showvminfo default --machinereadable | grep Forwarding 顯示 default 虛擬機的全部端口映射規則

上面的命令必須逐個的把在 Mac OS X 與 default 虛擬機之間進行端口映射, 也有人想一了百了, 用下面那樣的腳本

1

2

3

4

fori
in{10000..10999};
do

VBoxManage
modifyvm "boot2docker-vm"--natpf1
"tcp-port$i,tcp,,$i,,$i";

VBoxManage
modifyvm "boot2docker-vm"--natpf1
"udp-port$i,udp,,$i,,$i";

done
這樣作徹底是在 Mac OS X 上無畏的啓動大量監聽的端口, 並與 default 虛擬機進行映射, 不只浪費了大量的資源, 並且 EXPOSE 80 選的隨機端口不必定落在 10000 — 10999 這個區間上, 好比前面的 32768 端口.

和 boot2docker 相似, 若是你不想用 VBoxMange 命令來操做虛擬機設置的話, 也能夠用 docker-machine ssh 來設置隧道轉發, 如

1

2

3

4

docker-machinesshdefault
-L 20080:localhost:10080

或者無需進入到

default 虛擬機的話

docker-machinesshdefault -f -N -L 20080:localhost:10080 尚不知如何中止掉 docker-machine 對某個端口轉發.

相關文章
相關標籤/搜索