2017年7月25日 星期二

CentOS 7 運行 Docker 錯誤 Failed to get D-Bus connection: Operation not permitted

Docker run 的 container 內的 root 只是一般使用者, 必須要給予真正的 root 權限, 才能執行 mount 或是在 docker 中啟動 docker.

主要原因

CentOS 7 權限不足的原因

解決辦法

docker run --name centos --privileged -d centos:latest /sbin/init
給予真正的 root 的權限

2017年7月4日 星期二

使用 Docker 建立 Cassandra Cluster

目標

建立 3 個 Cassandra Server 的 Cluster

取得 Cassandra Image

docker pull 取得最新的 cassandra image
執行
$ docker pull cassandra:latest
結果
NBAS055de-MacBook-Pro:~ nbas055$ docker pull cassandra:latest
latest: Pulling from library/cassandra
9f0706ba7422: Pull complete
47bacf36113f: Pull complete
7c6842ab2e6f: Pull complete
b0970d2724fb: Pull complete
7dd1392a6ce5: Pull complete
43faf38e08a8: Pull complete
448a3a082d57: Pull complete
2c7ffe4dc3db: Pull complete
caac33302fe6: Pull complete
8ba01779bed9: Pull complete
1aa363d655b1: Pull complete
02a5c66a8b99: Pull complete
Digest: sha256:b25a30a85b5869257f560fb05296886136b809288f53f32ebefde8967e6e6ca5
Status: Downloaded newer image for cassandra:latest

查看 Images

docker images 查看所以已下載的 images
執行
$ docker images
結果
NBAS055de-MacBook-Pro:~ nbas055$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
cassandra           latest              c82d9de5d478        5 days ago          386MB

建立 Docker Network

docker network create 建立一個 bridge 類型的網路
執行
$ docker network create --driver bridge apptier
結果
NBAS055de-MacBook-Pro:~ nbas055$ docker network create --driver bridge apptier
c40c7ae8e9a1c6ad8eced493c0fa77d881cd63bc2c2a702af666d6cc4b1dcb96

查看 Docker Network

docker network ls 查看目前所有網路設定
執行
$ docker network ls
結果
NBAS055de-MacBook-Pro:~ nbas055$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
c40c7ae8e9a1        apptier             bridge              local
de34dc3841de        bridge              bridge              local
fcde3e725906        host                host                local
e70d8c2c4afd        none                null                local

建立第 1 台 Cassandra Server

docker run: 建立 cassandra server 的 container
--name cassanda1: 設定 container 名稱為 cassandra1
--network apptier: 設定 network 為 apptier
-d cassandra: 背景執行 cassandra image
執行
$ docker run --name cassandra --network apptier -d cassandra
結果
NBAS055de-MacBook-Pro:~ nbas055$ docker run --name cassandra1 --network apptier -d cassandra
33b7a234cef63f07ec62366aaf86035fa4552157a5cdf8645438a64975fbf056
NBAS055de-MacBook-Pro:~ nbas055$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                         NAMES
33b7a234cef6        cassandra           "/docker-entrypoin..."   3 seconds ago       Up 2 seconds        7000-7001/tcp, 7199/tcp, 9042/tcp, 9160/tcp   cassandra1

查詢目前正在執行的 Containers

docker ps 列出目前正在執行的 containers
執行
$ docker ps
結果
NBAS055de-MacBook-Pro:~ nbas055$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                         NAMES
7f22277bf144        cassandra           "/docker-entrypoin..."   2 seconds ago       Up 1 second         7000-7001/tcp, 7199/tcp, 9042/tcp, 9160/tcp   cassandra1

查詢 Containers 的執行狀況(CPU/Ram)

docker stats 查看所有 container 執行的狀況
執行
$ docker stats
結果
NBAS055de-MacBook-Pro:~ nbas055$ docker stats
CONTAINER           CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
33b7a234cef6        0.10%               1.148GiB / 1.952GiB   58.83%              1.12kB / 0B         0B / 1.78MB         42

刪除 Container

若 container 設定錯誤
docker rm cassandra1: 指定刪除 cassandra1 的 container
-f: 強制刪除
P.S. 刪除之後再嘗試建立一個 container
執行
$ docker rm -f cassandra1
結果
NBAS055de-MacBook-Pro:~ nbas055$ docker rm -f cassandra1
33b7a234cef6
NBAS055de-MacBook-Pro:~ nbas055$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

建立 Cassandra Cluster

設定 cassandra2 跟 cassandra3
執行 docker run 同時指定連結目標
-e CASSANDRA_SEEDS: 設定目標為 cassandra1
執行
$ docker run --name cassandra2 --network apptier -e CASSANDRA_SEEDS="$(docker inspect --format='{{ .NetworkSettings.Networks.apptier.IPAddress }}' cassandra1)" -d cassandra
$ docker run --name cassandra3 --network apptier -e CASSANDRA_SEEDS="$(docker inspect --format='{{ .NetworkSettings.Networks.apptier.IPAddress }}' cassandra1)" -d cassandra
結果
NBAS055de-MacBook-Pro:~ nbas055$ docker run --name cassandra2 --network apptier -e CASSANDRA_SEEDS="$(docker inspect --format='{{ .NetworkSettings.Networks.apptier.IPAddress }}' cassandra1)" -d cassandra
cf300680fa79787482da750fb7b7907c01b263889ca2e17434b9a829f56e3346
NBAS055de-MacBook-Pro:~ nbas055$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                         NAMES
cf300680fa79        cassandra           "/docker-entrypoin..."   12 seconds ago      Up 10 seconds       7000-7001/tcp, 7199/tcp, 9042/tcp, 9160/tcp   cassandra2
7f22277bf144        cassandra           "/docker-entrypoin..."   45 minutes ago      Up 44 minutes       7000-7001/tcp, 7199/tcp, 9042/tcp, 9160/tcp   cassandra1
NBAS055de-MacBook-Pro:~ nbas055$ docker run --name cassandra3 --network apptier -e CASSANDRA_SEEDS="$(docker inspect --format='{{ .NetworkSettings.Networks.apptier.IPAddress }}' cassandra1)" -d cassandra
1b3070561d24662830117005ace7615ccab8e66d652b0c5401f852da93490160
NBAS055de-MacBook-Pro:~ nbas055$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                                         NAMES
1b3070561d24        cassandra           "/docker-entrypoin..."   About a minute ago   Up About a minute   7000-7001/tcp, 7199/tcp, 9042/tcp, 9160/tcp   cassandra3
a277482c88c3        cassandra           "/docker-entrypoin..."   3 minutes ago        Up 3 minutes        7000-7001/tcp, 7199/tcp, 9042/tcp, 9160/tcp   cassandra2
fbc7888155bc        cassandra           "/docker-entrypoin..."   4 minutes ago        Up 4 minutes        7000-7001/tcp, 7199/tcp, 9042/tcp, 9160/tcp   cassandra1
NBAS055de-MacBook-Pro:~ nbas055$ docker stats
CONTAINER           CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
1b3070561d24        223.78%             2.131GiB / 7.787GiB   27.36%              578B / 0B           0B / 692kB          41
a277482c88c3        0.58%               2.137GiB / 7.787GiB   27.45%              1.13kB / 0B         0B / 1.95MB         42
fbc7888155bc        0.45%               2.14GiB / 7.787GiB    27.48%              1.91kB / 0B         76MB / 1.95MB       42

查看 Node 運行狀況

docker exec -it 進入 cassandra1
nodetool status 查看 cassandra node server 運行狀態
執行
$ docker exec -it cassandra1 /bin/bash
$ nodetool status
結果
NBAS055de-MacBook-Pro:~ nbas055$ docker exec -it cassandra1 /bin/bash
root@687e14268025:/# nodetool status
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address     Load       Tokens       Owns (effective)  Host ID                               Rack
UN  172.18.0.2  108.67 KiB  256          61.8%             791e7d85-9b08-45e0-8804-c804a3538679  rack1
UN  172.18.0.3  103.21 KiB  256          67.9%             ecbe769c-0d54-4d4b-8019-7f5bfa51a7ed  rack1
UN  172.18.0.4  15.35 KiB  256          70.4%             634eb8c4-17ea-40dd-ac2e-33ab97ada0ef  rack1

注意事項

  • 每個 node server 在連接 cassandra1 時記得間隔幾秒, 避免連接失敗
  • docker info 可查看 docker 預設的記憶體大小, cassandra 每個 node 至少需要 2 GB 的記憶體, 所以 node 數 x 2 = docker 記憶體



2017年3月14日 星期二

Cucumber(2): puts, raw, diff!

說明


puts: 顯示數據
raw: 將數據表轉換成陣列
diff!: 比較數據表

建立 test_board.feature


# test_board.feature
Feature: Test board
Background: Some backgrounds here
Scenario: Add row and column
    Given a board like this:
    |    | 1 | 2 | 3 |
    | 1 |    |    |    |
    | 2 | x |    |    |
    | 3 |    |    |    |
    When player x plays in row 3, column 2
    Then the board should look like this:
    |    | 1 | 2 | 3 |
    | 1 |    |    |    |
    | 2 | x |    |    |
    | 3 |    | x |    |

建立 steps.rb


# features/step_definitions/steps.rb

Given /^a board like this:$/ do |table|
    @board = table.raw
end

When /^player x plays in row (\d+), column (\d+)$/ do |row, col|
    row, col = row.to_i, col.to_i
    @board[row][col] = 'x'
    puts @boards
end

Then /^the board should look like this:$/ do |expected_table|
    expected_table.diff!(@board)
end


執行結果




2017年3月9日 星期四

Cucumber(1) : Feature, Scenario, Given, When, Then 結構(Gherkin)

Cucumber 用 Feature(功能/特性) 當作測試項目
每個測試項目都會有 Scenario(場景)

還沒安裝好 Cucumber 請參考 BDD Cucumber 安裝 (Windows 環境)

建立測試目錄


$ mkdir calculator
$ cd calculator

初始化 cucumber 目錄結構


$ cucumber --init

執行測試 cucumber


$ cucumber

此時你會發現
0 scenarios
0 steps
0m0.000s

上述的輸出表示 cucumber 已經可以正常掃描到 features 的目錄
不過他還沒找到可以運行的 scenario(場景)

建立測試項目


$ cd features
$ vi adding.feature

# adding.feature

Feature: Adding
Scenario: Add two numbers
    Given the input "<input>"
    When the calculator is run
    Then the output should be "<output>"

Example:
    | input | output |
    | 2+3   | 5         |
    | 98+1 | 99       |

此文本結構就叫做 Gherkin(小黃瓜)

----
OS: 黃瓜(Cucumber)裡面的小黃瓜(Gherkin)\
----

定義步驟


執行 cucumber --init 會在 features 建立 step_definitions
(如果沒有, 請自行 mkdir)
$ cd step_definitions
$ vi calculator_steps.rb

# calculator_steps.rb

Given /^the input "([^"]*)"$/ do |input|
    @input = input
end

When /^the calculator is run$/ do
    @output = `ruby calc.rb #{@input}`
    raise('Command failed!') unless $?.success?
end

Then /^the output should be "([^"]*)"$/ do |expect_output|
    expect(@output).to eq(expect_output)
end

建立 calc.rb


建立運算呼叫的 ruby calc.rb
回到 calculator 目錄下
$ vi calc.rb

# calc.rb
print eval(ARGV[0])

執行測試 cucumber


$ cucumber

回傳結果




2017年3月8日 星期三

BDD Cucumber 安裝 (Windows 環境)

此篇將說明如何在 Windows 環境下使用 Cucumber
安裝 Cucumber 之前需要先安裝 Ruby

安裝 Ruby 與 DevKit


官網下載網址
http://rubyinstaller.org/downloads/

安裝好 Ruby 之後
在 cmd 底下測試 ruby -v
如果有顯示版本就表示安裝成功

升級 gem


gem update --system

安裝 DevKit


把下載好的 DevKit 解壓縮
到該目錄底下執行
ruby dk.rb init
ruby dk.rb review
ruby dk.rb install

安裝 Cucumber


gem install cucumber
gem install selenium-webdriver
gem install capybara
gem install rspec

安裝 ansi166


Cucumber 使用 ANSI 轉碼控制顏色輸出
如果你沒安裝 ANSI 轉碼會跳警告訊息
下載網址
http://adoxa.altervista.org/ansicon/
執行
x64/ansicon -i

建立目錄並執行 cucumber 初始化


mkdir cucumber_test
cd cucumber_test
cucumber --init

建立 feature


Feature: Adding
Scenario: Add two number
Given the input "2+2"
When the calculator is run
Then the output should be "4"

執行 cucumber




2017年2月24日 星期五

[Docker] CentOS 7 安裝 Docker 教學

一般安裝

// 安裝 epel(Extra Package of Enterprise Linux)
# sudo yum install epel-release

// 安裝 Docker
# sudo yum install docker

// 啟動 Docker
# sudo systemctl start docker

// 開機自動啟動 Docker
# sudo systemctl enable docker

// 下載 ubuntu image 從 docker hub
# sudo docker pull ubuntu:12.04

// 執行 ubuntu 的 bash
# sudo docker run -t -i ubuntu:12.04 /bin/bash

// 列出本機 images
# sudo docker images


指定 Docker 版本安裝

// 移除舊版的 container(或 docker)
# sudo yum -y remove docker docker-common container-selinux docker-selinux

// 安裝 yum-utils
# sudo yum install -y yum-utils

// 加入 docker 的資源庫
# sudo yum-config-manager \
--add-repo \
https://docs.docker.com/engine/installation/linux/repo_files/centos/docker.repo

// 可加入測試版本的 docker
// 使用 yum update 要小心, 會以最新版本進行更新
# sudo yum-config-manager --enable docker-testing

// 也可以取消測試版本
# sudo yum-config-manager --disable docker-testing

// 列出 Docker 的版本
# sudo yum list docker-engine.x86_64  --showduplicates |sort -r

// 安裝 Docker 指定版本
# sudo yum -y install docker-engine-<VERSION_STRING>

// 啟動 Docker
# sudo systemctl start docker

// 開機自動啟動 Docker
# sudo systemctl enable docker

// 下載 ubuntu image 從 docker hub
# sudo docker pull ubuntu:12.04

// 執行 ubuntu 的 bash
# sudo docker run -t -i ubuntu:12.04 /bin/bash

// 列出本機 images
# sudo docker images

參考文件
Docker: https://docs.docker.com/engine/installation/linux/centos/
Git book: https://philipzheng.gitbooks.io/docker_practice/install/centos.html

2016年7月20日 星期三

WYSIWYG HTML editor: CKEditor 4.5.10 + CKFinder 2.6.2 整合圖片上傳



CKEditor 4.5.10


CKFinder 2.6.2

以上兩個套件都可以從官網下載
官網連結如下

CKEditor

CKFinder

都下載好之後解壓縮
放在 / 目錄下
分別取名 ckeditor 跟 ckfinder
另外取名一個 uploads 目錄
讓 ckfinder 可以上傳檔案到該目錄
權限設定 777 (全開)

打開 ckeditor/config.js
在 CKEDITOR.editorConfig 加入以下內容



config.filebrowserBrowseUrl = 'ckfinder/ckfinder.html';
config.filebrowserImageBrowseUrl = 'ckfinder/ckfinder.html?Type=Images';
config.filebrowserFlashBrowseUrl = 'ckfinder/ckfinder.html?Type=Flash';
config.filebrowserUploadUrl = 'ckfinder/core/connector/php/connector.php?command=QuickUpload&type=Files'; //可上傳一般檔案
config.filebrowserImageUploadUrl = 'ckfinder/core/connector/php/connector.php?command=QuickUpload&type=Images';//可上傳圖檔
config.filebrowserFlashUploadUrl = 'ckfinder/core/connector/php/connector.php?command=QuickUpload&type=Flash';//可上傳Flash檔案


打開 ckfinder/config.php
找到 function CheckAuthentication()
將 return false; 改成 return true;
找到 $baseUrl 設定上傳目錄
$baseUrl = '/uploads/';

編輯 test.php

<script src="ckeditor/ckeditor.js"></script>

<textarea class="ckeditor" cols="40" id="editor1" name="content" rows="10"></textarea>


啟動 apache
打開 localhost/test.php
就可以正常使用 ckeditor + ckfinder 了!