- 投稿日:2020-08-01T22:32:24+09:00
ec2にdocker環境を構築してみた
railsアプリをec2を利用して本番環境でデプロイした際に、dockerを導入してみました。
ec2にdocker及びdocker-composeをインストールするには以下を参考にしました。
https://qiita.com/y-do/items/e127211b32296d65803aec2にsshログインし、mysqlにマイグレーションするまでは以下が詳しく書いてあります。
https://qiita.com/naoki_mochizuki/items/f795fe3e661a3349a7ceMySQLの設定以降
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
- 投稿日:2020-08-01T18:58:12+09:00
Docker覚書
はじめに
これはDocker初心者でDockerに遊ばれている僕が、「Dockerでrstudioを動かすため」(ここ重要)の「Dockerを動かす」部分のメモ書きである。コピペの部分も多いが、メモ書きなので目をつぶっていただけると有難い。
他の人が役に立つかどうかは知らないが,まあ役に立つならそれで良いかなあと。取り敢えず自己満足で書いているので、そこんとこ宜しく。参考にしたサイト
@kooohei 氏の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-namedocker images を削除する
コンテナ削除
docker rm
イメージ削除
docker rmi -f
全削除
コンテナが動いているとイメージを削除できないので, 本当に全削除したいときはコンテナから全削除する。
コンテナを削除する
docker ps -aq | xargs docker rmイメージを削除する
docker images -aq | xargs docker rmi
なんかあれば、また追記する。
- 投稿日:2020-08-01T17:55:12+09:00
[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 ./appCMD ./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 を使いましょう。
参考資料
宣伝
- 投稿日:2020-08-01T17:44:51+09:00
ローカルで開発中の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.ymlservices: 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 3000ENV 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
- 投稿日:2020-08-01T16:43:52+09:00
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-cliproject source codeダウンロード
※既に自分のPCにプロジェクトソースコード管理している場合は下記の部分をスキップできます。
projectソースコード用フォルダー作成$mkdir ~/docker/projectname $cd ~/docker/habidogit初期化
$cd ~/docker $git initlaravelプロジェクトのソースコード取得
$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 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に設定された内容が一致する必要があります。
変更を反映するために、コンテナ再起動
$docker-compose down $docker-compose up -dプロジェクトのデータベーステーブル作成
appコンテナに入るdocker exec -it --user {username} app bashcd project フォルダー
cd /var/www/html/project$ php artisan migrate必要なSeed data作成
$ php artisan db:seedredisコンテナと設定
redisのIPアドレス確認
docker inspect redis | grep "IPAddress"
.envでRedis設定
REDIS_HOST="172.23.0.2" REDIS_PASSWORD="null" REDIS_PORT="6379"動作確認
最後にブラウザで確認サイト確認
https://localhost
- 投稿日:2020-08-01T14:55:12+09:00
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) - Qiitamy.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の環境変数系の設定が反映されないのは余計なデータベースをマウントしているから - QiitaLaravel+MySQL8.0環境でマイグレートできない場合の原因と対処法
Docker: where is docker volume located for this compose file
- 投稿日:2020-08-01T14:42:23+09:00
俺の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
- 投稿日:2020-08-01T10:28:12+09:00
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 48a66213feDockerのインストール
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 rewritephp.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=utf8mb4docker-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 upLaravelのプロジェクトを作成する
上記とは別の画面を立ち上げて次のコマンドを実行して、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の画面が表示されました。
- 投稿日:2020-08-01T04:38:02+09:00
ネットワークまわりを確認&勉強しながら、Kubernetesの環境構築をしてみた
はじめに
- ネットワークまわりを確認&勉強しながら、Kubernetesの環境構築をしたときのメモです。
- 構築手順自体は、Ubuntu 18.04 LTS にKubernetes環境をインストールする [Master / Worker]の通りに実施したところ、サクッとできました。
構成概要
構成図
- 今回構築した環境は下記の通りです。
- AWSでEC2を3台立てて検証しました。
補足
- 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[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[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台のポート>/ でアクセス可能メモ
確認に使ったコマンド
- 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の仕組みが分かりやすい
参考リンク
- 投稿日:2020-08-01T02:40:21+09:00
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...タスクマネージャーで確認。
有効化されてる。どお゛じでえ゛え゛え゛
使用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-583378427CPU が悪いのか 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.0shell を再起動して
docker-machine create -d virtualbox toolboxPS docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS toolbox - virtualbox Running tcp://192.168.99.100:2376 v19.03.12動いた!
- 投稿日:2020-08-01T00:13:02+09:00
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=4GBmemoryで使用メモリを固定しています
私的には4GBでも十分動かせます
ここはPCのメモリ量と相談してください....Vmmemが大量消費する条件
- Visual Studio Code + Remote Extension(WSL)を使用してる
- Docker Desktop WSL2を使用してる
- 大きなコードベースで開発してる
参考URL
WSL2によるホストのメモリ枯渇を防ぐための暫定対処
WSL2導入|WinアップデートからWSL2を既定にするまでのスクショ
- 投稿日:2020-08-01T00:10:41+09:00
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 2Dockerのインストール
あとは下記よりインストーラーをダウンロードして実行すればOKです。
https://hub.docker.com/editions/community/docker-ce-desktop-windows/お疲れさまでした。