20200926のdockerに関する記事は4件です。

Circle CIのDockerコンテナにsshでアクセスしてデバッグする

はじめに

ローカルではパスするテストがCircleCiではパスしない、ということがあったので、CircleCiのコンテナにsshでつないでデバッグをしました。
おおむね、公式通りなのですが、補足も必要なところもあるかと思うので、その時の手順を残しておきます。
windows環境ですので悪しからず。

前提

  • sshは使用できず状態になっている前提です。
    • まだの場合はこちらなどを参考に入れてみてください。
  • githubとCircleCiもアカウントは持っている前提です。

準備

CircleCiにsshで接続するには、githubにsshで接続できる状態になっている必要があります。
こちらを参考に設定をすると良いかと思います。

デバッグ対象のコンテナをsshを有効にして再起動

CircleCiにアクセスし、デバッグしたいJobの"Rerun Job With SSH"を選択する。
WorkFlowではなくJobを選択する必要があります。

image.png

以下のようにEnable SSHのステップが追加されてワークフローが開始されます。
以下の白枠の箇所にポート番号とホストのipアドレスが表示されますのでこれを使ってsshでコンテナに接続していきます。

無題.png

sshでコンテナに接続

先ほど表示された情報をもとにsshでコンテナに接続します。
途中で接続するか聞かれたらyesと答えておけば良いです。

ssh -p <port> <ip address>

これでコンテナに接続した状態になるはずなので、いろいろデバッグに必要な情報が取れると思います。
また、ローカルに戻った状態で以下のようなscpを使ったりしてコンテナのファイルやディレクトリをダウンロードしたりもできます。

scp -r -P <port> root@<ip address>:<コピーしたいディレクトリのパス> <ローカルのダウウンロード先のパス>

終わりに

Dockerを使ってても、ちょこちょこローカルとCircleCiでの結果が異なることがあり、その際にデバッグしたりしています。そもそもデバッグがいらなくなるようDockerやOSについても学んでいきたいなーと思います。

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

docker-composeを用いたRailsのAPIサーバー環境構築

筆者について

ProgateのRuby, Railsコースを一通りやった。
その後Dockerで環境作ってRailsでAPIサーバー作った。

本記事について

Progateではviewを含んだrailsの書き方を学んだが、APIサーバーとしてのみRailsを使いたかった。
また、dockerで開発したかったため公式のクイックスタートを参考にRailsの開発環境を作った。
その過程で得られたノウハウをまとめる。

APIサーバーの開発で使うGemについては別記事で書く。

前提

Docker, docker-composeの使い方がわかること

環境

Ruby 2.7
MySQL 5.7
VSCode
Mac 10.14.5
Sequel Pro データベース見る用

Rails new するまで

まずはプロジェクトフォルダを作成。ここではrails-sampleとした。
そして、この直下に Dockerfileを作成

FROM ruby:2.7

RUN apt-get update -qq && apt-get install -y
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install

# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]

次にrailsをインストールするためのGemfileを用意

source 'https://rubygems.org'
gem 'rails', '~>5'

空のGemfile.lockを作る

touch Gemfile.lock

Dockerfileに記載されているentrypoint.shを作る

entrypoint.sh
#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"

なぜこれらのファイルを作るのかはDocker 公式クイックスタートの方を見ていただければ。

docker-compose.ymlを作る

docker-compose.yml
version: '3'
services:
  server:
    build: .
    tty: true
    volumes:
      - .:/myapp
    working_dir: /myapp
    ports:
      - "3000:3000"
    depends_on:
      - mysql
    command: bash
    # command: > 
    #   bash -c "rm -f tmp/pids/server.pid &&
    #       bundle exec rails s -p 3000 -b '0.0.0.0'"
  mysql:
    image: mysql:5.7
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: mysql
    volumes:
      - "./mysql/db-data/:/var/lib/mysql" # データ永続化
      - "./mysql/my.cnf:/etc/mysql/conf.d/my.cnf" # 日本語をデータとして使うために必要

MySQLのデータの永続化と日本語対応のために

rails-sample > mysql > db-data フォルダを作成。
mysqlフォルダ以下にmy.cnfを作成

my.cnf
[mysqld]
character-set-server=utf8

ここまででこのような構成になる。
スクリーンショット 2020-09-26 20.12.16.png

それができたらrails newする。

docker-compose run server rails new . -MC --force --api --database=mysql --skip-active-storage

railsコマンドやコマンドのヘルプでオプションを調べ、不要そうなものを省いている。
重要なオプションは以下

--force // rails new 時にファイルを上書き
--api // api開発に不要なviewとかを生成しない
--database=myql // デフォルトではsqliteだがmysqlを指定する

これでいろいろ作られる。

スクリーンショット 2020-09-26 20.23.52.png

で、ここでGemfileGemfile.lockが上書きされて新しくなっている。
これをイメージのほうに反映させるために、

docker-compose build

する必要がある。

事前に必要なgemがわかっている場合にはここでGemfileに書いておく。

これでrails new完了

mysqlに繋がるように設定ファイルを書く。

config > database.yml

database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: mysql

development:
  <<: *default
  host: mysql
  database: myapp_development

...
test:
  <<: *default
  host: mysql
  database: myapp_test

productionは不要なのでまるっとコメントアウトした
host名はdocker-compose.ymlのサービス名
passwordもdocker-compose.ymlで指定したもの

できたらdocker-compose up -dでコンテナを起動し、VSCodeのAttach Shellで中に入る

rails db:create

でDBを作る

root@dc075120af8a:/myapp# rails db:create
...
Created database 'myapp_development'
Created database 'myapp_test'

これでデータベースが作れた。
Sequel Proで接続すればデータベースができていることが確認できる

あとはProgateで学んだ通りモデル作ってマイグレーションすればテーブルができる。

参考

Docker 公式クイックスタート 英語
日本語の方は内容が古いので注意。

Railsガイド RailsによるAPI専用アプリケーション

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

CentOS7・CentOS8のDockerコンテナの日本語化および日本時間設定

結論

以下のDockerfileをビルドすれば、言語が日本語でタイムゾーンが日本時間のコンテナができます。

〇 CentOS7

FROM centos:7
RUN rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 && \
    yum -y update && \
    yum clean all && \
    localedef -f UTF-8 -i ja_JP ja_JP.UTF-8 && \
    ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
ENV LANG="ja_JP UTF-8" \
    LANGUAGE="ja_JP:ja" \
    LC_ALL="ja_JP.UTF-8" \
    TZ="Asia/Tokyo"

〇 CentOS8

FROM centos:8
RUN rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial && \
    dnf -y upgrade && \
    dnf -y install glibc-locale-source && \
    dnf clean all && \
    localedef -f UTF-8 -i ja_JP ja_JP.UTF-8 && \
    ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
ENV LANG="ja_JP UTF-8" \
    LANGUAGE="ja_JP:ja" \
    LC_ALL="ja_JP.UTF-8" \
    TZ="Asia/Tokyo"

環境

使い方・確認

上記Dockerファイルがあるディレクトリでコンテナイメージをビルドします。
その後コンテナを立てて、date で日本語化とタイムゾーン設定が反映されていることを確認します。

〇CentOS7

$ docker build -t centos:7-ja .
$ docker run -dit --name centos7-ja centos:7-ja
$ docker exec centos7-ja date
2020年  9月 26日 土曜日 19:37:24 JST

〇CentOS8

$ docker build -t centos:8-ja .
$ docker run -dit --name centos8-ja centos:8-ja
$ docker exec centos8-ja date
2020年  9月 26日 土曜日 19:42:03 JST

余談

日本語化に必要な設定を把握したくて作りました。
以下は作業してるうちに知ったことのメモです。

  • rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 の意味
    rpmパッケージの署名です。rpmパッケージの完全性を確認するために必要です。これを実施していないと、yum update で以下のようなwarningが出る可能性があります。
    とはいえエラーが出たところで勝手に上記と同様の操作をしてくれるので、必ず書かなければいけない訳ではありません。不必要なエラーでびっくりしないために実施しています。
warning: /var/cache/yum/x86_64/7/updates/packages/bind-license-9.11.4-16.P2.el7_8.6.noarch.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
  • yum clean all の意味
    yum update で生成されたキャッシュをクリアします。以下に示す通り、yum clean all をやるかやらないかでイメージサイズが全然違います。両者の違いは yum clean all を行ったか否かのみです。
    今回の記事では yum update にくっつけましたが、最後の yum update および yum install より後にないと意味がないので、RUN コマンドの最後の方に置いておくとメンテが必要になりにくくて良いかと思います。
$ docker images
REPOSITORY          TAG                  IMAGE ID            CREATED             SIZE
centos              7-ja-without-clean   3f6ba3d02f45        5 minutes ago       352MB
centos              7-ja-with-clean      fa93ef373ec3        6 minutes ago       284MB

参考

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

Docker MongoDB mongo-express

MongoDB を Docker で使いたい

私はアプリを開発する際にデータベースをMac等のローカル環境にダウンロードしたくないので、Dockerというコンテナ管理ツールを使用しています。移行も楽なので。本番環境でも使いたいのは山々ですが、Kubernetes周りの知識がないので中々踏み込めないという感じです。まぁ規模にも因るんですが。

この記事はDockerを使ってMongoDBをたてるサンプルみたいなもの。他にわかりやすいものがなくて、作る際に調べた記憶があったので。

動作環境はMacOS Catalina

Goal

docker-compose.ymlファイルを作成してMongoDBmongo-expressをlocalhostにたてます。

MongoDBというのはNoSQL

mongo-expressというのはMySQLでいうphpMyAdminみたいなもの。MongoDBの中身が見易くなる。

Docker

MongoDB

mongo-express

docker-compose.yml

# Use root/example as user/password credentials
version: "3.1"

services:
  mongo:
    image: mongo
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root   # ユーザー名
      MONGO_INITDB_ROOT_PASSWORD: tree  # パスワード
    ports:
      - 27014:27017
    volumes:
      - ./db:/data/db
      - ./configdb:/data/configdb

  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 8080:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root   # ユーザー名
      ME_CONFIG_MONGODB_ADMINPASSWORD: tree   # パスワード

解説

docker-compose.ymlファイルの基本的な書き方は以下参照。
https://docs.docker.com/compose/compose-file/

portsの指定は以下参照
https://qiita.com/tksugimoto/items/23fcce1b067661e8aa46#%E6%A4%9C%E8%A8%BC%E7%B5%90%E6%9E%9C

volumesで指定した場所にデータベースのファイルが作成されます。
sample/docker-compose.yml にファイルがあったとするとsample/dbsample/configdbが作成されます。

How To Use

whoami$ pwd
/Users/whoami/sample
whoami$ ls
docker-compose.yml
whoami$ docker-compose up -d    // -d は daemon で実行という意味
Creating network "sample_default" with the default driver
Creating sample_mongo-express_1 ... done
Creating sample_mongo_1         ... done
whoami$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES
1aeb90deadd0        mongo               "docker-entrypoint.s…"   23 seconds ago      Up 22 seconds       0.0.0.0:27014->27017/tcp   sample_mongo_1
6649bb697412        mongo-express       "tini -- /docker-ent…"   23 seconds ago      Up 9 seconds        0.0.0.0:8080->8081/tcp     sample_mongo-express_1

whoami$ docker-compose down
Stopping sample_mongo_1         ... done
Stopping sample_mongo-express_1 ... done
Removing sample_mongo_1         ... done
Removing sample_mongo-express_1 ... done
Removing network sample_default
whoami$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

docker-compose up -dした後ブラウザで[http://localhost:8080/]を開くと、そこに**mongo-express**があります。

注意

ポート番号の指定を適当にやりすぎるとMongoDBがたたない。DockerのMongoDBのポートが27017しかないみたいな記事も見た事がある気がする。

mongo-expressはdockerでは開発環境しか使えないらしい。

予告

これでたてたMongoDBにNode.jsから繋ぐ方法も書こうと思う。

公式ref

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

https://hub.docker.com/_/mongo-express

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