20210124のdockerに関する記事は15件です。

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の環境構築は多分これが一番やさしい説明だと思いますを参照。

やりたいことと注意点

やりたいこと

  1. DockerとVSCodeでElixirの開発環境を作る
  2. mixでElixirプロジェクトを作って動作確認する
  3. GitHubと連携してバージョン管理を行う

本記事では1,2,3の順番で説明。

注意点

本記事を読む際は以下の点に注意されたし。

  • 環境構築の手順とそのハマりポイントについて記載しているので、DockerやElixirなどについての詳しい記載を避けている
  • 画面のキャプチャを張り付けて説明している。アプリや拡張機能の仕様変更により記事掲載時と画面の内容が異なることがある
  • 本記事の手順は上記環境欄で記載した環境を用意していることを前提とする
  • 記事が長い

STEP1 DockerとVSCodeでElixirの開発環境を作る

1.VSCodeを起動して[ファイル]->[フォルダーを開く]を押下

image.png

 
2. 任意のフォルダを作成して、フォルダーの選択を押下(今回は「elixir_intro」のフォルダを作成)

image.png
 
3. エクスプローラーのところで右クリック->新しいファイルをクリック

image.png

 
4.新しく作成したファイルの名前を「Dockerfile」にして、以下の内容を記述

※ファイル名を「DockerFile」(fを大文字)にするとdocker-composeコマンドがエラーになるので注意(後述のハマりポイントを参照)

Dockerfile
FROM 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. 再度エクスプローラーのところで右クリック->新しいファイルをクリック

image.png

 
6.新しく作成したファイルの名前を「docker-compose.yml」にして、以下の内容を記述
 

docker-compose.yml
version: '3.2'
services:
  elixir:
    build: .
    volumes:
      - .:/app

 
7. VSCodeの左下のアイコンを選択(Remote - Containersの拡張機能が必要)

vs-code.png

 
8. 「Remote - Containers:Reopen in Container」を選択

image.png

 
9. 「From 'docker-compose.yml'」を選択

image.png

 
10. 左下に「Dev Container:Existing Docker Compose(...」と表示されたら成功

vs-code.png
 
11. VSCodeの拡張機能を有効化する。「Ctrl」+「Shift」+「X」キーを押下して拡張機能を表示して、「Dev Container:Existin1」を押下
※docker-compose(Docker)で接続したリモートコンテナ上でVSCodeが立ち上がっているので、拡張機能が無効化されている。

vs-code.png

ハマりポイント 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-compose

STEP2 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.ex
defmodule ElixirIntro do
  @moduledoc """
  Documentation for `ElixirIntro`.
  """

  @doc """
  Hello world.

  ## Examples

      iex> ElixirIntro.hello()
      :world

  """
  def main([]) do
    IO.puts "Hello World"
  end
end

動作確認① iexからプログラムを実行する場合

  1. 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を実行して動作確認

  1. 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

動作確認③ 実行可能ファイルを作成・実行して動作確認

  1. 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 World

STEP3 GitHubと連携してバージョン管理を行う

前準備 Gitの初期設定

既に初期設定している場合は読み飛ばしてOK

※前提として、GitHubアカウントを作成していること

  1. Git Bashを実行してコマンドラインを起動(Git BashはWindows検索ボックスなどで検索して実行)
  2. ユーザー名の登録(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

ローカルリポジトリの作成と変更内容のコミット

  1. ローカルリポジトリを初期化する。VSCodeで「Ctrl」+「Shift」+「G」キーを押下して、ソース管理画面のInitialize Repositoryを押下

vs-code.png
 
2. 変更内容を全てステージングする。画像の「+」マークを押下

vs-code.png
 
3. 変更内容を全てコミットする。①コミットメッセージを記載し、②レ点を押下

vs-code.png

リモートリポジトリの作成

  1. GitHub (https://github.com/) にアクセス、ログインして画面左上のNewを押下

vs-code.png
 
2. 「Repository name」を入力し、Create repositoryを押下

※今回はリポジトリ名を「elixir_intro」とし、Publicリポジトリにした(誰でもアクセス可能)
※READMEファイルや.gitignoreファイルはmixでプロジェクトを作成した時に作成されたので今回はチェックを外した。ライセンスは関係ないのでチェックを外した

vs-code.png
 
3. 画面に表示されたHTTPSのURLをコピーしておく(後にpushするときに必要)

vs-code.png

ローカルからリモートリポジトリへpushする

  1. リモートリポジトリを追加する。VSCodeで「Ctrl」+「Shift」+「G」キーを押下して、ソース管理画面の横三点リーダからAdd Remoteを押下

vs-code.png
 
2. テキストボックスにリモートリポジトリのHTTPS URLを入力

vs-code.png
 
3. テキストボックスにリモート名を入力(今回は「origin」と入力)

vs-code.png
 
4. ソース管理画面の横三点リーダからFetchを押下

vs-code.png
 
5. ソース管理画面の横三点リーダからPushを押下

vs-code.png
 
6. 「上流ブランチが無いので、このブランチをpublishするか?」と聞いてくるのでOKを押下

vs-code.png
 
7. GitHubでリモートリポジトリを確認すると、反映されている

image.png

以上で環境の構築は完了。

謝辞

今回は様々な記事を参考にさせて頂きました。
この場をお借りしてお礼申し上げます。


  1. Existing Docker Compose (Extend) 

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

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 にする。

Dockerfile
FROM 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

適宜書き換える。

.env
MYSQL_ROOT_PASSWORD=root_password
MYSQL_DATABASE=sample
MYSQL_USER=sample_user
MYSQL_PASSWORD=sample_password

MYSQL_PORT=3306
ADMINER_PORT=8080

docker-compose.yml

version は特に理由がなければ最新でよさそう。使えるものは公式のドキュメントでわかる。
Adminerはお好みで入れる。個人的にはローカル用なら入れといて損はしないかなと思っている。

docker-compose.yml
version: '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 になる。

.gitignore
docker/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 も必要

リンク集

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

共同開発講座を受講中にコツコツ書いた「詰まったメモ」をジャンル別に全て公開します【環境構築編】

はじめに

タイトルの通り、共同開発講座を受講中に起きたトラブルや詰まりポイントをまとめたメモ(約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 stop

Vagrant 停止

vagrant suspend

②ガベージファイルの削除方法
既存のコンテナを確認する

docker ps -a

不要と思われるコンテナを削除する

docker rm コンテナ名

シャットダウンからの復帰

suspendからの復帰

vagrant resume

dockerの開始

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.2

ls   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-d

docker-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 bash

laravel本体をインストールする

[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.yml 
version: "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 suspend
kei@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 status
Last 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 resume
kei@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 ~]$ 

ログイン成功!!(再起動成功!!)

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

1台のWindowsマシンでJenkinsマスターとスレーブを登録してみた

概要

1台のWindowsマシンで、Dockerで立ち上げたJenkinsマスターと、ホストのWindowsネイティブで動くJenkinsスレーブを共用できたので、備忘録として残します。

モチベーション

  • 会社の組み込みソフト用のCI環境立ち上げが目的
  • 手元にあるのがWindows10マシン1台なので、まずはこれで全て賄いたい

構成

  • Dockerホスト: Windows10
  • Jenkinsマスター: Docker containerで立ち上げ
  • Jenkinsスレーブ: DockerホストのWindows10で立ち上げ Structure

何でそんな構成にしたの?

主な理由は以下の通りです。

  1. Jenkins立ち上げの属人化を防ぐ一環で、DockerでJenkinsサーバーを立ち上げたかった
  2. CI対象のビルド用ライセンスがWindows限定だった
  3. 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/Dockerfile
FROM jenkins/jenkins:2.263.2-lts-slim

USER root
RUN apt-get update -y
RUN apt-get install -y vim

USER jenkins

docker-compose.yml

ポートフォワーディングの設定を管理したり、将来的にnginxも使ったりするかもなので、今はJenkinsマスター単体ですがdocker-composeから起動するように準備してます。
データの永続化はVolumeで。
個人的に後から分かりやすいようにjenkins_って付けてるんですが、Volume名なんかがjenkins_jenkins_master_dataとかになっちゃう。フォルダ名が付与されちゃうのかな・・・?

docker-compose.yml
version: "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

これでノードの追加は完了です。
この時点では「×」のアイコン付きで表示されます。

node

スレーブのノードをクリックすると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が入れられない)

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

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ができます!!

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

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.yml
version: '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/ftpusers

FTPでアップロードするプログラム

参考にした記事

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.yml
version: '3.7'
services:
# 省略
  ftp-server:
    # 省略
    environment:
          - PUBLICHOST=ftp-server
ftp_upload.php
$ftp_server = 'ftp-server';

解説

参考記事
Dockerはコンテナ名を使用してコンテナ間の通信をするそう。
なので、

docker-compose.yml
version: '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';

上記のようにアプリ側でコンテナ名(ホスト名)を指定して、プログラムを実行すれば無事アップロードが成功する。(はず)

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

【最新版】はじめてのLaravel!Laradockを用いたLaravel開発環境構築

  • 最終編集日(2021年1月)

環境構築だけ読みたい方は、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 Started

Laravelの環境構築

それでは実際にLaravelの環境構築を行っていきましょう。

プロジェクトディレクトリの作成

mkdirコマンドでLaradockをインストールするディレクトリを作成します。ここでは、laravel-workspaceとしています。

mkdir laravel-workspace

cdコマンドで作成したディレクトリに移動します。

cd laravel-workspace

Laradockのインストール

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-project

8行目を以下のように編集してください。

.env
- APP_CODE_PATH_HOST=../
+ APP_CODE_PATH_HOST=../laravel-project

2.データベースのディレクトリ変更

デフォルトでは、データベースなどがホームディレクトリに保存されるようになっています。
プロジェクトディレクトリ配下に作成されるように設定を変更しましょう。

17行目を以下のように編集してください。

.env
- DATA_PATH_HOST=~/.laradock/data
+ DATA_PATH_HOST=.laradock/data

3. コンテナ名の変更

ここでは、Dockerを起動するときのコンテナ名を指定していきます。「コンテナ?」という方はコピペしていただいて構いません。
※Dockerに関しては「いまさらだけどDockerに入門したので分かりやすくまとめてみた」の記事が非常にわかりやすいです。

36行目を以下のように編集してください。

.env
- COMPOSE_PROJECT_NAME=laradock_
+ COMPOSE_PROJECT_NAME=laravel-project

4. PHPのバージョン設定

PHPのバージョンを設定します。

42行目を使用したいPHPのバージョンに変更します。
ここでは、PHP 7.4を指定します。

.env
- PHP_VERSION=7.3
+ PHP_VERSION=7.4

2021年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            ... done

Laravelアプリケーションの作成

それでは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プロジェクトが作成されているか確認してみましょう。
image

上記のように表示されていれば正常にアプリケーションが作成されています。

コンテナの停止

コンテナを停止するときは以下のコマンドで停止することができます。

$ docker-compose stop

参考

※本記事はTechpitの教材を一部修正したものです。

最後まで読んでいただきありがとうございました。今後も、PHP・Laravelに関する記事を投稿していきますので、もしよろしければ、Techpitをフォローしてお待ちください!

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

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

環境を構築して再度実行したら、無事インストール完了しました。

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

Docker環境のDB(MySQL)コンテナに接続する方法

やりたいこと

Dockerで作成したDB(MySQL)コンテナに入ってデータベースをいじりたい。:frowning2:

ソースコード

長いので折りたたんでいます。

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
.env
APP_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に接続したい

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

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 を削除していたので、思い込みがあったのも問題解決がすぐに出来なかった原因でした。

以上

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

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/jetstream

jetstream: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 --teams

npmの依存パッケージをインストール・構築

npmがインストールされているコンテナで実行します。

$ npm install && npm run dev

データベースをマイグレートする

こちらは再びLaravelのコンテナで実行します。

$ php artisan migrate

確認

Laravelのホーム画面を確認すると、右上にログイン画面、ユーザー登録画面へのリンクが表示されており、それぞれの画面へ遷移できます。

スクリーンショット 2021-01-24 17.17.48.png
スクリーンショット 2021-01-24 17.21.37.png
スクリーンショット 2021-01-24 17.21.53.png

composer require aravel/jetstream でメモリエラーが出た場合

php.iniファイルのmemory_limitを一時的に無制限にすることで対応可能です。
インストール後、memory_limitの値を元に戻しておいてください。

php.ini
memory_limit = 256M

php.ini
memory_limit = -1
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker + Laravel + Vue の環境構築 - Docker編

はじめに

  • DockerWindows10 Homeにも対応したということでDockerでの環境構築を始めてみました。
  • DockerVueは初めて触ります。Laravelのみ少し経験あり。
  • Xserverにデプロイするつもりで構築。
    • ドキュメントルートはプロジェクト直下の public_html
    • 本来はWebサーバーはApacheだけど、慣れたいのでnginx使ってます。

環境

  • Windows 10 Home(20H2)

Dockerのインストールについて

  • インストール
  • 発生したトラブル
    • Win10にすんなりインストールして使えるとはいかず、バージョンアップをしました。
    • Windowsアップデートがまだの場合、下記公式からダウンロード可能です。
  • 生成されたバージョン
    • Docker: 20.10.2
    • Docker Compose: 1.27.4

image.png

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.yml
version: '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/www

php -> 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を確認すると下記のように指定したプロジェクトと、コンテナが作成されていることが確認できます。
image.png

これで環境が整いました。

Docker Desktopからの操作

各コンテナにカーソルを合わせると、いくつかアイコンが表示されます。

image.png

左から

  • ブラウザを開く
    • 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

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

DockerでPHP環境を作る(mac)

はじめに

勤め先でもPHPを使っており自宅でPHPを勉強するために、ローカルでPHP開発環境を整えることにしました。
MAMP(マンプ)でも良いかなと思いましたが、せっかくなのでDockerで作ってみます。
(開発中に色々詰まってしまったところがあるので、備忘録がわりのメモです。)

手順

  1. Dockerによる環境構築
  2. ファイル・ディレクトリの準備
  3. 各ファイルの作成
  4. コンテナを起動
  5. サイトにアクセス

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.php

3. 各ファイルの作成

用意したファイルの中身を作成していきます。
中身を作成するファイルは、docker-compose.ymlnginx.confDockerfilephp.iniindex.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:
      - db

nginx.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_mysql

php.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 stop

5. サイトにアクセス

最後にサイトにアクセスします。
それぞれ下記画像のような画面が表示されたら、成功です。
お疲れ様でした。

Webサイト:http://localhost:8080/
localhost_8080_config.php.png

管理画面:http://localhost:8888/
localhost_8888_ (1).png

ユーザー名:root
パスワード:secret

以上です。
最後までお読みいただき、ありがとうございました。


お世話になったサイト

【補足】Qitaに投稿されているDockerインストール記事

下記の中から自分に合いそうなものを1つ選んで、進めてみると良いと思います。

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

DockerでAtCoderができる環境を作る【Python・C++】

はじめに

Dockerは仮想化技術のひとつであり、コンテナ型仮想化のためのソフトウェアです。
一般的にいわれる利点はこんな感じ(この記事を参考にしています)

  • 処理が速い
  • 起動が速い
  • 可搬性が高い
  • イメージが軽い
  • Dockerイメージを簡単に共有できる仕組みが整っている

AtCoderなど競技プログラミングをする際は指定の動作環境があり、ユーザー環境もAtCoder用の環境を独立させたくなります。なので仮想環境としてひとつ持っておくのがよくあるプラクティスなわけです。
pythonとかだとpipenvやcondaを使って仮想環境をつくるって対処法もあるんですが、DockerHubというなかなかいけてる共有サービスがあるのでDockerの勉強がてら環境を作成してみることにしました。

AtCoder環境をDockerで整えると何が嬉しいの?

  1. Dockerさえあれば、手軽かつ簡単にAtCoderをする環境を整えられる
  2. 複数の端末でAtCoderの環境を統一できる
  3. 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.yml
version: '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)
においてあります。

とりあえず使ってみる

  1. 次のコマンドを実行
shell
$ git clone https://github.com/hinamimi/docker-atcoder
$ docker pull hinamimi/atcoder-test:dev
$ code ./docker-atcoder
  1. docker-compose.ymlをいじる
  2. VSCodeでRemote-Containers: Reopen in Containerを選択

で多分動くと思います。

おわりに

本記事やレポジトリなど、改善があれば追記していきます。Docker初心者なので多々間違っている点などもあるかと思いますが、見つけ次第ご指摘くださると助かります。

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

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 . /myapp

FROM: 使用するイメージとバージョン
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をつけるバックグラウンドで実行できる

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