20201227のdockerに関する記事は24件です。

yarnでgatsby newする(Docker)

Docker環境(他の環境は調べていない)では、gatsby newgatsby new ~をした際に、問答無用でnpmインストールしてきます。

ここではyarnを使ってgatsby newする方法をご紹介します!

開発環境

  • Docker: 20.10.1
  • docker-compose: 1.27.4
  • Node: 12.17.0
  • Gatsby: 2.10.0

完成後のディレクトリ構成の確認

project-name
    |- .config
        |- gatsby
            |- config.json
    |- 生成されるgatsbyファイル群
        |- ...
    |- docker-compose.yml
    |- Dockerfile

上記に書いている生成されるgatsbyファイル群以外は事前に用意しておきます。

config.jsonを作成する

ずばりこれがyarnを使う方法です。
↓詳しくはコチラを参照↓
Using Yarn as your Gatsby package manager

先ほどの構成通りにconfig.jsonを作成して、公式ドキュメントを参考に以下のような記述をしていきます。

config.json
{
    "cli": {
        "packageManager": "yarn"
    }
}

Docker系の設定

config.jsonの設定をコンテナ内の設定と繋げるために以下のような構成となっています。

Dockerfile
FROM node:12.17.0

RUN mkdir project-name
WORKDIR /project-name
COPY .config /root/.config/

RUN yarn global add gatsby-cli

続いてdocker-composeファイルになります

docker-compose.yml
version: '3.8'
services:
  gatsby:
    build: ./
    tty: true
    stdin_open: true
    volumes:
      - ./:/project-name
    environment:
      - NODE_ENV=development
    ports:
      - 8000:8000
      - 9000:9000

実行

イメージを作成して、コンテナを起動、コンテナ内に入っていきます。

$ docker-compose build
$ docker-compose up -d
$ docker-compose exec gatsby bash

一度コンテナ内でファイルが存在しているか見に行きましょう!

$ cat /root/.config/gatsby/config.json

先ほど作成していたconfig.jsonがあれば成功です!

ではgatsby new ~してみてください!

$ gatsby new 生成されるgatsbyファイル群のフォルダ名

yarnさんが作成してくれているはずです!!

さいごに

いろいろな記事を漁ってきて、yarnだけで作成する方法はないかと探っていたところ、見つけられたので共有致しました!

なおconfig.jsonファイルには自分にはよく分からなかった値が含まれているので、pushする際に本体はignoreして、config.example.jsonなど作成した方が良いかも知れません。

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

【Docker】dockerfileを利用してEC2にApacheコンテナを構築

目標

dockerfileを利用してEC2インスタンスにApacheコンテナを構築する。

はじめに

Docker学習の備忘録メモです。
基本的には以下のサイト(※)の内容を参考に構築しており、
基本的なコンテナやDockerの概念も分かりやすく記載してあるため、こちらを参考にした方がよいかと思います。

※参考サイト(特に「その3:Dockerfileってなに?」を本記事では主に利用しております。)
【連載】世界一わかりみが深いコンテナ & Docker入門 〜 その1:コンテナってなに? 〜
【連載】世界一わかりみが深いコンテナ & Docker入門 〜 その2:Dockerってなに? 〜
【連載】世界一わかりみが深いコンテナ & Docker入門 〜 その3:Dockerfileってなに? 〜

前提

・EC2インスタンス(Amazon Linux 2 AMI (HVM), SSD Volume Type利用)(※)が構築済みであること。

※セキュリティグループでTCP8080番ポートを空けること。

作業の流れ

項番 タイトル
1 Dockerデーモン起動
2 Dockerイメージの作成
3 Dockerコンテナの起動
4 接続検証

手順

1.Dockerデーモン起動

①Dockerのインストール
EC2インスタンスにOSログイン後、Dockerをインストールします。

sudo yum install -y docker

②Dockerデーモン起動及び自動起動の有効化

sudo systemctl start docker
sudo systemctl status docker
sudo systemctl enable docker
sudo systemctl is-enabled docker

③ec2-userをdockerグループに所属させる

sudo usermod -a -G docker ec2-user
cat /etc/group | grep docker

一旦ログアウト後(※)、docker infoでDockerのシステム情報が表示されることを確認します。
※ログアウトしないとdocker info実行時パーミッションエラーとなる。

[ec2-user@ip-172-31-32-204 ~]$ docker info
Client:
 Debug Mode: false

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 19.03.13-ce
 Storage Driver: overlay2
  Backing Filesystem: xfs
  Supports d_type: true
  Native Overlay Diff: true
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: c623d1b36f09f8ef6536a057bd658b3aa8632828
 runc version: ff819c7e9184c13b7c2607fe6c30ae19403a7aff
 init version: de40ad0 (expected: fec3683)
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 4.14.209-160.339.amzn2.x86_64
 Operating System: Amazon Linux 2
 OSType: linux
 Architecture: x86_64
 CPUs: 1
 Total Memory: 983.3MiB
 Name: ip-172-31-32-204.ap-northeast-1.compute.internal
 ID: RKGH:NETA:2FJW:FP7Q:X52F:F2DG:NSPR:YCQD:RYG2:XN54:ATEO:CLYY
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

2.Dockerイメージの作成

①コンテナ配備用PHPファイル作成
作成するコンテナに配備するためのPHPファイルを作成します。

vi test.php
test.php
<?php
  echo "hoge";
?>

②dockerfileの作成
Dockerhubから取得したCentOSイメージをベースとして(FROM)、httpd及びphpをインストール(RUN)、かつ先ほど作成したtest.phpを/var/www/html配下にコピー(COPY)し組み込み、更にコンテナ起動時にはhttpd起動コマンドを実行する(CMD)Dockerイメージを新規作成…といったフローを実行するためのdockerfileを作成します(※)。

※RUN及びCOPYはDockerイメージ新規作成時に実行し、イメージ内に組み込まれる。それに対し、CMDはコンテナ起動時に実行するコマンドを指定する。

vi dockerfile
dockerfile
FROM centos:centos7

RUN yum -y install httpd php

COPY test.php /var/www/html/

CMD ["/usr/sbin/httpd","-DFOREGROUND"]

③Dockerイメージの作成
docker buildを利用してdockerfile内のフローを適用したdockerイメージを作成します。
カレントディレクトリ内に存在するdockerfileを利用して、testphpという名前のdockerイメージを作成するという趣旨のコマンドです。

# Successfully tagged testphp:latestと最終行に出力されればOK
docker build -t testphp .

docker imagesでdockerイメージ一覧を確認します。
ベースとしたCentOSとそこからカスタマイズしたtestphp(※)のDockerイメージの作成が確認出来ます。

※Dockerイメージ作成時、タグ名を指定しないと自動的にタグ名はlatestとなる。

[ec2-user@ip-172-31-32-204 ~]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
testphp             latest              f5e7748e4f37        2 minutes ago       348MB
centos              centos7             8652b9f0cb4c        6 weeks ago         204MB

3.Dockerコンテナの起動

作成したDockerイメージから、docker runでdockerコンテナtestwebを起動します。
-dでバックグラウンド起動(フォアグラウンドで起動した場合コンソール操作が以降不可となるので基本的にはこのオプションはつける)、-p 8080:80でローカルホスト8080番ポート→コンテナ80番ポートへフォワーディングする設定とします。

docker run -d -p 8080:80 --name testweb testphp:latest

docker psでコンテナ一覧を確認し、testwebという名前のコンテナが確認できます。

[ec2-user@ip-172-31-32-204 ~]$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
216b216e14bf        testphp:latest      "/usr/sbin/httpd -DF…"   4 minutes ago       Up 4 minutes        0.0.0.0:8080->80/tcp   testweb

4.接続検証

ブラウザから<EC2のグローバルIPアドレス>:8080/test.phpでアクセスをかけ、hogeと表示されるページが表示されればOKです。

image.png

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

Ansible: Dockerインストール時にダウングレードを許可する

年末にAnsible勉強中です。
AnsibleでDockerをインストールするときにターゲットバージョンより、新しいバージョンがインストールされていた時の対処方法を備忘録として残します。
aptモジュールを使った他のパッケージのインストール時も同様の対処でいけるはず。

結論

  • forceにtrueを設定
  • dpkg_optionsにforce-downgradeを設定
main.yml
- name: Docker | Install Docker | apt
  apt:
    name:
     - "docker-ce={{docker_ce_version}}"
     - "docker-ce-cli={{docker_ce_cli_version}}"
     - "containerd.io={{containerd_io_version}}"
    state: present
    update_cache: yes
    force: yes
    dpkg_options: force-downgrade

実行環境

  • vagrant
    • ubntu18.04
      • box-image:ubuntu/bionic64
      • 20201125.0.0
  • ansible:2.9.16

実行結果(失敗)

最初にオプションが不足したまま、実行して、以下のようなエラーが出力され、調査しました。

ansible実行結果
fatal: [192.168.xx.xx]: FAILED! => {"cache_update_time": 1609061762, "cache_updated": true, "changed": false, 
"msg": "'/usr/bin/apt-get -y -o \"Dpkg::Options::=--force-confdef\" -o \"Dpkg::Options::=--force-confold\"
install 'docker-ce=5:18.09.2~3-0~ubuntu-bionic' 'docker-ce-cli=5:18.09.2~3-0~ubuntu-bionic' 'containerd.io=1.3.7-1'
' failed: E: Packages were downgraded and -y was used without --allow-downgrades.",
 "rc": 100, "stderr": "E: Packages were downgraded and -y was used without --allow-downgrades.",
 "stderr_lines": ["E: Packages were downgraded and -y was used without --allow-downgrades."],
 "stdout": "Reading package lists...
Building dependency tree...
Reading state information...
The following package was automatically installed and is no longer required:\n
docker-ce-rootless-extras
Use 'sudo apt autoremove' to remove it.
The following packages will be DOWNGRADED:
  containerd.io docker-ce docker-ce-cli
0 upgraded, 0 newly installed, 3 downgraded, 0 to remove and 10 not upgraded.",
 "stdout_lines": ["Reading package lists...", "Building dependency tree...", "Reading state information...",
 "The following package was automatically installed and is no longer required:",
 "  docker-ce-rootless-extras", "Use 'sudo apt autoremove' to remove it.",
 "The following packages will be DOWNGRADED:",
 "  containerd.io docker-ce docker-ce-cli", "0 upgraded, 0 newly installed, 3 downgraded, 0 to remove and 10 not upgraded."]}

調査不足

ダウングレードするより、ターゲットバージョンと一致しない場合はアンインストールすべき?

参考

https://docs.ansible.com/ansible/latest/collections/ansible/builtin/apt_module.html
https://stackoverflow.com/questions/56332649/is-there-a-way-to-allow-downgrades-with-apt-ansible-module

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

Dockerコンテナで動いているmariadbを直接操作する

Wordpressにログインできなくなった

Wordpressを運用していて管理者でログインできなくなってしまい焦りました。
パスワードリセットもうまく効かずmariadbを直接操作してパスワードを変更することにします。

KUSANAGI RoDのmairadbのパスワード

Kusanagi Rod上で構築している場合、mariadbのパスワードは.kusanagi.mysqlに記載されています。

.kusanagi.mysql
MYSQL_ROOT_PASSWORD=wp_root_password          <-- これです!
MYSQL_DATABASE=wp_database
MYSQL_USER=wp_username
MYSQL_PASSWORD=wp_password
MYSQL_CHARSET=utf8mb4
#MYSQL_ALLOW_EMPTY_PASSWORD=
#MYSQL_RANDOM_ROOT_PASSWORD=
#SOCKET=
#MYSQL_INITDB_SKIP_TZINFO=
#MYSQL_ROOT_HOST=

Dockerコンテナのmariadbにログインする

dockerコマンドでDockerのmariadbにログインしてからWordpressのパスワードを変更します。
データベース内ではパスワードはMD5でハッシュ化されていますのでMD5コマンドを使って変更しておきます。

$ docker-compose exec db mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.5.6-MariaDB-1:10.5.6+maria~focal mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> 
MariaDB [(none)]> use wp_database;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [wp_database]> 
MariaDB [wp_database]> select * from wp_users;
+----+------------+-----------+---------------+--------------+----------------------+---------------------+-----------------------------------------------+-------------+--------------+
| ID | user_login | user_pass    | user_nicename | user_email   | user_url      | user_registered     | user_activation_key                           | user_status | display_name |
+----+------------+-----------+---------------+--------------+----------------------+---------------------+-----------------------------------------------+-------------+--------------+
|  1 | admin      | md5_password | admin    | mail@ddress  | http://example.com | 2020-08-05 05:53:54 | ???? |           0 | admin   |
|  2 | user       | md5_password | user     | mail@ddress  |                    | 2020-08-05 06:30:29 | ???? |           0 | ????    |
+----+------------+-----------+---------------+--------------+----------------------+---------------------+-----------------------------------------------+-------------+--------------+
2 rows in set (0.023 sec)

MariaDB [wp_database]> 
MariaDB [wp_database]> update wp_users set user_pass=MD5('newpassword') where id=1;
Query OK, 1 row affected (0.034 sec)
Rows matched: 1  Changed: 1  Warnings: 0

これでWordpressにログインできるようになっていればOKです。

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

Docker + VSCode + Remote Containerで作る Jupyter Lab(Python)分析環境

この記事はどのような内容?

Docker + VSCode + Remote Containerで作るデータ分析環境構築の手順が書いてあります。

想定読者

Jupyter Lab? それともGoogle Colaboratoryなどのクラウドサービス?...なんか色々あって、Pythonのデータ分析環境わからん!簡単に導入できて、かつそれなりに快適な分析環境を整えたい!」
という方に向けて書きました。

サンプルリポジトリはGitHubにPushしていますので、cloneしてコンテナを立ち上げ、READMEの手順に沿ってリモート接続していただければ、10分程度で環境構築ができます。

https://github.com/hatahata7757/sample-analytical-env

この記事を読んだ方のデータ分析環境の選択に、少しでも貢献できましたら幸いです。

はじめに

最近、Python でデータ分析する機会があり、Jupyterが動く環境を構築する必要がありました。

ローカルにJupyter Lab環境を直接構築しても良いのですが、なるべくローカル環境は汚したくないですし、Jupyter LabではVSCodeと違って入力補完等のサポートが弱いので、ちょっと使いにくい。

色々と調べていると、VSCodeのOctober-2019-releaseで、Microsoft公式の Python 拡張機能が、.ipynb(Ipython notebook専用ファイル)をサポートしていたことを知りました。よって、コーディング環境はJupyter Labではなくインテリセンスなどが効くVSCodeを選択。

仮想環境も、Jupyter LabのDockerイメージがDocker Hubにpushされていることを知ったので、pullしてこれば手軽に環境構築ができそうです。

ということで、

  • 仮想環境は、Jupyter LabDockerイメージを使う

  • Remote Containerを使って、起動したコンテナにリモート接続

  • Remote Containerで接続したワークスペース内で、入力補完やLinterを効かせながらコーディング

上記のような環境をデータ分析環境として選択しました。
イメージはこのような感じです。
Screenshot 2020-12-26 15.17.11.png

Docker + VSCode + Remote Containerで作るJupyter Lab(Python)分析環境構築

以下の内容は、自分で環境構築をされる方用に、少し細かく説明したものになります。

この記事の上部に載せたリポジトリには、必要拡張機能や各種設定を.vscode/settings.json.devcontainer/devcontainer.jsonに記述 & 最低限の手順をREADMEに記載しておりますので、以下手順を読む必要がないようにしてあります。

Docker

他の方が書かれた記事:【Docker】3分でjupyterLab(python)環境を作る!を参考に...というか丸パクリなのですが、docker-compose.ymlに、Jupyter Lab環境構築に必要な設定を記述します。

docker-compose.yml
version: '3'
services:
  notebook:
    image: jupyter/datascience-notebook
    ports:
      - '8888:8888'
    environment:
      - JUPYTER_ENABLE_LAB=yes
    volumes:
      - ./work:/home/jovyan/work
    command: start-notebook.sh --NotebookApp.token=''

volumesにhome/ 以下にjovyan という名前でディレクトリを切っておりますが、jovyanは Jupyter Notebookを使用する人々全員 という意味があるそうです。

参考:

これで、Jupyter Labが動く環境が用意できました。

Remote Container

このままdocker-compose up -dでコンテナを立ち上げれば、http://localhost:8888 にアクセスしてJupyter Labでコーディングできます。

別にそれでも良いのですが、VSCodeの入力補完などの強力な拡張機能の恩恵を受けたいため、Remote Container立ち上げたコンテナにリモート接続し、VSCodeでコーディングしたいと思います。
Remote Containerに関しては、調べると他の方が詳しく説明をしてくださっていますので、そちらをご参照ください。

参考:VSCode Remote Containerが良い

Remote Containerの設定

VSCode [設定]→[拡張機能]→[Remote Container]:インストール。

インストールすると、「Reopen in Container」というポップアップが表示されるので、選択。

Screenshot 2020-12-27 17.10.34.png

すると、プロジェクトのdocker-compose.ymlの設定に基づいたコンテナを自動的にbuild & 起動してくれ、コンテナの中でVSCodeのワークスペースが開かれます。

(二回目以降は、VSCode左下の「><」みたいなマーク→reopen in Containerで接続できます。)
Screenshot 2020-12-27 17.09.37.png

ワークスペース内では、ターミナルもコンテナのシェルと接続されているため、コマンドなどを流す際にいちいちdocker-compose ~(もしくはエイリアス)をつける必要はありません。

ワークスペースを開くと、「No Python interpreter is selected...」といったポップアップが表示されます。これは、Pythonの実行環境を聞いてきているので、Jupyter Labの実行環境であるconda環境「Python 3.xx 64-bit('conda': virtualenv)」を選択。
Screenshot 2020-12-27 17.14.50.png

VSCode

起動したコンテナにリモート接続し、コンテナの中でVSCodeが開ける状態になりました。
ただ、このまま.ipynbを開いてもIPython Notebook用の表示にならないため、ワークスペースに拡張機能を追加します。

ワークスペース内で[拡張機能]→[python(ms-python.python)]を探し、Dev Container: [プロジェクト名にインストールする]を選択。これで、IPython Notebook用の表示になります。
Screenshot 2020-12-26 15.10.05.png

他にも、LinterやIntelliSense系の各種拡張機能を、適宜ワークスペースにインストールしてください。.devcontainer/devcontainer.json内のextensionsに拡張機能を記載しておけば、ワークスペース起動時に自動的に読み込んでくれるので、プロジェクトの配布時などに便利です。

(※「はじめに」に載せたリポジトリには、python (ms-python.python)と自動インポート機能・型チェック機能をサポートしているpylance (ms-python.vscode-pylance)が読み込まれるように設定しています)

最後に。
新しい.ipynbを開く度、そのままでは権限が付与されておらず、編集ができない状態になっています。おそらく「A notebook could execute harmful code when opened.」というポップアップが表示されるので、「Trust」を選択してください。

(ちょっとここが面倒です。ALL Trustを選択しても、一度コンテナを再起動すると設定が初期化されます、、解決策ありましたらご教授ください:qiitan-cry:

環境構築完了!

これでDocker + VSCode + Remote Containerで、入力補完などの強力な各ツールを効かせつつ、データ分析ができる環境が用意できました!

なお、ワークスペースを閉じてもコンテナは起動しっぱなしなので、コンテナは都度停止するのを忘れないようにしてくださいね。

終わりに

Docker + VSCode + Remote Containerで、Jupyter Lab(Python)分析環境を作成しました。
入力補完も効きますし、自分的には快適だなぁと思っているのですが、Pythonでの分析をし始めたばかりなのでこれが正解かわかっておりません。

Google Colaboratory やAzure Notebookなどの便利なクラウドサービスもありますが、時間制限があったり、ローカルで分析した方が計算が早かった、という場合があったので、今回はローカルの環境構築方法にフォーカスしました。

内容の間違いや、もっと良い方法がありましたら、ご指摘・ご教授をお願いいたします。

では、快適なコーディング環境を!

参考資料

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

Docker + VSCode + Remote Containerで作る快適Jupyter Lab(Python)分析環境

この記事はどのような内容?

Docker + VSCode + Remote Containerで作るデータ分析環境構築の手順が書いてあります。

想定読者

Jupyter Lab? それともGoogle Colaboratoryなどのクラウドサービス?...なんか色々あって、Pythonのデータ分析環境わからん!簡単に導入できて、かつそれなりに快適な分析環境を整えたい!」
という方に向けて書きました。

サンプルリポジトリはGitHubにPushしていますので、cloneしてコンテナを立ち上げ、READMEの手順に沿ってリモート接続していただければ、10分程度で環境構築ができます。

https://github.com/hatahata7757/sample-analytical-env

この記事を読んだ方のデータ分析環境の選択に、少しでも貢献できましたら幸いです。

はじめに

最近、Python でデータ分析する機会があり、Jupyterが動く環境を構築する必要がありました。

ローカルにJupyter Lab環境を直接構築しても良いのですが、なるべくローカル環境は汚したくないですし、Jupyter LabではVSCodeと違って入力補完等のサポートが弱いので、ちょっと使いにくい。

色々と調べていると、VSCodeのOctober-2019-releaseで、Microsoft公式の Python 拡張機能が、.ipynb(Ipython notebook専用ファイル)をサポートしていたことを知りました。よって、コーディング環境はJupyter Labではなくインテリセンスなどが効くVSCodeを選択。

仮想環境も、Jupyter LabのDockerイメージがDocker Hubにpushされていることを知ったので、pullしてこれば手軽に環境構築ができそうです。

ということで、

  • 仮想環境は、Jupyter LabDockerイメージを使う

  • Remote Containerを使って、起動したコンテナにリモート接続

  • Remote Containerで接続したワークスペース内で、入力補完やLinterを効かせながらコーディング

上記のような環境をデータ分析環境として選択しました。
イメージはこのような感じです。
Screenshot 2020-12-26 15.17.11.png

Docker + VSCode + Remote Containerで作るJupyter Lab(Python)分析環境構築

以下の内容は、自分で環境構築をされる方用に、少し細かく説明したものになります。

この記事の上部に載せたリポジトリには、必要拡張機能や各種設定を.vscode/settings.json.devcontainer/devcontainer.jsonに記述 & 最低限の手順をREADMEに記載しておりますので、以下手順を読む必要がないようにしてあります。

Docker

他の方が書かれた記事:【Docker】3分でjupyterLab(python)環境を作る!を参考に...というか丸パクリなのですが、docker-compose.ymlに、Jupyter Lab環境構築に必要な設定を記述します。

docker-compose.yml
version: '3'
services:
  notebook:
    image: jupyter/datascience-notebook
    ports:
      - '8888:8888'
    environment:
      - JUPYTER_ENABLE_LAB=yes
    volumes:
      - ./work:/home/jovyan/work
    command: start-notebook.sh --NotebookApp.token=''

volumesにhome/ 以下にjovyan という名前でディレクトリを切っておりますが、jovyanは Jupyter Notebookを使用する人々全員 という意味があるそうです。

参考:

これで、Jupyter Labが動く環境が用意できました。

Remote Container

このままdocker-compose up -dでコンテナを立ち上げれば、http://localhost:8888 にアクセスしてJupyter Labでコーディングできます。

別にそれでも良いのですが、VSCodeの入力補完などの強力な拡張機能の恩恵を受けたいため、Remote Container立ち上げたコンテナにリモート接続し、VSCodeでコーディングしたいと思います。
Remote Containerに関しては、調べると他の方が詳しく説明をしてくださっていますので、そちらをご参照ください。

参考:VSCode Remote Containerが良い

Remote Containerの設定

VSCode [設定]→[拡張機能]→[Remote Container]:インストール。

インストールすると、「Reopen in Container」というポップアップが表示されるので、選択。

Screenshot 2020-12-27 17.10.34.png

すると、プロジェクトのdocker-compose.ymlの設定に基づいたコンテナを自動的にbuild & 起動してくれ、コンテナの中でVSCodeのワークスペースが開かれます。

(二回目以降は、VSCode左下の「><」みたいなマーク→reopen in Containerで接続できます。)
Screenshot 2020-12-27 17.09.37.png

ワークスペース内では、ターミナルもコンテナのシェルと接続されているため、コマンドなどを流す際にいちいちdocker-compose ~(もしくはエイリアス)をつける必要はありません。

ワークスペースを開くと、「No Python interpreter is selected...」といったポップアップが表示されます。これは、Pythonの実行環境を聞いてきているので、Jupyter Labの実行環境であるconda環境「Python 3.xx 64-bit('conda': virtualenv)」を選択。
Screenshot 2020-12-27 17.14.50.png

VSCode

起動したコンテナにリモート接続し、コンテナの中でVSCodeが開ける状態になりました。
ただ、このまま.ipynbを開いてもIPython Notebook用の表示にならないため、ワークスペースに拡張機能を追加します。

ワークスペース内で[拡張機能]→[python(ms-python.python)]を探し、Dev Container: [プロジェクト名にインストールする]を選択。これで、IPython Notebook用の表示になります。
Screenshot 2020-12-26 15.10.05.png

他にも、LinterやIntelliSense系の各種拡張機能を、適宜ワークスペースにインストールしてください。.devcontainer/devcontainer.json内のextensionsに拡張機能を記載しておけば、ワークスペース起動時に自動的に読み込んでくれるので、プロジェクトの配布時などに便利です。

(※「はじめに」に載せたリポジトリには、python (ms-python.python)と自動インポート機能・型チェック機能をサポートしているpylance (ms-python.vscode-pylance)が読み込まれるように設定しています)

最後に。
新しい.ipynbを開く度、そのままでは権限が付与されておらず、編集ができない状態になっています。おそらく「A notebook could execute harmful code when opened.」というポップアップが表示されるので、「Trust」を選択してください。

(ちょっとここが面倒です。ALL Trustを選択しても、一度コンテナを再起動すると設定が初期化されます、、解決策ありましたらご教授ください:qiitan-cry:

環境構築完了!

これでDocker + VSCode + Remote Containerで、入力補完などの強力な各ツールを効かせつつ、データ分析ができる環境が用意できました!

なお、ワークスペースを閉じてもコンテナは起動しっぱなしなので、コンテナは都度停止するのを忘れないようにしてくださいね。

終わりに

Docker + VSCode + Remote Containerで、Jupyter Lab(Python)分析環境を作成しました。
入力補完も効きますし、自分的には快適だなぁと思っているのですが、Pythonでの分析をし始めたばかりなのでこれが正解かわかっておりません。

Google Colaboratory やAzure Notebookなどの便利なクラウドサービスもありますが、時間制限があったり、ローカルで分析した方が計算が早かった、という場合があったので、今回はローカルの環境構築方法にフォーカスしました。

内容の間違いや、もっと良い方法がありましたら、ご指摘・ご教授をお願いいたします。

では、快適なコーディング環境を!

参考資料

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

Ruby on Rails ✕ Docker 開発中のアプリにDocker導入(MySQL)

はじめに

はじめてのDocker導入だと、何から手を付けたら良いのかわからない、ということがよくありますが、まさに自分がそれでした...

本記事では開発途中・完成したRailsアプリケーション(DB: MySQL)にDockerを導入する方法・流れを解説していきます。
参考までに自分は6時間位かけてローカルに導入できました。その苦労を忘れないようにしっかりアウトプットしていこうと思います(笑)
間違っていたら指摘してくださると幸いです!

Dockerの導入

1)Dockerのインストール

まずMacにDockerのアプリをインストールしてください
それに関しては以下の記事がわかりやすいです!
DockerをMacにインストールする

インストールできたらターミナルで以下コマンドを実行しましょう!

ターミナル
~ % docker run -d -p 80:80 docker/getting-started

2)インストールの確認

ターミナル
~ % docker -v

以下のように出力されたらインストール成功です。
Docker version 20.10.0, build 7287ab3

ターミナル
~ % docker-compose -v

こちらも同じようにdocker-compose version 1.27.4, build 40524192と出力されたら成功です。

3)開発中・完成済みのアプリでDockerファイルの作成

次にDockerを導入するためにDockerファイルを作成し、設定を記述していきます。
テキストエディタでも可能ですが、自分の場合はターミナルから入力して方がエラーもなくスムーズだったため、そちらの方法を記載していきます。

①Dockerfileの作成

まずアプリのルートディレクトリにDockerfileを作成して、記述していきます。
ルートディレクトリというのは以下の図のようにアプリ直下のディレクトリを表します。

dock_app ----|-- app
            |-- bin
            |-- config
            |-- db
            ・・・・・・
       ・・・・・・
            |-- Gemfile
            |-- Gemfile.lock
            |-- package.json
            |-- Rakefile
            |-- README.md
            |-- Dockerfile  ←「Dockerfile]
            |-- docker-compose.yml  ←[docker-compose.yml]

手順としては以下の順に進んでいきます。

ターミナル
 ~ % cd Dockerを導入したいアプリのパス

 アプリ名 % vi Dockerfile
 #ファイルを開いたら「i」でインサートモードにして以下記述
FROM ruby:2.6.5 #アプリのRubyバージョン

RUN apt-get update -qq && \
    apt-get install -y build-essential \
                       libpq-dev \
                       nodejs

RUN mkdir /アプリ名
WORKDIR /アプリ名

ADD ./Gemfile /アプリ名/Gemfile
ADD ./Gemfile.lock /アプリ名/Gemfile.lock

RUN gem install bundler #bundlerをインストールしないとエラーが出る
RUN bundle install
ADD . /アプリ名

 #記述ができたら「escキー」を押して「:wq」で保存

②docker-compose.ymlファイルの作成

ターミナル
 アプリ名 % vi docker-compose.yml

 docker-compose.ymlに以下記述

 #「i」と入力しインサートモードで記述

version: '3'
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: 'password' # このままpasswordとしても問題なく動く
    ports:
      - "4306:3306" #DockerコンテナとSequelpro接続の為に必要な設定

  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/アプリ名
    ports:
      - "3000:3000"
    depends_on:
      - db
 #記述が終了したら「escキー」を押して「:wq」で保存

4)config/database.ymlファイルの編集

(テキストエディタ)
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password # passwordの設定がなければ、このままで良い
  socket: /tmp/mysql.sock
  host: db

development:
  <<: *default
  database: アプリ名_development

追加されたのはpassword: passwordhost: dbの2つのみ。

5)docker-compose buildでコンテナ作成

ターミナル
アプリ名 ~ % docker-compose build

上記コマンドを実行してコンテナを作成しましょう。※時間がかかることがあります

以下のように出力されれば成功です。

ターミナル
Removing intermediate container dac250609513
 ---> f0ba8d685e44
Step 9/9 : ADD . /tumlog
 ---> f50cb7681119

Successfully built f50cb7681119
Successfully tagged tumlog_web:latest

ちなみに初心者の方だとコマンド実行中に赤字でdebconf: delaying package configuration, since apt-utils is not installedと表示されますが、自分の調べた範囲では特に気にするようなこともない?出力のようです。

6)コンテナ上でDB作成・migrationの実行

コンテナが作成できたらコンテナ上でDBを作成していきます。

ターミナル
アプリ名  % docker-compose run web bundle exec rake db:create

Rails6だとこのコマンドを実行すると

========================================
  Your Yarn packages are out of date!
  Please run `yarn install --check-files` to update.
========================================


To disable this check, please change `check_yarn_integrity`
to `false` in your webpacker config file (config/webpacker.yml).

このように出力されることがあります。
このように出力されたら、エラー分通りconfig/webpacker.ymlファイルの記述を以下のように編集しましょう。

webpacker.yml
# Verifies that correct packages and versions are installed by inspecting package.json, yarn.lock, and node_modules
  check_yarn_integrity: true

 # check_yarn_integrity: true を falseに変えましょう → check_yarn_integrity: false

これでエラーは解決できると思うので、記述を変更したら、もう1度DB作成のコマンドを実行しましょう。

ターミナル
Created database 'アプリ名_development'
Created database 'アプリ名_test'

#上記のようにcreatingがcreated...doneとなったら成功

続いてmigrationを実行しましょう。

ターミナル
アプリ名  % docker-compose run web bundle exec rake db:migrate


== 20201222010929 Createテーブル名: migrating ====================================
-- create_table(:テーブル名)
   -> 0.0095s
== 20201222010929 Createテーブル名: migrated (0.0096s) ===========================

# 上記のようにrails db:migrateを実行したときのようにマイグレーションが実行されれば成功です

7)コンテナの起動

最後にコンテナを起動して無事、アプリがブラウザで表示されるか確認しましょう。

コンテナの起動コマンドを実行しましょう。

ターミナル
アプリ名 % docker-compose up 

# 起動していれば以下の様の出力が出る

db_1   | 2020-12-27T06:45:52.494912Z 0 [Note] Event Scheduler: Loaded 0 events
db_1   | 2020-12-27T06:45:52.497330Z 0 [Note] InnoDB: Buffer pool(s) load completed at 201227  6:45:52
db_1   | 2020-12-27T06:45:52.497669Z 0 [Note] mysqld: ready for connections.
db_1   | Version: '5.7.32'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server (GPL)
web_1  | => Booting Puma
web_1  | => Rails 6.0.3.4 application starting in development 
web_1  | => Run `rails server --help` for more startup options
web_1  | Puma starting in single mode...
web_1  | * Version 3.12.6 (ruby 2.6.5-p114), codename: Llamas in Pajamas
web_1  | * Min threads: 5, max threads: 5
web_1  | * Environment: development
web_1  | * Listening on tcp://0.0.0.0:3000
web_1  | Use Ctrl-C to stop

コマンドを実行し、サーバーが起動したらローカル環境にアクセスしてみましょう
http://localhost:3000/
無事に表示・挙動が確認できれば開発環境にDockerを導入できたということになります。

自分はこれだけで6時間くらいかかったので、ぜひ皆さんは本記事を活用して、さくさく進めていってください!!

本記文献

『さわって学ぶクラウドインフラ docker基礎からのコンテナ構築』
既存のrails6のアプリにMySQLでDockerを導入する。
Ruby on Rails 「途中まで作ったアプリにDockerを導入したい」に挑戦してみる(MySQL / Sequel Pro)

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

Ruby on Rails ✕ Docker✕MySQL開発中のアプリにDockerとdocker-composeを導入

はじめに

はじめてのDocker導入だと、何から手を付けたら良いのかわからない、ということがよくありますが、まさに自分がそれでした...

本記事では開発途中・完成したRailsアプリケーション(DB: MySQL)にDockerを導入する方法・流れを解説していきます。
参考までに自分は6時間位かけてローカルに導入できました。その苦労を忘れないようにしっかりアウトプットしていこうと思います(笑)
間違っていたら指摘してくださると幸いです!

Dockerの導入

1)Dockerのインストール

まずMacにDockerのアプリをインストールしてください
それに関しては以下の記事がわかりやすいです!
DockerをMacにインストールする

インストールできたらターミナルで以下コマンドを実行しましょう!

ターミナル
~ % docker run -d -p 80:80 docker/getting-started

2)インストールの確認

ターミナル
~ % docker -v

以下のように出力されたらインストール成功です。
Docker version 20.10.0, build 7287ab3

ターミナル
~ % docker-compose -v

こちらも同じようにdocker-compose version 1.27.4, build 40524192と出力されたら成功です。

3)開発中・完成済みのアプリでDockerファイルの作成

次にDockerを導入するためにDockerファイルを作成し、設定を記述していきます。
テキストエディタでも可能ですが、自分の場合はターミナルから入力して方がエラーもなくスムーズだったため、そちらの方法を記載していきます。

①Dockerfileの作成

まずアプリのルートディレクトリにDockerfileを作成して、記述していきます。
ルートディレクトリというのは以下の図のようにアプリ直下のディレクトリを表します。

dock_app ----|-- app
            |-- bin
            |-- config
            |-- db
            ・・・・・・
       ・・・・・・
            |-- Gemfile
            |-- Gemfile.lock
            |-- package.json
            |-- Rakefile
            |-- README.md
            |-- Dockerfile  ←「Dockerfile]
            |-- docker-compose.yml  ←[docker-compose.yml]

手順としては以下の順に進んでいきます。

ターミナル
 ~ % cd Dockerを導入したいアプリのパス

 アプリ名 % vi Dockerfile
 #ファイルを開いたら「i」でインサートモードにして以下記述
FROM ruby:2.6.5 #アプリのRubyバージョン

RUN apt-get update -qq && \
    apt-get install -y build-essential \
                       libpq-dev \
                       nodejs

RUN mkdir /アプリ名
WORKDIR /アプリ名

ADD ./Gemfile /アプリ名/Gemfile
ADD ./Gemfile.lock /アプリ名/Gemfile.lock

RUN gem install bundler #bundlerをインストールしないとエラーが出る
RUN bundle install
ADD . /アプリ名

 #記述ができたら「escキー」を押して「:wq」で保存

②docker-compose.ymlファイルの作成

ターミナル
 アプリ名 % vi docker-compose.yml

 docker-compose.ymlに以下記述

 #「i」と入力しインサートモードで記述

version: '3'
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: 'password' # このままpasswordとしても問題なく動く
    ports:
      - "4306:3306" #DockerコンテナとSequelpro接続の為に必要な設定

  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/アプリ名
    ports:
      - "3000:3000"
    depends_on:
      - db
 #記述が終了したら「escキー」を押して「:wq」で保存

4)config/database.ymlファイルの編集

(テキストエディタ)
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password # passwordの設定がなければ、このままで良い
  socket: /tmp/mysql.sock
  host: db

development:
  <<: *default
  database: アプリ名_development

追加されたのはpassword: passwordhost: dbの2つのみ。

5)docker-compose buildでコンテナ作成

ターミナル
アプリ名 ~ % docker-compose build

上記コマンドを実行してコンテナを作成しましょう。※時間がかかることがあります

以下のように出力されれば成功です。

ターミナル
Removing intermediate container dac250609513
 ---> f0ba8d685e44
Step 9/9 : ADD . /アプリ名
 ---> f50cb7681119

Successfully built f50cb7681119
Successfully tagged アプリ名_web:latest

ちなみに初心者の方だとコマンド実行中に赤字でdebconf: delaying package configuration, since apt-utils is not installedと表示されますが、自分の調べた範囲では特に気にするようなこともない?出力のようです。

6)コンテナ上でDB作成・migrationの実行

コンテナが作成できたらコンテナ上でDBを作成していきます。

ターミナル
アプリ名  % docker-compose run web bundle exec rake db:create

Rails6だとこのコマンドを実行すると

========================================
  Your Yarn packages are out of date!
  Please run `yarn install --check-files` to update.
========================================


To disable this check, please change `check_yarn_integrity`
to `false` in your webpacker config file (config/webpacker.yml).

このように出力されることがあります。
このように出力されたら、エラー分通りconfig/webpacker.ymlファイルの記述を以下のように編集しましょう。

webpacker.yml
# Verifies that correct packages and versions are installed by inspecting package.json, yarn.lock, and node_modules
  check_yarn_integrity: true

 # check_yarn_integrity: true を falseに変えましょう → check_yarn_integrity: false

これでエラーは解決できると思うので、記述を変更したら、もう1度DB作成のコマンドを実行しましょう。

ターミナル
Created database 'アプリ名_development'
Created database 'アプリ名_test'

#上記のようにcreatingがcreated...doneとなったら成功

続いてmigrationを実行しましょう。

ターミナル
アプリ名  % docker-compose run web bundle exec rake db:migrate


== 20201222010929 Createテーブル名: migrating ====================================
-- create_table(:テーブル名)
   -> 0.0095s
== 20201222010929 Createテーブル名: migrated (0.0096s) ===========================

# 上記のようにrails db:migrateを実行したときのようにマイグレーションが実行されれば成功です

7)コンテナの起動

最後にコンテナを起動して無事、アプリがブラウザで表示されるか確認しましょう。

コンテナの起動コマンドを実行しましょう。

ターミナル
アプリ名 % docker-compose up 

# 起動していれば以下の様の出力が出る

db_1   | 2020-12-27T06:45:52.494912Z 0 [Note] Event Scheduler: Loaded 0 events
db_1   | 2020-12-27T06:45:52.497330Z 0 [Note] InnoDB: Buffer pool(s) load completed at 201227  6:45:52
db_1   | 2020-12-27T06:45:52.497669Z 0 [Note] mysqld: ready for connections.
db_1   | Version: '5.7.32'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server (GPL)
web_1  | => Booting Puma
web_1  | => Rails 6.0.3.4 application starting in development 
web_1  | => Run `rails server --help` for more startup options
web_1  | Puma starting in single mode...
web_1  | * Version 3.12.6 (ruby 2.6.5-p114), codename: Llamas in Pajamas
web_1  | * Min threads: 5, max threads: 5
web_1  | * Environment: development
web_1  | * Listening on tcp://0.0.0.0:3000
web_1  | Use Ctrl-C to stop

コマンドを実行し、サーバーが起動したらローカル環境にアクセスしてみましょう
http://localhost:3000/
無事に表示・挙動が確認できれば開発環境にDockerを導入できたということになります。

自分はこれだけで6時間くらいかかったので、ぜひ皆さんは本記事を活用して、さくさく進めていってください!!

8)Docker環境(開発環境)のRailsアプリとSequelProを接続する

最後にDBを接続しましょう!

以下の設定ページを開いて標準を選択します。

se.png

設定ページに以下を記述

eee.png

「名前」 → 任意のものを設定
「ホスト」 → 「127.0.0.1」
「ユーザー名・パスワード」 → ymlファイルで記述したものに合わせる
「ポート」 → 「4306」

以上を設定して「接続」するとSequelPro内で該当アプリのDBが作成されているはずです。

また、ボート番号はdocker-compose.ymlports:の記述と合わせています。

以上でDockerとdocker-composeの開発環境への導入は終了です。
ちなみに僕はここまで6時間前後かかったので、ぜひ参考にしてさくさく進めていってください。

本記文献

『さわって学ぶクラウドインフラ docker基礎からのコンテナ構築』
既存のrails6のアプリにMySQLでDockerを導入する。
Ruby on Rails 「途中まで作ったアプリにDockerを導入したい」に挑戦してみる(MySQL / Sequel Pro)

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

Dockerチュートリアルをやってみた!

ナニコレ

この記事は Ubiregi Advent Calendar 2020 23日目のエントリです。
この投稿(12/27)からもう4日も過ぎているんですが、どうしても備忘録として残しておきたいという自分勝手な気持ちが強かったので、しれっと書きましたw

おそらく何万人という方がやられているDocker tutorialをやって、Dockerというのは
なんなのかというのを知りたい & 自分のポートフォリオにも使ってみたいという気持ちで臨みました。

参考文献

Docker tutorialは英文だったので、本当は原文読んで理解したかったのですが、途中で挫折しそうな気がしたので、@Michinosukeさんの和訳記事を元に進めました。圧倒的感謝:bow:
https://qiita.com/Michinosuke/items/5778e0d9e9c04038903c#docker%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97

チュートリアルを進めていく中でどうしてもわからない単語などは都度ググって調べました。

チュートリアルメモ

ここからはちょっと雑ですが、自分が理解したことやチュートリアルに記載されていて大事だなと思うところを抜き取ったメモになります。理解がおかしいところもあると思うので、ご指摘ください!

Dockerとは?

PCの上で別のOSを起動することができる。コンテナが別のOSを起動する為の容器。
自分の中ではそんなイメージです。
tutorialではnode.jsを起動したりしていました。

Dockerを使うと何が嬉しいんだろうか?

・様々なコンテナを起動し、本番環境と同じように開発環境を作れば、「開発環境ではできるのに本番環境だとできないのはなぜ・・・」みたいなシーンが無くなりそう?
・ひとり開発だと恩恵があまり無いかもだが、チーム開発であれば一つのDocker composeを利用すれば同じ環境があら不思議!すぐに環境構築ができちゃう!みたいな恩恵がある?

tutorialで苦労したポイント

・実体験はできるんだけど、コマンドの意味がわからなさ過ぎて途中で細かく調べることはやめました。
きちんと意味を理解しながら進めろよ!と言われそうな気もしますが、チュートリアルの目的はあくまでもDockerとはこういうものだ!と理解することだと思うので。
・コマンドはこのディレクトリで叩いてね!みたいに親切設計では無いので、チュートリアル通りに実行してもエラーが出たことがありました。ググったら解決しましたが。
・ボリュームがすごい。頑張って休日を1日使えば終わらせることも可能だと思います。7~8時間ぐらいかな。
・話が抽象的なので、内容を理解するのが本当に大変。Dockerは奥が深い・・・
・ネームドボリュームって実際使うんですかね?バインドマウントはすごく使いそうなのはなんとなくわかりましたけど。

今後どうしていくか

・チュートリアルは概要を知るもの。実戦向きではないと思うので、入門書やudemyなどで講座を受けたりするのがいいのかなあと思いました。
・一番手取り早いのは、ポートフォリオにさっさと導入してしまうことかなと。
・コンテナデプロイ?をやってみたい。めちゃ難しそうだけど!

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

Docker Quickstart Terminalでクジラが出なかったときの原因の1つとその解決方法

はじめに

Windows10 Homeを使われている方で、Dockerを開発環境に使われる方はDocker Toolboxを利用されていると思います。この記事では、今日(2020年12月27日)僕が遭遇したエラーと解決方法を紹介します。

エラーの内容

一昨日まで普通に立ち上がっていたDocker Quickstart Terminalが、今日はいきなりクジラを見せてくれなくなりました。コマンドプロンプトでdocker-machine start defaultを叩いたエラー内容はこんな感じです。

(default) Windows might ask for the permission to configure a dhcp server. Sometimes, such confirmation window is minimized in the taskbar.
listen tcp4 127.0.0.1:55712: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.

たぶん、Quickstart Terminalにもこんな感じのエラーが出ていたと思います。(その時は記事にするつもりは無かったのでしっかりと確認してませんでしたが)

使いたいポートが既に何者かに使われているっぽい。

解決方法

エラー内容の中でポート番号を教えてくれているので、
netstat -ano | find "55712"をコマンドプロンプトで実行してプロセスIDを調べます。
その後、念のためにタスクマネージャーでそのプロセスの詳細を調べてからプロセスを終了し、Quickstart Terminalを再度立ち上げることで無事クジラを見ることができました。

おわりに

ここに書くほどの内容でも無かったですが、将来慌てないためにも自分の備忘録として書き残しておきます。

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

M1 MacでDockerを使おう

12月16日よりM1マック用パブリックプレビュー提供開始

以下の記事に記載あり。Public preview7だそうです。

https://www.docker.com/blog/download-and-try-the-tech-preview-of-docker-desktop-for-m1/

ダウンロードはこちらから。

https://desktop.docker.com/mac/m1preview/Docker-AppleSilicon-Preview7.dmg
インストールは普通にdmgからアプリケーションにD&Dです。上書きはもはや動いていないからやってOKだと思います(笑)
ヘルパーのインストールで認証を求められたり、インストール後のGUIでログインをもう一度しなければいけなかったりします。あと、自動起動はしないので、自分で起動してください。そうしないと、ターミナルで

docker-compose build

docker-compose up

しても起動しません。当たり前ですが。

使った感想

特に問題なく動いていますが、赤いメッセージが出まくったりして、まだまだですが、うちのnuxt環境は動いています。

PHPなどは今後調査

バックエンドサーバで使っているPHP+Laravelがちゃんと動くのかは未検証。

なので、M1マックを買ってもいいよ。

私はM1 MacBookAir(Core8+メモリ16GB)で動かしました。特に発熱もなく動いています。

UIが少し変わった。

最近のUIがこうなっているんでしょうけれども、ずっと削っていたので新鮮でした。

さらばインテル

インテルマックとか買っちゃダメです。バッテリーの持ちが違いすぎます。docker動かしているのに、バッテリーがめちゃくちゃ持ちます。信じられません。

Macbook Proとどっちがいいの?

どっちでもいいですけど、MBAに16GBのメモリ積んでほとんどの人は十分かと。iMovieぐらいだったらサクサクでした。Premierはまだ動かしていませんけど。Zoomがちゃんと動いているのでこれで問題ないと思います。UnityもUnrealもサクサク動きました。まだ本気出していないx86版なのに。

M1 macの唯一の問題点

Homebrewが完全対応しておらず、たぶんBluetoothマウスの通信を裏で邪魔している可能性があります。Appleと色々やっていますがまだ原因を追求できておらずです。OSが対応するのが早いかHomebrewが改善する方が早いか、時間の問題っぽいです。

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

軽量で爆速にコンテナを使える Azure Container Instances !

この記事は、求ム!Cloud Nativeアプリケーション開発のTips!【PR】日本マイクロソフト Advent Calendar 2020 の 9 日目です(後から追っかけで書いています)。


本記事では Azure Container Instances についてと Docker を Azure Container Instances 上で使う方法について、ご紹介したいと思います。

What is Azure Container Instances?

Azure Container Instances は、シンプルなアプリケーション、タスク自動化、ビルドジョブなど、分離されたコンテナーのシナリオに向いたサービスです。

Why Azure Container Instances?

似たサービスに Azure Kubernetes Service があります。

Azure Kubernetes Service は複数コンテナーを使うサービスやオートスケーリングなどコンテナーのオーケストレーションが必要なシナリオに向いたサービスです。

使い分けとしては、シンプルな構成であれば、Azure Container Instances が適しています(=Azure Kubernetes Service をシンプルな構成に使うのはあまり適切ではありません)。

一方で、複雑なサービス(オートスケーリングや複数コンテナーを使うサービス)に Azure Container Instances を使うのはあまり適切ではありません。

Docker との連携強化

以前までは、Docker Desktop から Azure Container Instances を操作できず、Azure CLI や Azure Portal から操作が必要でした。

しかし、今年(2020 年)の Docker Desktop の更新バージョンでは、Azure Container Instances の Docker コンテキストを作成するためのコマンド docker context が追加されました。

詳細は以下のドキュメントに書いてあります。

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

軽量で爆速にコンテナーを使える Azure Container Instances !

この記事は、求ム!Cloud Nativeアプリケーション開発のTips!【PR】日本マイクロソフト Advent Calendar 2020 の 9 日目です(後から追っかけで書いています)。


本記事では Azure Container Instances についてと Docker を Azure Container Instances 上で使う方法について、ご紹介したいと思います。

What is Azure Container Instances?

Azure Container Instances は、シンプルなアプリケーション、タスク自動化、ビルドジョブなど、分離されたコンテナーのシナリオに向いたサービスです。

Why Azure Container Instances?

似たサービスに Azure Kubernetes Service があります。

Azure Kubernetes Service は複数コンテナーを使うサービスやオートスケーリングなどコンテナーのオーケストレーションが必要なシナリオに向いたサービスです。

使い分けとしては、シンプルな構成であれば、Azure Container Instances が適しています(=Azure Kubernetes Service をシンプルな構成に使うのはあまり適切ではありません)。

一方で、複雑なサービス(オートスケーリングや複数コンテナーを使うサービス)に Azure Container Instances を使うのはあまり適切ではありません。

Docker との連携強化

以前までは、Docker Desktop から Azure Container Instances を操作できず、Azure CLI や Azure Portal から操作が必要でした。

しかし、今年(2020 年)の Docker Desktop の更新バージョンでは、Azure Container Instances の Docker コンテキストを作成するためのコマンド docker context が追加されました。

詳細は以下のドキュメントに書いてあります。

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

Docker上にASP.NET Core WebAPI環境を構築する(VSCode)その2

手順

1.WebAPIの作成

ASP.NET CoreでWebAPIを作成する を参考にして作成。WebAPIの詳細については本記事では割愛。

【作成したWebAPI】
  • Model
AuthorModel.cs
namespace webapisqlsv1.Models{
  public class AuthorModel {
      public int Id { get; set; }
      public string Author { get; set; }
      public string BookTitle { get; set; }
  }
}
AuthorContext.cs
using Microsoft.EntityFrameworkCore;

namespace webapisqlsv1.Models{
  public class AuthorContext:DbContext{
    public AuthorContext(DbContextOptions<AuthorContext> options)
      :base(options){

    }

    public DbSet<AuthorModel> TblAuthor {get; set;}
  }
}

  • Controller
AuthorController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using webapisqlsv1.Models;

namespace webapisqlsv1.Controllers
{
  [ApiController]
  [Route("[controller]")]
  public class AuthorController : ControllerBase
  {

    private readonly ILogger<AuthorController> _logger;
    private readonly AuthorContext _context;

    public AuthorController(ILogger<AuthorController> logger, AuthorContext context)
    {
      _logger = logger;
      _context = context;
    }

    [HttpGet]
    public IEnumerable<AuthorModel> Get()
    {
      return _context.TblAuthor.ToArray();
    }
  }
}

  • Startup.cs
Startup.cs
//追加部分のみ
public void ConfigureServices(IServiceCollection services)
{
   services.AddDbContext<Models.AuthorContext>(opt => opt.UseSqlServer(Configuration.GetConnectionString("AUTHOR01")));
}
  • appsettings.json 追加部分のみ
appsettings.json
  "ConnectionStrings":{
    "AUTHOR01" : "Data Source=db1;Database=Author;User ID=sa;Password=Password0!;"
  }

2.Docker環境の作成

  • DB用のフォルダを作成しDB用のDockerfileを作成
Dockerfile
FROM mcr.microsoft.com/mssql/server:2017-latest

ENV ACCEPT_EULA=Y
ENV MSSQL_SA_PASSWORD=Password0!
ENV MSSQL_PID=Express
ENV MSSQL_COLLATION=Japanese_CI_AS
ENV MSSQL_LOG_DIR=/MSSQL/log
ENV MSSQL_DATA_DIR=/MSSQL/data
ENV MSSQL_BACKUP_DIR=/MSSQL/backup
ENV MSSQL_MASTER_DATA_FILE=/MSSQL/master.mdf
ENV MSSQL_MASTER_LOG_FILE=/MSSQL/mastlog.ldf

EXPOSE 1433

  • docker-compose.ymlを編集

depends_onを追加しDBの設定を追加する

docker-compose.yml
# Please refer https://aka.ms/HTTPSinContainer on how to setup an https developer certificate for your ASP .NET Core service.

version: '3.4'

services:
  webapisqlsv1:
    image: webapisqlsv1
    container_name: apisqlsv1
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - 5001:5000
    depends_on: 
      - db
  db:
    image: mssqldb
    container_name: sqlsv1
    hostname: db1
    build: 
      context: ./db/
      dockerfile: Dockerfile
    volumes: 
      - C:\Docker\SQLServer\DB:/MSSQL  
    ports: 
      - 1433:1433

3.コマンド実行&結果

docker-compose up

VSCode_20201227-3.png

VSCode_20201227-2.png
VSCode_20201227-1.png

ソースはこちら

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

Dockerとは?

Dockerを知らないと化石であるといわれるほど
あまりにも有名な技術を使えなかったので勉強。

これからDockerを学ぼうとしているが概要がよくわからない方向け

Dockerとは

Dockerイメージの構築
構築したイメージをコンテナ上で作成、実行、破棄
Composeによる複数コンテナの実行

dockercomposeでコンテナを作成して、複数コンテナを連携させることで環境を作り、
開発ができるようになる。
軽量ですぐに移動できるのが利点。

チュートリアルを読む、
ググりつつ一つ環境を作ってみると
dockercomposeの書き方がわかる
dockerfileはdockercomposeの補助的なものなので
そこがごちゃごちゃになると理解ができなくなるので
dockercomposeとdockerfileどちらの説明をしているのか
意識すれば一人でも理解できる

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

kind(Kubernetes in Docker) 使ってkubernetesクラスタ構築

kindとは

Kubernetes in Dockerの略でDockerコンテナを複数個起動し、そのコンテナをKubernetesNodeとして利用することで、複数台構成のKubernetesクラスタを構築する。

作成する環境

以下の環境(Master1台、Worker1台のKubernetesClusterを1台)を作成する。
※VPS契約しなくてもMacやWindowsのローカルでできると思われます。
image.png

使用した環境のバージョン纏め

[root@xxxxxxxx ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

[root@xxxxxxxx ~]# docker version
Client: Docker Engine - Community
 Version:           20.10.1
 API version:       1.41
 Go version:        go1.13.15
 Git commit:        831ebea
 Built:             Tue Dec 15 04:37:17 2020
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.1
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       f001486
  Built:            Tue Dec 15 04:35:42 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.3
  GitCommit:        269548fa27e0089a8b8278fc4fc781d7f65a939b
 runc:
  Version:          1.0.0-rc92
  GitCommit:        ff819c7e9184c13b7c2607fe6c30ae19403a7aff
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

[root@xxxxxxxx ~]# kubectl version
Client Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.0", GitCommit:"70132b0f130acc0bed193d9ba59dd186f0e634cf", GitTreeState:"clean", BuildDate:"2019-12-07T21:20:10Z", GoVersion:"go1.13.4", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.2", GitCommit:"52c56ce7a8272c798dbc29846288d7cd9fbae032", GitTreeState:"clean", BuildDate:"2020-06-03T04:00:21Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}

[root@xxxxxxxx ~]# kind version
kind v0.7.0 go1.13.6 linux/amd64

1.初期設定、インストール

1−1. VPS初期設定(セキュリティ上の理由等で必要であれば)

・ユーザ作成
・sshd周りの設定(rootログイン禁止等)
・証明書配置
etc...

1−2. Docker インストール

(※参考URL)[https://qiita.com/ymasaoka/items/b6c3ffea060bcd237478]

1−3. kubectl のインストール [※参考URL](https://tech-lab.sios.jp/archives/19226)

chmod +x ./kubectl
mv ./kubectl /usr/local/bin/
ls -l /usr/local/bin/kubectl
kubectl version
※以下エラー出るが無視
 The connection to the server localhost:8080 was refused - did you specify the right host or port?

1−4. kind のインストール [※参考URL](https://tech-lab.sios.jp/archives/19226)

curl -Lo ./kind "https://github.com/kubernetes-sigs/kind/releases/download/v0.7.0/kind-$(uname)-amd64"
chmod +x ./kind
mv ./kind /usr/local/bin/
ls -l /usr/local/bin/kind
kind version

2. 単一ノード (Master 1台構成)のkubernetesクラスタ作成

2−1. kubernetesクラスタ作成コマンド実行

[root@xxxxxxxx ~]# kind create cluster

Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.17.0) ? 
 ✓ Preparing nodes ?  
 ✓ Writing configuration ? 
 ✓ Starting control-plane ?️ 
 ✓ Installing CNI ? 
 ✓ Installing StorageClass ? 
Set kubectl context to "kind-kind"
You can now use your cluster with:

kubectl cluster-info --context kind-kind

Thanks for using kind! ?

2−2. 確認

[root@xxxxxxxx ~]# docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED         STATUS         PORTS                       NAMES
9cc673f1e968   kindest/node:v1.17.0   "/usr/local/bin/entr…"   2 minutes ago   Up 2 minutes   127.0.0.1:49157->6443/tcp   kind-control-plane

2−3.コンテキスト設定

※コンテキストを設定し指定することで、kubectlコマンドの対象のkubernetesクラスタを指定することができる

[root@xxxxxxxx ~]# kubectl cluster-info --context kind-kind
Kubernetes master is running at https://127.0.0.1:49157
KubeDNS is running at https://127.0.0.1:49157/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

2−4. kubernetesクラスタ起動確認

[root@xxxxxxxx ~]# kubectl get node
NAME                 STATUS   ROLES    AGE     VERSION
kind-control-plane   Ready    master   5m58s   v1.17.0

2−5. kubernetesクラスタ削除

[root@xxxxxxxx ~]# kind delete cluster
Deleting cluster "kind" ...
[root@xxxxxxxx ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@xxxxxxxx ~]# kubectl get node
The connection to the server localhost:8080 was refused - did you specify the right host or port?

3. 複数ノード (Master 1台、Worker1台構成)のkubernetesクラスタ作成

3−1. yamlファイル作成

※apiVersion,imageのバージョンが合っていないと失敗する

kind.yaml
apiVersion: kind.x-k8s.io/v1alpha4
kind: Cluster
nodes:
- role: control-plane
  image: kindest/node:v1.18.2
- role: worker
  image: kindest/node:v1.18.2

3−2. kubernetesクラスタ作成コマンド実行

[root@xxxxxxxx ~]# kind create cluster --config kind.yaml --name kindclluster
Creating cluster "kindclluster" ...
 ✓ Ensuring node image (kindest/node:v1.18.2) ?
 ✓ Preparing nodes ? ?  
 ✓ Writing configuration ? 
 ✓ Starting control-plane ?️ 
 ✓ Installing CNI ? 
 ✓ Installing StorageClass ? 
 ✓ Joining worker nodes ? 
Set kubectl context to "kind-kindclluster"
You can now use your cluster with:

kubectl cluster-info --context kind-kindclluster

Have a nice day! ?

3−3. 確認

[root@xxxxxxxx ~]# docker ps -a
CONTAINER ID   IMAGE                  COMMAND                  CREATED              STATUS              PORTS                       NAMES
bc55874ac1ff   kindest/node:v1.18.2   "/usr/local/bin/entr…"   About a minute ago   Up About a minute                               kindclluster-worker
57fd25bbbeba   kindest/node:v1.18.2   "/usr/local/bin/entr…"   About a minute ago   Up About a minute   127.0.0.1:49158->6443/tcp   kindclluster-control-plane

[root@xxxxxxxx ~]# kubectl get nodes
NAME                         STATUS   ROLES    AGE   VERSION
kindclluster-control-plane   Ready    master   72s   v1.18.2
kindclluster-worker          Ready    <none>   37s   v1.18.2

3−4. kubernetesクラスタ削除

[root@xxxxxxxx ~]# kind delete cluster
Deleting cluster "kind" ...
[root@xxxxxxxx ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@xxxxxxxx ~]# kubectl get node
The connection to the server localhost:8080 was refused - did you specify the right host or port?

4. nginxpodデプロイ

kubectl create deployment nginx --image=nginx
kubectl create service nodeport nginx --tcp=8080:80 service/nginx created
kubectl port-forward --address localhost svc/nginx 8080:8080 
curl 127.0.0.1:8080

以上

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

`Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?` の対処法

環境

  • Windows 10 Home
  • WSL2 (ubuntu)

エラー

docker コマンドで色々やろうとしたら、

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

解決策

docker を stop させて、start

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

[仕事納め]2020年にやらかしたミスをまとめる[未経験から2年目]

こんにちは。web系を中心としたプラグラマをしております。
小さなミスからそこそこ大きめのミスまで、今年1年でたくさんのミスをしてきました。
まだ新人で大きな権限を頂いていないこともあり、本番環境でやらかしてしまった皆様ほどのインパクトあるやらかしはないのですが、コーディングや開発環境構築などであれこれ反省点があるのでまとめていきたいと思います。
アンチパターンやあるあるとしてお楽しみ下さい。

コーディング系
環境系
人として

コーディング系

誤字

とにかく多かったです。
クラス名や関数名ならすぐエラーが発生して見つけやすいのですが、phpで変数名のスペルミスをしたりすると、そのままnullが代入されたりして見つけづらく、時間の無駄になりがちでした。

$address = 'hogehoge';
print $adress; // 返却値なし

くだらない誤字ですが、この手のエラーが出ない誤字で無駄にした時間も、年間を通せばかなり膨大になって来ます。
解決策としては、コードを細かく切り分けてこまめにテストを実行しました。これによって誤字箇所を発見するのが早くなった実感があります。
また、エディタはVSCodeを使用しており補完機能は元々使っていたのですが、コード量が多いとなかなか読み込まず使用を諦めて手入力することもあったので、今後補完機能をうまく活用できるように工夫していきたいです。
......そんなことより静的言語を使った方がいいのかもしれません。

エスケープ

先日LaravelselectRawメソッドを用いて生に近いSQLを書く機会がありました。WHERE句の対象となるカラムにバックスラッシュを用いたパスが入っていて、この部分をエスケープ出来ておらず検索結果が0となる失敗を犯しました。この質問と大体同じ内容です。

// 失敗例
DB::table('hoge')
    ->selectRaw('* WHERE `path`="PATH\\TO\\SOME\\MODEL"')
    ->get();

一見エスケープ出来ていそうですが、phpではダブルクォート内ではバックスラッシュが ///となり、かつ、Laravelのraw関係のメソッドではエスケープされない(というかrawって書いてあるのでそりゃそうですね)ので、MySQLに送られるクエリは以下のようになります。

SELECT * FROM hoge WHERE `path`='PATH\TO\SOME\MODEL' 

結果、MySQLでもエスケープされて無事死亡しました。
できるだけこのような生っぽいSQLは書かないのが一番ですが、この時は諸事情で仕方なかったので、以下のようにして解決しました。

// 成功例
DB::table('hoge')
    ->selectRaw('* WHERE `path`="PATH\\\\TO\\\\SOME\\\\MODEL"')
    ->get();
SELECT * FROM hoge WHERE `path`='PATH\\TO\\SOME\\MODEL' 

ともかく、何かとバックスラッシュは問題のタネになりやすいので警戒していきたいと思います。

環境系

Dockerコンテナの内か外か

Dockerを立ち上げてシェル作業する時、必要なコマンドをコンテナの内側で行うのか外側で行うのかを間違えて command not found になったり、最悪の場合想定外の処理が始まったりします(しました)。
基本的にどのコマンドをどこで実行するのかはプロジェクトによるので、実行前に確認するようになりました。特にcomposerの実行場所で事故ったので気をつけていきたいと思います。

バージョン違い

composerで依存パッケージをインストールすることが多いのですが、マイナーバージョンは指定しておらず不具合が発生する場合があります。
また、私が今年特に詰まったのはcomposer自体のバージョン違いです。
2020年10月頃にcomposerのバージョン2.0がリリースされました。これに気づかずdocker-composeコマンドを実行してしまった結果、DockerFile内にcomposer関係の諸々のコマンドが実行されてしまい、大量のエラーが発生しました。
この件の解決策は、こちらの方と同じ方法を使いました。
コマンドは以下のものです。

curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --1 --filename=composer

バージョンアップの詳細はこちらです。
        

人として

連絡が遅い

思い出すと胃が痛くなります.......
進捗が悪いのに、頑張って挽回しようと試行錯誤していて締め切りギリギリまで上司への進捗が遅れている旨の連絡をしませんでした。上司からは特に怒られず、淡々と「了解です。次は早めに連絡・相談して下さい」という内容のメッセージが返ってきて逆に怖かったです。
とにかく、早めの報告・連絡・相談は本当に大切です。技術的なミスより何より連絡不足が一番信用を失うと思いました。

仕様通りでない

仕様変更が頻繁でも、仕様書が読みづらくても、決定した仕様が一意である以上、仕様通りでないのは絶対にダメですよね。
コミット前にもう一度、成果物のチェックを怠らない。大事だと思います。
あと、最初に仕様書を通しで読んだ時に矛盾点を見つけられるようになりたいです。実装を始めてから気づくことが多いので.......

まとめ

結局、ほとんどのミスが確認不足に起因していました。
コミット前、コマンド入力前、上司への報告前......この記事を振り返ってミスを減らしていきたいと思います。
というわけで、皆様1年間お疲れ様でした。2021年も頑張っていきましょう!!

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

[wip] Docker メモ

前提知識

  • コンテナ型仮想化
    • ホストOSの上に動作している Docker Engine から、コンテナと呼ばれるミドルウェアの環境構築がされた実行環境を作成し、その中でアプリケーションを動作させる
    • 依存関係の問題を解決するための手段
      • アプリケーションの実行に必要な依存物を全てコンテナの中にパッケージングし、このパッケージをそのままデリバリーすることで、開発環境から本番環境まで同一の環境(コンテナ)でアプリケーションを動作させることが出来る
  • Docker Engine
    • Docker を利用するための常駐プログラム
  • イメージ(Image)
    • コンテナ(=アプリケーションの実行環境)を起動するのに必要な設定ファイルをまとめたもの
  • コンテナ
    • イメージからコンテナ(=アプリケーションの実行環境)を起動
  • コンテナ利用時・検討時によくある誤解をしていないか
    • 誤解1:コンテナに移行「しなければならない」と漠然と思っている
    • 誤解2:コンテナ化により仮想マシンの管理・運用が不要になる
    • 誤解3:まずはじめにオーケストレーションツールを選定しなければならないと思っている
    • 誤解4:コンテナを使うならマイクロサービス化しなければならない。(あるいは)マイクロサービス化するならコンテナ化しなければならない。
# イメージ一覧
$ docker images

# イメージ削除
# コンテナは残るらしいので、コンテナを削除してからイメージを削除する
$ docker rmi [イメージID]

# 現在実行中のコンテナ一覧を表示
# -a は現在存在しているコンテナ一覧を表示 
$ docker ps

# コンテナの詳細を確認
$ docker inspect コンテナ名

# コンテナの削除
$ docker rm [コンテナID]

DockerFile

Dockerfile

FROM ruby:2.5
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

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

# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]

entrypoint.sh

#!/bin/bash
set -e

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

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

https://docs.docker.com/compose/rails/ より

  • EXPOSE
  • ENTRYPOINT と CMD
    • ENTRYPOINT を指定しない場合
      • CMD でプロセスおよびそれへの引数を指定する
        • 任意のプロセスを起動できる
      • docker run <コンテナ指定> [RET]
        • プロセス指定を省略して起動したときに、CMD で指定した内容が起動するプロセスのおよびそれへの引数の指定となる
    • ENTRYPOINT を指定する場合
      • ENTRYPOINT で決まった特定のプロセスを指定する
        • それ以外のプロセスは起動できなくなる
    • docker run <コンテナ指定> <追加引数指定> RET
      • 追加引数を指定しなかったときのデフォルトの追加引数をCMD項目から与えることができる

docker-compose

複数コンテナの Docker アプリケーションを事前定義して実行するためのツール
コンテナを個別起動する面倒やミスを防ぎ、円滑に環境の共有を行うため

よく使うものを抜粋

  • docker-compose -h
    • マニュアル
  • docker-compose ps
    • コンテナの一覧を表示
  • docker-compose top
    • 各コンテナのプロセス情報を表示
  • docker-compose logs
    • サービスのログを出力
  • docker-compose build
    • DockerFile から image を構築(コンテナは作成しない)
      • yml に image が書かれている場合はそのイメージ名、ローカルになければリモートからプルする
      • image が書かれていない場合、build に書かれている Dockerfile を参考にしてイメージを構築する
    • --no-cache
      • Dockerfile を更新したなどの理由でキャッシュを使いたくない場合
  • docker-compose up
    • イメージの構築から、コンテナの構築・起動
      • キャッシュがある場合はそれを使って build を行う
      • --build
        • キャッシュを使わずに再度ビルドする(イメージもコンテナも新しくなる)
      • -d
        • バックグランドで実行する
  • docker-compose run [サービス] [コマンド]
    • イメージの構築から、コンテナの構築・起動し、指定したサービスのコンテナ内でコマンドを実行
      • 引数でサービスを指定しないと失敗する
    • -d
      • デタッチド・モード: コンテナをバックグラウンドで実行し、新しいコンテナ名を表示
    • --rm
      • コンテナ実行後に削除。デタッチド・モードの場合は無視
    • --no-deps
      • リンクしたサービスを起動しない
  • docker-compose stop
    • コンテナの停止
  • docker-compose down
    • オプション無しだと、削除されるのはコンテナとネットワークだけ
      • イメージ、ボリューム、未定義コンテナを削除する場合は別途指定
    • -v, --volumes
      • Compose ファイルの volumes セクションの名前付きボリュームを削除
      • また、コンテナがアタッチしたアノニマス・ボリュームも削除
  • その他

Fargate

  • 概要
    • サーバレスなコンテナ向けエンジン
      • ホストマシンが見えなくなり、OS や Docker Engine, ecs-agent が抽象化され Fargate プラットフォームに隠蔽される
        • OS バージョンアップやセキュリティ対策は AWS 側の責務
    • コンテナ化により仮想マシンの管理・運用が不要になる
      • クラスタの管理が不要(キャパシティ)
        • 全体でどの程度のリソースが必要かを見積もった上で、インスタンスタイプの選定、必要な総台数の計算など
      • シームレスなスケーリング
        • クラスタ全体のキャパシティ状況を常にモニタリングし、コンテナと合わせてスケールさせる必要がある
      • ホストマシンの管理が不要(セキュリティ等)
        • OS やミドルウェアのバージョンアップやセキュリティパッチの適用など
  • Session Manager との連携
    • AWS Systems Manager サービスの 1 機能
      • AWS 上で管理しているサーバ(マネージドインスタンス)に対してターミナルのアクセスを可能にするもの
        • SSH だと、SSH ポートを外部に開放する必要があるため攻撃の対象になりやすい
        • SSH ポートの開放は不要でサーバから見てアウトバウンド方向の HTTPS 通信の確保で済む為安全
    • Session Manager を経由して Fargate 上のコンテナに接続できる

参考

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

Dockerでデータサイエンス環境構築

環境

OS: macOS Big Sur 11.1
Docker: 20.10.0
docker-compose: 1.27.4

注意点

コマンドの実行は管理者権限で行なってください。また、Docker、docker-composeはすでにインストールされているものとして進めていきます。

Docker imageはDockerfileを基に構築されます。Docker imageを一度buildした際はキャッシュが作成されます。キャッシュとは簡単に言えば、2回目以降の読込を高速化するものです。このキャッシュがあると、buildの際に優先的に用いられてしまいます。そのため、Dockerfileを更新した際はdocker-compose build --no-cacheでキャッシュを使用しないbuildをしましょう。

キャッシュを使用しないbuildですので、ものによってはかなり時間が掛かることもありますので、ご注意ください。

Dockerとは

Dockerとは、簡単にいえば仮想マシンのようなものです。ただ厳密には異なり、サーバーのカーネルを利用してプロセスやユーザーをサーバーごとに隔離し、あたかも別のマシンが動いているように動かすことができます。そのため、仮想化よりも軽量で高速に動きます。Dockerを使用することで簡単に環境構築をすることができ、OSの違いを考慮することなく簡単に自分の環境を共有できます。

事前準備

注意点にも記載していますが、すでにDocker、docker-composeはインストールされているものとします。その上で、ターミナル上で以下のコマンドを打ち込みます。

$ docker pull jupyter/datascience-notebook:latest

このコマンドで、DockerイメージをDocker Hubからローカルに引っ張ってきます。このとき使用するDockerイメージが決まっていれば、ご自分のお好きなものを選択しても良いです。Dockerイメージの選択にはJupyterの公式サイトをご確認いただき、選択してみてください。迷ったら上記のdatascience-notebookを使用すれば大丈夫です。

この段階で、ご自分のJupyterにパスワードを設定することが可能です。ローカルの環境でのみ作業をする場合は特に設定する必要はありませんが、もし必要であればコチラの記事が分かりやすかったので、参考にしてみてください。

その後、ご自分の任意のディレクトリに以下のDockerfileを保存してください。

Dockerfile

FROM jupyter/datascience-notebook

RUN pip install --upgrade pip
RUN pip install jupyterlab
RUN jupyter serverextension enable --py jupyterlab

### Jupyterlab 拡張機能
# Variable Inspector
RUN jupyter labextension install @lckr/jupyterlab_variableinspector
# Table of Contents
RUN jupyter labextension install @jupyterlab/toc

### settings
## prepare settings ※ ここのディレクトリはjupyterlabのSettingsのAdvanced Setting Editorを参照する
RUN mkdir -p /home/jovyan/.jupyter/lab/user-settings/@jupyterlab/apputils-extension
RUN mkdir -p /home/jovyan/.jupyter/lab/user-settings/@jupyterlab/notebook-extension
## user-settings ※ prepare settingsでディレクトリを生成していないとerror
# 黒背景
RUN echo '{"theme":"JupyterLab Dark"}' > \
  /home/jovyan/.jupyter/lab/user-settings/@jupyterlab/apputils-extension/themes.jupyterlab-settings
# 行番号表示
RUN echo '{"codeCellConfig": {"lineNumbers": true}}' > \
  /home/jovyan/.jupyter/lab/user-settings/@jupyterlab/notebook-extension/tracker.jupyterlab-settings

詳しく中身について解説はしませんが、このDockerfileでデータサイエンス環境Jupyterlabの設定を行なっています。コメント文を読めば何の目的に書いたコマンドなのかが分かるかと思いますので、興味のある方はぜひ詳しく見てみてください。

特にsetting以下はコマンドとして記載しておくことで、デフォルトのJupyterlabを黒背景、そして行番号を表示してくれるようになるので、個人的には記載必須です。

次にdocker-composeです。

docker-compose とは

docker-composeは、複数のコンテナで構成されるアプリケーションについて、Dockerイメージのビルドや各コンテナの起動・停止などをより簡単に行えるようにするものです。

docker-compose.yml

version: "3"
services:
  jupyterlab:
    build:
      context: .
      dockerfile: "Dockerfile"
    user: root
    container_name: con_jupyterlab
    image: jupyterlab
    ports:
      - "8888:8888"
    volumes:
      - "/Users/[user]/Documents/DataScience/jupyter:/home/jovyan/work"
    environment:
      GRANT_SUDO: "yes"
      TZ: Asia/Tokyo
    command: start.sh jupyter lab --NotebookApp.token=""

こちらについても詳しい解説はしません。適宜Dockerイメージ名、コンテナ名はご自身で作成したものを記載してください。volumesについては、コロン(:)前までのパスは、ご自身のDockerfileの存在するパスを指定してください。この部分が間違っていると、コンテナを停止する度にデータサイエンス環境で作業した内容が消去されてしまいます。必ず作業を行う前にデータが保持されているかの確認を忘れないようにしておいてください。

使用方法

ターミナルのcdコマンドを用いて、Dockerfile(docker-compose.yml)が存在しているディレクトリまで移動します。そこで、下記コマンドを実行します。

$ docker-compose up -d

実行した後、少々待ったら http://localhost:8888 にアクセスします。このような画面になっていたら成功です。

jupyterlab.png

もし「ページを開けませんでした」とか「サーバに接続できません」と出たら、少し時間を開けた後に再度ページリロードを行なってみてください。それでもダメな場合はDockerfileかdocker-composeに間違いがありますので、ターミナル上のエラーメッセージを確認してみてください。

エラーが出ていなかったら、以上で作業は終わりです。お疲れさまでした。

Pythonの日本語対応化

初期状態のPythonは日本語に対応していません。日本語をそのまま表示させようとすると、いわゆる豆腐文字(文字化け)になってしまいます。フォントを導入し、日本語を表示できるようにします。詳しくはコチラの記事を参考にしてください。

おわりに

Dockerというものは、自分の環境を汚すことなく、開発環境を構築することができ、他人にも自分の環境を共有することが可能になります。これによって、環境による開発者同士の齟齬が起きなくなります。他にも軽量で高速といった特徴があるので、ぜひ勉強してみてください。

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

Gatsby(TypeScript)×Netlify×Dockerの始め方

収益が出ていないのに、今月もブログのサーバー代を払う僕へ、朗報です。
Gatsby×Netlifyを使って無料世界中にブログを届ける方法がございます!!

今回はDockerを使いつつ、ブログが配信できるまでの方法をご紹介致します:muscle:

まずは全体の流れをサラッと確認

  1. Gatsbyを起動させるためにDocker環境を構築していく
  2. Gatsby(TypeScript)でサイトを構築
  3. NetlifyをGitHubと連携させて記事を自動でデプロイ

上記の流れで本記事ではご紹介していきます(・∀・)
完成後のサンプルリポジトリはコチラ

開発環境

  • Docker: 20.10.1
  • docker-compose: 1.27.4
  • Node: 12.17.0
  • Gatsby: 2.10.0

ファイル構造の確認

普段Qiitaの記事を見ていて、いつも『ファイル構造知りたいなぁー』とか思っているので(笑)、
完成後のファイル構造を載せておきます。

gatsby-ts-netlify-docker
    |- gatsby
        |- ...
    |- docker-compose.yml
    |- Dockerfile
    |- README.md

Dockerによる環境構築

Dockerはローカルでのnodeの実行環境として使っていきます!

Dockerfile

先ほどご紹介した場所にDockerfileを配置し、以下の記述をしていきましょう!

Dockerfile
FROM node:12.17.0

RUN mkdir gatsby-ts-netlify-docker
WORKDIR /gatsby-ts-netlify-docker

RUN yarn global add gatsby-cli

FROMではイメージの取得、RUNgatsby-ts-netlify-dockerフォルダの作成、WORKDIRで作業ディレクトリの設定をしています。
最後に今回の肝であるgatsby-cliをglobalにaddしております。

docker-compose.yml

書けたら次にdocker-compose.ymlを紹介した場所に作成して、以下の記述をしていきましょう!

docker-compose.yml
version: '3.8'
services:
  gatsby:
    build: ./
    tty: true
    stdin_open: true
    volumes:
      - ./:/gatsby-ts-netlify-docker
    environment:
      - NODE_ENV=development
    ports:
      - 8000:8000

buildDockerfileの場所を教える。ttystdin_openでコンテナとホストをつなぐ設定をして、volumesでhostとコンテナのディレクトリを対応させて、portsではローカルでサーバーをたてる際のポートを設定しています。

ビルド&立ち上げ

Dockerfiledocker-compose.ymlファイルが配置できれば、ビルド後、コンテナを立ち上げていきましょう!

$ docker-compose build
$ docker-compose up -d

これでコンテナがビルドされ、立ち上がりました!

Gatsbyを使ってサイトを構築する

今回はTypeScript対応のStarter Libraryを使ってサイトを構築していきます。

Dockerのコンテナ内に入る

まずはコマンドを実行するためにコンテナ内に入りましょう:open_hands:

$ docker-compose exec gatsby bash

これでコンテナ内に入れたと思います!

Starter Libraryの導入

今回僕が導入しようと決めていたLibraryは以下の特徴をもっているものです。

  • TypeScriptで書かれている
  • 最低限の構成

よって、選ばれたのは、、、

gatsby-starter-typescript-plusでした!
リンクはコチラから

コチラを導入していきます。

gatsby new gatsby https://github.com/resir014/gatsby-starter-typescript-plus

『時間かかるな−』と思った方、通常仕様なので、安心してお待ちください〜(´∀`)

下記のような表示が出てきたら成功です!!
Screenshot from 2020-12-27 03-13-35.png

いよいよ表示させていく!

画像にもあるとおり、gatsby developでサーバーを起動させていきます。ですがここで注意点が…!
上記のように起動させると、localhostでアクセスしても表示されません。

なので以下のコマンドで起動させていきます。

gatsby develop -H 0.0.0.0

buildが終わって、localhost:8000へアクセスしてみると…?
Screenshot from 2020-12-27 03-18-30.png

このような画面が出ていれば成功です!!!:laughing:

Netlifyを使って世界中に向けて配信していく

Netlifyのアカウントを持っていない方は、GitHubアカウントがあれば簡単に登録できるので、登録してください。

アカウントを登録するとマイページみたいなところに飛ぶので、以下ボタンを探してください。
Screenshot from 2020-12-27 03-26-19.png
ここを押すと、GitHubのリポジトリと連携することが出来ます。

Screenshot from 2020-12-27 03-31-16.png

最後はこのような感じで入力してください。

もしdeployに失敗してしまった場合

右上にあるSite settingsを押して、Build & Deployを選択、Edit settingsを押して、以下のように記述してください。

Screenshot from 2020-12-27 03-34-42.png

サブドメインの変更

今のままでもNetlifyからであればアクセスは可能ですが、まだ外部の方はアクセスすることが出来ません。
そこでサブドメインを設定することによって、外部からでもアクセスが可能となります。

方法は先ほどと同様にSite settingsから、次はDomain managementへ移動、OptionsからEdit site nameを選択するとサブドメインの変更が可能となります。

例えばサブドメインをsampleにしたとすると、https://sample.netlify.appがドメインとなります。
これでどこからでもアクセスが可能となったはずです!!

GitHubを使った変更の自動デプロイ

実は何も設定する必要はございません。笑

GitHubにてDefaultのリモートブランチとなっているところに、Pushするだけ。
これによりNetlify側が発火して、自動でデプロイを行ってくれます!(献身的です:cry:)

さいごに

最後まで見て頂きありがとうございました。

スターターライブラリは何を使おうか迷ったり、
ルートディレクトリのGatsby下にファイルを生成しているので、他の方の記事を見ながらやっていると、NetlifyのBuildで少し躓いたりと僕はしていましたが、比較的簡単に導入できるので、皆さんやってみてはいかがでしょうか!

間違っている点やシンプルな感想、よかった点などでもございましたら、お気軽にコメントください(´艸`*)

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

作ったポートフォリオを簡単に解説してみる。

何を作ったのか?

アプリ名 Dig Memo

思考を深掘る事を意識して作ったメモアプリです。
下記URLで公開しております!
http://www.digmemo-app.xyz/

なぜ作ろうと思ったのか?

思考をサポートできるサービスを作りたいと思ったからです。

プログラミング学習をしている時に、ただ勉強するよりも思考して勉強する方が、知識が定着しやすいと感じました。しかし、ただのメモだと楽をしてインプットした情報をそのまま吐き出すこともできてしまうなと思いました。そこを制限して思考をサポートすることができるサービスがあったらいいのではないか?と思い、作ることにしました!

どんな機能を実装したのか?

機能一覧

・メモ投稿・編集・削除機能
・カテゴリー機能
・全文検索機能
・お気に入り機能
・ページネーション機能
・メール認証機能
・パスワードリセット機能
・ゲストログイン機能

ER図

Copy of Untitled Diagram (1).png

こだわった・工夫したポイント

ポイント1

問いを設定し、それに対して答える事で思考を促せるようにしました。

このアプリでは完全自由なメモはしにくいようになっています。言葉では説明が難しい部分もあるので動画を載せます。
DigMemo-how-to.gif
動画のようにこのアプリはタイトルを設定し、そのタイトルに対して自問自答を行います。こうする事で反強制的に思考することができます。

ポイント2

カテゴリーや問い作成機能にajax処理を用いました。

文字を打っている時「あ、この問いも追加したい」ってなった場合に、何も対策しなければ問いを作った後、それまで打っていた文字まで消えてしまいます。それを防ぐためにajax処理を用いて、UXを向上させました。
DigMemo-how-to-ajax.gif

ポイント3

テーブル結合で全文検索を実現させました。

検索機能ではメモのタイトルからだけではなく、メモの内容からも検索を行えるように実装しました。articlesテーブルのtitleカラムと、article_itemsテーブルのbodyカラムという二つのテーブルから取り出したデータを結合させることによって機能を実現させました。

DigMemo-how-to-search.gif

使用技術等

  • 言語: Ruby 2.7.1
  • フレームワーク:Ruby on Rails 6.0.3.2
  • テスト:RSpec
  • フロントエンド:HTML、SCSS、bootstrap4、javascript(jQuery)
  • インフラ:AWS(VPC・EC2・Route53・SES)
  • コード管理:GitHub
  • DB: MySQL
  • その他:docker-compose(開発環境のDBで使用)

追加実装予定

  • ELBを導入して冗長化する
  • ACMでhttps化する

最後に

ここまでご覧いただきありがとうございました!

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

ローカルにあるHTMLファイルを正しくブラウザで確認する方法

この記事はDockerが動作する環境が前提です。

目的

サクっとローカルにあるHTMLファイルをブラウザで確認する。

よくあるケース

「このHTMLなぜか動かないので確認してもらえますか?」みたいな感じでざっくりHTMLファイルを渡されたとき、そのままブラウザ開くと外部ファイル読み込みがうまく行かずに悩むことありますよね?

一昔前ですとXAMPやMAMPを立ち上げたり、OS標準の共有サービスを使ったりしていました。
公開手順もちょっと面倒ですし、公開を止めるのを忘れたりして余計なリソースを使い続けてしまうことが多々ありました。

Dockerの誕生でOSを極力汚さずに手軽にローカルHTMLファイルを確認する方法があります。

方法

ローカルにサーバを立ち上げてHTMLファイルがあるディレクトリを一時的に公開。

コンソールでHTMLファイルのディレクトリまで行き

docker run -v $(pwd):/usr/share/nginx/html:ro --rm -p 8080:80 nginx

これだけでtest.htmlっていうファイル名であれば
http://127.0.0.1:8080/test.html
でファイルにアクセスできるようになります。

-dオプションを付けずデーモンとして立ち上げないので通信ログも見えますし、Ctrl+Cプロセスを止めると--rmによりコンテナも消えるのでクリーンです。--nameでコンテナ名を付けなくて良いのでコマンドも短くなり覚えやすいですね。

宗教上の理由でApacheしか受け付けない人は

docker run -v $(pwd):/usr/local/apache2/htdocs/:ro --rm -p 8080:80 httpd

で立ち上げてください。

$(pwd)が動かないとか意味がわからない方は以下のように公開したいディレクトリパスを指定してください。

docker run -v /Users/qiita/Downloads:/usr/share/nginx/html:ro --rm -p 8080:80 nginx

あとがき

過去に似たような記事を書きましたが別にデーモン化させる必要もなく終わったあとの後片付けも--rmオプション使えば良いことに気づいたので改めて記事化しました。

前の記事
https://qiita.com/rspepe/items/6f7f5eb31a04185bafbd

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

docker+rails(ver5.2)での本番環境の起動と生じたエラー

初めての投稿になりますので、間違いなどあればご指摘ください.
また、今回の投稿はdockerでのrails5.2の本番環境の起動の助けになればと思います。

環境

  • rails ver 5.2
  • docker

記事の内容

主に4つのパートに分かれています。

  • railsでの本番環境にするにはどのように設定する必要があるのか
  • dockerでの設定方法
  • build後の起動時のエラー
  • 解決方法

railsで本番環境にするにはどのように設定する必要があるのか

まず、rails5.2での本番環境で起動にするには主に以下の四つが必要になります
1. database.ymlやデータベースでのproduction環境を設定する
2. SECRET_KEY_BASEがcredentials.yml.encに存在するか確認
3. アセットプリコンパイルを行う
4. サーバーの起動

dockerでの設定方法

dockerでは起動に必要な部分を記述して起動を行います

データベース関連

database.ymlを設定やDB接続などを設定します。

database.yml
production:
  <<: *default
  database: 
  username: 
  password: 

credentials.yml.encでのSECRET_KEY_BASの確認

以下のコマンドをdockerで走らせることができれば確認できると思います

EDITOR=vim rails credentials:edit

私はdocker-composeを利用していたので以下のコマンドで確認しています

docker-compose run -e EDITOR=vim web rails credentials:edit

アセットプリコンパイル

railsのassetsファイルをプリコンパイルする必要があります

RAILS_ENV=production bundle exec rails assets:precompile

dockerに記述する部分

以下の記述を追加して起動を行いました

Dockerfile
ENV RAILS_ENV="production"

RUN SECRET_KEY_BASE=production bundle exec rails assets:precompile

起動時の生じたエラー

さて起動をしてみると以下のエラーが出てきました。

`validate_secret_key_base': Missing `secret_key_base` for 'production' environment, set this string with `rails credentials:edit` (ArgumentError)

内容としては「secret_key_base値が見つからないため、起動できません」となっています。 
そこでネット上で検索してエラーを解決しようとしていましたが解決できていませんでした。

  • SECRET_KEY_BASEの値の確認
  • production.rbでの設定の変更
  • アセットプリコンパイルのエラーが原因なのかを調査

エラーの解決策

以下のサイトを試すと解決しました
https://qiita.com/laser_beam/items/b4abdfed09fd987308fb

具体的にはcredentials.yml.encファイルのSECRET_KEY_BASEに対してスペースを入れると解決しました。
before

credentials.yml.enc
secret_key_base: *****************************

after

credentials.yml.enc
 secret_key_base: *****************************
↑スペースが入ります

原因はわかりませんが、どうしても解決しない時は試してみるといいかもしれません。

終わりに

予想外の方法で解決したので、試せることは試すことが大切だと思いました。

参考にした記事

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