- 投稿日:2021-01-24T23:55:16+09:00
Docker×Git×VSCodeを使ってElixirの開発を丁寧に始める
環境
- Windows 10 Pro
- Docker for Windows
- Docker Engin (20.10.2)
- docker-compose (1.27.4)
- Git for Windows (2.30.0.windows.2)
- Visual Studio Code (1.52.1)
- 拡張機能
- Docker
- Japanese Language Pack for Visual Studio Code
- Remote - Containers
- ElixirLS
それぞれのインストールについては、Docker×Git×VSCodeの環境構築は多分これが一番やさしい説明だと思いますを参照。
やりたいことと注意点
やりたいこと
- DockerとVSCodeでElixirの開発環境を作る
- mixでElixirプロジェクトを作って動作確認する
- GitHubと連携してバージョン管理を行う
本記事では1,2,3の順番で説明。
注意点
本記事を読む際は以下の点に注意されたし。
- 環境構築の手順とそのハマりポイントについて記載しているので、DockerやElixirなどについての詳しい記載を避けている
- 画面のキャプチャを張り付けて説明している。アプリや拡張機能の仕様変更により記事掲載時と画面の内容が異なることがある
- 本記事の手順は上記環境欄で記載した環境を用意していることを前提とする
- 記事が長い
STEP1 DockerとVSCodeでElixirの開発環境を作る
1.VSCodeを起動して[ファイル]->[フォルダーを開く]を押下
2. 任意のフォルダを作成して、フォルダーの選択を押下(今回は「elixir_intro」のフォルダを作成)
3. エクスプローラーのところで右クリック->新しいファイルをクリック
4.新しく作成したファイルの名前を「Dockerfile」にして、以下の内容を記述※ファイル名を「DockerFile」(fを大文字)にするとdocker-composeコマンドがエラーになるので注意(後述のハマりポイントを参照)
DockerfileFROM elixir:1.11.1 RUN mix local.hex --force && \ mix archive.install hex phx_new 1.4.3 --force && \ mix local.rebar --force WORKDIR /app
5. 再度エクスプローラーのところで右クリック->新しいファイルをクリック
6.新しく作成したファイルの名前を「docker-compose.yml」にして、以下の内容を記述
docker-compose.ymlversion: '3.2' services: elixir: build: . volumes: - .:/app
7. VSCodeの左下のアイコンを選択(Remote - Containersの拡張機能が必要)
8. 「Remote - Containers:Reopen in Container」を選択
9. 「From 'docker-compose.yml'」を選択
10. 左下に「Dev Container:Existing Docker Compose(...」と表示されたら成功
11. VSCodeの拡張機能を有効化する。「Ctrl」+「Shift」+「X」キーを押下して拡張機能を表示して、「Dev Container:Existin1」を押下
※docker-compose(Docker)で接続したリモートコンテナ上でVSCodeが立ち上がっているので、拡張機能が無効化されている。ハマりポイント docker-composeコマンドがエラーになる(原因:Dockerfileのファイル名)
Dockerfileのファイル名を「DockerFile」(fが大文字)にした場合、以下のエラーが発生する。
原因は「~Cannot locate specified Dockerfile: Dockerfile'~」と記載されているように、
docker-compose実行時にCPythonが実行され、内部コードの辞書に存在する「Dockerfile」の文字列に合致しないため。ファイル名を「Dockerfile」に変更すると解消する。
--------------------------中略-------------------------- [2021-01-24T00:14:09.868Z] [PID 18988] File "compose\service.py", line 346, in ensure_image_exists File "compose\service.py", line 1147, in build compose.service.BuildError: (<Service: elixir>, {'message': 'Cannot locate speci fied Dockerfile: Dockerfile'}) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "docker-compose", line 3, in <module> File "compose\cli\main.py", line 78, in main TypeError: can only concatenate str (not "dict") to str [7012] Failed to execute script docker-composeSTEP2 mixでElixirプロジェクトを作って動作確認する
STEP1でコンテナにリモート接続し、VSCodeのターミナルで以下のコマンドを実行
root@:/workspace# mix new . --app elixir_intro #カレントディレクトリに「elixir_intro」のアプリ名でPJを作成する実行したら以下のディレクトリが構成される
. ├── .devcontainer │ ├── devcontainer.json │ └── docker-compose.yml ├── .elixir_ls │ └── build ├── lib │ └── elixir_intro.ex ├── test │ ├── elixir_intro_test.exs │ └── test_helper.exs ├── .formatter.exs ├── .gitignore ├── docker-compose.yml ├── Dockerfile ├── mix.exs └── README.md動作確認では、以下のElixirファイルをコンパイル・実行する。(プロジェクト作成時から訂正しているのでコピペすること)
lib/elixir_intro.exdefmodule ElixirIntro do @moduledoc """ Documentation for `ElixirIntro`. """ @doc """ Hello world. ## Examples iex> ElixirIntro.hello() :world """ def main([]) do IO.puts "Hello World" end end動作確認① iexからプログラムを実行する場合
- VSCodeのターミナルで以下のコマンドを実行して、iexを起動
root@:/workspace# iex -S mix # -Sオプションでインタラクションモード実行前にmixを実行する Erlang/OTP 23 [erts-11.1.1] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [hipe] Compiling 1 file (.ex) # mixを実行したためにコンパイル実行 Generated elixir_intro app Interactive Elixir (1.11.1) - press Ctrl+C to exit (type h() ENTER for help) iex(1)>
2. iexで以下を実行して動作確認iex(1)> ElixirIntro.main([]) Hello World :ok動作確認② コマンドラインからmixを実行して動作確認
- VSCodeのターミナルで以下のコマンドを実行して、コンパイルを実行
root@:/workspace# mix compile Compiling 1 file (.ex) # -Sオプションでインタラクションモード実行前にmixを実行する Generated elixir_intro app
2. 続いてVSCodeのターミナルで以下のコマンドを実行して動作確認root@:/workspace# mix run -e "ElixirIntro.main([])" Hello World動作確認③ 実行可能ファイルを作成・実行して動作確認
- VSCodeのターミナルで以下のコマンドを実行して、実行可能ファイルを作成
実行後、ファイル名「elixir_intro」のファイルが作成される。
root@:/workspace# mix escript.build Compiling 1 file (.ex) Generated elixir_intro app Generated escript elixir_intro with MIX_ENV=dev
2. 実行可能ファイルを実行して動作確認root@:/workspace# ./elixir_intro Hello WorldSTEP3 GitHubと連携してバージョン管理を行う
前準備 Gitの初期設定
既に初期設定している場合は読み飛ばしてOK
※前提として、GitHubアカウントを作成していること
- Git Bashを実行してコマンドラインを起動(Git BashはWindows検索ボックスなどで検索して実行)
- ユーザー名の登録(GitHubアカウントのユーザー名)
$ git config --global user.name 'username'
3. アドレスの登録(GitHubアカウントのアドレス)$ git config --global user.email 'username@example.com'
4. Gitのエディタとマージツールの設定をVSCodeに指定$ git config --global core.editor 'code --wait' $ git config --global merge.tool 'code --wait "$MERGED"'
5. pushの方式を指定(追跡ブランチに対してpush)$ git config --global push.default simpleローカルリポジトリの作成と変更内容のコミット
- ローカルリポジトリを初期化する。VSCodeで「Ctrl」+「Shift」+「G」キーを押下して、ソース管理画面のInitialize Repositoryを押下
2. 変更内容を全てステージングする。画像の「+」マークを押下
3. 変更内容を全てコミットする。①コミットメッセージを記載し、②レ点を押下リモートリポジトリの作成
- GitHub (https://github.com/) にアクセス、ログインして画面左上のNewを押下
2. 「Repository name」を入力し、Create repositoryを押下※今回はリポジトリ名を「elixir_intro」とし、Publicリポジトリにした(誰でもアクセス可能)
※READMEファイルや.gitignoreファイルはmixでプロジェクトを作成した時に作成されたので今回はチェックを外した。ライセンスは関係ないのでチェックを外した
3. 画面に表示されたHTTPSのURLをコピーしておく(後にpushするときに必要)ローカルからリモートリポジトリへpushする
- リモートリポジトリを追加する。VSCodeで「Ctrl」+「Shift」+「G」キーを押下して、ソース管理画面の横三点リーダからAdd Remoteを押下
2. テキストボックスにリモートリポジトリのHTTPS URLを入力
3. テキストボックスにリモート名を入力(今回は「origin」と入力)
6. 「上流ブランチが無いので、このブランチをpublishするか?」と聞いてくるのでOKを押下
7. GitHubでリモートリポジトリを確認すると、反映されている以上で環境の構築は完了。
謝辞
今回は様々な記事を参考にさせて頂きました。
この場をお借りしてお礼申し上げます。
- Docker ComposeでElixir/Phoenixの開発環境を構築する
- Elixir のはじめ方
- 【Git】Visual Studio Code × GitHub の連携
- docker-composeを実行しようとしたら、エラー「Cannot locate specified Dockerfile: Dockerfile」
Existing Docker Compose (Extend) ↩
- 投稿日:2021-01-24T21:47:26+09:00
docker-composeでのMySQL環境構築(タイムゾーン、UTF-8対応)
はじめに
ローカル開発環境を立てるためにMySQLのコンテナを用意することがよくあるが、(主にタイムゾーンとUTF-8の対応で)毎回同じようなところで詰まって調べていたので、備忘録も兼ねて自分的な「いつものやつ」を残しておく。
結論
https://github.com/p5750/docker-mysql-sample
ディレクトリ構成
./docker/myqsl/data
をvolumeとすることでDBのデータを永続化する。
なお、初回起動時にこのディレクトリに余計なファイルが入っているとコケることがあるので注意。
.gitkeep
は置いておいて大丈夫だった。構成. ├── docker │ └── mysql │ ├── data │ │ └── .gitkeep │ └── Dockerfile ├── .env ├── .gitignore └── docker-compose.yml各ファイルの内容
Dockerfile
MySQLのバージョンはお好みで。
タイムゾーンをAsia/Tokyo
に、ロケールはen_US.UTF-8
にしている。 日本語にしたければja_JP.UTF-8
にする。DockerfileFROM mysql:8.0.23 RUN apt-get update && \ apt-get install -y tzdata locales && \ cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \ echo "en_US.UTF-8 UTF-8" > /etc/locale.gen && \ locale-gen ENV LANG en_US.UTF-8 CMD ["mysqld", "--character-set-server=utf8mb4", "--collation-server=utf8mb4_unicode_ci"].env
適宜書き換える。
.envMYSQL_ROOT_PASSWORD=root_password MYSQL_DATABASE=sample MYSQL_USER=sample_user MYSQL_PASSWORD=sample_password MYSQL_PORT=3306 ADMINER_PORT=8080docker-compose.yml
version
は特に理由がなければ最新でよさそう。使えるものは公式のドキュメントでわかる。
Adminerはお好みで入れる。個人的にはローカル用なら入れといて損はしないかなと思っている。docker-compose.ymlversion: '3.8' services: db: build: ./docker/mysql env_file: - .env ports: - "${MYSQL_PORT}:3306" volumes: - ./docker/mysql/data:/var/lib/mysql adminer: image: adminer:4.7.8-standalone ports: - "${ADMINER_PORT}:8080".gitignore
データ永続化用の
docker/mysql/data
と、認証情報が含まれる.env
は必ずignoreする。
.idea
はJetBrainsのIDE用。VSCodeなら.vscode
になる。.gitignoredocker/mysql/data .env .ideaコマンド
Dockerの基本操作は本稿の趣旨ではないので割愛する。
DBを抹消して作り直すとき
ゴミが残るので、必ず先に
down
する。docker-compose down # コンテナを止めて削除する rm -rf ./docker/mysql/data # volumeでマウントしているデータをディレクトリごと消す mkdir ./docker/mysql/data # ディレクトリを作り直す touch ./docker/mysql/data/.gitkeep # gitに.gitkeepをコミットしているなら作り直す。 # ※差分出てるはずなのでgit resetとかで復旧してもよい。 docker-compose up -d # 再度立ち上げる。Dockerfileに変更が入っていたら --build も必要リンク集
- 公式MySQLコンテナ https://hub.docker.com/_/mysql
- 環境変数とかたまに調べる
- 公式Adminerコンテナ https://hub.docker.com/_/adminer
- 投稿日:2021-01-24T21:06:48+09:00
共同開発講座を受講中にコツコツ書いた「詰まったメモ」をジャンル別に全て公開します【環境構築編】
はじめに
タイトルの通り、共同開発講座を受講中に起きたトラブルや詰まりポイントをまとめたメモ(約50記事)をジャンル別に全て公開します。
ジャンルは以下の通りなので、気になるものがあればぜひご覧ください。【ジャンル一覧】
・GitHub関連
・Laravel関連
・データベース(migration/seeding)関連
・環境関連
・総まとめ集下記の点を、ご了承ください。
・ジャンルで統一しているため、内容に関しては統一性はありません。
・メモの難易度もバラバラです。
・初学者向けの内容となっております。
・自分用のメモを転用しておりますので、表現が稚拙な部分があるかと思います。
・あくまで僕のメモです!!環境
・vagrant-docker-laravel
・docker-compose version 1.25.0
・PHP 7.2.34
・Laravel Framework 5.8.38
・mysql Ver 14.14 Distrib 5.7.32, for Linux (x86_64) using EditLine wrapper
・phpmyadminを使用・【docker】down と stop の使い分け
docker-compose build
を行って
・ファイルの修正を反映させたい時はdocker-compose down //コンテナの削除?シャットダウンを行って
docker-compose up -dで、新たにコンテナを立ち上げる
・そのままのコンテナで、再起動のみ行いたい場合は
docker-compose stopでコンテナを止めてから
docker-compose startで、既存のコンテナを開始させる
・Docker 起動時にapacheがすぐに落ちる
不具合詳細
Docker 起動時にapacheがすぐに落ちる不具合
その他ブラウザでLaravelにアクセスできない等原因は、DockerとVagrantの適切なシャットダウンをしていなかったから(?)
【メンターさんの回答】 以前の操作で適切なシャットダウンが出来ていないと、ガベージファイルというゴミファイルが悪さをしているのかも知れません。 docker ps -a で現在できているコンテナをみて、 docker rm コンテナID でガベージファイルを全削除してから、 再度 docker-compose build docker-compose up -d 等を試していただけますか?参考リンク
https://qiita.com/tifa2chan/items/e9aa408244687a63a0ae対処方法
①適切なシャットダウン
Docker 停止docker-compose stopVagrant 停止
vagrant suspend②ガベージファイルの削除方法
既存のコンテナを確認するdocker ps -a不要と思われるコンテナを削除する
docker rm コンテナ名シャットダウンからの復帰
suspendからの復帰
vagrant resumedockerの開始
docker-compose start・Docker立ち上げまでの流れ(インストール後)
※こちら私が使用していたディレクトリ名なのでわかりにくいかもです
ターミナルにて
・cdコマンドでプロジェクトディレクトリに移動
・cdコマンドでdocker-on-vagrantに移動
・vagrantにログインkei@Mac-Pro docker-on-vagrant % vagrant ssh Last login: Sat Nov 14 16:32:03 2020 from 10.0.2.2ls cdコマンドでdocker-laravelまで移動
[vagrant@local-docker ~]$ ls docks [vagrant@local-docker ~]$ cd docks/ [vagrant@local-docker docks]$ ls docker-laravel [vagrant@local-docker docks]$ cd docker-laravel/ [vagrant@local-docker docker-laravel]$ ls README.md apache-php docker-compose.yml index.php lara-ddocker-laravel上で「docker-compose start」(既存のコンテナをスタートさせる)
[vagrant@local-docker docker-laravel]$ docker-compose start Starting db ... done Starting web ... done Starting phpmyadmin ... done //3つ全て立ち上がったらOK!lara-dに移動
[vagrant@local-docker docker-laravel]$ ls README.md apache-php docker-compose.yml index.php lara-d [vagrant@local-docker docker-laravel]$ cd lara-d--ここから開発スタートできる--
・Laravelとmysqlが接続できないエラー(環境構築)
エラー詳細
→php artisan migration ができない
root@86b16371b02f html]# php artisan migrate
エラー文
Illuminate\Database\QueryException : SQLSTATE[HY000] [1045] Access denied for user 'root'@'172.23.0.3' (using password: NO) (SQL: select * from information_schema.tables where table_schema = laravel and table_name = migrations and table_type = 'BASE TABLE')原因
①Laravelの.envファイルのmysqlパスワード と docker-compose.yml内に記載されているmysqlパスワードが不一致であった。
ちなみに、docker-compose.yml内のパスワードに全て合わせなければならない!!②そもそも、migrationをする前にテーブルが入るための箱(データベース)をphpmyadminに作っておかなければならなかった。これは.envファイルのDB_DATABASE=●●●で指定されている名前のdbを作っておくこと
③migrationファイル内の構文が間違っていた
今回はtimestamps()とtimestamp()で引数の取り方が変わるため、構文エラーとなっていた。Mysqlとの接続方法
以前まとめた記事があります↓↓
https://qiita.com/kei_Q/items/f3422b34afbe094119cb・vagrant docker 新しいコンテナを立ち上げる(新規プロジェクトを立ち上げる)方法
コンテナを新しく立ち上げたい!!!
という時の方法laravelの環境を動かすことができるdockerファイルをクローン
この時に名前を変更しておくと良い
[vagrant@local-docker docks]$ git clone https://github.com/****/docker-laravel.git **lara-review** ←ここで名前変更vagrantにログインした状態でdocksディレクトリの中にクローンする
[vagrant@local-docker docks]$ git clone https://github.com/****/docker-laravel.git lara-review Cloning into 'lara-review'... remote: Enumerating objects: 23, done. remote: Counting objects: 100% (23/23), done. remote: Compressing objects: 100% (15/15), done. remote: Total 23 (delta 5), reused 22 (delta 4), pack-reused 0 Unpacking objects: 100% (23/23), done.これでファイルをクローンしてきてlara-reviewと言う名前でvagrantの中においた。
イメージの作成
docker-compose buildを行ってイメージを作成した
いざコンテナの作成
docker-compose up -dでコンテナを新しく作成しようとしたらエラーが出た
それが以下のエラー[vagrant@local-docker lara-review]$ docker-compose up -d Creating network "lara-review_default" with the default driver Creating mysql5.7 ... error ERROR: for mysql5.7 Cannot create container for service db: Conflict. The container name "/mysql5.7" is already in use by container "76d4ee80c5a2d3f73636dcd29e6ac736470617f02ee7e36148599f15d8fea51a". You have to remove (or rename) that container to be able to reuse that name.訳)
コンテナを作成しようとしたけど、コンテナを作る時に使用するファイルに記載してある名前はすでに他のコンテナで使われているから作れませんよ?
って怒られてる。。
↓
つまり、今取り組んでるプロジェクトであるlara-dというlaravelプロジェクトのために作ったコンテナで、名前使っちゃってるから、同じ名前で二つは作成できないよと言う意味。解決策
解決策としては以下の3つが考えられる?
①既存のコンテナの削除
②既存のコンテナの名前変更
③ymlファイルの名前を変更してbuildした後にコンテナ作成現行のプロジェクトであるlara-dを消すのは不可能だから答えは③になるので
lara-reviewでクローンしてきたものの中にあるdocker-compose.ymlファイルに書いてある3つの名前を全て変更する
①Apache
②phpmyadmin
③web bash
の3つのこと。docker-compose.ymlファイル
[vagrant@local-docker lara-review]$ cat docker-compose.yml version: "3" services: web: build: context: ./apache-php ports: - 80:80 privileged: true links: - db volumes: - "./:/var/www/html" - "./apache-php/apache.conf:/etc/httpd/conf/httpd.conf" container_name: "apache-php" //←この名前を変更 db: image: mysql:5.7 environment: - MYSQL_ROOT_PASSWORD=root container_name: "mysql5.7" //←この名前を変更 phpmyadmin: image: phpmyadmin/phpmyadmin:latest links: - db ports: - 8080:80 environment: - PMA_ARBITRARY=1 - PMA_HOST=db - PMA_USER=root - PMA_PASSWORD=root container_name: "phpmyamin-la" //←この名前を変更 [vagrant@local-docker lara-review]$ymlファイルの編集
sudo vi docker-compose.ymlで編集
3つの名前を適当に変更した後、
docker-compose build docker-compose up -dを行うとコンテナが作成できた!!(この時既存のコンテナはストップしておかないといけない)
--------ここまでがコンテナの立ち上げ-----------
---------以下、Laravelの導入-----------
コンテナを立ち上げ、web bash に入る
[vagrant@local-docker lara-review]$ docker-compose exec web bashlaravel本体をインストールする
[root@4b2a1b935301 html]# composer create-project --prefer-dist laravel/laravel laravel-review "5.8.*"ちなみに最後の5.8の後の「*」は「5.8系のなかで最新のものをインストールしてね」という意味
laravelインストール画面
Creating a "laravel/laravel" project at "./laravel-review" Installing laravel/laravel (v5.8.35) - Downloading laravel/laravel (v5.8.35) - Installing laravel/laravel (v5.8.35): Extracting archive Created project in /var/www/html/laravel-review > @php -r "file_exists('.env') || copy('.env.example', '.env');" Loading composer repositories with package information Updating dependencies Lock file operations: 86 installs, 0 updates, 0 removals - Locking beyondcode/laravel-dump-server (1.3.0) - Locking dnoegel/php-xdg-base-dir (v0.1.1) - Locking doctrine/inflector (1.4.3) - Locking doctrine/instantiator (1.4.0) - Locking doctrine/lexer (1.2.1) ・・・・・ ・・・・ ・・続くymlファイルを編集する
[vagrant@local-docker lara-review]$ cat docker-compose.ymlversion: "3" services: web: build: context: ./apache-php ports: - 80:80 privileged: true links: - db volumes: - "./laravel-review:/var/www/html" //変更箇所 - "./apache-php/apache.conf:/etc/httpd/conf/httpd.conf" //変更箇所 container_name: "apache-php-2" db: image: mysql:5.7 environment: - MYSQL_ROOT_PASSWORD=root container_name: "mysql5.7-2" phpmyadmin: image: phpmyadmin/phpmyadmin:latest links: - db ports: - 8080:80 environment: - PMA_ARBITRARY=1 - PMA_HOST=db - PMA_USER=root - PMA_PASSWORD=root container_name: "phpmyamin-la-2"apache conf をbuildする
[vagrant@local-docker apache-php]$ docker-compose buildちなみに
コンテナを起動させておけるのは多分一つだけなので、、
lara-reviewのコンテナを立ち上げる際はdocker-laravelのコンテナは停止しておく必要がある。停止とスタートのコマンドは以下の通り
docker-compose stop コンテナを停止 (docker-compose downはシャットダウンなので注意) docker-compose start コンテナを再開させるdocker-laravel(既存プロジェクト) もしくは lara-review(新規プロジェクト) の停止もしくは開始したい方のディレクトリに移動してから上記コマンドを叩いて、使わないプロジェクトを停止させ、これから使用する方を立ち上げる。
こんな感じに↓↓↓
[vagrant@local-docker lara-review]$ docker-compose stop Stopping phpmyamin-la-2 ... done Stopping apache-php-2 ... done Stopping mysql5.7-2 ... done [vagrant@local-docker lara-review]$ [vagrant@local-docker lara-review]$ [vagrant@local-docker lara-review]$ cd .. [vagrant@local-docker docks]$ cd docker-laravel/ [vagrant@local-docker docker-laravel]$ docker-compose start Starting db ... done Starting web ... done Starting phpmyadmin ... done・vagrantの停止と再起動の流れ(パソコンの再起動したい時に超有用です)
パソコンを再起動するときはvagrantをシャットダウンさせるか、スリープモードにしておくべきだそう。
vagrantを一時停止する(スリープさせる)
vagrant suspendkei@Mac-Pro docker-on-vagrant % vagrant suspend ==> vagrant: A new version of Vagrant is available: 2.2.14 (installed version: 2.2.13)! ==> vagrant: To upgrade visit: https://www.vagrantup.com/downloads.html ==> default: Saving VM state and suspending execution...vagrantが止まったかどうかの確認(状態確認)
vagrant statusちなみにdefaultの状態は
Power off
Running
Saved
の三つがある。
vagrant status実行
kei@Mac-Pro docker-on-vagrant % vagrant status Current machine states: default saved (virtualbox) //savedならOK! To resume this VM, simply run `vagrant up`. oourakeisuke@Mac-Pro docker-on-vagrant %――ここでパソコンを再起動する――
――パソコンの再起動が完了したら――
状態確認
vagrant statusLast login: Sun Nov 22 15:25:57 on console kei@Mac-Pro docker-on-vagrant % vagrant status Current machine states: default saved (virtualbox) //savedのままならOK! To resume this VM, simply run `vagrant up`.vagrantを再起動する(suspendからの復帰)
vagrant resumekei@Mac-Pro docker-on-vagrant % vagrant resume ==> default: Resuming suspended VM... ==> default: Booting VM... ==> default: Waiting for machine to boot. This may take a few minutes... default: SSH address: 127.0.0.1:2200 default: SSH username: vagrant default: SSH auth method: private key ==> default: Machine booted and ready! ==> default: Machine already provisioned. Run `vagrant provision` or use the `--provision` ==> default: flag to force provisioning. Provisioners marked to run always will still run.vagrantにログインする
kei@Mac-Pro docker-on-vagrant % vagrant ssh Last login: Thu Nov 19 11:14:13 2020 from 10.0.2.2 [vagrant@local-docker ~]$ログイン成功!!(再起動成功!!)
- 投稿日:2021-01-24T20:34:17+09:00
1台のWindowsマシンでJenkinsマスターとスレーブを登録してみた
概要
1台のWindowsマシンで、Dockerで立ち上げたJenkinsマスターと、ホストのWindowsネイティブで動くJenkinsスレーブを共用できたので、備忘録として残します。
モチベーション
- 会社の組み込みソフト用のCI環境立ち上げが目的
- 手元にあるのがWindows10マシン1台なので、まずはこれで全て賄いたい
構成
何でそんな構成にしたの?
主な理由は以下の通りです。
- Jenkins立ち上げの属人化を防ぐ一環で、DockerでJenkinsサーバーを立ち上げたかった
- CI対象のビルド用ライセンスがWindows限定だった
- JenkinsのDockerはLinuxコンテナ限定なのでWindowsのコマンドが動かせず、ビルドできなかった: 参考文献
主に2、3のせいで若干複雑な構成になった感じです。
単に目的達成だけなら、JenkinsマスターをWindowsインストーラでセットアップすれば良かったんですが。
仮にサーバーマシンを入れ替えたりすることになっても、手順書をゴリゴリ書くよりはコマンド一発でセットアップできるほうが楽かなと。
(あと単純にDockerを使ってみたかったという理由もあります)環境
- Windows10 Home Version 20H2 (Build 19042.685)
- Docker Desktop Version 3.1.0 (51484)
- WSL2
- Jenkins Version 2.263.2
- WMI Windows Agent Version 1.7
リポジトリ
今回のDocker構成は Github に置いています。
Jenkinsマスター
Dockerfile
コンテナ内のファイルを編集するときに備えて、(宗教上の理由から)Vimだけインストールしています。
本当はここにWMI Windows Slaveプラグインのインストールを書くべきなのでしょうが、今回は省略しました。jenkins/DockerfileFROM jenkins/jenkins:2.263.2-lts-slim USER root RUN apt-get update -y RUN apt-get install -y vim USER jenkinsdocker-compose.yml
ポートフォワーディングの設定を管理したり、将来的にnginxも使ったりするかもなので、今はJenkinsマスター単体ですがdocker-composeから起動するように準備してます。
データの永続化はVolumeで。
個人的に後から分かりやすいようにjenkins_
って付けてるんですが、Volume名なんかがjenkins_jenkins_master_data
とかになっちゃう。フォルダ名が付与されちゃうのかな・・・?docker-compose.ymlversion: "3" services: jenkins_master: container_name: master build: context: . dockerfile: ./jenkins/Dockerfile environment: JENKINS_OPTS: '--prefix=/jenkins' ports: - 80:8080 - 50000:50000 volumes: - jenkins_master_data:/var/jenkins_home volumes: jenkins_master_data:Dockerコンテナ起動
普通に
docker-compose up -d
で起動します。Jenkins起動まで
Unlockして、Suggested pluginをインストールして、Adminユーザーを作る。
今回は詳細は省略します。Jenkins初期設定
Jenkinsの管理
->プラグインの管理
から WMI Windows Agent プラグインをインストールします。Slaveノードの追加
Jenkinsの管理
->ノードの管理
->新規ノード作成
から追加します。
最初のページは以下の通り設定。
- ノード名: windows-slave (今回の例。スレーブに合わせて適切に)
- Permanent Agent にチェック
次のページは以下の通り設定。
- リモートFSルート:
C:/tmp
- 起動方法:
Launch agent by connecting it to the master
これでノードの追加は完了です。
この時点では「×」のアイコン付きで表示されます。スレーブのノードをクリックするとJNLPで接続する手順が表示されます。
今回はLaunchボタンでなく、Run from agent command line
の手順で接続しました。
ちゃんと接続できると「×」のアイコンが消えます。ジョブ設定
新規ジョブ作成
からテスト用のジョブを作成します。
- ジョブ名: SlaveJob1(今回の例。ジョブに合わせて適切に)
- フリースタイル・プロジェクトのビルドを選択
General の設定
- 実行するノードを制限
- ラベル式: windows-slave
ビルド の設定
ビルド手順の追加
->Windowsバッチコマンドの実行
- コマンド:
..\..\build.bat
- あとでスレーブに作るビルド用のバッチファイル名と合わせます
- 実行ディレクトリは
[リモートFSルート]/workspace/[JOB名]
となるようなので、2つ上の階層を指定していますJenkinsスレーブ
リモートFSルートである
C:\tmp
を作成します。
その中に先ほど指定したbuild.bat
を作成します。
今回はテスト用に中身は単純なechoとしますが、ここにビルド用のコマンドを記述します。build.bat@echo off echo "Slave build job"ビルド実行
再度メニューから
ビルド実行
で手動ビルドします。
するとビルド履歴に#XX
と履歴が表示されるので、そこからコンソール出力
を見ると以下のように表示されるはずです。Started by user USER_NAME Running as SYSTEM Building remotely on windows-slave in workspace C:/tmp/workspace/SlaveJob1 [SlaveJob1] $ cmd /c call C:\Users\USER\AppData\Local\Temp\jenkins12877575992189775420.bat C:\tmp\workspace\SlaveJob1>..\..\build.bat "Slave build job" C:\tmp\workspace\SlaveJob1>exit 0 Finished: SUCCESS終わりに
若干複雑な構成になっちゃいましたが、1台のWindows10マシンでDockerのJenkinsマスターとホストネイティブのJenkinsスレーブを共用することができました。
ただ、実は2021/01/24現在、この記事の構成に成功したのは自宅のWindows10マシンで、会社のマシンではスレーブの接続あたりが上手く動いてません。
WSL2バックエンドでないとダメとかあったら嫌だなぁ・・・(会社マシンはWindowsビルドバージョンのせいでWSL2が入れられない)
- 投稿日:2021-01-24T20:22:52+09:00
listen tcp 0.0.0.0:xxx: bind: address already in us の対処法
目的
Ruby on Railsでポートフォリオを作成していた途中にdocker-compose upをした際に、listen tcp 0.0.0.0:xxx: bind: address already in usとエラーが出たのでその時の対処方法を忘れないように書きます。
エラー内容
$ docker-compose up -d ------------------------- ------------------------- Error starting userland proxy: listen tcp 0.0.0.0:3306: bind: address already in use ERROR: Encountered errors while bringing up the project.対処方法
最初にこのコマンドを打ちます。
$ sudo lsof -i -P | grep "LISTEN" name1 633 ~~~~~~ 10u IPv4 0xc46fc72c3028ba51 0t0 TCP localhost:49362 (LISTEN) name2 634 ~~~~~~ 53u IPv6 0xc46fc72c50688ca1 0t0 TCP *:3000 (LISTEN) name3 96145 ~~~~~~ 54u IPv6 0xc46fc72c506892c1 0t0 TCP *:3306 (LISTEN) name4 72412 ~~~~~~ 82u IPv4 0xc46fc72c4cf4e591 0t0 TCP localhost:62741 (LISTEN)エラー内容は3306ポートはすでにあるよと言われています。
なので3306ポートをkillします。$ sudo kill -9 96145これでdocker-compose upができます!!
- 投稿日:2021-01-24T19:25:37+09:00
Dockerコンテナ間でのFTPアップロードするためのdocker-compose.ymlの書き方
PHP+ApacheからFTPサーバーへデータをアップロードするアプリケーションを開発するために、まずはDockerで開発環境を作ることになりました。
その際に、コンテナ(Apache + php)とコンテナ(Pure-FTPd)の間の通信でハマったので、記事にまとめます。バージョン情報
- PHP 7.4
- Apache 2.4
- Pure-FTPd v1.0.47
結論
最終的な
docker-compose.yml
とPHPのプログラムの記述はこんな感じ。docker-compose.yml
docker-compose.ymlversion: '3.7' services: app: build: . ports: - 443:443 volumes: - .:/var/www/html ftp-server: image: stilliard/pure-ftpd:latest ports: - "21:21" - "30000-30009:30000-30009" volumes: - ./ftp/data:/home/ftpusers environment: - PUBLICHOST=ftp-server - FTP_USER_NAME=ftp_user - FTP_USER_PASS=ftp_password - FTP_USER_HOME=/home/ftpusersFTPでアップロードするプログラム
ftp_upload.php$ftp_server = 'ftp-server'; $ftp_port = 21; $ftp_user_name = 'ftp_user'; $ftp_user_pass = 'ftp_password'; $ftp_send_file = '/hoge/data.txt'; $ftp_remote_file = '/hoge/data.txt'; // FTPサーバへ接続する $conn_id = ftp_connect($ftp_server, $ftp_port); if($conn_id == false){ echo "FTPサーバへの接続失敗"."\n"; exit(); } // ユーザー名とパスワードでログインする $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); if($login_result == false){ echo "FTPサーバへのログイン失敗"."\n"; // 接続を閉じる ftp_close($conn_id); exit(); } //パッシブモードに設定 ftp_pasv($conn_id, true); // ファイルをアップロードする if (ftp_put($conn_id, $ftp_remote_file, $ftp_send_file, FTP_BINARY)) { echo "UPLOAD 成功"."\n"; } else { echo "UPLOAD 失敗"."\n"; } // 接続を閉じる ftp_close($conn_id);Dockerfileはあまり重要ではないので割愛します。
重要なところ
docker-compose.ymlversion: '3.7' services: # 省略 ftp-server: # 省略 environment: - PUBLICHOST=ftp-serverftp_upload.php$ftp_server = 'ftp-server';解説
参考記事
Dockerはコンテナ名を使用してコンテナ間の通信をするそう。
なので、docker-compose.ymlversion: '3.7' services: # 省略 ftp-server:ここで設定したサービス名(
container_name
で明示的にしていないとサービス名がコンテナ名となる)と、docker-compose.yml# 省略 environment: - PUBLICHOST=ftp-serverこの
PUBLICHOST
を合わせておかないと、Docker間でのFTP通信ができない。(ホスト名が違うとエラーが出る)
docker-compose.yml
内の項目を合わせたら、これでFTPサーバー側の設定はできたので、ftp_upload.php$ftp_server = 'ftp-server';上記のようにアプリ側でコンテナ名(ホスト名)を指定して、プログラムを実行すれば無事アップロードが成功する。(はず)
- 投稿日:2021-01-24T18:29:11+09:00
【最新版】はじめてのLaravel!Laradockを用いたLaravel開発環境構築
- 最終編集日(2021年1月)
- PHP、Dockerのインストールも後日投稿予定です。アカウントをフォローしてお待ちください!
環境構築だけ読みたい方は、Laravelの環境構築まで読み飛ばしてください。
概要
本記事は、PHPのフレームワークであるLaravelの環境構築を開設した記事です。
構築する Laravel 及び PHP のバージョンは以下になります。
- Laravel 8.x
- PHP 7.4
初めてLaravelを使う方、一度環境構築で挫折した方でもつまずかないことを心掛けて執筆しました。
何かわからないことことがありましたら、コメントでお知らせください!
環境
Docker for Desktopのインストールが必要になります
- Mac
- Windows
- Windows 10 homeの方は、Windowsをバージョン2004,ビルド19041以上にアップデートした上でWSL 2のインストールが必要になります
- Docker Toolboxでも環境構築をすることはできますが、一部コマンドが異なる場合があります
- 本記事では
MySQL
を使います。PostgreSQL
での環境構築も可能ですが、Laradockの起動で一部コマンドが異なります。Laradock で使用できる PHP バージョン早見表
Laradockで使用できるPHP、Laravelのバージョンは以下の通りです。
※2021年1月現在公式サポートされているPHPのバージョンのみ記載しています。
PHPバージョン Laradock対応 7.3 〇 7.4 〇 8.0 × 前提条件
- gitをインストールしていること
- Docker for Desktopをインストールしていること
Terminalで以下のコマンドを実行して正しく出力されるかを確認してください。
$ git --version git version 2.9.0 $ docker --version Docker version 19.03.1, build 74b1e89e8a $ docker-compose --version docker-compose version 1.24.1, build 4667896b※Dockerのバージョンは
17.12
以降である必要があります。
(参考) Getting StartedLaravelの環境構築
それでは実際にLaravelの環境構築を行っていきましょう。
プロジェクトディレクトリの作成
mkdir
コマンドでLaradock
をインストールするディレクトリを作成します。ここでは、laravel-workspace
としています。mkdir laravel-workspace
cd
コマンドで作成したディレクトリに移動します。cd laravel-workspaceLaradockのインストール
Laradockをインストールしていきます。
以下のコマンドを実行します。
$ git clone https://github.com/Laradock/laradock.gitインストールが終わると以下のように表示されます。
$ git clone https://github.com/Laradock/laradock.git Cloning into 'laradock'... remote: Enumerating objects: 11524, done. remote: Total 11524 (delta 0), reused 0 (Rdelta 0), pack-reused 11524eceiving objects: 100% (11524/11524), 11.36 MiB | 3Receiving objects: 100% (11524/11524), 11.42 MiB | 346.00 KiB/s, done. Resolving deltas: 100% (6203/6203), done. Checking connectivity... done.
laradock
ディレクトリが作成されていることがわかります。$ ls laradock/
Laradock
のインストールは以上です.env ファイルの編集
.env
ファイルを編集することで、プロジェクトの環境変数を定義していきます。使用するデータベースやPHPのバージョンなどもここで指定します。
cd
コマンドを使って先ほど作成されたlaradock
ディレクトリに移動しましょう。$ cd laradock
laradock
ディレクトリの中には、env-example
という.env
のサンプルがあります。これをコピーして使用します。以下のコマンドでコピーしてください。cp env-example .env
.env
を編集していきます。お好きなエディタで.env
ファイルを開いてください。1.プロジェクトの相対パスの指定
プロジェクトを作成するにあたり、パスを指定します。
ここでは、laravel-project
というプロジェクトをlaradock
同じ階層に作成します。laravel-workspace ├── laradock └── laravel-project8行目を以下のように編集してください。
.env- APP_CODE_PATH_HOST=../ + APP_CODE_PATH_HOST=../laravel-project2.データベースのディレクトリ変更
デフォルトでは、データベースなどがホームディレクトリに保存されるようになっています。
プロジェクトディレクトリ配下に作成されるように設定を変更しましょう。17行目を以下のように編集してください。
.env- DATA_PATH_HOST=~/.laradock/data + DATA_PATH_HOST=.laradock/data3. コンテナ名の変更
ここでは、Dockerを起動するときのコンテナ名を指定していきます。「コンテナ?」という方はコピペしていただいて構いません。
※Dockerに関しては「いまさらだけどDockerに入門したので分かりやすくまとめてみた」の記事が非常にわかりやすいです。36行目を以下のように編集してください。
.env- COMPOSE_PROJECT_NAME=laradock_ + COMPOSE_PROJECT_NAME=laravel-project4. PHPのバージョン設定
PHPのバージョンを設定します。
42行目を使用したいPHPのバージョンに変更します。
ここでは、PHP 7.4
を指定します。.env- PHP_VERSION=7.3 + PHP_VERSION=7.42021年1月現在のLaradockがサポートしているPHPのバージョンに関してはこちらをご覧ください。
Laradockの起動
それではLaradockを起動していきます。
laradock
ディレクトリで以下のコマンドを実行してコンテナを起動します。※
postgres
を使用している場合は、mysql
の部分をpostgres
に置き換えてください。$ docker-compose up -d php-fpm nginx mysql workspace以下のように表示されればOKです。
$ docker-compose up -d nginx mysql workspace . . . Creating laravel-project_docker-in-docker_1 ... done Creating laravel-project_mysql_1 ... done Creating laravel-project_workspace_1 ... done Creating laravel-project_php-fpm_1 ... done Creating laravel-project_nginx_1 ... doneLaravelアプリケーションの作成
それではLaravelのアプリケーションを作成していきます。以下のコマンドを実行してください。
$ docker-compose exec workspace bash以下のような表示になれば正常に
bash
が起動できています。$ docker-compose exec workspace bash root@6095e16a845d:/var/www#コマンドの最後には、Laravelのバージョンを指定しています。2021年現在、最新版は
Laravel8.x
です。ここでは8.*
を指定していますが、コマンドの最後の数字を変えることで、別のバージョンのLaravelでアプリケーションを作成をすることができます。# composer create-project --prefer-dist laravel/laravel="8.*" .※アプリケーションの作成には少し時間がかかります。
Application key set successfully.
と表示されればアプリケーションの作成は完了です。以下のようにプロジェクトの相対パスの指定で指定した名前と同じフォルダが作成されています。
laravel-workspace ├── laradock └── laravel-projectアプリケーションの確認
http://localhost にアクセスしてLaravelプロジェクトが作成されているか確認してみましょう。
上記のように表示されていれば正常にアプリケーションが作成されています。
コンテナの停止
コンテナを停止するときは以下のコマンドで停止することができます。
$ docker-compose stop参考
※本記事はTechpitの教材を一部修正したものです。
最後まで読んでいただきありがとうございました。今後も、PHP・Laravelに関する記事を投稿していきますので、もしよろしければ、Techpitをフォローしてお待ちください!
- 投稿日:2021-01-24T18:21:45+09:00
Vagrant&DockerのRailsの開発環境構築 メモ
開発環境
Winodows 1p Pro (64bit)
Vagrant 2.2.14
Ubuntu 16.04.6 LTS
Docker 18.09.7
ruby:ruby 2.7.2p137
/rails_docker
Dockerの勉強の為、Railsの開発環境構築を構築しました。
Vagrantフォルダ配下にrails_dockerディレクトリを置きその下に、Docker,docker-compose-ymlを配置。
さらに下にsrcディレクトリ置き、Gemfileを配置。
sudo docker-compose run web rails new . --force --database=mysql コマンドを実行したら以下のエラーが発生した。
````Building web ERROR: Error processing tar file(signal: killed):ソースを修正しながら再度インストールを実行。すると次のエラーが・・・・。
Gem::Ext::BuildError: ERROR: Failed to build gem native extension. current directory: /usr/local/bundle/gems/racc-1.5.2/ext/racc/cparse /usr/local/bin/ruby -I /usr/local/lib/ruby/2.7.0 -r ./siteconf20210122-7-k0z1kz.rb extconf.rb extconf failedCannot allocate memory - /usr/local/bin/ruby Gem files will remain installed in /usr/local/bundle/gems/racc-1.5.2 for inspection. Results logged to /usr/local/bundle/extensions/x86_64-linux/2.7.0/racc-1.5.2/gem_make.out An error occurred while installing racc (1.5.2), and Bundler cannot continue. Make sure that `gem install racc -v '1.5.2' --source 'https://rubygems.org/'` succeeds before bundling. In Gemfile: rails was resolved to 6.1.1, which depends on actioncable was resolved to 6.1.1, which depends on actionpack was resolved to 6.1.1, which depends on actionview was resolved to 6.1.1, which depends on rails-dom-testing was resolved to 2.0.3, which depends on nokogiri was resolved to 1.11.1, which depends on racc ERROR: Service 'web' failed to build: The command '/bin/sh -c bundle config --local set path 'vendor/bundle' && bundle install' returned a non-zero code: 5「extconf failedCannot allocate memory」というメッセージが.
メモリ不足の可能性を教えてもらい。
VSCodeの中、Vagrant に SSH-FS 接続よりいい方法があるかな?を参考にして、Vagrantファイルにメモリーを増やしました。Vagrant.configure("2") do |config| config.vm.box = "ubuntu/xenial64" # Ubuntu 16.04 を使用 #config.vm.network "forwarded_port", guest: 3000, host: 3000 # Railsで利用するポートを設定 config.vm.network "private_network", ip: "192.168.33.10" config.vm.provider "virtualbox" do |vb| vb.memory = "4096" # メモリを多めに設定 end end環境を構築して再度実行したら、無事インストール完了しました。
- 投稿日:2021-01-24T18:00:16+09:00
Docker環境のDB(MySQL)コンテナに接続する方法
やりたいこと
Dockerで作成したDB(MySQL)コンテナに入ってデータベースをいじりたい。
ソースコード
長いので折りたたんでいます。
docker-compose.yml
docker-compose.yml#docker-compose.ymlのバージョン version: "3.8" #docker volumeの設定 volumes: docker-volume: #services以下に各コンテナの設定を書く services: #Webサーバーのコンテナ web: image: nginx:1.18 ports: - "8000:80" depends_on: - app volumes: - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf - .:/var/www/html #アプリケーションのコンテナ app: build: ./docker/php volumes: - .:/var/www/html #データベースのコンテナ db: image: mysql:5.7 ports: - "3306:3306" environment: MYSQL_DATABASE: db_name MYSQL_USER: db_user MYSQL_PASSWORD: db_password MYSQL_ROOT_PASSWORD: root TZ: "Asia/Tokyo" volumes: - docker-volume:/var/lib/mysql # phpMyadominのコンテナ作成 phpmyadmin: image: phpmyadmin/phpmyadmin depends_on: - db environment: - PMA_ARBITRARY=1 - PMA_HOSTS=db - PMA_USER=db_user - PMA_PASSWORD=db_password ports: - "8080:80" volumes: - ./docker/phpmyadmin/sessions:/sessions
.env
.envAPP_NAME=Laravel APP_ENV=local APP_KEY=base64:8EM1Yt7LJjZSRaEjtdhXCVShJEI0GGo6FG6IZHXCuis= APP_DEBUG=true APP_URL=http://localhost:8000 LOG_CHANNEL=stack DB_CONNECTION=mysql DB_HOST=db DB_PORT=3306 DB_DATABASE=db_name DB_USERNAME=db_user DB_PASSWORD=db_password BROADCAST_DRIVER=log CACHE_DRIVER=file QUEUE_CONNECTION=sync SESSION_DRIVER=cookie SESSION_LIFETIME=120 REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 MAIL_DRIVER=smtp MAIL_HOST=smtp.mailtrap.io MAIL_PORT=2525 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= AWS_DEFAULT_REGION=us-east-1 AWS_BUCKET= PUSHER_APP_ID= PUSHER_APP_KEY= PUSHER_APP_SECRET= PUSHER_APP_CLUSTER=mt1 MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"試したこと
rootのパスワードを使っても接続できない。
terminal$ docker-compose exec db bash root@74539701c71c:/# mysql -u user -p Enter password: ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)ちなみにホストとポート番号を確認すると...
Name Command State Ports -------------------------------------------------------------------------------- laravel_todo_api_app_1 docker-php-entrypoint Up 9000/tcp php-fpm laravel_todo_api_db_1 docker-entrypoint.sh Up 0.0.0.0:3306->3306/tcp mysqld , 33060/tcp laravel_todo_api_phpmy /docker-entrypoint.sh Up 0.0.0.0:8080->80/tcp admin_1 apac ... laravel_todo_api_web_1 /docker-entrypoint.sh Up 0.0.0.0:8000->80/tcp ngin ...
解決法
$ mysql -h 127.0.0.1 -P 3306 -u root -pホストは
localhost
と指定するとローカルマシンのmysql
ソケットを探しに行くのでエラーになる。
ポート番号の指定は大文字で-P
参考
参考にさせていただきました。ありがとうございました。
【Docker】コンテナ内のデータベース閲覧(ローカル,EC2)
docker内のMySQLに接続したい
- 投稿日:2021-01-24T17:37:49+09:00
Dockerのruby:2.7-alpineでruby2.7がないといわれてしまう
はじめに
これまでいくつかのDockerimageを構築してきました。OpenAPIとSinatraの組み合わせは、お手軽なのですが、これまで作成してきたイメージを作り直したところ問題が発生しました。
Dockerでbundle exec rackup ...を実行したタイミングでエラーメッセージが表示されてしまうようになりました。
エラーメッセージ$ sudo docker run -it --rm \ --env LC_CTYPE=ja_JP.UTF-8 \ --env RACK_ENV="deployment" \ -p 8080:8080 \ --name webapp mywebapp \ ... + bundle exec rackup --host 0.0.0.0 --port 8080 env: can't execute 'ruby2.7': No such file or directoryコンテナ内のファイルを確認して、最後のメッセージは ./lib/ruby/2.7.0/bin/rackupコマンドがruby2.7を呼び出しているからということは分かりました。
Dockerfileは次のようになっていて、multi-stage buildを利用しています。
Dockerfileの抜粋FROM ruby:2.7-alpine as rubydev RUN apk update && \ apk add --no-cache tzdata bash ca-certificates make gcc libc-dev COPY . /app WORKDIR /app RUN bundle config path lib RUN bundle install FROM ruby:2.7-alpine RUN apk update && \ apk add --no-cache tzdata bash ca-certificates COPY --from=rubydev /app /app WORKDIR /app ADD run.sh /run.sh RUN chmod +x /run.sh RUN addgroup sinatra RUN adduser -S -G sinatra sinatra USER sinatra RUN bundle config path lib ## generating the ~/.bundle/config file. ENTRYPOINT ["/run.sh"]理由
rackupを探してみると、2箇所に存在していて、なぜか lib/ruby/2.7.0/bin/rackup では ruby2.7バイナリを探していました。
+ find lib/ -name rackup lib/ruby/2.7.0/bin/rackup lib/ruby/2.7.0/gems/rack-2.2.3/bin/rackup + cat lib/ruby/2.7.0/bin/rackup #!/usr/bin/env ruby2.7 ... + cat lib/ruby/2.7.0/gems/rack-2.2.3/bin/rackup #!/usr/bin/env ruby ...ワークアラウンドで対応するのであれば、/usr/local/bin/ruby2.7 を準備する方法もあります。
Dockefileに追加した1行RUN ln -s ruby /usr/local/bin/ruby2.7ただ、こういった現象が発生するはずがないと思っていたので、少し原因の調査を進めました。
原因
結論からいうと、問題は Dockerfile の次の箇所にありました。
問題のあったDockerfileの抜粋COPY . /appここではDockerfileを含めて全てのファイルをコピーしています。
Dockerfile自体は秘密ではないため、この方法自体は横着しているなという程度のものですが、問題はこの時点でカレントディレクトリの./lib/ruby/2.7.0/ ディレクトリもコピーされてしまったことでした。コンテナを作成する前にコードをデバッグする目的で、ローカルのUbuntu環境でもrackupを起動しています。
そのため、bundle install コマンドを実行することで、./lib/ruby/2.7.0/bin/rackup が配置されていたのでした。Ubuntuでは /usr/bin/ruby が ruby2.7へのシンボリックリンクとなっているため、このrackupはruby2.7から起動されるようになっていました。
Ubuntuに配置されたrackupコマンド$ head -2 ./lib/ruby/2.7.0/bin/rackup #!/usr/bin/env ruby2.7 #他のDockerfileを処理するMakefileの中で、./lib/ruby ディレクトリを削除していたのですが、このイメージを作成する作業用リポジトリのMakefileには、このコードが含まれていませんでした。
Makefileのdockerイメージをbuildする箇所の処理抜粋## local debug用のコマンド bundle-install: bundle install --path lib ## dockerイメージをbuild docker-build: rm Gemfile.lock || true sudo docker build . --tag $(DOCKER_IMAGE)Gemfile.lockファイル以外に、./lib/ruby/, ./.bundle/ ディレクトリを削除するコードを追加することで恒久的な対策となりました。
結果は勘違いから勝手に悩んでいるだけだったのですが、手持ちのコンテナをbuildするプロセスを再度チェックしたいと思います。
他のイメージでは ./.bundle/ や、./lib/ruby を削除していたので、思い込みがあったのも問題解決がすぐに出来なかった原因でした。以上
- 投稿日:2021-01-24T17:35:13+09:00
Docker上のLaravelにJetstreamをインストールする。
https://qiita.com/ucan-lab/items/56c9dc3cf2e6762672f4
https://qiita.com/ucan-lab/items/5fc1281cd8076c8ac9f4
上記の記事を参考に構築したLaravel8に、Jetstreamをインストールします。ComposerでJetstreamをインストールする
まず、Laravelをインストールしたコンテナに入ります。
$ docker-compose exec [コンテナ名] [コマンド名]次にcomposerコマンドを実行します。
$ composer require laravel/jetstreamjetstream:installを実行
フロントエンドスタックとして、LivewireかInertiaを指定します。
Livewireはテンプレート言語にLaravelのBladeを利用します。
一方、InertiaはVue.jsを利用します。
どちらの場合も、--teamsをつけることでチームサポートを有効にできます。$ php artisan jetstream:install livewire $ php artisan jetstream:install livewire --teams$ php artisan jetstream:install inertia $ php artisan jetstream:install inertia --teamsnpmの依存パッケージをインストール・構築
npmがインストールされているコンテナで実行します。
$ npm install && npm run devデータベースをマイグレートする
こちらは再びLaravelのコンテナで実行します。
$ php artisan migrate確認
Laravelのホーム画面を確認すると、右上にログイン画面、ユーザー登録画面へのリンクが表示されており、それぞれの画面へ遷移できます。
composer require aravel/jetstream でメモリエラーが出た場合
php.iniファイルのmemory_limitを一時的に無制限にすることで対応可能です。
インストール後、memory_limitの値を元に戻しておいてください。php.inimemory_limit = 256M↓
php.inimemory_limit = -1
- 投稿日:2021-01-24T17:15:20+09:00
Docker + Laravel + Vue の環境構築 - Docker編
はじめに
Docker
がWindows10 Home
にも対応したということでDockerでの環境構築を始めてみました。Docker
とVue
は初めて触ります。Laravel
のみ少し経験あり。- Xserverにデプロイするつもりで構築。
- ドキュメントルートはプロジェクト直下の
public_html
- 本来はWebサーバーは
Apache
だけど、慣れたいのでnginx使ってます。環境
- Windows 10 Home(20H2)
Dockerのインストールについて
- インストール
- Docker Desktop for Windows
- インストールの詳細については割愛します。
- 発生したトラブル
Win10
にすんなりインストールして使えるとはいかず、バージョンアップをしました。- Windowsアップデートがまだの場合、下記公式からダウンロード可能です。
- 生成されたバージョン
- Docker: 20.10.2
- Docker Compose: 1.27.4
Docker
- Docker単体でも使えるが
Docker Compose
を使うのが便利なようです。- docker-composeは
yml
ファイルに複数のコンテナの定義を記述し、立ち上げができます。- WEBサーバーやDB等の1つのファイルで管理でき、コンテナ間の連携もできる大変便利なツールです。
- 今回使う
Docker Desktop
のインストール内容にDocker Compose
も含まれています。Docker Composeの準備
- 下記の
yml
を実行し、以下の環境が作られました。
- php : 7.4.14
- nginx : 1.19.6
- MySql : 5.7.32
- PhpMyAdmin : 5.0.4
- npm : 6.12.1
- node : 12.13.1
docker-compose.ymlversion: '3' services: php: build: ./docker/php volumes: - ./src:/var/www nginx: image: nginx ports: - 80:80 volumes: - ./src:/var/www - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf depends_on: - php tty: true command: [nginx-debug, '-g', 'daemon off;'] db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: sample_project MYSQL_USER: docker MYSQL_PASSWORD: docker TZ: 'Asia/Tokyo' command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci volumes: - ./docker/db/data:/var/lib/mysql - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf - ./docker/db/sql:/docker-entrypoint-initdb.d ports: - 3306:3306 phpmyadmin: image: phpmyadmin/phpmyadmin environment: - PMA_ARBITRARY=1 - PMA_HOST=db - PMA_USER=docker - PMA_PASSWORD=docker links: - db ports: - 4000:80 volumes: - ./docker/phpmyadmin/sessions:/sessions node: image: node:12.13-alpine tty: true volumes: - ./src:/var/www working_dir: /var/wwwphp -> Dockefileの準備
Dockerfile
に各コンテナの詳細情報を定義します。
これはphp
用のDockerfileで、今回個別に用意するのはこれだけです。FROM php:7.4-fpm COPY php.ini /usr/local/etc/php/ # 1. 必要なツールをインストール RUN apt-get update \ && apt-get install -y zlib1g-dev mariadb-client vim libzip-dev \ && docker-php-ext-install zip pdo_mysql \ && git vim curl cron unzip # 2. Composerインストール RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" RUN php composer-setup.php RUN php -r "unlink('composer-setup.php');" RUN mv composer.phar /usr/local/bin/composerd ENV COMPOSER_ALLOW_SUPERUSER 1 ENV COMPOSER_HOME /composer ENV PATH $PATH:/composer/vendor/bin WORKDIR /var/www # 3. laravelインストール RUN composer global require "laravel/installer"php -> php.iniの準備
php.ini[Date] date.timezone = "Asia/Tokyo" [mbstring] mbstring.internal_encoding = "UTF-8" mbstring.language = "Japanese"nginx -> default.conf
server { listen 80; index index.php index.html; root /var/www/public_html; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass php:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } }ここまでのディレクトリ構成
適当な場所にプロジェクトフォルダを作り、下記のように配置してください。
※[]
で囲ってる箇所はディレクトリです。[myLaravel] ├── [docker] │ ├── [nginx] │ │ └── default.conf │ └── [php] │ ├── Dockerfile │ └── php.ini └── [src]Docker Composeの実行
- コマンドプロンプト、または
Git Bash
等を使ってプロジェクトフォルダへ移動してください。- 下記コマンドを実行すると
Docker Compose
の内容からコンテナが作成され、下記のように動作を確認できます。~/myLaravel$ docker-compose up -d Starting mylaravel_db_1 ... done Starting mylaravel_node_1 ... done Starting mylaravel_php_1 ... done Starting mylaravel_phpmyadmin_1 ... done Starting mylaravel_nginx_1 ... done
Docker Desktop
を確認すると下記のように指定したプロジェクトと、コンテナが作成されていることが確認できます。
これで環境が整いました。
Docker Desktopからの操作
各コンテナにカーソルを合わせると、いくつかアイコンが表示されます。
左から
- ブラウザを開く
- WebサーバーやPhpMyAdmin等ブラウザ上で確認できるものにだけ、アイコンが表示されます。
- コンソール画面を開く
- コンソール上での操作を行います。
- 他の記事だとコマンド
docker-compose exec php bash
を使ってるものが多いです。- なぜか僕はこのコマンドでエラーになるので、デスクトップアプリ経由で使ってます。
docker-compose.yml
の各コンテナの設定にtty:true
があればできるはずなんですが解決できなかったので、設定から外しています。- PHPコマンドやnpmを使う時はそれぞれのコンソール上からしか実行できないので、やりたいことに合わせたコンソールを開く必要があります。ちょっとめんどくさい。
- コンテナの停止
- コンテナの再起動
- コンテナの削除
最終的にできた構成
db
,phpmyadmin
ディレクトリが作られました。中身は特に気にしなくていいので省略してます。[myLaravel] ├── [docker] │ ├── [db] │ │ └── ... │ ├── [nginx] │ │ └── default.conf │ ├── [php] │ │ ├── Dockerfile │ │ └── php.ini │ └── [phpmyadmin] │ └── [sessions] └── [src]次回
次回はLaravelとVueの環境構築を進めます。
参考にさせていただいた記事
https://qiita.com/phper_sugiyama/items/654f7a9171ae5ccf3e83
https://qiita.com/rockinruuula1227/items/83f3f1406f339083ef3f
- 投稿日:2021-01-24T12:43:41+09:00
DockerでPHP環境を作る(mac)
はじめに
勤め先でもPHPを使っており自宅でPHPを勉強するために、ローカルでPHP開発環境を整えることにしました。
MAMP(マンプ)でも良いかなと思いましたが、せっかくなのでDockerで作ってみます。
(開発中に色々詰まってしまったところがあるので、備忘録がわりのメモです。)手順
- Dockerによる環境構築
- ファイル・ディレクトリの準備
- 各ファイルの作成
- コンテナを起動
- サイトにアクセス
1. Dockerによる環境構築
Dockerを使うには、「Docker for Mac」のインストールが必要です。
Qitaに素敵な記事がたくさんあるので、ここでの説明は省略します。今回はDockerで以下のコンテナを使います。
- nginx
- PHP
- MySQL
- PHPMyAdmin
使用するコンテナが複数あるので、今回は「Docker Compose」を使って環境を作っていきます。
2. ディレクトリ・ファイルの準備
Dockerを起動する場所を作成しましょう。
まずはフォルダを1つ用意し、次のようなファイル構造となるようにしてください。
用意するフォルダは何でも良いのですが、今回は「php-test」という名前で作成します。php-test ├── docker-compose.yml ├── mysql │ └── data ├── nginx │ └── nginx.conf ├── php │ ├── Dockerfile │ └── php.ini └── www └── html └── index.php3. 各ファイルの作成
用意したファイルの中身を作成していきます。
中身を作成するファイルは、docker-compose.yml
、nginx.conf
、Dockerfile
、php.ini
、index.php
の5つです。docker-compose.yml
version: '3' services: nginx: image: nginx:latest ports: - 8080:80 volumes: - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf - ./www/html:/var/www/html depends_on: - php php: build: ./php volumes: - ./www/html:/var/www/html depends_on: - db db: image: mysql:5.7 ports: - 13306:3306 volumes: - ./mysql/data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: secret phpmyadmin: image: phpmyadmin/phpmyadmin:latest ports: - 8888:80 depends_on: - dbnginx.conf
server { listen 80; server_name _; root /var/www/html; index index.php index.html; 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_pass php:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }Dockerfile
FROM php:7.2-fpm COPY php.ini /usr/local/etc/php/ RUN docker-php-ext-install pdo_mysqlphp.ini
date.timezone = "Asia/Tokyo"index.php
設定情報を確認するために
phpinfo();
としていますが、なんでもいいです。<?php phpinfo(); ?>4. コンテナを起動
いよいよコンテナ起動です。
ターミナルを開き、docker-compose.yml
があるフォルダ(今回はphp-test)に移動します。下記コマンドで、php-testフォルダに移動。
cd php-test下記コマンドで、コンテナを起動。
docker-compose up -d以下のような記述がターミナル内に表示されたら、起動は成功です。
Creating php_01_db_1 ... done Creating php_01_phpmyadmin_1 ... done Creating php_01_php_1 ... done Creating php_01_nginx_1 ... doneなお下記コマンドで、コンテナを停止できます。
docker-compose stop5. サイトにアクセス
最後にサイトにアクセスします。
それぞれ下記画像のような画面が表示されたら、成功です。
お疲れ様でした。Webサイト:http://localhost:8080/
ユーザー名:root
パスワード:secret以上です。
最後までお読みいただき、ありがとうございました。
お世話になったサイト
- [PHP]DockerでPHP, MySQL(MariaDB), nginxを使ったローカル開発環境を構築する
- Docker Composeでphpでmysqlにアクセスする
- docker-composeでPHPとMySQLを連携させてみる
- Docker ドキュメント
【補足】Qitaに投稿されているDockerインストール記事
下記の中から自分に合いそうなものを1つ選んで、進めてみると良いと思います。
- 投稿日:2021-01-24T05:46:22+09:00
DockerでAtCoderができる環境を作る【Python・C++】
はじめに
Dockerは仮想化技術のひとつであり、コンテナ型仮想化のためのソフトウェアです。
一般的にいわれる利点はこんな感じ(この記事を参考にしています)
- 処理が速い
- 起動が速い
- 可搬性が高い
- イメージが軽い
- Dockerイメージを簡単に共有できる仕組みが整っている
AtCoderなど競技プログラミングをする際は指定の動作環境があり、ユーザー環境もAtCoder用の環境を独立させたくなります。なので仮想環境としてひとつ持っておくのがよくあるプラクティスなわけです。
pythonとかだとpipenvやcondaを使って仮想環境をつくるって対処法もあるんですが、DockerHubというなかなかいけてる共有サービスがあるのでDockerの勉強がてら環境を作成してみることにしました。AtCoder環境をDockerで整えると何が嬉しいの?
- Dockerさえあれば、手軽かつ簡単にAtCoderをする環境を整えられる
- 複数の端末でAtCoderの環境を統一できる
- VSCodeの拡張が偉い!
1~2についてはそのままです。DockerHubにイメージをpush、GitHubに関連ファイルなどをレポジトリにpushしておけば、pullするだけで環境が整います!
3については「Remote-Containers」という偉すぎるVSCodeの拡張があり、ローカルのファイルを編集するノリでコンテナ内のファイルを編集することができます。Docker環境の中身について
今回はPyPy環境とPython環境、C++環境が使えるAtCoder環境としてDocker Imageを作ります。
C++ではac-libraryとbits/stdc++.hが使えるようにします。
PythonではAtCoderでも使える非標準ライブラリをインストールしておきます。
また、online-judge-toolsもインストールします。
OSやシェルは任意ですが、今回はUbuntu、zshにしました。Dockerfile# Ubuntuの公式コンテナを軸に環境構築 FROM ubuntu # C++, Python3, PyPy3の3つの環境想定 RUN apt-get update && \ apt-get install -y zsh && \ apt-get install -y time && \ apt-get install -y git && \ apt-get install -y gcc-9 && \ apt-get install -y g++-9 && \ apt-get install -y python3.8 && \ apt-get install -y python3-pip && \ apt-get install -y pypy3 # デフォルトシェルをZ shellにする RUN chsh -s /bin/zsh # 一般的なコマンドで使えるように設定 # e.g. python3.8 main.py => python main.py RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 30 && \ update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 30 && \ update-alternatives --install /usr/bin/python python /usr/bin/python3.8 30 && \ update-alternatives --install /usr/bin/pip pip /usr/bin/pip3 30 && \ update-alternatives --install /usr/bin/pypy pypy /usr/bin/pypy3 30 # online-judge-toolsのinstall RUN pip install online-judge-tools # C++でAtCoder Library(ACL)を使えるようにする RUN git clone https://github.com/atcoder/ac-library.git /lib/ac-library ENV CPLUS_INCLUDE_PATH /lib/ac-library # AtCoderでも使えるPythonライブラリをインストール RUN pip install numpy==1.18.2 && \ pip install scipy==1.4.1 && \ pip install scikit-learn==0.22.2.post1 && \ pip install numba==0.48.0 && \ pip install networkx==2.4 # problems以下をworkdirにする WORKDIR /root/problems次にイメージの立ち上げ方の設定、docker-compose.ymlを編集します。このあたりは各々の環境に合わせて、お好みの設定をチューニングするといいでしょう。
docker-compose.ymlversion: '3' services: dev: build: context: . dockerfile: Dockerfile # イメージ名を指定 image: hinamimi/atcoder-test:dev # localとcontainer間のファイルを同期させる # ${local}:{container} volumes: - ../problems:/root/problems:cached - ../.vscode/launch.json:/root/.vscode/launch.json # オプション これらのconfigファイルがなければコメントアウト - ~/.gitconfig:/root/.gitconfig - ~/.bashrc:/root/.bashrc - ~/.bash_profile:/root/.bash_profile - ~/.zshrc:/root/.zshrc - ~/.zprofile:/root/.zprofile - ~/.aliases:/root/.aliases # Overrides default command so things don't shut down after the process ends. command: /bin/sh -c "while sleep 1000; do :; done"ついでにonline-judge-toolでDLしてきたサンプルをVSCodeで簡単にデバッグする設定をつくっておきます。(C++の設定も気が向いたらします)
.vscode/launch.json{ // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "Python: AtCoder Test1", "type": "python", "request": "launch", "program": "${file}", "cwd":"${fileDirname}", "console": "integratedTerminal", "args": [ "<", "test/sample-1.in" ] }, { "name": "Python: AtCoder Test2", "type": "python", "request": "launch", "program": "${file}", "cwd":"${fileDirname}", "console": "integratedTerminal", "args": [ "<", "test/sample-2.in" ] }, { "name": "Python: AtCoder Test3", "type": "python", "request": "launch", "program": "${file}", "cwd":"${fileDirname}", "console": "integratedTerminal", "args": [ "<", "test/sample-3.in" ] } ] }そしてこれらをまとめておいて、DockerHubとGitHubにpushします。
これらのリポジトリは
GitHub (https://github.com/hinamimi/docker-atcoder)
DockerHub (https://hub.docker.com/repository/docker/hinamimi/atcoder-test/general)
においてあります。とりあえず使ってみる
- 次のコマンドを実行
shell$ git clone https://github.com/hinamimi/docker-atcoder $ docker pull hinamimi/atcoder-test:dev $ code ./docker-atcoder
docker-compose.yml
をいじる- VSCodeで
Remote-Containers: Reopen in Container
を選択で多分動くと思います。
おわりに
本記事やレポジトリなど、改善があれば追記していきます。Docker初心者なので多々間違っている点などもあるかと思いますが、見つけ次第ご指摘くださると助かります。
- 投稿日:2021-01-24T02:34:35+09:00
dockerとは 自分用めも
Dockerとは
コンテナ仮想環境でアプリケーションを管理、実行するためのオープンソースのプラットフォーム。
dockerでlinuxOSで動きます
docker for (mac or windows)ができているので、それであればそれぞれのosで使えるmacOSとdockerの相性が悪く、非常に遅いので
vagrant環境でのlinuxOSを使ってdockerを使うと非常に高速になる!
それぞれがのコンテナが独立しているので、そのコンテナ内でイメージを変更してもコンテナの外にある同じファイルは変更されない!
Docker composeとは
複数のコンテナを管理するもの。docker-compose.ymlファイルを用意してコマンドでそのファイルを読み込んでコンテナを起動できる。コンテナ管理が容易に
Dockerfile
必要なパッケージ、アプリ、各種設定を含んだDockerイメージを自分で作成するためのファイル
Dockerのイメージを作成できるFROM ruby:2.5 RUN apt-get update -qq && qpt-get install -y build-essential libpq-dev nodejs // エラー以外何も履かないこ --qq // オプションは全てyesで実行する -y RUN mkdir /myapp WORKDIR /myapp COPY Gemfile /myapp/Gemfile COPY Gemfile.lock /myapp/Gemfile.lock RUN bundle install COPY . /myappFROM: 使用するイメージとバージョン
RUN: コマンドの実行
WORKDIR: 作業用ディレクトリの設定
COPY: コピー元とコピー先のファイルまたはディレクトリを指定このファイルは、youtubeのFarstep【プログラミング講座】のサンプルファイルと説明を拝借させていただきました。
docker-compose.yml
version: '3' services: db: image: mysql:5.7 environment: MYSQL_USER: root MYSQL_ROOT_PASSWORD: password ports: - "3306:3306" volumes: - ./db/mysql/volumes:/var/lib/mysql web: build: . command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" volumes: - .:/myapp - gem_data:/usr/local/bundle ports: - 3000:3000 depends_on: - db tty: true stdin_open: true volumes: gem_data:上記のコードでは、主にコンテナでつくった仮想環境にローカルの環境(ポート番号)を合わせてローカルからURLにアクセスできるように、またローカルと仮想環境のソースコードを同期して、コンテナが破棄された時、ローカルの変更が破棄されることがないよう設定をしている。
version: docker-composeのバージョン
service: アプリケーション動かすための各要素!dbとrails
ports: コンテナ内容のポート番号とホストのポート番号をマッピングする
これによりコンテナないのwebサーバーへhttp://localhost:3000
でアクセスできる!
volumes: コンテナとローカルの同期をしている!これによりコンテナが破棄された後でもローカルファイルが残るようになる。#.がローカルのカレンとディレクトリを/myappが仮想環境につくったローカルと同期したいディレクトリを設定 volumes: - .: /myappこのファイルも先ほどのFarstepさんのこちらの動画から拝借しております!
主なメソッド
・
run
イメージの構築からコンテナの起動までする。
引数にサービスの指定する必要がある
volumesで同期されているため、ローカルにもファイルが同期される!・
build
サービスのビルドを行う。ymlファイルにimage:が書かれている場合は、そのイメージをローカルかリモートからプル。imageが書かれていない場合、buildに書かれているパスのDockerfileを参考にしてイメージを構築!・
images
対象のイメージ参照
・kill
コンテナを強制停止
・logs
サービスをログに出力
・ps
コンテナ一覧
・pull
サービスのイメージをプルする。
・rm
停止中コンテナ削除
・start
サービス開始(コンテナがないとダメ)
・stop
サービス停止
・up
コンテナ作成、起動。-dをつけるバックグラウンドで実行できる