- 投稿日:2020-12-27T19:39:19+09:00
yarnでgatsby newする(Docker)
Docker環境(他の環境は調べていない)では、
gatsby new
、gatsby 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
の設定をコンテナ内の設定と繋げるために以下のような構成となっています。DockerfileFROM 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.ymlversion: '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
など作成した方が良いかも知れません。
- 投稿日:2020-12-27T19:07:54+09:00
【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: false2.Dockerイメージの作成
①コンテナ配備用PHPファイル作成
作成するコンテナに配備するためのPHPファイルを作成します。vi test.phptest.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 dockerfiledockerfileFROM 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 204MB3.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 testweb4.接続検証
ブラウザから
<EC2のグローバルIPアドレス>:8080/test.php
でアクセスをかけ、hogeと表示されるページが表示されればOKです。
- 投稿日:2020-12-27T18:45:38+09:00
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
- 投稿日:2020-12-27T18:09:56+09:00
Dockerコンテナで動いているmariadbを直接操作する
Wordpressにログインできなくなった
Wordpressを運用していて管理者でログインできなくなってしまい焦りました。
パスワードリセットもうまく効かずmariadbを直接操作してパスワードを変更することにします。KUSANAGI RoDのmairadbのパスワード
Kusanagi Rod上で構築している場合、mariadbのパスワードは
.kusanagi.mysql
に記載されています。.kusanagi.mysqlMYSQL_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です。
- 投稿日:2020-12-27T17:24:03+09:00
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 Lab
のDocker
イメージを使う
Remote Container
を使って、起動したコンテナにリモート接続Remote Containerで接続したワークスペース内で、入力補完やLinterを効かせながらコーディング
上記のような環境をデータ分析環境として選択しました。
イメージはこのような感じです。
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.ymlversion: '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に関しては、調べると他の方が詳しく説明をしてくださっていますので、そちらをご参照ください。Remote Containerの設定
VSCode [設定]→[拡張機能]→[Remote Container]:インストール。
インストールすると、「Reopen in Container」というポップアップが表示されるので、選択。
すると、プロジェクトの
docker-compose.yml
の設定に基づいたコンテナを自動的にbuild & 起動してくれ、コンテナの中でVSCodeのワークスペースが開かれます。(二回目以降は、VSCode左下の「><」みたいなマーク→reopen in Containerで接続できます。)
ワークスペース内では、ターミナルもコンテナのシェルと接続されているため、コマンドなどを流す際にいちいち
docker-compose ~
(もしくはエイリアス)をつける必要はありません。ワークスペースを開くと、「No Python interpreter is selected...」といったポップアップが表示されます。これは、Pythonの実行環境を聞いてきているので、Jupyter Labの実行環境である
conda
環境「Python 3.xx 64-bit('conda': virtualenv)」を選択。
VSCode
起動したコンテナにリモート接続し、コンテナの中でVSCodeが開ける状態になりました。
ただ、このまま.ipynb
を開いてもIPython Notebook用の表示にならないため、ワークスペースに拡張機能を追加します。ワークスペース内で[拡張機能]→[python(ms-python.python)]を探し、Dev Container: [プロジェクト名にインストールする]を選択。これで、IPython Notebook用の表示になります。
他にも、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
を選択しても、一度コンテナを再起動すると設定が初期化されます、、解決策ありましたらご教授ください)
環境構築完了!
これで
Docker
+VSCode
+Remote Container
で、入力補完などの強力な各ツールを効かせつつ、データ分析ができる環境が用意できました!なお、ワークスペースを閉じてもコンテナは起動しっぱなしなので、コンテナは都度停止するのを忘れないようにしてくださいね。
終わりに
Docker + VSCode + Remote Containerで、Jupyter Lab(Python)分析環境を作成しました。
入力補完も効きますし、自分的には快適だなぁと思っているのですが、Pythonでの分析をし始めたばかりなのでこれが正解かわかっておりません。Google Colaboratory やAzure Notebookなどの便利なクラウドサービスもありますが、時間制限があったり、ローカルで分析した方が計算が早かった、という場合があったので、今回はローカルの環境構築方法にフォーカスしました。
内容の間違いや、もっと良い方法がありましたら、ご指摘・ご教授をお願いいたします。
では、快適なコーディング環境を!
参考資料
- 投稿日:2020-12-27T17:24:03+09:00
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 Lab
のDocker
イメージを使う
Remote Container
を使って、起動したコンテナにリモート接続Remote Containerで接続したワークスペース内で、入力補完やLinterを効かせながらコーディング
上記のような環境をデータ分析環境として選択しました。
イメージはこのような感じです。
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.ymlversion: '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に関しては、調べると他の方が詳しく説明をしてくださっていますので、そちらをご参照ください。Remote Containerの設定
VSCode [設定]→[拡張機能]→[Remote Container]:インストール。
インストールすると、「Reopen in Container」というポップアップが表示されるので、選択。
すると、プロジェクトの
docker-compose.yml
の設定に基づいたコンテナを自動的にbuild & 起動してくれ、コンテナの中でVSCodeのワークスペースが開かれます。(二回目以降は、VSCode左下の「><」みたいなマーク→reopen in Containerで接続できます。)
ワークスペース内では、ターミナルもコンテナのシェルと接続されているため、コマンドなどを流す際にいちいち
docker-compose ~
(もしくはエイリアス)をつける必要はありません。ワークスペースを開くと、「No Python interpreter is selected...」といったポップアップが表示されます。これは、Pythonの実行環境を聞いてきているので、Jupyter Labの実行環境である
conda
環境「Python 3.xx 64-bit('conda': virtualenv)」を選択。
VSCode
起動したコンテナにリモート接続し、コンテナの中でVSCodeが開ける状態になりました。
ただ、このまま.ipynb
を開いてもIPython Notebook用の表示にならないため、ワークスペースに拡張機能を追加します。ワークスペース内で[拡張機能]→[python(ms-python.python)]を探し、Dev Container: [プロジェクト名にインストールする]を選択。これで、IPython Notebook用の表示になります。
他にも、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
を選択しても、一度コンテナを再起動すると設定が初期化されます、、解決策ありましたらご教授ください)
環境構築完了!
これで
Docker
+VSCode
+Remote Container
で、入力補完などの強力な各ツールを効かせつつ、データ分析ができる環境が用意できました!なお、ワークスペースを閉じてもコンテナは起動しっぱなしなので、コンテナは都度停止するのを忘れないようにしてくださいね。
終わりに
Docker + VSCode + Remote Containerで、Jupyter Lab(Python)分析環境を作成しました。
入力補完も効きますし、自分的には快適だなぁと思っているのですが、Pythonでの分析をし始めたばかりなのでこれが正解かわかっておりません。Google Colaboratory やAzure Notebookなどの便利なクラウドサービスもありますが、時間制限があったり、ローカルで分析した方が計算が早かった、という場合があったので、今回はローカルの環境構築方法にフォーカスしました。
内容の間違いや、もっと良い方法がありましたら、ご指摘・ご教授をお願いいたします。
では、快適なコーディング環境を!
参考資料
- 投稿日:2020-12-27T17:17:06+09:00
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-started2)インストールの確認
ターミナル~ % 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: password
とhost: 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:createRails6だとこのコマンドを実行すると
======================================== 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)
- 投稿日:2020-12-27T17:17:06+09:00
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-started2)インストールの確認
ターミナル~ % 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: password
とhost: 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:createRails6だとこのコマンドを実行すると
======================================== 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を接続しましょう!
以下の設定ページを開いて標準を選択します。
設定ページに以下を記述
「名前」 → 任意のものを設定
「ホスト」 → 「127.0.0.1」
「ユーザー名・パスワード」 → ymlファイルで記述したものに合わせる
「ポート」 → 「4306」以上を設定して「接続」するとSequelPro内で該当アプリのDBが作成されているはずです。
また、ボート番号は
docker-compose.yml
のports:
の記述と合わせています。以上でDockerとdocker-composeの開発環境への導入は終了です。
ちなみに僕はここまで6時間前後かかったので、ぜひ参考にしてさくさく進めていってください。本記文献
①『さわって学ぶクラウドインフラ docker基礎からのコンテナ構築』
② 既存のrails6のアプリにMySQLでDockerを導入する。
③ Ruby on Rails 「途中まで作ったアプリにDockerを導入したい」に挑戦してみる(MySQL / Sequel Pro)
- 投稿日:2020-12-27T12:52:01+09:00
Dockerチュートリアルをやってみた!
ナニコレ
この記事は Ubiregi Advent Calendar 2020 23日目のエントリです。
この投稿(12/27)からもう4日も過ぎているんですが、どうしても備忘録として残しておきたいという自分勝手な気持ちが強かったので、しれっと書きましたwおそらく何万人という方がやられているDocker tutorialをやって、Dockerというのは
なんなのかというのを知りたい & 自分のポートフォリオにも使ってみたいという気持ちで臨みました。参考文献
Docker tutorialは英文だったので、本当は原文読んで理解したかったのですが、途中で挫折しそうな気がしたので、@Michinosukeさんの和訳記事を元に進めました。圧倒的感謝
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などで講座を受けたりするのがいいのかなあと思いました。
・一番手取り早いのは、ポートフォリオにさっさと導入してしまうことかなと。
・コンテナデプロイ?をやってみたい。めちゃ難しそうだけど!
- 投稿日:2020-12-27T12:46:03+09:00
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を再度立ち上げることで無事クジラを見ることができました。おわりに
ここに書くほどの内容でも無かったですが、将来慌てないためにも自分の備忘録として書き残しておきます。
- 投稿日:2020-12-27T12:15:09+09:00
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が改善する方が早いか、時間の問題っぽいです。
- 投稿日:2020-12-27T11:50:42+09:00
軽量で爆速にコンテナを使える 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
が追加されました。詳細は以下のドキュメントに書いてあります。
- 投稿日:2020-12-27T11:50:42+09:00
軽量で爆速にコンテナーを使える 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
が追加されました。詳細は以下のドキュメントに書いてあります。
- 投稿日:2020-12-27T11:20:47+09:00
Docker上にASP.NET Core WebAPI環境を構築する(VSCode)その2
- Docker上にASP.net Core WebAPI環境を構築する(VSCode)の続き。SQLServerとの接続環境を構築。
手順
1.WebAPIの作成
ASP.NET CoreでWebAPIを作成する を参考にして作成。WebAPIの詳細については本記事では割愛。
【作成したWebAPI】
- Model
AuthorModel.csnamespace webapisqlsv1.Models{ public class AuthorModel { public int Id { get; set; } public string Author { get; set; } public string BookTitle { get; set; } } }AuthorContext.csusing Microsoft.EntityFrameworkCore; namespace webapisqlsv1.Models{ public class AuthorContext:DbContext{ public AuthorContext(DbContextOptions<AuthorContext> options) :base(options){ } public DbSet<AuthorModel> TblAuthor {get; set;} } }
- Controller
AuthorController.csusing 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を作成
DockerfileFROM 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:14333.コマンド実行&結果
docker-compose upソースはこちら
- 投稿日:2020-12-27T11:09:49+09:00
Dockerとは?
Dockerを知らないと化石であるといわれるほど
あまりにも有名な技術を使えなかったので勉強。これからDockerを学ぼうとしているが概要がよくわからない方向け
Dockerとは
Dockerイメージの構築
構築したイメージをコンテナ上で作成、実行、破棄
Composeによる複数コンテナの実行dockercomposeでコンテナを作成して、複数コンテナを連携させることで環境を作り、
開発ができるようになる。
軽量ですぐに移動できるのが利点。チュートリアルを読む、
ググりつつ一つ環境を作ってみると
dockercomposeの書き方がわかる
dockerfileはdockercomposeの補助的なものなので
そこがごちゃごちゃになると理解ができなくなるので
dockercomposeとdockerfileどちらの説明をしているのか
意識すれば一人でも理解できる
- 投稿日:2020-12-27T10:50:41+09:00
kind(Kubernetes in Docker) 使ってkubernetesクラスタ構築
kindとは
Kubernetes in Dockerの略でDockerコンテナを複数個起動し、そのコンテナをKubernetesNodeとして利用することで、複数台構成のKubernetesクラスタを構築する。
作成する環境
以下の環境(Master1台、Worker1台のKubernetesClusterを1台)を作成する。
※VPS契約しなくてもMacやWindowsのローカルでできると思われます。
使用した環境のバージョン纏め
[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/amd641.初期設定、インストール
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 version2. 単一ノード (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-plane2−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.02−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.yamlapiVersion: kind.x-k8s.io/v1alpha4 kind: Cluster nodes: - role: control-plane image: kindest/node:v1.18.2 - role: worker image: kindest/node:v1.18.23−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.23−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以上
- 投稿日:2020-12-27T10:21:57+09:00
`Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?` の対処法
- 投稿日:2020-12-27T09:21:27+09:00
[仕事納め]2020年にやらかしたミスをまとめる[未経験から2年目]
こんにちは。web系を中心としたプラグラマをしております。
小さなミスからそこそこ大きめのミスまで、今年1年でたくさんのミスをしてきました。
まだ新人で大きな権限を頂いていないこともあり、本番環境でやらかしてしまった皆様ほどのインパクトあるやらかしはないのですが、コーディングや開発環境構築などであれこれ反省点があるのでまとめていきたいと思います。
アンチパターンやあるあるとしてお楽しみ下さい。コーディング系
誤字
とにかく多かったです。
クラス名や関数名ならすぐエラーが発生して見つけやすいのですが、phpで変数名のスペルミスをしたりすると、そのままnullが代入されたりして見つけづらく、時間の無駄になりがちでした。$address = 'hogehoge'; print $adress; // 返却値なしくだらない誤字ですが、この手のエラーが出ない誤字で無駄にした時間も、年間を通せばかなり膨大になって来ます。
解決策としては、コードを細かく切り分けてこまめにテストを実行しました。これによって誤字箇所を発見するのが早くなった実感があります。
また、エディタはVSCodeを使用しており補完機能は元々使っていたのですが、コード量が多いとなかなか読み込まず使用を諦めて手入力することもあったので、今後補完機能をうまく活用できるように工夫していきたいです。
......そんなことより静的言語を使った方がいいのかもしれません。エスケープ
先日LaravelのselectRawメソッドを用いて生に近い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年も頑張っていきましょう!!
- 投稿日:2020-12-27T09:05:14+09:00
[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 上のコンテナに接続できる
- Fargate 上のコンテナにはデフォルトだと接続できない
- Fargate タスクに SSM エージェントを導入して、EC2 同等のアクセスを可能にする
参考
- 【図解】Dockerの全体像を理解する -前編-
- スタートアップのためのコンテナ入門 – 導入編
- スタートアップのためのコンテナ入門 – AWS Fargate 編
- DockerfileのCMDとENTRYPOINTを改めて解説する
- docker-compose コマンドまとめ
- 続:「Bastion ~ AWS Fargateで実現するサーバーレスな踏み台設計」
- AWS Systems Manager (SSM) を やってみよう
- Fargate上で動くコンテナアプリケーションにSessionManagerで接続する
- 投稿日:2020-12-27T04:29:01+09:00
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 にアクセスします。このような画面になっていたら成功です。
もし「ページを開けませんでした」とか「サーバに接続できません」と出たら、少し時間を開けた後に再度ページリロードを行なってみてください。それでもダメな場合はDockerfileかdocker-composeに間違いがありますので、ターミナル上のエラーメッセージを確認してみてください。
エラーが出ていなかったら、以上で作業は終わりです。お疲れさまでした。
Pythonの日本語対応化
初期状態のPythonは日本語に対応していません。日本語をそのまま表示させようとすると、いわゆる豆腐文字(文字化け)になってしまいます。フォントを導入し、日本語を表示できるようにします。詳しくはコチラの記事を参考にしてください。
おわりに
Dockerというものは、自分の環境を汚すことなく、開発環境を構築することができ、他人にも自分の環境を共有することが可能になります。これによって、環境による開発者同士の齟齬が起きなくなります。他にも軽量で高速といった特徴があるので、ぜひ勉強してみてください。
- 投稿日:2020-12-27T03:56:15+09:00
Gatsby(TypeScript)×Netlify×Dockerの始め方
収益が出ていないのに、今月もブログのサーバー代を払う僕へ、朗報です。
Gatsby×Netlifyを使って無料で世界中にブログを届ける方法がございます!!今回はDockerを使いつつ、ブログが配信できるまでの方法をご紹介致します
まずは全体の流れをサラッと確認
- Gatsbyを起動させるためにDocker環境を構築していく
- Gatsby(TypeScript)でサイトを構築
- 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.mdDockerによる環境構築
Dockerはローカルでのnodeの実行環境として使っていきます!
Dockerfile
先ほどご紹介した場所に
Dockerfile
を配置し、以下の記述をしていきましょう!DockerfileFROM node:12.17.0 RUN mkdir gatsby-ts-netlify-docker WORKDIR /gatsby-ts-netlify-docker RUN yarn global add gatsby-cli
FROM
ではイメージの取得、RUN
でgatsby-ts-netlify-docker
フォルダの作成、WORKDIR
で作業ディレクトリの設定をしています。
最後に今回の肝であるgatsby-cli
をglobalにaddしております。docker-compose.yml
書けたら次に
docker-compose.yml
を紹介した場所に作成して、以下の記述をしていきましょう!docker-compose.ymlversion: '3.8' services: gatsby: build: ./ tty: true stdin_open: true volumes: - ./:/gatsby-ts-netlify-docker environment: - NODE_ENV=development ports: - 8000:8000
build
でDockerfile
の場所を教える。tty
、stdin_open
でコンテナとホストをつなぐ設定をして、volumes
でhostとコンテナのディレクトリを対応させて、ports
ではローカルでサーバーをたてる際のポートを設定しています。ビルド&立ち上げ
Dockerfile
とdocker-compose.yml
ファイルが配置できれば、ビルド後、コンテナを立ち上げていきましょう!$ docker-compose build $ docker-compose up -dこれでコンテナがビルドされ、立ち上がりました!
Gatsbyを使ってサイトを構築する
今回はTypeScript対応のStarter Libraryを使ってサイトを構築していきます。
Dockerのコンテナ内に入る
まずはコマンドを実行するためにコンテナ内に入りましょう
$ docker-compose exec gatsby bashこれでコンテナ内に入れたと思います!
Starter Libraryの導入
今回僕が導入しようと決めていたLibraryは以下の特徴をもっているものです。
- TypeScriptで書かれている
- 最低限の構成
よって、選ばれたのは、、、
gatsby-starter-typescript-plusでした!
リンクはコチラからコチラを導入していきます。
gatsby new gatsby https://github.com/resir014/gatsby-starter-typescript-plus『時間かかるな−』と思った方、通常仕様なので、安心してお待ちください〜(´∀`)
いよいよ表示させていく!
画像にもあるとおり、
gatsby develop
でサーバーを起動させていきます。ですがここで注意点が…!
上記のように起動させると、localhostでアクセスしても表示されません。なので以下のコマンドで起動させていきます。
gatsby develop -H 0.0.0.0
buildが終わって、
localhost:8000
へアクセスしてみると…?
このような画面が出ていれば成功です!!!
Netlifyを使って世界中に向けて配信していく
Netlifyのアカウントを持っていない方は、GitHubアカウントがあれば簡単に登録できるので、登録してください。
アカウントを登録するとマイページみたいなところに飛ぶので、以下ボタンを探してください。
ここを押すと、GitHubのリポジトリと連携することが出来ます。最後はこのような感じで入力してください。
もしdeployに失敗してしまった場合
右上にある
Site settings
を押して、Build & Deploy
を選択、Edit settings
を押して、以下のように記述してください。サブドメインの変更
今のままでもNetlifyからであればアクセスは可能ですが、まだ外部の方はアクセスすることが出来ません。
そこでサブドメインを設定することによって、外部からでもアクセスが可能となります。方法は先ほどと同様に
Site settings
から、次はDomain management
へ移動、Options
からEdit site name
を選択するとサブドメインの変更が可能となります。例えばサブドメインを
sample
にしたとすると、https://sample.netlify.app
がドメインとなります。
これでどこからでもアクセスが可能となったはずです!!GitHubを使った変更の自動デプロイ
実は何も設定する必要はございません。笑
GitHubにてDefaultのリモートブランチとなっているところに、Pushするだけ。
これによりNetlify側が発火して、自動でデプロイを行ってくれます!(献身的です)
さいごに
最後まで見て頂きありがとうございました。
スターターライブラリは何を使おうか迷ったり、
ルートディレクトリのGatsby下にファイルを生成しているので、他の方の記事を見ながらやっていると、NetlifyのBuildで少し躓いたりと僕はしていましたが、比較的簡単に導入できるので、皆さんやってみてはいかがでしょうか!間違っている点やシンプルな感想、よかった点などでもございましたら、お気軽にコメントください(´艸`*)
- 投稿日:2020-12-27T02:43:35+09:00
作ったポートフォリオを簡単に解説してみる。
何を作ったのか?
アプリ名 Dig Memo
思考を深掘る事を意識して作ったメモアプリです。
下記URLで公開しております!
http://www.digmemo-app.xyz/なぜ作ろうと思ったのか?
思考をサポートできるサービスを作りたいと思ったからです。
プログラミング学習をしている時に、ただ勉強するよりも思考して勉強する方が、知識が定着しやすいと感じました。しかし、ただのメモだと楽をしてインプットした情報をそのまま吐き出すこともできてしまうなと思いました。そこを制限して思考をサポートすることができるサービスがあったらいいのではないか?と思い、作ることにしました!
どんな機能を実装したのか?
機能一覧
・メモ投稿・編集・削除機能
・カテゴリー機能
・全文検索機能
・お気に入り機能
・ページネーション機能
・メール認証機能
・パスワードリセット機能
・ゲストログイン機能ER図
こだわった・工夫したポイント
ポイント1
問いを設定し、それに対して答える事で思考を促せるようにしました。
このアプリでは完全自由なメモはしにくいようになっています。言葉では説明が難しい部分もあるので動画を載せます。
動画のようにこのアプリはタイトルを設定し、そのタイトルに対して自問自答を行います。こうする事で反強制的に思考することができます。ポイント2
カテゴリーや問い作成機能にajax処理を用いました。
文字を打っている時「あ、この問いも追加したい」ってなった場合に、何も対策しなければ問いを作った後、それまで打っていた文字まで消えてしまいます。それを防ぐためにajax処理を用いて、UXを向上させました。
ポイント3
テーブル結合で全文検索を実現させました。
検索機能ではメモのタイトルからだけではなく、メモの内容からも検索を行えるように実装しました。
articles
テーブルのtitle
カラムと、article_items
テーブルのbody
カラムという二つのテーブルから取り出したデータを結合させることによって機能を実現させました。使用技術等
- 言語: 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化する
最後に
ここまでご覧いただきありがとうございました!
- 投稿日:2020-12-27T01:23:18+09:00
ローカルにある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オプション使えば良いことに気づいたので改めて記事化しました。
- 投稿日:2020-12-27T00:04:04+09:00
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.ymlproduction: <<: *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:precompiledockerに記述する部分
以下の記述を追加して起動を行いました
DockerfileENV 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に対してスペースを入れると解決しました。
beforecredentials.yml.encsecret_key_base: *****************************after
credentials.yml.encsecret_key_base: ***************************** ↑スペースが入ります原因はわかりませんが、どうしても解決しない時は試してみるといいかもしれません。
終わりに
予想外の方法で解決したので、試せることは試すことが大切だと思いました。
参考にした記事