読者です 読者をやめる 読者になる 読者になる

Taker's インフラ関連技術調査ログ

インフラ関連についての調査メモです。

Editing Swagger UIを使ったAPI仕様書の閲覧

Swagger

はじめに

swagger.jsonまたはswagger.yamlによって書かれた
ドキュメントをHTMLで参照するには Swagger UI を使用する

Swagger UI Serverの準備

ダウンロード

任意のディレクトリに移動し、swagger-ui.gitをチェックアウトする

git clone https://github.com/swagger-api/swagger-ui.git
cd swagger-ui/

Swaggerファイルのコピー

swagger-ui自身でファイルをサーブできるよう
swagger.yamlをdistにコピーする
Swager-UIから参照可能な場所においてあれば特にこれは必須ではない

cp -pi swagger.yaml ./dist/

Dockerで起動

docker build -t swagger-ui-builder .
docker run -p 127.0.0.1:8080:8080 swagger-ui-builder

アクセス

ブラウザでアクセスする

http://localhost:8080`

URL入力欄に以下を入力

http://localhost:8080/swagger.yaml

上手く行けば表示されるはず

参考

デフォルトでPetstoreのDemoサイトのURLが設定されててしかも動かないので変更したい場合は下記を参考。

Docker systemコマンドとclean-up系コマンド

Docker

Docker 1.13でCLIが改善されたとの記事があったのでお試し。

https://www.infoq.com/jp/news/2017/02/docker-1.13

docker system - Docker

Docker System

docker system df

Dockerのディスク利用状況がわかる。便利。

$ docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              24                  2                   9.816 GB            9.205 GB (93%)
Containers          3                   0                   0 B                 0 B
Local Volumes       3                   3                   318.9 MB            0 B (0%)

docker system events

サーバーからのリアルタイムイベントを取得して標準出力してくれる。 オプション無しだとログが長くて読みにくいのでfilterして使うのが良さそう。

$ docker system events
2017-02-11T19:32:45.900852754+09:00 network create 1560fdef4fcd98b68e64dc5815b9616e77167ce1ba8d0d899c680a1e8ddb8ef2 (name=ultimatecatalogapi_default, type=bridge)
2017-02-11T19:32:45.937009381+09:00 volume create ultimatecatalogapi_uc-data (driver=local)
2017-02-11T19:32:46.352153980+09:00 container create 84d93c1fc07a683ec59887202fd4fb45b7ff8894688bfd7dad56c5c7b55af1ee (com.docker.compose.config-hash=996c535a97366837fb156707e1cf1a55346d5e9adc522cf1a78a6b0970393348, com.docker.compose.container-number=1, com.docker.compose.oneoff=False, com.docker.compose.project=ultimatecatalogapi, com.docker.compose.service=api, com.docker.compose.version=1.11.1, image=ultimatecatalogapi_api, name=ultimatecatalogapi_api_1)
2017-02-11T19:32:46.368757935+09:00 container attach 84d93c1fc07a683ec59887202fd4fb45b7ff8894688bfd7dad56c5c7b55af1ee (com.docker.compose.config-hash=996c535a97366837fb156707e1cf1a55346d5e9adc522cf1a78a6b0970393348, com.docker.compose.container-number=1, com.docker.compose.oneoff=False, com.docker.compose.project=ultimatecatalogapi, com.docker.compose.service=api, com.docker.compose.version=1.11.1, image=ultimatecatalogapi_api, name=ultimatecatalogapi_api_1)
2017-02-11T19:32:46.443896827+09:00 network disconnect 1560fdef4fcd98b68e64dc5815b9616e77167ce1ba8d0d899c680a1e8ddb8ef2 (container=84d93c1fc07a683ec59887202fd4fb45b7ff8894688bfd7dad56c5c7b55af1ee, name=ultimatecatalogapi_default, type=bridge)
2017-02-11T19:32:46.592015158+09:00 container create 8c6e0aac2ec66d23d8bb00895f7cba2a69963a9c199889613c6f9221006b0968 (com.docker.compose.config-hash=d8d867edf8af8cda04ecd661b84a4183b81c7575612e608c533c8d4e0be3fb39, com.docker.compose.container-number=1, com.docker.compose.oneoff=False, com.docker.compose.project=ultimatecatalogapi, com.docker.compose.service=mongo, com.docker.compose.version=1.11.1, image=mongo:latest, name=ultimatecatalogapi_mongo_1)

docker system info

システム情報を表示

docker system prune

未使用データの削除。停止中のコンテナの削除などをしてくれる。使い方を間違えなければ便利。

ボリュームの削除

未使用のボリュームの削除

$ docker volume prune
WARNING! This will remove all volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
a22a726badc76f67e9bf6414c3ee9f4104a1ad9caa2fbc4ac8d191f6b778a345
a5af6749f56651087d7fb2b1896e624486fb40fd8fce0e3153671eb35363ed24
fb6974503d635b5f9d97a3951901794acdd6afd279209e95da7f15ffb91b28ae
ultimatecatalogapi_uc-data
4426cb4bdd449b750f29c83a835bd211bd664fd27e69644616ddb81b09a2557d
a20b31b370e79a43c7bb9b00243b83016dc938621245f119e231f520325b4473
d94fab1718e74c35b1970a63e4c61060f4db979b9919d63c4c04aef9ca908e47

Total reclaimed space: 641.6 MB

イメージの削除

タグ付けされていないイメージを削除

$ docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Deleted Images:
deleted: sha256:1ff2f4c46f286b04e7a932450aed4138349a477f558ded55fcecb5fd4b5cba66
deleted: sha256:bdcd065ab7de14bf53579ac02912701a44e25981e20464cec6de1e20c5c5baee
deleted: sha256:09f28b3a116d6c392851fff8b65a29f153ecdc8442acbb02b0461ce97aa78bb3
deleted: sha256:fabd7e17fbdd44ee2821e345d7ca8d423cd2c3dd24713bf789dfa4995814688d
deleted: sha256:e85ffe4667da329053f6a47b775dcf790d7a957adc7bed72d87a6284bad7dbd6
deleted: sha256:22263a689937489bf399e05edd9682618319e6cb3801b6ec42d9c7415725033d
deleted: sha256:5940666d2088bdb774ac498d4adf7e754b81318641924efab95cf1ed3256faa0

Total reclaimed space: 278.5 MB

DockerにMongoDBのデータをリストアする

Docker MongoDB

課題

既存のMongoDBのデータがあり、そのダンプをDocker化するにあたって初期データとしてリストアしたい。

条件

  • Docker Composeは繰り返し利用するので初期データの投入に関わる処理は記述したくない
  • あとからdocker-compose.ymlを書き直ししたくない
  • ローカル領域を記述して環境依存をさせたくない
  • ローカルPCにmongodbはインストールしたくない

対策

  • volumes を利用する。

docker-compose.yml編集

docker-compose.ymを作る。 データディレクトリを volumes: に定義

version: '3'
services:
  api:
    build: .
    ports:
    - "9080:9080"
  mongo:
    image: "mongo:latest"
    volumes:
     - mongo-data:/data/db
  mongo-express:
    image: "mongo-express:latest"
    ports:
    - "8081:8081"
    links:
     - mongo
volumes:
  mongo-data:

ひとまず起動・停止してvolumeを作っておく。

$ docker-compose up
$ docker-compose down

データ投入用mongo起動

先ほど作成したvolumeを参照するためにmongoを立ち上げる。

$ cd workdir //ダンプファイルが置いてあるディレクトリ
$ docker run --rm -v "projectname_mongo-data:/data/db" -v "$PWD":/work -w "/work" --name mongo -d mongo

-v "projectname_mongo-data:/data/db" でdocker-composeで作成したvolumeに接続するのがポイント。

データリストア

$ docker exec mongo mongorestore /work/mongodb_dump

確認

http://localhost:8081/ にアクセスしてDBのリストアが成功していることが確認できればOK。
普通にポート開けてMongoDBインストール済みのマシンから mongorestore した方が多分楽チン。

EchoサーバーをDocker化する

Docker Go Echo

目的

Echoが起動するDockerイメージを作りたい

下調べ

golangにはDockerのOfficialイメージがあるのでそれを使う

https://hub.docker.com/_/golang/

作業ディレクトリを決める

$ cd ~/myapp

確認用ファイルの準備

ガイドを参考に、server.goファイルを作る

https://echo.labstack.com/guide

package main

import (
    "net/http"
    
    "github.com/labstack/echo"
)

func main() {
    e := echo.New()
    e.GET("/", func(c echo.Context) error {
        return c.String(http.StatusOK, "Hello, World!")
    })
    e.Logger.Fatal(e.Start(":1323"))
}

Dockerfileの編集

Dockerfileを作成する。といっても golang:onbuild 内で 外部ライブラリのインポートなどもしてくれるので最初は1行しか書く必要はない。

FROM golang:onbuild

ビルド

Dockerをビルドする。ここでは echo とタグをつけておく(なんでもよい)。

docker build -t echo .

起動

docker run --rm -p 127.0.0.1:1323:1323 --name echo echo

確認

以下にアクセスして Hello World! と表示されたら成功。

http://localhost:1323/

Golangの公式Dockerファイルがよろしくやってくれるので、 余計なことしないならプロジェクトのディレクトリ上でdockerビルドするだけでいい感じ。 なんというか別にEcho関係ないやん、という結論に。。

MongoDB:外部接続を許可

MongoDB

ローカルホスト以外からの接続を許可したい場合。 net:bindIpを使って定義する。

$ sudo vim /etc/mongod.conf 
# network interfaces
net:
  port: 27017
  bindIp: 0.0.0.0
#  bindIp: 127.0.0.1

0.0.0.0 はどこからでもアクセス可能になるので注意。

Vagrant 環境にmysql-5.6をインストールする

Vagrant Ubuntu MySQL

Vagrant環境にMySQLをインストールする。

Vagrant セットアップ

$ mkdir vagrant-mysql-5.6
$ cd vagrant-mysql-5.6
$ vagrant init ubuntu/trusty64

Vagrantfile編集

やることは2つ

  • ポート開け
  • メモリ拡張
$ vim Vagrantfile

ポートを開放

  config.vm.network "forwarded_port", guest: 3306, host: 3306

メモリを拡張する

メモリが不足していると起動できないので

  config.vm.provider "virtualbox" do |vb|
  #   # Display the VirtualBox GUI when booting the machine
  #   vb.gui = true
  #
  #   # Customize the amount of memory on the VM:
     vb.memory = "1024"
  end

Vagrant 起動&接続

$ vagrant up
$ vagrant ssh

MySQLインストール

パッケージを探す

$ sudo aptitude search ^mysql-.*5.6
p   mysql-client-5.6                                          - MySQL database client binaries                                                                
p   mysql-client-core-5.6                                 - MySQL database core client binaries                                                           
p   mysql-common-5.6                                     - MySQL 5.6 specific common files, e.g. /etc/mysql/conf.d/my-5.6.cnf                            
p   mysql-server-5.6                                         - MySQL database server binaries and system database setup                                      
p   mysql-server-core-5.6                                - MySQL database server binaries                                                                
p   mysql-source-5.6                                        - MySQL source                                                                                  
p   mysql-testsuite-5.6             

mysql-sourceとmysql-testsuiteはいらなそうなのでその他を入れる

インストール

$sudo aptitude install -y mysql-client-5.6 mysql-client-core-5.6 mysql-common-5.6 mysql-server-5.6 mysql-server-core-5.6

途中でrootのパスワードを聞かれるので入力する

確認

vagrant@vagrant-ubuntu-trusty-64:~$ service mysql status
mysql start/running, process 7262

start/running になっていればOK

MySQL設定

外部からの接続を許可(MySQL)

$ sudo vim /etc/mysql/my.cnf
bind-address            = 0.0.0.0

再起動

$ sudo service mysql restart
mysql stop/waiting
mysql start/running, process 7440

外部からの接続を許可(ユーザー)

ユーザーに対しても同様。パスワードは任意のものを

vagrant@vagrant-ubuntu-trusty-64:~$ mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 44
Server version: 5.6.30-0ubuntu0.14.04.1 (Ubuntu)

mysql> grant all privileges on *.* to 'root'@'%' identified by '*****' with grant option;
Query OK, 0 rows affected (0.00 sec)

ホストから接続

$ mysql -h 127.0.0.1 -P3306 -u root -p

接続エラーがでなければ成功。ChefやらAnsibleやらDocker使ったほうが後々は楽かなと。

www.amazon.co.jp

dockerイメージのリポジトリ名とタグを設定する

Docker

Dockerの設定が完了したのでImageにタグをつけたい、またはDockerfileからビルドしたものの名前を付け忘れた、そんな時に。

$ docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
<none>                  <none>              a1e05daa2311        2 minutes ago       428.8 MB
ubuntu                  14.04               90d5884b1ee0        9 hours ago         188 MB

<none> は困るね、ということで

$ docker tag a1e05daa2313 hoge/ubuntu-mongodb:latest

とかやっておく。すると

$ docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
hoge/ubuntu-mongodb   latest              a1e05daa2311        3 minutes ago       428.8 MB
ubuntu                    14.04               90d5884b1ee0        9 hours ago         188 MB

当然ながら変更もできる、わけではない。

$ docker tag a1e05daa2313 fuga/ubuntu-mongodb:3.2.6
$ docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
fuga/ubuntu-mongodb   3.2.6               a1e05daa2311        10 minutes ago      428.8 MB
hoge/ubuntu-mongodb   latest              a1e05daa2311        10 minutes ago      428.8 MB

IMAGE_IDに対してタグをつけているだけなので、増殖する。 不要なIMAGEは docker rmi で消してしまおう。

$ docker rmi hoge/ubuntu-mongodb:latest
/* Responsive: yes */