20200801のdockerに関する記事は13件です。

ec2にdocker環境を構築してみた

railsアプリをec2を利用して本番環境でデプロイした際に、dockerを導入してみました。
ec2にdocker及びdocker-composeをインストールするには以下を参考にしました。
https://qiita.com/y-do/items/e127211b32296d65803a

ec2にsshログインし、mysqlにマイグレーションするまでは以下が詳しく書いてあります。
https://qiita.com/naoki_mochizuki/items/f795fe3e661a3349a7ce

MySQLの設定以降

amazon linuxではデフォルトがmariadbのため以下のエラーが出ます。

$ sudo service mysqld start
Redirecting to /bin/systemctl start mysqld.service
Failed to start mysqld.service: Unit not found.

該当する方は以下を参考にmysqlをインストールしてください。
https://qiita.com/hamham/items/fd77bb0bb167a150dc8e#mysql57%E3%81%AE%E5%B0%8E%E5%85%A5

また、ここまで手順どおり進めても以下のコマンドでエラーが出ます。

$ rake db:create RAILS_ENV=production
rake db:migrate RAILS_ENV=production
rake aborted!
Mysql2::Error::ConnectionError: Unknown MySQL server host 'db' (2)
Tasks: TOP => db:migrate
(See full trace by running task with --trace)

こちらはdockerの導入のためにdatabase.ymlの設定を以下のように変更したためです。

host: localhost #変更前
host: db #変更後

そのため、データベースの作成にはdockerコマンドで実行する必要があります。
しかし、dockerコマンドを実行しようとすると以下のエラーになります。

ERROR: Couldn’t connect to Docker daemon at http+docker://localhost – is it running?

権限不足によるエラーのため、以下を参考に権限を変更してください。
https://qiita.com/dnnnn_yu/items/14a31721a2870b735938

ここまで進んだらdockerコマンドが使用できると思いますので以下のコマンドを実行して下さい。

$ docker-compose up -d コンテナの作成(バックグラウンドで起動モード)
$ docker ps -a 起動しているかの確認

データベースを作成しようとするとエラーが出ます。

$ docker-compose run web rails db:create RAILS_ENV=production
Mysql2::Error::ConnectionError: Access denied for user 'root'@'172.18.0.5' (using password: NO)

これは参考サイトでdatabase.ymlのproduction環境のpasswordが設定されていないからです。
以下のように設定してあげましょう。

// database.yml
production:
  <<: *default
  host: <%= ENV['DB_HOST'] %>
  database: <%= ENV['DB_DATABASE'] %>
  username: <%= ENV['DB_USERNAME'] %>
  password: <%= ENV['DB_PASSWORD'] %>

これでデータベースの作成ができると思います。

$ docker-compose run web rails db:create RAILS_ENV=production
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker覚書

はじめに

これはDocker初心者でDockerに遊ばれている僕が、「Dockerでrstudioを動かすため」(ここ重要)の「Dockerを動かす」部分のメモ書きである。コピペの部分も多いが、メモ書きなので目をつぶっていただけると有難い。
他の人が役に立つかどうかは知らないが,まあ役に立つならそれで良いかなあと。取り敢えず自己満足で書いているので、そこんとこ宜しく。

参考にしたサイト

@fist0 氏のdocker images を全削除する

@kooohei 氏のDockerコンテナの作成、起動〜停止まで

@butada (初心者向け)Dockerの使い方

用語

@butada (初心者向け)Dockerの使い方によると

「イメージ:コンテナが動作するためにベースとなるファイル群。コンテナによってイメージが変更されることはなく不変のもの。Docker Hubから取得可能。CentOSイメージが汎用的なので初心者には使いやすいと思う。
コンテナ:イメージから作成されたインスタンスのようなもの。コンテナが動作することで生成されたファイルは、イメージではなくコンテナに紐づいて管理される。ざっくり言うと、コンテナ=イメージ+差分ファイル。厳密に言えばコンテナには起動中のプロセスも含まれる。」
らしい。
ふむふむ

Dockerコマンドの基本

取得可能なイメージはDockerHubで確認する。

docker pull images #イメージをローカルにダウンロードする

ダウンロード出来たら、以下のコマンドで確認。

docker images
#以下のように出てくる
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

基本動作

イメージを確認

docker images

コンテナの一覧を確認

#デフォルトは稼働中のコンテナを表示
docker ps
#全てのコンテナを表示
docker ps -a

作成

イメージからコンテナの作成

docker run -it images

ログイン状態を抜ける(dettachする)

ログインを抜けるためには{Ctr+P},{Ctr+Q}を順番に押す(これを「dettach(デタッチ)」と呼ぶ)。
dettachしたコンテナを確認する方法は

docker ps

である。

再度ログインする(attachする)

そして、dettachしたコンテナに再度ログインする状態ことを「attach」と呼び、以下のコマンドを叩く。
docker attach <CONTAINER IDまたはNAME>を入力する

docker attach container-ID

あるいは

docker attach container-NAME

となる。

コンテナの中でdockerを終了する

exit

コンテナを起動する

docker start container-ID

または

docker start container-Name

コンテナを終了する

ターミナルの中でコンテナを終了する。

docker stop container-ID

または

docker stop container-name

docker images を削除する

コンテナ削除

docker rm

イメージ削除

docker rmi -f

全削除

コンテナが動いているとイメージを削除できないので, 本当に全削除したいときはコンテナから全削除する。

コンテナを削除する

docker ps -aq | xargs docker rm

イメージを削除する

docker images -aq | xargs docker rmi

なんかあれば、また追記する。

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

[Dockerfile]RUN, CMD, ENTRYPOINT, Shell, Exec形式の違いと使い道をまとめました

RUN

イメージをビルドするときに使います。
ビルドされる環境(Google Cloud Build とか)で行いたい処理を記述しましょう。

例えば、アプリケーションをビルドするために必要なパッケージを取得する、アプリケーションをビルドするとかです。

RUN apk update && apk add gcc g++

WORKDIR /go/src/app
COPY . .

RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o /go/bin/app -ldflags="-s -w" .

CMD, ENTRYPOINT

コンテナが起動するときに実行されます。
コンテナが動作する環境(K8s, Cloud Run とか)で行いたい処理を記述しましょう。

例えば、アプリケーションの起動です。

ENTRYPOINT ./app
CMD ./app

どっちがいいの?

ENTRYPOINT → 実行可能なDockerイメージをビルドする場合、常に実行されるコマンドが必要な場合
CMD → Dockerコンテナの実行時にコマンドラインから上書きされる可能性のあるデフォルトの引数を追加する必要がある場合

Shell, Exec

RUN CMD ENTRYPOINT は、いずれもコマンドを実行するために使用されます。
ただし、実行するコマンドを指定する方法は2通りあります。

Shell

こんな書き方をします。

RUN yarn run build

コマンドは新しいシェルプロセスの中で実行され、デフォルトでは Linux では /bin/sh -c、Windows では cmd /S /C となっています。
Shell形式は、変数置換のようなShell処理機能を使用したり、複数のコマンドを連結したりすることを可能にするために存在します。

Exec

こんな書き方をします。

RUN ["yarn", "run", "build"]

コマンドは新しいシェルプロセス内では実行されません。

どっちがいいの?

複数のコマンドを連結しない限り、基本的に Exec を使いましょう。

参考資料

宣伝

https://plum-u.me/
https://twitter.com/kskumgk63

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

ローカルで開発中のnuxtプロジェクトをdockerコンテナ(別フォルダ)でnuxt startで公開する方法

ローカルのnuxt開発環境をサクッとdockerで公開したい

全然サクッと公開できなかった・・・

開発環境で色々作っているnuxtのプロジェクト、普段はyarn devやnpm run devで開発・確認をしていますが、お客サンからの一言「どっかサーバーに上げて見れるようにしてくれない?」と。

ここで考えられる対応方法はいくつかあります。

・ビルドしてdist/ フォルダをS3やgithub経由でnetlifyとかにアップする。
 簡単。S3やgithub,netlifyの設定が必要。
 変更のたびにビルド→再アップが必要。

・開発サーバーを放置していいなら、直接 yarn serve(nuxt start)する
 一番簡単、ただしnuxt startをデーモンとして動かないので、サービス化するのに一手間必要。

・dockerコンテナをawsのec2上などに展開する。
 サービス化できるので放置できる。gitと連携しておけば、ファイル更新があってもpullしてコンテナ内で再ビルドできる。

楽なのは、ビルド済みのファイルをS3やnetlifyなどの静的ファイル公開サービスへデプロイする方法です。
ただ、今回セキュリティの事情で、ec2上に乗せる必要がありました。

dockerでnuxtプロジェクトを公開する方法は主に2つありまして

・nginxコンテナでdistフォルダを公開する(一般的)
 本番系に近い方法、SPAの設定が必要。
 https://ja.nuxtjs.org/faq/nginx-proxy/

 こちらも、ソース変更のたびに再ビルドが必要です。

・nodeコンテナで直接 yarn serve(旧 yarn start)する。
 ↑今回やる方法

今回、nodeコンテナで公開する方法を使ってみました。
dockerを配置するフォルダと、nuxtのフォルダが別の場所にある場合はひと工夫必要でした。

docker-compose

docker-compose.yml
services:
  node:
    tty: true
    build: ./dockerFileのあるディレクトリ
    volumes:
      - ../../nuxtプロジェクトのフォルダ:/app:delegated
    ports:
      - "80:3000"
    command: ash -c "yarn && yarn build&& yarn export && yarn serve"

Docker-file

FROM node:current as node

WORKDIR /app

ENV NUXT_TELEMETRY_DISABLED 1
ENV HOST 0.0.0.0
ENV PORT 3000

ENV NUXT_TELEMETRY_DISABLED 1が無いと、build時に止まってしまう

https://stackoverflow.com/questions/63096652/how-to-ignore-the-nuxt-js-starting-question

ハマったポイント

docker-composeのvolumesフォルダは、ビルド中には見ることができない。。。
COPYコマンドで親ファイルからソースを持ってくることができない・・・
なので、コンテナを起動してからyarn install,build系のコマンドを叩くようにする必要がありました。

https://crieit.net/posts/docker-build-volume
https://qiita.com/mk-tool/items/1c7e4929055bb3b7aeda
https://qiita.com/katoosky/items/bd24905bca20afdfe745

参考資料

https://jp.vuejs.org/v2/cookbook/dockerize-vuejs-app.html
https://qiita.com/art_porokyu/items/8363334c358c67adb61a
https://qiita.com/tmiyajima/items/b099fb707bfde9337a70

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

Ubuntu上Docker(docker-compose)を使ってmysql8,https対応、redis使用のngnix+Laravel環境構築

今まではLaravelのローカル開発環境はVagrant+VirtualBox+Homesteadを使ったが,Vagrant,VirtualBox,OSのバージョンアップにより、数時間をかけて環境を作り直したことがあります。今回は、Dockerを使ったので、下記の記事を参考しながら、環境構築をしてみました。
docker-composeでLaravelの開発環境を整える方法とその解説
とてもわかり易い記事ですが、開発に必要なhttps対応や、Mysql8とRedisなど必要な設定対応がなかったので、メモとしてを整理しました。
★ベストプラクティスかどうか分からないので、ご指摘ください。

読む対象:
* docker + laravel 開発者で、 HomesteadからDockerへ移行したい方
* nginxのhttps対応、Mysql8の設定、redisの設定、何れが必要な方

ホストマシンOS
Ubuntu18.0.4

全体目次:
手順
初期のフォルダー構造
docker-compose.yaml設定
phpコンテナのDockerfile設定
nginxのhttps対応
project source codeダウンロード
mysql8対応設定
redisコンテナと設定
動作確認

手順

初期のフォルダー構造

まず/home/user/の下に初期のフォルダー構造を作成します。

├── docker
│   └── web
│       └── default.conf
|   └── php
|       └── Dockfile
|   └── mysql
├── docker-compose.yml
└── project

※ projectフォルダーはproject(laravel)source code を入れるところ
ファイル~/docker/docker-compose.yaml, ~/docker/web/default.conf, ~/php/Dockfileの設定は下記になります。

docker-compose.yaml設定

~/docker/docker-compose.yaml設定
version: '3'
services:
  web:
    image: nginx:1.18.0
    container_name: web
    ports:
      - 443:443
    depends_on:
      - app
    volumes:
      - ./web/default.conf:/etc/nginx/conf.d/default.conf
      - ./server.crt:/etc/nginx/server.crt
      - ./server.key:/etc/nginx/server.key
      - .:/var/www/html
  app:
    build: ./php
    container_name: app
    volumes:
      - .:/var/www/html
    depends_on:
      - mysql
  mysql:
    build: ./mysql

 image: mysql:8
    container_name: mysql
    environment:
      MYSQL_DATABASE: habidodb
      MYSQL_USER: homestead
      MYSQL_PASSWORD: secret
      MYSQL_ROOT_PASSWORD: secret
    ports:
      - "3306:3306"
    volumes:
      - ./mysql/mysql-confd:/etc/mysql/conf.d
      - ./mysql/data:/var/lib/mysql

  redis:
    image: redis:3.2.12-alpine # 以前はlatestだった
    container_name: redis
    ports:
      - "6379:6379"
    volumes:
      - ./redis/data:/data
    restart: unless-stopped
volumes:
        mysql-data:

nginxのhttps対応

(1)~/docker/web/default.conf設定

default.conf設定
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

server {
    listen 80;
    server_name localhost;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ;
    server_name localhost;

    ssl on;
    ssl_certificate /etc/nginx/server.crt;
    ssl_certificate_key /etc/nginx/server.key;

    root  /var/www/html/project;
    index index.php index.html index.htm;
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    location / {
        try_files $uri $uri/ /index.php$is_args$args; }
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

(2)sslキーを作成
自己署名証明書でhttpsアクセスができるコンテナを作るためにsslキーが必要になります。

$cd ~/docker
$openssl req -x509 -nodes -new -keyout server.key -out server.crt -days 365

を実行したら、server.keyとserver.crtを~/dockerの下に確認できました。

phpコンテナのDockerfile設定]

FROM php:7.2-fpm

# install composer
RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer
RUN apt-get update \
&& apt-get install -y \
git \
zip \
unzip \
vim

RUN docker-php-ext-install pdo_mysql

RUN apt-get update \
    && apt-get install -y libpq-dev \
    && docker-php-ext-install mysqli pdo pdo_pgsql

RUN pecl install -o -f redis \
    &&  rm -rf /tmp/pear \
    &&  docker-php-ext-enable redis

RUN curl -sL https://deb.nodesource.com/setup_6.x | bash - \
    && apt-get update \
    && apt-get install -y nodejs

#Add user for laravel application
RUN groupadd -g 1000 teiri && \
    useradd -u 1000 -ms /bin/bash -g teiri teiri


# Install Node
RUN apt-get update &&\
    apt-get install -y --no-install-recommends gnupg &&\
    curl -sL https://deb.nodesource.com/setup_10.x | bash - &&\
    apt-get update &&\
    apt-get install -y --no-install-recommends nodejs &&\
    npm config set registry https://registry.npm.taobao.org --global &&\
    npm install --global gulp-cli

project source codeダウンロード

※既に自分のPCにプロジェクトソースコード管理している場合は下記の部分をスキップできます。
projectソースコード用フォルダー作成

$mkdir ~/docker/projectname
$cd ~/docker/habido

git初期化

$cd ~/docker
$git init

laravelプロジェクトのソースコード取得

$git remote add origin 追加したいリポジトリ
$git clone リポジトリのURL

~/docker/projectnameのフォルダーが作成されることが確認できます。
laravelインストール

composer installでcomposer.jsonに定義されているlaravel framesなど必要なパッケージをインストールします。

$composer install

※Homesteadの環境よりずっと速い!

mysql8対応設定

.envファイルを設定

必要があれば、DBの設定をdocker-compose.yamlと一致するようにします
例:

DB_HOST="mysql"
DB_PORT=3306
DB_DATABASE="habidodb"
DB_USERNAME="homestead"
DB_PASSWORD="secret"

MySQL8.0.4以降 のログイン認証方式は caching_sha2_password がデフォルトなので、
もしmysql 5.* からmysql8に変更した場合は認証方式の設定を変更する必要があります。

(1)mysqlのコンテナに入る

コンテナを起動

$docker-composer up -d

コンテナ一覧を確認する
docker-compose ps
image.png

$docker exec -it {mysql_container_name} bash

(2)rootユーザとしてログイン,passwordはdocker-compose.yamlの中の設定一致する必要があります。

$mysql -uroot -p

認証方式を変更

 ALTER USER 'homestead'@'%' IDENTIFIED WITH mysql_native_password BY 'secret';

注)↑のコマンドに使うユーザとパスワードはdocker-compose.yamlに設定された内容が一致する必要があります。

image.png

変更を反映するために、コンテナ再起動

$docker-compose down
$docker-compose up -d

プロジェクトのデータベーステーブル作成
appコンテナに入る

docker exec -it --user {username} app bash

cd project フォルダー

cd /var/www/html/project
$ php artisan migrate

必要なSeed data作成

$ php artisan db:seed

redisコンテナと設定

redisのIPアドレス確認
docker inspect redis | grep "IPAddress"
image.png

.envでRedis設定

REDIS_HOST="172.23.0.2"
REDIS_PASSWORD="null"
REDIS_PORT="6379"

動作確認

最後にブラウザで確認サイト確認
https://localhost

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

docker-composeで、MySQLの設定ファイル変更を適用させる

何をするのか

docker-composeでMySQLの設定ファイル(my.conf)の中身を更新したが、作り直したコンテナに反映されなかったため、これを反映させる。

環境

  • Laravel
  • MySQL8.0
  • docker-compose version 1.26.2

こちらを参考にDockerでLaravelの環境構築をしていました。
【初心者向け】20分でLaravel開発環境を爆速構築するDockerハンズオン

問題が起きた背景

Laravelでは、MySQLのバージョンが8の場合にデータベース接続がうまくできない不具合があります。

MySQLのバージョンが8.0.4以降の場合、デフォルトの認証方式がcaching_sha2_passwordになっており、PHPのMySQL接続ライブラリがcaching_sha2_passwordに対応していないため、MySQLに接続できない(ログインできない)というエラーが発生していました。

引用:Laravel+MySQL8.0環境でマイグレートできない場合の原因と対処法

このため、「認証方法を変更」を行いました。

ただ、↓のリンクに「すでに認証方法が対応された」と書かれていたのであえて変更する必要もないと思いMySQLの設定の以下をコメントアウトしました。(これが間違いだった。)
MySQL8.0 認証方式を変更する(Laravel5) - Qiita

my.cnf
# MySQL8 caching_sha2_password to mysql_native_password
default-authentication-plugin = mysql_native_password

そのままdocker-compose up -d —buildして

マイグレーションしたらところエラー発生

Illuminate\Database\QueryException 

  SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client (SQL: select * from information_schema.tables where table_schema = routine-share and table_name = migrations and table_type = 'BASE TABLE')

  at vendor/laravel/framework/src/Illuminate/Database/Connection.php:671
    667|         // If an exception occurs when attempting to run a query, we'll format the error
    668|         // message to include the bindings with SQL, which will make this exception a
    669|         // lot more helpful to the developer instead of just the database's errors.
    670|         catch (Exception $e) {
  > 671|             throw new QueryException(
    672|                 $query, $this->prepareBindings($bindings), $e
    673|             );
    674|         }
    675| 

      +34 vendor frames 
  35  artisan:37
      Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

それならば、さっきのコメントアウトを戻せば大丈夫だろうと思い
docker-compose downしてから
先程のmy.cnfの認証方法変更部分のコメントアウトを戻しました。

改めてdocker-compose up -d —buildをします。

が、マイグレーションできず、同じエラー画面になります。

解決方法

どうやらデータベース(volumes)がマウントされていると設定が変更されないようでした。

一度データベース(volumes)を削除すればOKなので、、、

docker volume prune

したところ、マイグレーションまで問題なくできました。

参考にしてもらえたらうれしいです。

以下参考:
DockerのMySQLの環境変数系の設定が反映されないのは余計なデータベースをマウントしているから - Qiita

Laravel+MySQL8.0環境でマイグレートできない場合の原因と対処法

Docker: where is docker volume located for this compose file

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

俺のDockerコマンドメモ

Dockerコマンド

コンテナ操作

起動中コンテナ確認

docker ps
docker container ls

止まってるコンテナも確認

docker ps -a
docker container ls -a

イメージからコンテナ生成

docker create [image_name]

イメージからコンテナを生成して起動

docker run -it [image_name] [command]

centosのイメージを起動してbashログイン

docker run -it centos /bin/bash

コンテナの80ポートをホスト8080ポートにポートフォワーディングしてhttpdを起動

docker run -d -p 8080:80 httpd
docker run -d -p 8080:80 -p 8081:443 httpd

ローカルのディレクトリをコンテナにマウント

docker run -itd --privileged -p [host_port]:[container_port] -v [local_dir]:[container_dir] --name [container_name] [image_name]:[image_tag] /sbin/init

コンテナ起動

docker container start [container_id]

コンテナ停止

docker container stop [container_id]

コンテナ再起動

docker container restart [container_id|container_name]

コンテナ削除

docker rm [container_id]

コンテナに入ってbashログイン

docker exec -it [container_name] /bin/bash

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

docker container exec [container_id|container_name] [command]

コンテナのログを確認

docker logs [container_id]

コンテナの状態を確認

docker stats [container_id]

Dockerイメージ操作

Dockerイメージの取得

docker pull [image_name]

Dockerイメージの検索

docker search [image_name]

Dockerイメージの確認

docker images

Dockerイメージのコミット

docker commit [container_id] [image_name]:[image_tag]

Dockerイメージの削除

docker rmi [image_id]

Dockerイメージをtar形式でエクスポート

docker save [image_name]:[image_tag] -o image.tar

ファイルを読み込んでDockerイメージをインポート

docker load -i image.tar

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

docker-composeコマンドメモ

起動

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

DockerでLaravel+Apache+MySQLの開発環境を構築する

https://note.com/pocke_techblog/n/n8af813848fa0

上記の記事通りにすすめて、DockerでLaravel+Apache+MySQLの開発環境を構築しましたが、パーミションのエラーが出て解決に手こずったので記録に残しておきます。

作業環境

OS:Windows 10 Pro ver.2004
Docker:version 19.03.12, build 48a66213fe

Dockerのインストール

Dockerのインストール方法については別記事にて解説しているので、まだインストールしていないのであれば参考にしてみてください。
Windows 10 Pro : Dockerをインストールする

サンプルコードを準備する

フォルダ構成

フォルダ構成は以下の通りです。

.
├── docker/
│   ├── app/
│   │   ├ Dockerfile
│   │   ├ php.ini # PHP設定用のファイル
│   │   └ 000-default.conf  # Apacheの設定ファイル
│   └── db/
│        ├ data/ # MySQLのデータを保存しておくディレクトリ
│        └ my.cnf  # MySQLの設定ファイル
│
├── src/ # Laravelのソースを格納するディレクトリ
└── docker-compose.yml

ソースコード

Dockerfile

# どんなdockerイメージを利用して構築をするか
FROM php:7.4-apache

# 設定ファイルをdockerコンテナ内のPHP、Apacheに読み込ませる
ADD php.ini /usr/local/etc/php/
ADD 000-default.conf /etc/apache2/sites-enabled/

# Composerのインストール
RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer

# ミドルウェアインストール
RUN apt-get update \
&& apt-get install -y \
git \
zip \
unzip \
vim \
libpng-dev \
libpq-dev \
&& docker-php-ext-install pdo_mysql

# Laravelで必要になるmodRewriteを有効化する
RUN mv /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled
RUN /bin/sh -c a2enmod rewrite

php.ini

docker/app/php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
docker/app/000-default.conf
<VirtualHost *:80>
       ServerAdmin webmaster@localhost
       DocumentRoot /var/www/html/laravelapp/public
       ErrorLog ${APACHE_LOG_DIR}/error.log
       CustomLog ${APACHE_LOG_DIR}/access.log combined
       <Directory /var/www/html/laravelapp/public>
           AllowOverride All
       </Directory>
</VirtualHost>

my.cnf

docker/db/my.cnf
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
[client]
default-character-set=utf8mb4

docker-compose.yml

docker-compose.yml
# Compose fileのバージョン指定
version: '3'
# どんなコンテナを立ち上げるか
services:
 # laravelを動かすコンテナ
 app:
   # どのポートを開いて繋ぐか。下記はコンテナの80番ポートを開いて、ホストの8000番につなぐ
   ports:
     - "8000:80"
   # 先ほど作ったDockerfileを使って、コンテナをビルドするという指定
   build: ./docker/app
   # コンテナの名前を指定
   container_name: laravel_app
   # コンテナとホスト側のディレクトリを同期する場所の指定。laravelのソースが入る予定の場所
   volumes:
     - ./src:/var/www/html
 # MySQLを動かすコンテナ
 db:
   # Docker HubからMySQL5.7の公式イメージをダウンロードしてくる指定
   image: mysql:5.7
   container_name: laravel_db
   # コンテナ内の環境変数を指定。環境変数を渡すとビルド時に設定してくれるDockerイメージがあるので、利用の際はDocker Hubのサイトで確認すると良い
   environment:
     MYSQL_ROOT_PASSWORD: root
     MYSQL_DATABASE: laravel_db
     MYSQL_USER: laravel_user
     MYSQL_PASSWORD: laravel_pass
     TZ: 'Asia/Tokyo'
   # 起動時のコマンド
   command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
   # ディレクトリ同期。設定ファイルとMySQLのデータが保存される場所を同期している。コンテナは基本的に起動時に変更されてもコンテナ自体が止まるとデータが消えてしまうため、保存しておきたいものはホストマシンと同期しておく必要がある。
   volumes:
     - ./docker/db/data:/var/lib/mysql
     - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
   ports:
     - 3306:3306

開発環境を構築する

Docker Composeでコンテナを立ち上げる

次のコマンドを実行して、Docker Composeでコンテナを立ち上げます。

$ docker-compose build
$ docker-compose up

Laravelのプロジェクトを作成する

上記とは別の画面を立ち上げて次のコマンドを実行して、Laravelのプロジェクトを作成します。

$ docker exec -it laravel_app bash
$ composer create-project laravel/laravel --prefer-dist laravelapp

これでhttp://localhost:8000 にアクセスするとLaravelの画面が立ち上がるはずですが、パーミッションのエラーが起きてしまいました。

パーミッションのエラーを解決する

最初に以下のようなエラーメッセージが出ました。
The stream or file "/var/www/html/laravelapp/storage/logs/laravel.log" could not be opened in append mode: failed to open stream: Permission denied

ここのサイトを参考に以下のコマンドを実行しました。

$ chmod 777 /var/www/html/laravelapp/storage/logs/laravel.log
$ chmod 775 /var/www/html/laravelapp/storage/logs/

すると以下のようにエラーメッセージの文言が変わりました。
file_put_contents(/var/www/html/laravelapp/storage/framework/sessions/oI2ffP9BUcWC0llE0NEoFU09eqQyXTosSZZeq4BV): failed to open stream: Permission denied

ここのサイトを参考に以下のコマンドを実行しました。

chmod -R gu+w /var/www/html/laravelapp/storage
chmod -R guo+w /var/www/html/laravelapp/storage
cd ./laravelapp
php artisan cache:clear

これでパーミッションのエラーが解決して、Laravelの画面が表示されました。

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

ネットワークまわりを確認&勉強しながら、Kubernetesの環境構築をしてみた

はじめに

構成概要

構成図

  • 今回構築した環境は下記の通りです。
  • AWSでEC2を3台立てて検証しました。

k8s_nw_3.png

補足

  • EC2を配置しているVPCにはIGWを関連付けている
  • EC2を配置しているVPCのIPレンジとして10.1.100.0/16を設定している
  • flannelのIPレンジは、デフォルトのbridege(172.17.0.0/16など)と被らないよう設定する必要がある
    • 今回は、172.21.0.0/16を指定した
  • ホストに複数のNICが接続されている場合は、他のクラスタノードと通信するNICを、 kubeadm init --apiserver-advertise-address で指定する(今回は1枚)
  • 起動したPodに対して、ユーザ(インターネット経由)は http://18.176.61.21:30000 などでアクセスできる

構築手順

[Ctrl/Node] EC2作成

  • 2CPU/メモリ2GB以上でOSが対応していれば良さそう
* セキュリティグループ作成
    * ローカルPCからのssh
    * 下記インスタンス間のtcp(プライベートIP)
* インスタンス作成
    * Ubuntu Server 18.04 LTS
    * t2.medium

k8s_nw_1.png

[Ctrl/Node] Dockerをインストール

# 必要なライブラリを事前にインストール
$ sudo apt update
$ sudo apt install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
# GPG公開鍵のインストール
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 公開鍵のフィンガープリントを確認
$ sudo apt-key fingerprint 0EBFCD88
# aptリポジトリの設定
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

# dockerインストール
$ sudo apt update
$ sudo apt-get install -y docker-ce docker-ce-cli containerd.io

# 動作確認
$ sudo docker run --rm hello-world
$ sudo docker rmi hello-world

k8s_nw_2.png

[Ctrl/Node] kubeadmをインストール

# GPG公開鍵のインストール
$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
# aptリポジトリの設定(Googleが提供しているパッケージリポジトリを登録)
$ sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"

# kubeadmインストール
$ sudo apt update
$ sudo apt install -y kubeadm

# swapをオフにする
#   これだとOS再起動の度に必要になるので、/etc/fstabファイルを編集するのがよい
$ sudo swapoff -a

[Ctrl] Kubernetesをセットアップ

# コントロールプレーンのセットアップ
#   etcd、apiserver、controller-manager、schedulerといったコンテナを起動するなど、色々
#   --apiserver-advertise-address: 他ノードと接続できるネットワークインターフェイスに割り当てられているIPアドレスを指定する
#   --pod-network-cidr: KubernetesのPod(コンテナ)に割り当てるIPアドレス範囲
#   上手くいかなかった場合、 kubeadm reset を実行して設定をリセットしてから再度実行する
$ sudo kubeadm init --apiserver-advertise-address=10.1.100.11 --pod-network-cidr=172.21.0.0/16

# kubectlコマンド設定ファイルの配置
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
# ノード確認
#   ネットワーク関連の設定が完了していないため、STATUSはNotReadyでよい
$ kubectl get nodes

# flannelのセットアップ
#   コンテナ間の通信を行うための仮想ネットワーク

# flannelのためにiptablesを編集
$ sudo sysctl net.bridge.bridge-nf-call-iptables=1
# 設定ファイルの取得、修正
$ wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# net-conf.json: 以下の ”Network” の値を、kubeadm initコマンド実行時に --pod-network-cidr オプションで指定したものに変更する
$ vim kube-flannel.yml
---
"Network": "172.21.0.0/16",
---

# flannelの作成
$ kubectl apply -f kube-flannel.yml

# ノード確認
$ kubectl get nodes

# (参考)クラスタを作り直す場合、上記で作成した仮想インターフェイスを一旦削除しておく
# ip link delete cni0, ip link delete flannel.1

[Node] クラスタにjoinする

# クラスタにjoinする
$ sudo kubeadm join 10.1.100.11:6443 --token xxxxxx.xxxxxxxxxxxxx --discovery-token-ca-cert-hash sha256:xxxxxxx

# ノード確認(コントロールプレーンにて実行)
$ kubectl get nodes

[Ctrl]JupyterNotebookコンテナを作成・接続

  • マニュフェストファイル作成 -> 実行
    • コマンドだと、 docker run -p 10000:8888 --name jupyter docker.io/jupyter/scipy-notebook
notebook.yaml
# Deployment
#   アプリケーションの配布単位を管理するリソース
#   ReplicaSetを管理する(ReplicaSetの履歴を持つ)
#   ReplicaSet: 指定された数のPodを複製し、実行してくれる
apiVersion: apps/v1 # APIのバージョン情報
kind: Deployment # リソースの種類
metadata:
  name: test-notebook # リソースの名前

spec: # リソースの詳細
  selector: # ここで指定したPodを起動する
    matchLabels:
      app: notebook # Podのテンプレートを指定する([A])
  replicas: 1 # クラスタ内で起動するPodの数

  template: # 作成される(動かしたい)Podのテンプレート
    metadata:
      labels:
        app: notebook # PodにLabelを付ける([A]と対応)
    spec:
      containers:
      - name: notebook # コンテナ名
        image: docker.io/jupyter/scipy-notebook # コンテナイメージの場所
        ports:
        - containerPort: 8888 # ポート番号

---
# Service
#   クラスタ内のPodに対して、クラスタ内部および外部のネットワークからアクセスするためのリソース
#   Selectorで選択したPodをUpstreamとしたLB
apiVersion: v1 # APIのバージョン情報
kind: Service # リソースの種類
metadata:
  name: test-service # リソースの名前

spec: # リソースの詳細
  type: NodePort # [ClusterIP, NodePort, LoadBalancer, ExternalName]
  selector: # ここで指定したLabelが付与されているPodに伝送する
    app: notebook # ([A]と対応)
  ports:
    - port: 8888 # ポート番号
# Podのデプロイ
$ kubectl create -f notebook.yaml
# ポート確認
$ kubectl get svc
# logを見てtoken確認
$ kubectl get pod
$ kubectl logs XXX
# -> http://:<30000台のポート>/ でアクセス可能

k8s_nw_3.png

メモ

確認に使ったコマンド

  • NW
# IP確認
$ ip addr show

# NIC確認
$ ifconfig

# iptables確認
$ sudo iptables -nL

# ルートテーブル確認
$ route
  • Kubernetes
# クラスタ確認
$ kubectl cluster-info

# ノード確認
$ kubectl get nodes
$ kubectl get nodes -o==wide
$ kubectl describe node XXX

# ポッド確認
$ kubectl get pod
$ kubectl get pod -o wide
$ kubectl get pod --show-labels
$ kubectl get pod -l env=prod
$ kubectl describe pod XXX
$ kubectl logs XXX

# サービス確認
$ kubectl get svc

# まとめて確認(Deployment, ReplicaSet, Pod, Service)
$ kubectl get all

ネットワークについて

  • AWS

    • グローバルIPがOSから(ifconfigで)見えない
      • グローバルIPは、コンソールのネットワークインターフェイスのプロパティとして表示されるが、実態はNATによってプライベートIPにマッピングされている。
  • Docker

    • コンテナとして起動するサービスを外部に公開する場合は、コンテナホストの特定ポートに対するアクセスをコンテナに対してiptablesによりDNATすることで、コンテナに対するアクセスを実現している。
  • Kubernetes

    • flannel
      • Docker単体での利用との違いは、ノードを跨ぐこと。各Podにはノードごとに独立したIPアドレスが割り当てられるが、ノード跨ぎの場合は課題が発生する。Docker単体ではNATを利用しているが、Pod作成の度にNATテーブルを操作するのは効率的ではないため、オーバーレイネットワークを採用している。
      • 詳細はわかった気になるflannelの仕組みが分かりやすい

参考リンク

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

Windows Home で Docker Toolbox を導入しようとして詰まる

手順

基本はこの手順で OK
https://qiita.com/zeffy1014/items/dda78f4ab0449989dfe1

詰まりポイント

Docker Quickstart Terminal を実行すると、「CPCの仮想化を有効にしろよ」って怒られる。

Running pre-create checks...
Error with pre-create check: "This computer doesn't have VT-X/AMD-v enabled. Enabling it in the BIOS is mandatory"
Looks like something went wrong in step ´Checking if machine default exists´... Press any key to continue...

タスクマネージャーで確認。
有効化されてる。

image.png

どお゛じでえ゛え゛え゛

使用CPU

AMD Ryzen 7 3700X 8-Core Processor

調べる

参考:
https://hepokon365.hatenablog.com/entry/2019/07/28/012617
https://github.com/docker/toolbox/issues/873#issuecomment-583378427

CPU が悪いのか tool 側が悪いのか、このバージョンからは動かない って問題があるらしい

解決する

The latest version WITHOUT this bug is DockerToolbox-18.09.0.exe so I assume that the bug was introduced in DockerToolbox-18.09.1.exe and it still remains in current release.
https://github.com/docker/toolbox/issues/873#issuecomment-583378427

らしいので、入ってるものをアンインストールして、DockerToolbox-18.09.0.exe をインストールする。

(ここで Chocolatey の存在を知ったので、ここからはコマンド操作)

PS choco install -y docker-toolbox --version 18.09.0

shell を再起動して

docker-machine create -d virtualbox toolbox
PS docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER      ERRORS
toolbox   -        virtualbox   Running   tcp://192.168.99.100:2376           v19.03.12

動いた!

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

WSL2+Dockerを導入してみた

はじめに

今回はWindowsHomeにWSL2+Docker環境をつくったのでまとめてみます

環境

OS Windows10 Home
version 2004
ビルド 19041

WSL2の導入の前に...

WSL2の導入には前提条件があります
まず、Windows10のversionが2004になっていることと、Virtual Boxを使用していないことです
Virtual Boxが入ってる場合、WSL2をインストールすると起動しません!!
余談ですが、VMwareは最新のバージョンにすると使えます

WSL2導入

この内容はここにわかりやすくかかれてますので、省略します
WSL2導入|WinアップデートからWSL2を既定にするまでのスクショ

docker導入

OSのインストールも無事終わりDockerHubをただインストールするのみです

ここまでは簡単にいくのですがここでまさかの事件です!!

WSL2+Docker導入PCのプチ事故

Zoom + VMwareを起動するとVMwareで起動したOSの画面がフラッシュするのです

原因は簡単です

Vmmemと呼ばれるプロセスがメモリをChrome並みに食べるのです....

microsoft/WSLのIssueは1年近くOpenのままとなっており、Microsoft側も問題を認識して取り組んでいるものの未だに根本対処されていません。
https://github.com/microsoft/WSL/issues/4166

さぁ、このままだとちょっとまずいのでVmmemの消費量を食い止めましょう!!

Vmmemの消費量を食い止める

暫定対処でメモリサイズを固定することにしました....(というよりほかの方法がない気がする...)
WSL2のメモリサイズを固定することでWindowsホストのメモリ枯渇を防ぎます。
原因について興味がある人は後述しているのでそちらを参照してください。

%USERPROFILE%.wslconfigのコンフィグに以下の設定を行います。

  • %USERPROFILE%はC:\Users\taroのようなホームディレクトリを指します。
  • コンフィグが存在しない場合は作成してください。
  • 設定した後は必ずOSを再起動してください。
[wsl2]
memory=4GB

memoryで使用メモリを固定しています
私的には4GBでも十分動かせます
ここはPCのメモリ量と相談してください....

Vmmemが大量消費する条件

  • Visual Studio Code + Remote Extension(WSL)を使用してる
  • Docker Desktop WSL2を使用してる
  • 大きなコードベースで開発してる

参考URL

WSL2によるホストのメモリ枯渇を防ぐための暫定対処
WSL2導入|WinアップデートからWSL2を既定にするまでのスクショ

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

How to install Docker-Desktop in Windows 10 Pro : Dockerをインストールする

Windows 10 にDockerを導入した過程を残しておきます。

作業環境

  • OS:Windows 10 Pro ver.2004

基本的な手順

公式ドキュメントに従ってインストールしていきます。
https://docs.docker.com/docker-for-windows/wsl/
※基本的にPowerShell は管理者権限で実行してください

事前準備

1. Install Windows 10, version 2004 or higher.

Windows をVersion 2004 以上にアップデートします。

2. Enable WSL 2 feature on Windows.

WSL 2を有効化します。
ここのステップは下記のMicrosoft の公式ドキュメントを参考にしますが、一部違う手順があるので注意してください。

  • Install the Windows Subsystem for Linux PowerShell を管理者権限で起動して、下記のコマンドを実行して、Windows 用のLinux をインストールします。
$ dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
  • Install your Linux distribution of choice 下記のコマンドをPowerShellで実行します。
$ dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

コマンドが終了してからPCを再起動すると、WSL をインストールしてWSL 2 にアップデートされます。
次に以下のコマンドを実行してWSL 2 をデフォルトの設定に変更しておきます。

$ wsl --set-default-version 2
  • Set up a new distribution Microsoft Store からお好みのLinux のディストリビューションをインストールします。 私はマニュアル通りにUbuntu を選びました。

3.Download and install the Linux kernel update package.

https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-kernel
上記のページからWSL2 カーネルのアップデートをダウンロードして実行します。

CPU の仮想化を有効にします。

ここでかなり時間を浪費しました。
BIOSメニューをデフォルト表示戻すと仮想化のメニューが表示されてうまくいきました。

各種機能を有効化する

コントロールパネルプログラムと機能Windows の機能の有効化または無効化 を開き下記のメニューにチェックを入れます。

  • Linux 用Windows サブシステム
  • Hyper-V
  • 仮想マシン プラットフォーム

Set your distribution version to WSL 1 or WSL 2

下記のコマンドをPowerShell で実行します。Ubuntu 以外をインストールしている場合はコマンドは変わるので注意してください。

$ wsl --set-version Ubuntu 2

Dockerのインストール

あとは下記よりインストーラーをダウンロードして実行すればOKです。
https://hub.docker.com/editions/community/docker-ce-desktop-windows/

お疲れさまでした。

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