S3のバケットをローカルに一括コピーする
課題
AWSのS3にバケットを作成したが、ローカルに保存して作業する必要が発生した。
対応
1ファイルずつならAWSのコンソールからダウンロードも可能だが、ファイル数が多い場合はAWS CLIで 取得する。バケットの中身を一括で取得するなら syncコマンドがよい。
AWS CLIセットアップ
この辺を参考にして aws configure
する
docs.aws.amazon.com
実行
#バケット保存先となるローカルディレクトリに移動 $ cd <任意のディレクトリ> #バケット一覧を確認 $ aws s3 ls #同期実行 $ aws s3 sync s3://バケット名/ ./
上記は S3からローカルへ
である。
同期元と同期先を間違えると消えちゃうような気がするので注意(未確認)。
その他
s3 sync
じゃなくても移動とかコピーとか通常のLinuxコマンドみたいのが一通りあるので
細かいことをしたい場合はそっちを使う。
$ aws s3 help
Editing Swagger UIを使ったAPI仕様書の閲覧
はじめに
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 1.13でCLIが改善されたとの記事があったのでお試し。
https://www.infoq.com/jp/news/2017/02/docker-1.13
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のデータをリストアする
課題
既存の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化する
目的
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!
と表示されたら成功。
Golangの公式Dockerファイルがよろしくやってくれるので、 余計なことしないならプロジェクトのディレクトリ上でdockerビルドするだけでいい感じ。 なんというか別にEcho関係ないやん、という結論に。。
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 セットアップ
$ 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使ったほうが後々は楽かなと。