2016/11/30

Docker On Windows

enter image description here

前言

我的工作環境是 Windows,但很習慣使用 command line 工作,雖然 Windows 有一些工具可以模擬,像是 Cygwin,或者是 cmder,但都只能說堪用而已,所以我習慣在 Windows 上安裝 Vagrant 當作工作環境,久仰 docker 大名,最近花了點時間研究,今天這篇文章會一個一個步驟帶到怎麼在 Windows 使用 docker toolbox 安裝一個 PHP7 container by ubuntu xenail 連結另一個 mysql container

開始 Docker 之旅

首先去 docker tool 下載頁面,下載 Windows 安裝檔,之後便是無窮的下一步,這邊介紹一下這個工具的運作方式,他會使用 docker-machine 的 vm 技術透過 virtualbox build 一個虛擬環境讓你跑 docker command,所以安裝成功後會有 Docker Quickstart Terminal 可以用,但他就跟其他模擬 bash 環境的軟體一樣只是堪用而已,所以我打算使用 xshell 去走這個 demo,也可以使用 putty

安裝完成後 docker vm 預設的 ip 是 192.168.99.100,ssh 192.168.99.100 以後會問你帳密,分別是 docker 以及 tcuser,進入以後我們就可以使用所有的 docker command,我今天要使用 ubuntumysql/mysql-server 這兩個 container,當然一定也有 build 好的 lamp image,但我打算 step by step 紀錄一下,至於 docker 的一些基礎命令我不會多做解釋,可以去 Docker —— 從入門到實踐 看一下,我們先 pull 一下

$ docker pull ubuntu
$ docker pull mysql/mysql-server

$ docker images

REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
ubuntu               latest              4ca3a192ff2a        12 hours ago        128.2 MB
mysql/mysql-server   latest              6272a6121ff6        7 days ago          316.2 MB

已經順利將這兩個 container 抓下來,先來設定 database

$ docker run --name db1 -e MYSQL_ROOT_PASSWORD=123456 -d mysql/mysql-server
$ docker ps

CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                 NAMES
dfc880ed429d        mysql/mysql-server   "/entrypoint.sh mysql"   18 seconds ago      Up 17 seconds       3306/tcp, 33060/tcp   db1

上述指令建立了一個名叫 db1 的 mysql server,root 密碼為 123456,但預設帳號只有 root@local,所以我們必須建一個 root@% 的帳號來使用,順便建立一個資料表來測試

$ docker exec -it db1 mysql -uroot -p123456
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
create database test;

mysql> use test;

mysql> CREATE TABLE `tests` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(50) NOT NULL
) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_unicode_ci;

mysql> INSERT INTO `tests` (`name`) VALUES ('a'), ('b');

mysql> exit;

到此 mysql-server 的部份就完成了,現在來進行 web 的部份

$ docker run -td --name php7 --link db1:db1 ubuntu /bin/bash
$ docker ps

CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                 NAMES
2c52f1c58edb        ubuntu               "/bin/bash"              12 seconds ago      Up 11 seconds                             php7
dfc880ed429d        mysql/mysql-server   "/entrypoint.sh mysql"   10 minutes ago      Up 10 minutes       3306/tcp, 33060/tcp   db1

這邊順利的建立了 php7 這個 container,並且將其 link 到 db1,接著要一連串的安裝 php7 並且寫一個 pdo 測試連線的流程

$ docker exec -it php7 bash

$ env

# 擷取重點
DB1_PORT_3306_TCP_ADDR=172.17.0.2
DB1_PORT_3306_TCP_PROTO=tcp
SHLVL=1
HOME=/root
DB1_ENV_MYSQL_ROOT_PASSWORD=123456
DB1_PORT=tcp://172.17.0.2:3306
DB1_PORT_33060_TCP_PROTO=tcp
DB1_NAME=/php7/db1

$ apt-get udpate
$ apt-get install php php-mysql vim

$ vim test.php

test.php 的內容如下

<?php

$ip = getenv('DB1_PORT_33060_TCP_ADDR');
$dsn = "mysql:host=${ip};dbname=test";
$db = new PDO($dsn, 'root', 123456);
$sql = "SELECT * FROM `tests`";

foreach ($db->query($sql) as $value) {
    var_dump($value);
}

接著我們執行看看

$ php test.php

array(4) {
  ["id"]=>
  string(1) "1"
  [0]=>
  string(1) "1"
  ["name"]=>
  string(1) "a"
  [1]=>
  string(1) "a"
}
array(4) {
  ["id"]=>
  string(1) "2"
  [0]=>
  string(1) "2"
  ["name"]=>
  string(1) "b"
  [1]=>
  string(1) "b"
}

這樣就大功告成啦

docker-machine

docker 一次只能 bind 一個對外的 80 port,如果要實現不同 domain name 不帶 port 去不同的 container 這種作法,前端要架設一個 nginx 去設定導向,這邊提供另一個偷懶的方法,docker-machine 本身用的就是 vm,所以我們可以開另一個 vm,這時候就得進到 docker terminal,執行以下指令

$ docker-machine create -d virtualbox chan

接著執行

$ docker-machine ls

我們會看到

NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER    ERRORS
chan      -        virtualbox   Running   tcp://192.168.99.101:2376           v1.12.3
default   *        virtualbox   Running   tcp://192.168.99.100:2376           v1.12.3

成功的建立了 chan 這個 vm,我們可以使用 ssh 進去 192.168.99.101,如果你在 docker terminal 要切換環境只要執行下方指令即可,然後把 lamp 的環境做在這個 ip 裡面,並且在本機設好 hosts 連過來即可

$ eval $(docker-machine env chan)

可以將自製的 web image 拷貝出來並寫成 Dockerfile,這樣開一個 vm 並且建一個新環境非常的快,如果只是測試環境不在意 port 的話就用不同的 port 去導向每個 container,或者是要用哪個 case 就 start 哪個 container 也是 ok 的,如果你跟我一樣重開機或關機會把軟體都關乾乾淨淨的話,可以在 docker toolbox terminal 下指令

$ docker-machine stop default

沒有留言: