20201125のdockerに関する記事は10件です。

Golangでtomlを読み込む

概要

dockerコンテナでgolangを動かしtomlを読み込んで標準フォーマットで出力する。

ファイル構成

今回はdockerを使ってコンテナ上で動かしますので以下のファイル構成で行うこととします。

goTest
  ├docker-compose.yml
  ├Dockerfile
  └src
   ├main.go
   ├config
   │  └testConfig.toml
   └tomlexec
      ├tomlexec.go
      └tomlexec_test.go

登場ファイル

主な登場ファイルはdockerファイルを除けば難しい事はなく、以下の4ファイルになります。
・main.go
・testConfig.toml
・tomlexec.go
・tomlexec_test.go

各ファイルの設定を見ていきましょう。

docker-compose.yml

docker-compose.yml
version: '3.7'
services:
  #golangの設定
  app:
    build: ./
    container_name: goTest
    tty: true
    volumes:
      - ../:/go/src/charts_server/src
    working_dir: /go/src/charts_server/src/goTest/src
    ports:
      - "8080:8080"
    command: go run main.go
    environment:
          - "GOPATH=/go/src/charts_server"
解説

細かい説明は省きますが、以下の通りとなります。
volumes:localのディレクトリとdockerコンテナのディレクトリの同期をここで行っています。
working_dir:ここで基準になるディレクトリを設定しています。
ports:アクセスする際のポートナンバーです。
environment:ここではdockerコンテナ内でのGOPATHを指定しています。今回は「/go/src/charts_server」

Dockerfile

FROM golang:latest
RUN mkdir /go/src/charts_server
WORKDIR /go/src/charts_server/src/goTest/src
ADD . /go/src/charts_server

ここに関してはdockerの設定を行っていますが、シンプルなものとなっていますので説明は不要かと思います。

main.go

main.go
package main

import (
    "goTest/src/tomlexec"
)

func main() {
    tomlexec.Exec()
}
解説

とてもシンプルです。
1階層下のパッケージ、tomlexecをインポートして、tomlexecパッケージのExec関数を呼び出しているだけです。

testConfig.toml

testConfig.toml
[TestToml]
No    = 1
Name  = "testName"

解説

今回はgoの構造体に合わせて上記のような設定をしています。
Noはint、Nameはstringとなっています。
TestTomlに関してはmapで言うkeyのようなものと思えば良いと思います。
TestTomlと言うキーの中に、NoNameと言うmapがあると思えば想像しやすいかもしれません。

tomlExec.go

tomlExec.go
package tomlexec

import (
    "fmt"

    "github.com/BurntSushi/toml"
)

// TConfig ...
type TConfig struct {
    TestToml *TomlConfig
}

// TomlConfig ...
type TomlConfig struct {
    No   int
    Name string
}

// Exec ...
func Exec() {
    var cfg TConfig
    _, err := toml.DecodeFile("./config/testConfig.toml", &cfg)
    if err != nil {
        fmt.Println(err)
    }

    fmt.Println(cfg.TestToml.Name)
}
解説

TConfigTomlConfigはそれぞれ、構造体の定義を行っています。
toml.DecodeFileで読み込むtomlファイルと読み込ませる構造体を指定しています。
今回は読み込んだ後にNameだけ標準出力するようにしています。

tomlexec_test.go

tomlexec_test.go
package tomlexec

import (
    "os"
    "path/filepath"
    "testing"
)

func TestExec(t *testing.T) {
    apath, _ := filepath.Abs("../")
    os.Chdir(apath)
    Exec()
}
解説

tomlExecパッケージのExec関数を呼んでいるだけの簡単なtestです。
ポイントはfilepath.Abs("../")os.Chdir
これをやらないとエラーとなってしまいます。
理由はmain.goの実行場所とこのテストの実行場所が違うと言うことです。
最初に挙げたファイル構成を見て頂けるとわかりますが、main.goよりも1階層深い場所にこのテストがあります。
このまま実行すると./config/testConfig.tomlがどこにあるのかプログラム上では分からなくなり、エラーとなりますが、filepath.Abs("../")で1階層下の絶対パスを取得し、それを引数にos.Chdirでワーキングディレクトリを指定することで同じように読むことが可能となります。

実行

goTest> docker-compose up
Starting goTest ... done
Attaching to goTest
goTest | testName

testNameが表示されているのでしっかり読めていますね。

テスト

手順は
1.起動しているコンテナを検索
2.コンテナの中に入る
3.テストのあるディレクトリまで移動してテストを実行
となります。

1.起動しているコンテナを検索
goTest> docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
c38c50f20df5        gotest_app          "go run main.go"    24 hours ago        Up 27 minutes       0.0.0.0:8080->8080/tcp   goTest 
2.コンテナの中に入る
goTest> docker exec -ti c38c50f20df5 bash
root@c38c50f20df5:/go/src/charts_server/src/goTest/src# 
3.テストのあるディレクトリまで移動してテストを実行
goTest/src# ls 
charts_server  config  main.exe  main.go  tmp  tomlexec
goTest/src# cd tomlexec/
goTest/src/tomlexec# go test -v
=== RUN   TestExec
testName
--- PASS: TestExec (0.01s)
PASS
ok      goTest/src/tomlexec     0.011s

ここまでで終了です。
テストも通りました。

一応上記のコードはgitで公開していますので、見たい方は参考までにどうぞ。

git

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

docker、Golangでtomlを読み込む

概要

dockerコンテナでgolangを動かしtomlを読み込んで標準フォーマットで出力する。

ファイル構成

今回はdockerを使ってコンテナ上で動かしますので以下のファイル構成で行うこととします。

goTest
  ├docker-compose.yml
  ├Dockerfile
  └src
   ├main.go
   ├config
   │  └testConfig.toml
   └tomlexec
      ├tomlexec.go
      └tomlexec_test.go

登場ファイル

主な登場ファイルはdockerファイルを除けば難しい事はなく、以下の4ファイルになります。
・main.go
・testConfig.toml
・tomlexec.go
・tomlexec_test.go

各ファイルの設定を見ていきましょう。

docker-compose.yml

docker-compose.yml
version: '3.7'
services:
  #golangの設定
  app:
    build: ./
    container_name: goTest
    tty: true
    volumes:
      - ../:/go/src/charts_server/src
    working_dir: /go/src/charts_server/src/goTest/src
    ports:
      - "8080:8080"
    command: go run main.go
    environment:
          - "GOPATH=/go/src/charts_server"
解説

細かい説明は省きますが、以下の通りとなります。
volumes:localのディレクトリとdockerコンテナのディレクトリの同期をここで行っています。
working_dir:ここで基準になるディレクトリを設定しています。
ports:アクセスする際のポートナンバーです。
environment:ここではdockerコンテナ内でのGOPATHを指定しています。今回は「/go/src/charts_server」

Dockerfile

FROM golang:latest
RUN mkdir /go/src/charts_server
WORKDIR /go/src/charts_server/src/goTest/src
ADD . /go/src/charts_server

ここに関してはdockerの設定を行っていますが、シンプルなものとなっていますので説明は不要かと思います。

main.go

main.go
package main

import (
    "goTest/src/tomlexec"
)

func main() {
    tomlexec.Exec()
}
解説

とてもシンプルです。
1階層下のパッケージ、tomlexecをインポートして、tomlexecパッケージのExec関数を呼び出しているだけです。

testConfig.toml

testConfig.toml
[TestToml]
No    = 1
Name  = "testName"

解説

今回はgoの構造体に合わせて上記のような設定をしています。
Noはint、Nameはstringとなっています。
TestTomlに関してはmapで言うkeyのようなものと思えば良いと思います。
TestTomlと言うキーの中に、NoNameと言うmapがあると思えば想像しやすいかもしれません。

tomlExec.go

tomlExec.go
package tomlexec

import (
    "fmt"

    "github.com/BurntSushi/toml"
)

// TConfig ...
type TConfig struct {
    TestToml *TomlConfig
}

// TomlConfig ...
type TomlConfig struct {
    No   int
    Name string
}

// Exec ...
func Exec() {
    var cfg TConfig
    _, err := toml.DecodeFile("./config/testConfig.toml", &cfg)
    if err != nil {
        fmt.Println(err)
    }

    fmt.Println(cfg.TestToml.Name)
}
解説

TConfigTomlConfigはそれぞれ、構造体の定義を行っています。
toml.DecodeFileで読み込むtomlファイルと読み込ませる構造体を指定しています。
今回は読み込んだ後にNameだけ標準出力するようにしています。

tomlexec_test.go

tomlexec_test.go
package tomlexec

import (
    "os"
    "path/filepath"
    "testing"
)

func TestExec(t *testing.T) {
    apath, _ := filepath.Abs("../")
    os.Chdir(apath)
    Exec()
}
解説

tomlExecパッケージのExec関数を呼んでいるだけの簡単なtestです。
ポイントはfilepath.Abs("../")os.Chdir
これをやらないとエラーとなってしまいます。
理由はmain.goの実行場所とこのテストの実行場所が違うと言うことです。
最初に挙げたファイル構成を見て頂けるとわかりますが、main.goよりも1階層深い場所にこのテストがあります。
このまま実行すると./config/testConfig.tomlがどこにあるのかプログラム上では分からなくなり、エラーとなりますが、filepath.Abs("../")で1階層下の絶対パスを取得し、それを引数にos.Chdirでワーキングディレクトリを指定することで同じように読むことが可能となります。
※pathが崩れてtestが通らない所を、通すのが目的なのでassertなどは記載していません。

実行

goTest> docker-compose up
Starting goTest ... done
Attaching to goTest
goTest | testName

testNameが表示されているのでしっかり読めていますね。

テスト

手順は
1.起動しているコンテナを検索
2.コンテナの中に入る
3.テストのあるディレクトリまで移動してテストを実行
となります。

1.起動しているコンテナを検索
goTest> docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
c38c50f20df5        gotest_app          "go run main.go"    24 hours ago        Up 27 minutes       0.0.0.0:8080->8080/tcp   goTest 
2.コンテナの中に入る
goTest> docker exec -ti c38c50f20df5 bash
root@c38c50f20df5:/go/src/charts_server/src/goTest/src# 
3.テストのあるディレクトリまで移動してテストを実行
goTest/src# ls 
charts_server  config  main.exe  main.go  tmp  tomlexec
goTest/src# cd tomlexec/
goTest/src/tomlexec# go test -v
=== RUN   TestExec
testName
--- PASS: TestExec (0.01s)
PASS
ok      goTest/src/tomlexec     0.011s

ここまでで終了です。
テストも通りました。

一応上記のコードはgitで公開していますので、見たい方は参考までにどうぞ。

git

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

すでに作ったLaravelプロジェクトにLaradockいれてEC2でデプロイする

背景

Laravelでプロジェクトつくって、EC2にデプロイする手順は下記の通りかと思っています。(間違っていたらすいません)
1.Laradockをいれる。
2.プロジェクトをLaradock配下でcomposerで作成する。
3.作成したプロジェクトをコーディングしていく。
4.githubにあげる。
5.EC2/VPCでgit cloneしてLaradock起動する。

最初にLaradockで作っていくのが良い例かと思いますが、
初心者であった自分はdockerはポートフォリオ作成と並行して勉強していたので、あとからdockerをプロジェクトに入れることが必要になりました。。。
Laradockを最初から使わずに制作していた自分みたいな人にむけて、他の人の参考にでもなればと思い、メモとして残しておきたいと思います。

参考にしたサイト

大いに参考にさせていただいたサイトは次のものです。
既存のLaravelプロジェクトにLaradockを導入する方法は下記のとおりです。

A : https://qiita.com/segur/items/600eaef70fef896f2d0d
このあとにLaradockのsubmoduleが読み込まれないところで詰まった点については下記のサイトを参考にしました。
B : https://karoten512.hatenablog.com/entry/2017/11/09/013845

手順

メモなので、ざっと書きます。
手順は下記の13の手順です。
①すでにローカル環境でLaravevlプロジェクトを作成する。
② 参考サイトAを参考にルートプロジェクト下にLaradockを入れる。(git submoduleする)
③ githubにLardockを入れたプロジェクトごとpushする。(git push(
④ AWS/EC2を起動する。その時使ったインスタンスは,t2.smallです。理由はcomposer installするときにt2.microだと固まってしまうからです。(EC2/VPCの作成)
⑤ インスタンス内で参考サイトBをgit clone --recursive{git repository url}をする。
⑥ git cloneしたプロジェクト配下にlaradockがあるので、そのなかにcd(cd プロジェクト/laradock)
⑦ docker-composeでイメージ立ち上げる。(docker-compose up -d nginx mysql)
⑧ ルート権限にする。(sudo su)
⑨ docker-compose exec workspace bashで作業ディレクトリに入る
⑩ rootで/home/ubuntu/プロジェクト名/laradock に移動して、composer install
⑪ php artisan key:generateする。
⑫ EC2のグローバルIPにブラウザでアクセスする。
⑬ 作ったアプリが確認できます。

終わりに

次からはDockerイメージ作成してからプロジェクト作成します。。。
以上

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

gerritとdockerを使って用途別のバージョン管理サイトを作ってみた。

初めに

この記事ではwindows版で書いています。
また、dockerはインストール済みの認識で書いています。
gerritとは、Googleが作成したコードレビューツールです。

目次

  1. この記事のターゲット
  2. なぜこの記事を書いたのか
  3. コンテナの用意
  4. バージョン管理サイトにアクセス
  5. gitの設定
  6. プロジェクトの作成
  7. プロジェクトのクローン
  8. 変更点をコミット
  9. コミットをマージ
  10. 最後に

1.この記事のターゲット

主に整理整頓が苦手な人向け

2.なぜこの記事を書いたのか

(長い上に本編に関係はないので読み飛ばしてください)
私は整理整頓が苦手です。
例えば部屋の片付け。
出したら出したまま。
前にどこに置いてあったかなんて一切覚えていません。
それ故に物を無くしがちです。
ただ、物はどこにあるか把握はしたいという欲張りです。
そこである考察が浮かびました。
「部屋が片付けられない」なら「物ごとに部屋を作ればいい」
そうすれば物を出したままにしようがどこに何があるか分かります。
これは部屋の片付けを例にしています。
よく考えるとこれは普段の業務にも関係していて、
自分のPCを見てみると「開発したら開発したまま」でした。
そこで「開発物を入れておく部屋」が欲しいと思いました。
また、当然その開発物は自分以外の誰かに見てもらいたい!と思い、githubを始めました。
ただ、誰かに見られる部屋は綺麗にしておきたいです。
(よく、小学生の頃とかに友達が遊びに来るからと散らかっている物を一旦押し入れに入れて部屋の見た目だけでも綺麗にするのと似た感情です。)
そこで自分の中でgithubだけは綺麗な部屋にしておいて別に「開発したら開発したまま」の部屋が欲しくなり探していて見つけた方法がgerritとdockerを使った方法です。

gerritで色々開発して上手く行った物等のプロジェクトをgithubに投稿することで
githubを「外から見られる綺麗にしたい部屋」
gerritが「開発したら開発したままの部屋」
という風に使い分けるのが最終目標です。

3.コンテナの用意

ますはイメージをプルしてきます。詳しい情報は公式サイトを参照してください。

docker pull gerritcodereview/gerrit[:version]-ubuntu20

末尾のubuntu20をcentos8にするとcentos版のイメージがプルできます。
次にコンテナを作成します。

docker run --name <作成したいコンテナ名> -d -p 8080:8080 -p 29418:29418 <IMAGE ID>

例えばpython用のバージョン管理サイトを作成したい場合は

docker run --name python_gerrit -d -p 8080:8080 -p 29418:29418 <IMAGE ID>

という風にコンテナに名前を付けます。

4.バージョン管理サイトにアクセス

バージョン管理サイト(localhost:8080)をブラウザで開きます。
次にSSH KEYを設定するために設定ページ(localhost:8080/settings/)に遷移します。
スクロールしていくとSSH Keysという場所があるのでそこまで遷移させます。

5.gitの設定

まずはコンテナに入ります。

docker exec -u 0 -it <CONTAINER ID> /bin/sh

SSH Keyの生成

# ssh-keygen -t rsa
# cat ~/.ssh/id_rsa.pub

ここでのcatの結果を4のSSH KeysにあるNew SSH keyに貼り付けてADD NEW SSH KEYをクリックします。

gitのアカウントの設定

# git config --global user.email "admin@example.com"
# git config --global user.name "admin"

6.プロジェクトの作成

下記のコマンドでプロジェクトを作成します。

# ssh -p 29418 admin@localhost gerrit create-project --empty-commit <プロジェクト名>

作成したプロジェクトはプロジェクト管理画面(localhost:8080/admin/repos)で確認できます。

7.プロジェクトのクローン

プロジェクト管理画面(localhost:8080/admin/repos)で先ほど作成したプロジェクトをクリックします。
そうするとDownloadと書かれたページに遷移するのでSSHタブのClone with commit-msg hookにあるコマンドをコピーしてシェルで実行します。

# git clone "ssh://admin@○○:29418/<プロジェクト名>" && scp -p -P 29418 admin@○○:hooks/commit-msg "<プロジェクト名>/.git/hooks/"

8.変更点をコミット

今回はtestとしてtestブランチを作成してtest.txtをコミットします。

# git checkout -b test
# echo "test" > test.txt
# git add test.txt
# git commit -m "test commit"
# git push ssh://admin@localhost:29418/<プロジェクト名> test(リモートにブランチが無い場合)
# git push ssh://admin@localhost:29418/<プロジェクト名> HEAD:refs/for/test(リモートにブランチが有る場合)

コミットが出来たかはコミット一覧ページ(localhost:8080/q/status:open)にて確認できます。(なお、リモートにブランチが無い場合はブランチが作成されるのでこちらのコミット一覧ページには表示されません。)localhost_8080_q_status_open(Pixel 2 XL).png

9.コミットをマージ

gerritでは、コミット1つ1つに対してレビューしなければマージすることができません。
そのためコミット一覧ページ(localhost:8080/q/status:open)で先ほどのコミットをクリックするとレビューが可能です。
レビュー後該当ページのCODE-REVIEWをクリックしSUBMITをクリックすることでコミットがマージされます。

右上のCODE-REVIEWをクリック

localhost_8080_q_status_open(Pixel 2 XL) (1).png

右上のSUBMITをクリック

localhost_8080_q_status_open(Pixel 2 XL) (2).png

中央のCONTINUEをクリック

localhost_8080_q_status_open(Pixel 2 XL) (3).png

マージ完了

localhost_8080_q_status_open(Pixel 2 XL) (4).png

10.最後に

用途ごとに3のようにコンテナを作成する事でバージョン管理サイトを用意することができます。
gerritは今回紹介した用途の他にもたくさんの使用方法があるので色々触ってみてください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【備忘録】docker環境にサーバーを立てる時のIP指定注意

はじめに

dockerでサーバーを立てるときにIPアドレスの指定でハマってしまったので備忘録として残します

docker内でサーバーを立てる時のIPアドレスは「0.0.0.0」にする

以下のようにdocker内では、0.0.0.0を指定しておけば、ホスト環境の「127.0.0.1:繋ぎ込みしたポート番号」からアクセスできるようになる

djangoの場合

サーバー起動時のコマンド
$python manage.py runserver 0:8000
# 0 = 0.0.0.0を表す

jupyter-labの場合

/root/.jupyter/jupyter_notebook_config.py
c.NotebookApp.allow_root = True
c.NotebookApp.ip = "0.0.0.0"
c.NotebookApp.token = "xxxx"
c.NotebookApp.port = 8888
c.NotebookApp.open_browser = False
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

何も知らない人のために、ちょっとだけ触ったことがある人がDockerを教えてみる ~Dockerは便利編~

はじめに

Dockerは名前だけ聞いたことがあるという人が対象です。
Dockerとは何か?Dockerは何ができるのか? Dockerはどうやって使うのか?といったことを説明していきます。
この記事を読んでDockerは便利ということを知っていただけたらと思います。

私はDockerを業務で使ったことがあるわけでもなく、ちゃんと勉強しているわけでもないです。
ただちょっとだけ触ってみたことがある人です。なので内容が間違っていたり、不親切な部分があると思います。
その点はご了承ください。

Dockerとは何か?

まずはじめにDockerとは何でしょうか?
Wikipediaには以下のように書かれています。

Docker(ドッカー)は、コンテナ仮想化を用いてアプリケーションを開発・配置・実行するためのオープンソースソフトウェアあるいはオープンプラットフォームである。

Docker Wikipediaより

なんとなくコンテナ仮想化という言葉が重要になってくることがわかりますよね。

仮想マシン

コンテナ仮想化を説明する前に、それが登場する以前から使われていた仮想マシンについて説明します。

仮想マシンは、コンピュータ上で仮想なコンピュータを動作する技術です。具体的なツールとしてはVirtualBoxがありますね。前に使ったことがあるのですが、仮想マシンに物理的なリソースをどれくらい割り当てるのかを決めて、UbuntuなどのOSをインストールします。Windows上でUbuntuが使えるようになる、みたいな感じです。ハイパーバイザ型とホストOS型があるのですが、どちらも一つのコンピュータ上に複数のOSが存在しているということになります。

企業では仮想マシンにアプリケーションを実行するための環境を構築し、それを仮想マシンイメージとして共有していました。しかし、それらは巨大で扱いにくかったみたいです。

そこでもっと良い方法がないかということで、コンテナ仮想化が登場しました。

コンテナ仮想化

コンテナ仮想化では隔離さらた実行環境をコンテナと呼んでいます。
仮想マシンと何が違うのかというと、動作するコンテナはただのプロセスであり、アプリケーションを動作するために必要な最小限のプログラムだけを含みます。つまりは軽量で扱いやすくパフォーマンスもよくなります。

(文章が適当になってしまったのですが、詳しいことは仮想マシンとコンテナ仮想化の違いで検索してみてください。わかりやすく解説していたり、もう少し深く踏み込んだ記事が出てきます。私も実はよくわかっていないので、これを機に調べたいと思います。)

Dockerは何ができるのか?

Dockerとは先ほども書いたように、コンテナ仮想化を実行するためのアプリケーションになってきます。
しかしこれだけでは、何ができるのか?ということはすぐにイメージできないと思います。
一番は実際に使ってみることだと思いますが、簡単にできることをあげてみます。

  • 新しい言語を触ってみたいが環境構築が面倒くさいので、Dockerで環境を作る (公式がイメージ(後で説明します)を提供していれば、一瞬で終わりますし、すぐに消すこともできます。)
  • 開発環境をDockerで作成し、他の人に共有する

みたいなことができます。

Dockerはどうやって使うのか?

では実際に触ってみたいと思います。
試しにGo言語でWEBサーバーを作っていきます。

インストール

公式サイトからインストーラをダウンロードして、インストーラに従ってインストールをします。環境によってインストールの仕方があると思うので、この記事では詳しく書かないです。
これ以降は、Dockerが起動して、Docker Hubにログインしている状態で始めていきます。

イメージのPull

Dockerでコンテナを作るためには、まずイメージと呼ばれるものが必要です。イメージとは、コンテナのオリジナルのようなもので、そこからコンテナを作成していきます。イメージはDocker HubからPullするか、Dockerfileから作成することができます。ここではDocker HubからPullする方法でやります。

私はGo言語の環境を作りたいので、Docker HubからGoのイメージを探すところから始めます。Docker Hubにいき、"golang"と検索するとGo言語に関するイメージが出てくると思います。一番上に出てくる、公式が出しているもの(Docker Official Imagesと書いているもの)が確実です。Go言語の場合は、これですね。

ではターミナルで以下のコマンドを打ってみましょう。

$ docker pull golang
Using default tag: latest
latest: Pulling from library/golang
~~ 省略 ~~
Status: Downloaded newer image for golang:latest
docker.io/library/golang:lates

これでイメージを引っ張ってこれました。
以下のコマンドでイメージを確認することができます。

$ docker image ls
REPOSITORY       TAG        IMAGE ID            CREATED             SIZE
golang           latest     6d8772fbd285        6 days ago          839MB

コンテナの作成

ではここからイメージを使ってコンテナを作成していきます。

$ docker run -d --name mygolang golang:latest
5afbb8c150b5f212dde298ab692a9bf81a2439be292ec6f9b029239fed74b368

-dはコンテナを作成後に、コンテナのプロンプトからデタッチします。
--nameはコンテナにわかりやすく名前をつけることができます。
-itはコンテナのプロンプトに入れるようになります。

以下のコマンドでコンテナが作成されたことを確認できます。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS               NAMES
b51ede21bac7        golang:latest       "bash"                   3 seconds ago       Up 2 seconds                                     mygolang

以下のコマンドで作成したコンテナを、止めたり起動したりできます。

$ docker stop mygolang
$ docker start mygolang

コンテナを起動できたところでコンテナのプロンプトに入ってみましょう。

$ docker attach mygolang
root@b51ede21bac7:/go# 

抜ける時は ctrl + pを押してctrl + qです。
これでイメージファイルからコンテナを作成することができました。

便利なVSCodeの拡張機能の紹介

ここでDockerを使う上で便利なVSCodeの拡張機能を紹介します。

Docker for Visual Studio Code

Docker for Visual Studio Codeを見るとわかるのですが、VSCode上からコンテナを作成したりなど、コマンドを打たなくてもよくなります。

Remote - Containers

Remote - ContainersはコンテナのファイルシステムにVSCodeからアクセスできるようになります。ファイルの共有は今まで触れていなかったのですが、簡単に試すならRemote - Containersを使ってアクセスし、ファイルを作成などができます。

demo.gif

GoでWEBサーバーの作成

ではGoでWEBサーバーを作っていきます。
最終的にコンテナでHTTPサーバーをたて、使っているブラウザからアクセスできるようにしたいです。
そのためにはまず、ポートフォワーディングする必要があります。
ホストのポートとコンテナのポートを繋げていきます。

まずは先ほど作成したコンテナを止めて、削除します。

$ docker stop mygolang
$ docker rm mygolang

そして-pオプションを追加して作成し直します。
-pはホストのポート:コンテナのポートで指定します。

$ docker run -d -it --name mygolang -p 9999:8888  golang:latest

先ほど紹介したRemote - Containersでコンテナにアクセスします。
root直下に以下のファイルを作成しましょう。

main.go
package main

import (
    "fmt"
    "log"
    "net/http"
)

func hello(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "Hello World")
}

func main() {
    http.HandleFunc("/", hello)
    log.Fatal(http.ListenAndServe(":8888", nil))
}

コンパイルして実行しましょう。

root@b759999e00a6:/# go build main.go 
root@b759999e00a6:/# ./main

これで簡易的なWEBサーバーを起動しました。
Chromeなどでlocalhost:9999にアクセスしてみてください。
Hello Worldが表示されたと思います。

まとめ

この記事を通して、Dockerって便利だな、Dockerを使ってこんなこともできそうだな、と思っていただけたら嬉しいです。私自身も〇〇言語を試してみようというときに、まずはDockerで楽して環境構築しています。環境構築が楽だと、様々な技術に手軽に触れるようになります。

次回

Docker Compose, network, volumeについてやる予定です。
またその後に、現在勉強中のkubernetesについても書けそうであれば、書きます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Docker】研修メモ

目次

仮想化

  • 1台のサーバ/PC(物理マシン)を複数台の仮想的なサーバ/PC(論理マシン)に分割して利用する仕組み

  • それぞれの仮想マシンではOSやアプリケーションを実行させることができ、
    あたかも独立したコンピュータのように使用することができる

仮想化のメリット

  • リソースの有効活用

  • 省スペース、省電力

  • 高い柔軟性

コンテナ型仮想化

特徴

コンテナ型仮想化は仮想マシンの中でゲストOSを起動することをせず、
ホストOS上で「コンテナ」と呼ばれるアプリケーション実行用の隔離空間を作成
※ゲストOSを必要としないのはホストOSとカーネルを共用するため

コンテナ型仮想化のメリット

  • オーバヘッドが少ない
    仮想マシン上でのゲストOS起動を行わないため、各マシンごとの最低限のリソース割り当てがなく軽量に動作

  • 構築時の時間短縮
    ゲストOSのインストールや起動にかかる時間がない
    構築・起動が高速

Dockerとは

  • オープンソースの仮想化ソフトウェア

  • リポジトリ(DockerHub)に、構築済みのコンテナ
    イメージを保存・共有できる。また、ベースとなるイメージは多数公開されているため、シンプルな構成なら構築作業がほぼ不要

  • コンテナの作成からプロダクトのインストール・設定までの手順を、
    “Dockerfile”というテキストファイルに定義できる(インフラのコード化)
    Dockerfileを用いることで、Dockerが導入されている環境であればどこであっても、準備した環境を稼働させられるため携帯性が高くなる

アジャイル×Docker

  • CI/CD
    修正したプログラム(テストされたもの)のリリース
    (ビルド・デプロイ)の繰り返しを自動化して効率化すること

  • CI(継続的インテグレーション)

  • CD(継続的デリバリー)
    手軽に変更ができる

Dockerとアジャイルは親和性が高い

Dockerコマンド

コンテナの確認

> docker ps [オプション]

#Example

> docker ps -a
オプション 意味
-a 停止中含め全て

イメージの確認

> docker images

イメージの取得

> docker pull [オプション] <イメージ[:タグ]>

#Example

> docker pull python:3.6-slim

新しいコンテナの起動

> docker run [オプション] <イメージ[:タグ]> [コマンド]

#Example

> docker run -itd -p 5000:80 --name pycontainer python:3.6-slim
オプション 意味
-i コンテナの標準入力にアタッチ
-t 疑似ターミナルを割り当て
-d コンテナをバックグラウンドで実行(デタッチドモード)
-p コンテナのポートをローカルに公開(ポートのマッピング)"ホスト側ポート:コンテナ側ポート"で指定
--name コンテナに名前をつける

Dockerfileからイメージを構築

> docker build [オプション] <Dockerfileが置かれているディレクトリパス>

#Example

> docker build -t evo/python:1.0 dockerdir
オプション 意味
-t   '名前:タグ' 形式で生成するイメージに名前とタグをつける

起動中のコンテナ上でコマンドを実行

> docker exec [オプション] <コンテナ名orコンテナID> <コマンド>

#Example

> docker exec -it ubuntu bash
オプション 意味
-i アタッチしていなくても標準入力をオープンにし続ける
-t 疑似ターミナルを割り当て
-d コマンドをバックグラウンドで実行(デタッチドモード)

コンテナ上で実行中のBashを終了する(ホストに戻る) ctrl + D

ホスト/コンテナ間でファイルをコピーする

#ホストからコンテナ

> docker cp <ホストパス> <[コンテナ名orコンテナID:]パス>

#コンテナからホスト

> docker cp <[コンテナ名orコンテナID:]パス> <ホストパス>

#Example

> docker cp conf.ini /var/www

> docker cp ubuntu:/var/www/log/ log/

作成済みコンテナの起動

> docker start [オプション] <コンテナ名orコンテナID> [コンテナ名orコンテナID...]

#Example

> docker start ubuntu
オプション 意味
-a 標準出力にアタッチする
-i コンテナの標準入力にアタッチ

コンテナの停止

> docker stop [オプション] <コンテナ名orコンテナID> [コンテナ名orコンテナID...]

#Example

> docker stop ubuntu

コンテナの削除

> docker rm [オプション] <コンテナ名orコンテナID> [コンテナorコンテナID...]

#Example

> docker rm ubuntu

イメージの削除

> docker rmi [オプション] <イメージ名:タグorイメージID> [イメージ名:タグorイメージID...]

#Example

> docker rmi evo/python:1.0
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Docker】メモ

目次

仮想化

  • 1台のサーバ/PC(物理マシン)を複数台の仮想的なサーバ/PC(論理マシン)に分割して利用する仕組み

  • それぞれの仮想マシンではOSやアプリケーションを実行させることができ、
    あたかも独立したコンピュータのように使用することができる

仮想化のメリット

  • リソースの有効活用

  • 省スペース、省電力

  • 高い柔軟性

コンテナ型仮想化

特徴

コンテナ型仮想化は仮想マシンの中でゲストOSを起動することをせず、
ホストOS上で「コンテナ」と呼ばれるアプリケーション実行用の隔離空間を作成
※ゲストOSを必要としないのはホストOSとカーネルを共用するため

コンテナ型仮想化のメリット

  • オーバヘッドが少ない
    仮想マシン上でのゲストOS起動を行わないため、各マシンごとの最低限のリソース割り当てがなく軽量に動作

  • 構築時の時間短縮
    ゲストOSのインストールや起動にかかる時間がない
    構築・起動が高速

Dockerとは

  • オープンソースの仮想化ソフトウェア

  • リポジトリ(DockerHub)に、構築済みのコンテナ
    イメージを保存・共有できる。また、ベースとなるイメージは多数公開されているため、シンプルな構成なら構築作業がほぼ不要

  • コンテナの作成からプロダクトのインストール・設定までの手順を、
    “Dockerfile”というテキストファイルに定義できる(インフラのコード化)
    Dockerfileを用いることで、Dockerが導入されている環境であればどこであっても、準備した環境を稼働させられるため携帯性が高くなる

アジャイル×Docker

  • CI/CD
    修正したプログラム(テストされたもの)のリリース
    (ビルド・デプロイ)の繰り返しを自動化して効率化すること

  • CI(継続的インテグレーション)

  • CD(継続的デリバリー)
    手軽に変更ができる

Dockerとアジャイルは親和性が高い

Dockerコマンド

コンテナの確認

> docker ps [オプション]

#Example

> docker ps -a
オプション 意味
-a 停止中含め全て

イメージの確認

> docker images

イメージの取得

> docker pull [オプション] <イメージ[:タグ]>

#Example

> docker pull python:3.6-slim

新しいコンテナの起動

> docker run [オプション] <イメージ[:タグ]> [コマンド]

#Example

> docker run -itd -p 5000:80 --name pycontainer python:3.6-slim
オプション 意味
-i コンテナの標準入力にアタッチ
-t 疑似ターミナルを割り当て
-d コンテナをバックグラウンドで実行(デタッチドモード)
-p コンテナのポートをローカルに公開(ポートのマッピング)"ホスト側ポート:コンテナ側ポート"で指定
--name コンテナに名前をつける

Dockerfileからイメージを構築

> docker build [オプション] <Dockerfileが置かれているディレクトリパス>

#Example

> docker build -t evo/python:1.0 dockerdir
オプション 意味
-t   '名前:タグ' 形式で生成するイメージに名前とタグをつける

起動中のコンテナ上でコマンドを実行

> docker exec [オプション] <コンテナ名orコンテナID> <コマンド>

#Example

> docker exec -it ubuntu bash
オプション 意味
-i アタッチしていなくても標準入力をオープンにし続ける
-t 疑似ターミナルを割り当て
-d コマンドをバックグラウンドで実行(デタッチドモード)

コンテナ上で実行中のBashを終了する(ホストに戻る) ctrl + D

ホスト/コンテナ間でファイルをコピーする

#ホストからコンテナ

> docker cp <ホストパス> <[コンテナ名orコンテナID:]パス>

#コンテナからホスト

> docker cp <[コンテナ名orコンテナID:]パス> <ホストパス>

#Example

> docker cp conf.ini /var/www

> docker cp ubuntu:/var/www/log/ log/

作成済みコンテナの起動

> docker start [オプション] <コンテナ名orコンテナID> [コンテナ名orコンテナID...]

#Example

> docker start ubuntu
オプション 意味
-a 標準出力にアタッチする
-i コンテナの標準入力にアタッチ

コンテナの停止

> docker stop [オプション] <コンテナ名orコンテナID> [コンテナ名orコンテナID...]

#Example

> docker stop ubuntu

コンテナの削除

> docker rm [オプション] <コンテナ名orコンテナID> [コンテナorコンテナID...]

#Example

> docker rm ubuntu

イメージの削除

> docker rmi [オプション] <イメージ名:タグorイメージID> [イメージ名:タグorイメージID...]

#Example

> docker rmi evo/python:1.0
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

メモ:Dockerイメージをまるっと削除したい

Dockerコンテナ乱立してるなー
Dockerイメージ使ってないやつ多いなー
って時にやる3コマンド

# コンテナ停止
docker ps -q | xargs docker stop
# コンテナ削除
docker ps -qa | xargs docker rm
# イメージ削除
docker images -q | xargs docker rmi
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】Mysql2::Error::ConnectionErrorの解消

Railsアプリにバリデーションを定義した後の、テストデータ登録の成功が目的の備忘録です。その為、バリデーションの定義、記述は終わっている状態です。

データ保存したいのに、Mysql2に接続できない

Docker環境下のRailsアプリで、app/modelsにバリデーションを定義し、動作チェックの為にMySQLにデータ登録を試みました。そうしたら.....

Mysql2::Error::ConnectionError at /Unknown MySQL server host 'db' (0)

MySQLに繋がってないよと怒られました。

全く同じエラーにハマっている方も居ましたが、解決策は載っていません。
記事に載っていたdocker-compose upを実践するも、dockerは正常に起動していました。

いずれにせよ、データが登録できていないので、次はデータベースのチェックを行いました。

①rails db:create
②rails db:migrate

しかし、ダメでした。
下記はrails db:create実行後にターミナルに出力されたエラー

Unknown MySQL server host 'db' (0)
Couldn't create 'myapp_development' database. Please check your configuration.
rails aborted!
Mysql2::Error::ConnectionError: Unknown MySQL server host 'db' (0)
/Users/athlaliel/test/qa-coin/bin/rails:9:in `<top (required)>'
/Users/athlaliel/test/qa-coin/bin/spring:15:in `<top (required)>'
bin/rails:3:in `load'
bin/rails:3:in `<main>'
Tasks: TOP => db:create
(See full trace by running task with --trace)

この後も、色々試した結果、原因が分かりました。

Docker環境でアプリを作成しているのに、実際はローカル環境でひたすらコマンドを叩いていました。Docker上のコンテナでMySQLも管理されてる以上、見つかるわけがなかったです。

下記のコマンドを順に実行する事で無事にデータベースは作成され、更新も可能となりました。

①docker-compose exec web rails db:create 

②docker-compose exec web rails db:migrate

バリデーションのデータ登録

データベースがDocker上に出来たので、テストデータを登録しバリデーションが機能しているか試します。rails consoleを起動し、テストデータを登録していきます。

バリデーションに記述する文言はここでは書きませんが、変数を定義して<モデル名.create>と入力します。
このコマンドでデータ登録が成功すれば、SQLと同じ文言が表示され、データの保存まで行います。その為、別途<モデル名>.saveコマンドを入力する必要はありません。
validate.png

validate2.png
もしエラーが起きたら、下記コマンドでチェックして原因の追求を行います。

pry(main)> <モデル名>.errors

※user.rbというmodelsファイルがあれば、user.errorsとターミナルに入力します。

validate3.png

Mysql2::Error::ConnectionErrorのようなエラーに遭遇したら、自分が今どの環境で作業しているかのチェックを行ってみると良いでしょう。

参考記事
Unknown MySQL server host 'db' (0)エラーが消えない
Active Record バリデーション

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む