2016年6月2日 星期四

如何安裝 docker

Docker 官方網頁有介紹如何在 jessie 中安裝 docker,其網址如下:

https://docs.docker.com/engine/installation/linux/debian/#debian-jessie-80-64-bit

請編輯 /etc/apt/sources.list 檔案,新增底下這行:

# Docker
deb https://apt.dockerproject.org/repo debian-jessie main

然後以 root 權限執行

# apt-get update
# apt-get install docker-engine

安裝完畢後,理論上你的 docker 服務已經開始運轉,我們可以執行

# systemctl status docker

來觀察目前狀態。在此同時,我們如果執行

# ifconfig

的話,也會看到有一個新的網路介面叫 docker0 的,其狀態如底下所示:

docker0   Link encap:Ethernet  HWaddr 02:42:48:93:4b:a0
          inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)


docker 之預設橋接網路介面為 docker0,其預設網段為 172.17.0.0/24,如果我們希望將網段改為 192.168.20.0/24,則在啟動 docker 前,我們要先設定 docker 的網段,請編輯 /etc/default/docker
這個檔案,將 DOCKER_OPTS 改成底下設定(其中一行):

南臺校外
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --bip=192.168.20.0/24"

南臺校內
DOCKER_OPTS="--dns 120.117.2.1 --dns 120.117.2.2 --bip=192.168.20.0/24"

其中 --dns 是指 docker0 所提供 DNS 位址,而 --bip 則是所設定的網段。改完之後,要重新啟動 docker0,在那之前,要先將 docker 服務停止,指令如下:

# systemctl stop docker

關完之後可以執行

# systemctl status docker

來看目前 docker 狀態。

接著來修理 docker0,docker0 不是網路介面,而是橋接網路,因此使用底下指令可以看
到 docker0 的狀態。

# brctl show
bridge name     bridge id               STP enabled     interfaces
br10            8000.000000000000       no
docker0         8000.024248934ba0       no

現在執行底下指令可以看到 docker0 的 IP 還沒改過來。

# ifconfig docker0
docker0   Link encap:Ethernet  HWaddr 02:42:48:93:4b:a0
          inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

我們將 docker0 這個橋拿掉:

# brctl delbr docker0
bridge docker0 is still up; can't delete it

這表示 docker0 這個橋接網路介面還沒關掉,我們要執行底下指令才能關掉:

# ifconfig docker0 down
# ifdown docker0
# brctl delbr docker0

如此一來 docker0 就完全不見了,可以執行 ifconfig 來驗證看看。


編輯 /etc/sudoers 檔,為自己的帳號新增 sudo 的權限 (無需打密碼)

account  ALL=(ALL:ALL) NOPASSWD:ALL

上面的 account 是指你自己的帳號。


我們也可以新增一個 br20 的橋接網路介面,然後在 /etc/default/docker 中作底下修改:

DOCKER_OPTS="--dns 120.117.2.1 --dns 120.117.2.2 -b=br20"

如此一來會讓 docker 使用 br20 這個橋接網路介面,然後再重新啟動 docker 服務:

# systemctl restart docker

接著可以觀察網路上是否有現成的影像檔可以下載:

sudo docker search debian:jessie

此時會看到有很多現成的 docker 影像檔可以下載,在下載前我們先看一下目前有的
docker 影像檔:

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

從此可以看到目前沒有下載任何 docker 影像檔,請執行底下指令下載 docker 影像檔:

$ sudo docker pull debian:jessie
jessie: Pulling from library/debian
51f5c6a04d83: Pull complete
a3ed95caeb02: Pull complete
Digest: sha256:2ca1d757fce75accad6ff84339c3327c7aa96ad6e7b7d6fdde22b2a537fac703
Status: Downloaded newer image for debian:jessie

下載完畢後再執行底下指令觀看目前是否已下載 docker image ?

herman@120:~$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
debian              jessie              1742affe03b5        10 days ago         125.1 MB

執行 docker jessie

$ sudo docker run -t -i debian:jessie /bin/bash
root@58abce6c9be8:/#

恭喜你,你已經啟動第一個 docker 容器了。但是這個容器相當陽春,連 ifconfig 指令
也沒有:
root@58abce6c9be8:/# ifconfig
bash: ifconfig: command not found

我們可以至 debian packages 網站查查看 ifconfig 屬於那個套件,再補裝上去,經過
查詢,ifconfig 屬於 net-tools 套件,在安裝此套件前要執行

# apt-get update
# apt-get install net-tools

安裝完畢後執行:

# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:c0:a8:14:02
          inet addr:192.168.20.2  Bcast:0.0.0.0  Mask:255.255.255.0
          inet6 addr: fe80::42:c0ff:fea8:1402/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3058 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2603 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:26185005 (24.9 MiB)  TX bytes:180507 (176.2 KiB)

可以看到 eth0 的 IP 為 192.168.20.2,此時我們可以從實體機來 ping 192.168.20.2
看看是否能 ping 到這台主機:

$ ping 192.168.20.2
PING 192.168.20.2 (192.168.20.2) 56(84) bytes of data.
64 bytes from 192.168.20.2: icmp_seq=1 ttl=64 time=0.032 ms
64 bytes from 192.168.20.2: icmp_seq=2 ttl=64 time=0.026 ms
64 bytes from 192.168.20.2: icmp_seq=3 ttl=64 time=0.022 ms
64 bytes from 192.168.20.2: icmp_seq=4 ttl=64 time=0.022 ms
64 bytes from 192.168.20.2: icmp_seq=5 ttl=64 time=0.025 ms
64 bytes from 192.168.20.2: icmp_seq=6 ttl=64 time=0.022 ms
64 bytes from 192.168.20.2: icmp_seq=7 ttl=64 time=0.023 ms
^C
--- 192.168.20.2 ping statistics ---
7 packets transmitted, 7 received, 0% packet loss, time 5999ms
rtt min/avg/max/mdev = 0.022/0.024/0.032/0.006 ms

也可以從 docker 虛擬機 ping 192.168.20.1 來看看是否能 ping 到 docker0:

root@58abce6c9be8:/# ping 192.168.20.1
PING 192.168.20.1 (192.168.20.1): 56 data bytes
64 bytes from 192.168.20.1: icmp_seq=0 ttl=64 time=0.044 ms
64 bytes from 192.168.20.1: icmp_seq=1 ttl=64 time=0.031 ms
64 bytes from 192.168.20.1: icmp_seq=2 ttl=64 time=0.031 ms
^C--- 192.168.20.1 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.031/0.035/0.044/0.000 ms

到此為止,我們已經成功啟動一台 docker 的虛擬機,並且知道其網路設定了。接下來要
進行 apache 伺服器安裝,在那之前要先設定好鏡像站來源,否則下載軟體的速度會很慢

# apt-get install vim

接著編輯 /etc/apt/sources.list 檔案:

deb http://security.debian.org jessie/updates main

#deb http://httpredir.debian.org/debian jessie main
#deb http://httpredir.debian.org/debian jessie-updates main

deb ftp://192.168.20.1/debian jessie main contrib non-free
deb ftp://192.168.20.1/debian jessie-updates main

然後執行

# apt-get update

看看是否可以從實體主機的 debian 鏡站中下載套件,接下來安裝 apache 套件:

# apt-get install apache2

下載安裝完成後,可以自實體機以瀏覽器打開 http://192.168.20.2 來看是否有網頁,
如果沒有的話請執行:

# /etc/init.d/apache2 start
[....] Starting web server: apache2AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 192.168.20.2. Set the 'ServerName' directive globally to suppress this message
. ok

# /etc/init.d/apache2 status
[ ok ] apache2 is running.

來啟動並觀看 apache2 這個服務是否有執行,確定 apache2 有執行後可以再使用實體機
的瀏覽器打開 192.168.20.2 以驗證網頁服務是否有啟動。

=======================================
在實體機上如果要觀察目前有那些 docker 的容器正在執行的話,可以執行:

$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
58abce6c9be8        debian:jessie       "/bin/bash"         53 minutes ago      Up 53 minutes                           dreamy_heisenberg

=======================================
離開 docker 容器,請在 docker 中輸入 exit:

root@58abce6c9be8:/# exit
exit
~$

此時再在實體機中執行:

$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

會發現剛剛運行中之系統已經不見,這表示 docker 容器已經停止。

沒有留言:

張貼留言