20210108のdockerに関する記事は13件です。

Ruby on Rails 日本語でフォーム投稿した際にIncorrect string valueエラー解決方法

はじめに

環境

  • Docker
  • ruby 2.3.7
  • Rails 5.2.4.4
  • MySQL 5.7.32

エラー内容

新規投稿フォームに日本語を入力し、送信するとIncorrect string valueエラーが発生。
スクリーンショット 2021-01-04 21.28.20.png

原因

Incorrect string valueのエラー文から、フォームに入力した文字列が原因と推測。
試しに英語を入力して送信すると問題なく投稿できました。

ということは、DBが日本語に対応していない?

MySQLに接続し、使用中のデータベースの設定を確認。

mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

DBの文字コードの設定がutf8ではなく、latin1になっていました。
latin1は、西ヨーロッパ言語で日本語対応していないらしいです。

Docker環境構築時にdatabase.ymlファイルの文字コードの設定が抜けていたのが原因でした。

database.yml
default: &default
  adapter: mysql2
  # ここに「charset: utf8」が抜けてたのが原因
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: hideki1104
  host: db

解決方法

etc/mysql/my.cnfのファイルに

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_bin
skip-character-set-client-handshake
[mysqldump]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4

を記述すると文字コードが変更できます。

viエディタを使用して記述を追加しようとしたが、viコマンドが設定されておらず使えない

# vi my.cnf
/bin/sh: 5: vi: not found

apt_getを使用すればvimをインストールできるらしい。

# apt-get -v
apt 1.8.2.2 (amd64)

下記のコマンドで一旦アップデートを行い

# apt-get update

vimをインストールします。

# apt-get install vim

これでvimを使用できるようになりました。

etc/mysql/my.cnfに先ほどの

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_bin
skip-character-set-client-handshake
[mysqldump]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4

を記述することで文字コードを変更できました。

この状態ではすでに作成しているすでにDB、テーブル、カラムの文字カードは変更されていません。

MySQLの中で以下のコマンドを打ち込みました
DBの文字コード設定

ALTER DATABASE DB名 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

テーブルの文字コード設定

ALTER TABLE テーブル名 CONVERT TO character SET utf8mb4 COLLATE utf8mb4_unicode_ci;

カラムの文字コード設定

ALTER TABLE テーブル名 CHANGE column_name カラム名 VARCHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

これで投稿フォームで日本語を送信することができるようになりました。

参考記事

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

備忘録

学習済み内容

  • AWS基礎
  • ネットワーク基礎
  • Docker基礎
  • Linuxド基礎

これから進めていく内容

  • AWSCloudformation
    • Wordpress構築
  • Docker
    • サーバ構築
  • Kubernetes
    • kind入れて練習
  • Linux
    • シェルスクリプトの教科書

よろしくお願いします

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

AWS,Dockerによるインフラ構築練習 備忘録

学習済み内容

  • AWS基礎
  • ネットワーク基礎
  • Docker基礎
  • Linuxド基礎

これから進めていく内容

  • AWSCloudformation
    • Wordpress構築
  • Docker
    • サーバ構築
  • Linux
    • シェルスクリプトの教科書

よろしくお願いします

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

自分的"よく使うけど覚えられない"Dockerコマンドまとめ

よく使うけどなぜかすぐ忘れる(個人的見解)dockerコマンドのコピペ用記録です。

ポートを指定してコンテナ起動

iは標準入力、tはtty割り当て、dはバックグラウンド実行のオプション

docker run -it --name <コンテナ名> -d -p 80:80 <イメージ名>

コンテナのIPアドレスを取得

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <コンテナ名>

コンテナの状態を確認

9割方コンテナのボリュームマウント状態を見るために使うけど、それならきっとマウントのみ確認するオプションがあるんだろうな。(調べるの面倒でgrepしてる)

docker inspect <コンテナ名>

コンテナ一括削除

$()の中身を変更して代用もでき便利(なのにすぐ忘れる)

docker rm $(docker ps -aq)

今あるコンテナのイメージ化

コンテナ起動を失敗した時の切り分けに役立つ。

docker commit <コンテナID> <任意のイメージ名>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker コンテナ内で composer install/require したら `Could not find package` となった

起こったこと

個人作成のアプリを作成中 docker のコンテナ内に入って、composer require laravel/laravel を実行したら以下のメッセージが出てきた。

[InvalidArgumentException]
Could not find package laravel/laravel with stability stable.

ちなみにローカルからだとうまくいく。
なんでやねーーーん!!

紆余曲折を経て最終的にやったこと

Dockerfile から composer をインストールしている以下の記述を削除

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer
RUN composer config -g repos.packagist composer https://packagist.jp

マルチステージビルドを使用して composer を install する

COPY --from=composer:2.0.8 /usr/bin/composer /usr/bin/composer

終わったら docker image を ビルドして完了

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

Docker コンテナ内で composer install/require で `Could not find package` となった

起こったこと

個人作成のアプリを作成中 docker のコンテナ内に入って、composer require laravel/laravel を実行したら以下のメッセージが出てきた。

[InvalidArgumentException]
Could not find package laravel/laravel with stability stable.

ファッ!?

やったこと

Dockerfile から composer をインストールしている以下の記述を削除

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer
RUN composer config -g repos.packagist composer https://packagist.jp

マルチステージビルドを使用して composer を install する

COPY --from=composer:2.0.8 /usr/bin/composer /usr/bin/composer

終わったら docker image を ビルドして完了

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

Elixirアプリケーションのコンテナをできるだけダイエットした話

概要

Elixirで書いたchatops用アプリケーション anagoをGKEで動かそうとdocker buildしたらかなり重めのRails並の容量になってしまったのでどこまでそぎ落とせるか検証した話です。

FROM elixir:latest

WORKDIR /app
ENV MIX_ENV=prod

RUN mix local.hex --force && \
  mix local.rebar --force

COPY mix.exs mix.exs
COPY mix.lock mix.lock
COPY config config
RUN mix deps.get --only prod && \
  mix deps.compile

COPY . .
CMD ["mix", "run", "--no-halt"]

最初の頃のDockerfileはこんな感じです。
このDockerfileでビルドしたアプリケーションのサイズは下記の通り...

docker images
##
REPOSITORY                                TAG             IMAGE ID       CREATED          SIZE
anago                                     latest          aa7e0779d912   2 seconds ago    1.27GB

画像もJSONもDBもない簡単なアプリケーションでのサイズが1.27GBと出てきたらさすがにダイエットを決意するよね...

ベースイメージの確認

Elixirのベースイメージサイズは下記の通り。

docker pull elixir
## docker images
REPOSITORY                                TAG             IMAGE ID       CREATED         SIZE
elixir                                    latest          83478b936eba   2 days ago      1.24GB

比較にGo言語のコンテナを取得してみると...

docker pull golang
### docker images
REPOSITORY                                TAG             IMAGE ID       CREATED          SIZE
golang                                    latest          5f9d35ce5cfe   3 weeks ago      839MB

やっぱりファイルサイズはビルドしたライブラリのコード含めても30MB程度。
だけどベースイメージがそもそも1.24GBもある...
比較に取ったGoのイメージと比べても300MB近くElixirのほうが重たい:upside_down:

alpineにしてみる

イメージサイズのダイエットの入り口はベースイメージをalpineにすることだと思うのでベースイメージを変えてみる。

docker pull elixir:alpine
## docker images
REPOSITORY                                TAG             IMAGE ID       CREATED         SIZE
elixir                                    alpine          dd10458addd0   2 days ago       84.9MB

圧倒的シェイプ!96%減!
これにアプリケーションの30MBを追加しても114MBに!

REPOSITORY                                TAG             IMAGE ID       CREATED              SIZE
anago                                     alpine          c8b8c08b7aef   About a minute ago   114MB

もともとのサイズと比較すると10%未満にダイエット成功!!
もうこれで良いんじゃない? :thinking:

escript、動きます

Erlangにはアプリケーションを一つの実行ファイルに固めるescriptという仕組みがあります。
実行ファイルはErlangのランタイムがある環境でなら実行可能だったりします。
ということはErlang:alpineのイメージで動くんじゃない? :thinking:
さっそくErlang:alpineのベースイメージを手に入れます。

docker pull erlang:alpine
## docker images

REPOSITORY                                TAG             IMAGE ID       CREATED          SIZE
erlang                                    alpine          daa6bbdd7458   2 weeks ago      69.4MB

ElixirはErlang上で動くためErlangのベースイメージのほうが軽量だったりします。
15MB程度ですが軽量ですね。
これで行きましょう!!

ということでDockerfileに mix escript buildを追加。
ついでにソースコードも要らないのでマルチステージビルドもやりましょう。

FROM elixir:alpine as build

WORKDIR /app
ENV MIX_ENV=prod

RUN mix local.hex --force && \
  mix local.rebar --force

COPY mix.exs mix.exs
COPY mix.lock mix.lock
COPY config config
RUN mix deps.get --only prod && \
  mix deps.compile

COPY . .

RUN mix escript.build

FROM erlang:alpine

WORKDIR /app
COPY --from=build /app/anago /app/anago

これでヨシ! :thumbsup:
あらためで docker buildしてサイズを見てみると :eyes:

REPOSITORY                                TAG             IMAGE ID       CREATED          SIZE
anago                                     erlang_alpine   a01f810d11dc   2 seconds ago    71.4MB

71.4MBまで軽量化に成功!!!
ついに100MBの壁を突破しましたよ!!


閑話休題

このアプリケーションはもともと mix run --no-haltで動かすつもりだったのですがescriptにしたら即終了されてしまいます。
そういう時は timer.sleep(:infinity)と書いておくとずっと動いてたりします。

defmodule Anago.CLI do
  def main(_args) do
    :timer.sleep(:infinity)
  end
end

どこまで減らせる?

erlang:alpineだって最低限何らか一緒に入っているだろうとは思うのでalpineに apk add erlangしてどこまで減るのか気になってきました。
バニラalpineのサイズはわずかに5MBです。
試しにalpineにerlangだけインストールするDockerfileを作ってみます。

FROM alpine:latest
RUN apk add --no-cache erlang

このDockerfileをビルドすると結果は 63.6MBまで軽量化されます!(Erlangが58MBくらいの容量になるのでこれ以上のダイエットは無理)
ここまで減らしちゃうとちゃんと動くのかが不安になりますがここまで来たら目標もどこまでサイズを削ぎおとせるかにシフトしているのでアプリケーションを含めてビルドしてみます。

REPOSITORY                                TAG             IMAGE ID       CREATED             SIZE
anago                                     custom_alpine   fb1de28697a1   9 minutes ago       65.6MB

65.6MBまで来ました :tada:

あとがき

ちなみにこのイメージもちゃんと実行できました:tada:(すごい...)
Erlangのサイズの限界でおそらくこれ以上の軽量化はできないと思うんで軽量化の限界は63.6MB + escriptとなるようです。

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

dockerのmount volumeのpermissionをfixuidでなんとかする

fixuidというコマンドを使う方法を知ったので共有します。

問題

docker/docker-composeでhostからvolumeをマウントして、そこへファイルを吐き出すと、rootで吐き出されてしまう。
あるいは、コンテナ内で作ったユーザーに対応するユーザーがhost側にいない
あるいは、host側のユーザーのUID/GIDを指定してdocker runしても、今度は当該ユーザーがコンテナ内にいない。

問題の根源

docker buildした時とdocker runする時で同じシステムとは限らない
なので、userのid、groupのidが異なってしまう。

対処

概ねこのような感じです

make_env.sh
#!/bin/sh

# 適切な.envを作成できればこれを使わなくてもよい
touch .env
echo "UID=$(id -u $USER)" >> .env
echo "GID=$(id -g $USER)" >> .env
echo "UNAME=$USER" >> .env
...
RUN useradd hoge # ユーザー名は各自かっこいいのつけて
RUN USER=hoge && \
    GROUP=hoge && \
    curl -SsL https://github.com/boxboat/fixuid/releases/download/v0.5/fixuid-0.5-linux-amd64.tar.gz | tar -C /usr/local/bin -xzf - && \
    chmod 4755 /usr/local/bin/fixuid && \
    mkdir -p /etc/fixuid && \
    printf "user: $USER\ngroup: $GROUP\n" > /etc/fixuid/config.yml
# ここまでrootユーザー
# ここからhogeユーザー
USER hoge:hoge

ENTRYPOINT[ "fixuid" ]
# 他にもENTRYPOINTを使っている何かが有ればunshift的につければいい
# ENTRYPOINT[ "fixuid", "docker-php-entrypoint" ] 等
docker-compose.yml
hoge:
  image: php:latest
  user: "${UID}:${GID}" # <= .envから読みこまれる
  volumes:
    - ....

使い方

# 各自、使う人が初回に叩いて.envを生成する
./make_env.sh

# あとは普通に使える
docker-compose up -d

原理

  • Dockerfileのベストプラクティスに則ってbuild時にuserを作っておく。この時点では、UID/GIDはランタイムと一致する保証はない。
  • LinuxのユーザーのUID/GIDは書き換えることが出来る。fixuidはそれを実施した上で、渡したコマンドを実行してくれる
    • 4xxxパーミッションが付いた実行ファイルは、その実行ファイルのownerの権限で動作する。fixuidはコレを利用してsudoなしでuid変更を実現する
    • 他にも$HOMEの書き換えなどやってくれる様子
  • docker run時に、host側ユーザーのuid/gidを外部から与えることで、ファイルシステムに記録されるuid/gidをhost-guestで一致させる
    • 与える手段としては.envを使う。docker-composeは.envを読んでくれる
    • uid/gidはidコマンドで取得
  • uid/gidが一致しているので、hostからもguestからもちゃんと読める!

参考:

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

サービスの公式ロゴ一覧

ドキュメントを作成する時にサービスのロゴなどを使いたいと思う時がよくあると思いますが、そういう時はきちんと公式のガイドラインに従って使用するようにしましょう。
※今後も順次、追記していきます

GitHub

みなさんご存知ソースコード管理サービスです。

GitHub Logos and Usage
https://github.com/logos

CircleCI

商標使用ガイドライン
https://circleci.com/ja/legal/trademark-guidelines/

Blandfolder CircleCI
https://brandfolder.com/circleci

docker

コンテナの有名OSSです。

Docker Logos
https://www.docker.com/company/newsroom/media-resources

ArgoCD

継続的デリバリー(CD)ツールです。

CNCF Argo
https://cncf-branding.netlify.app/projects/argo/

slack

コミュニケーションツールslackです。

メディアキット
https://slack.com/intl/ja-jp/media-kit

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

python&jupyterlabのコンテナ構築

はじめに

Jupyterlabを使いPython環境を利用するコンテナを構築したので、その時の手順をメモとして残しておく。

実行環境

【Docker導入環境】
  ・Ubuntu 18.04 LTS(GCP上)
  ・docker 19.03.13

手順

1.環境準備
2.Pythonコンテナを構築
3.SSHサーバー機能を追加
4.JuypterlabとSSHの同時起動

1.環境準備

GCP上にVMインスタンスを作成

dockerのインストール
 【Dockerコンテナ内のUbuntuではsystemctlは使えない】の手順1を参考に。

2.コンテナ構築

ベースイメージを取得

$ docker image pull python:3

コンテナを作成

$ docker container run -it -d --name python-con1 python:3

起動中コンテナの中に入り、いくつかのパッケージをインストール

$ docker container exec -it python-con1 /bin/bash
コンテナ内で実行するコマンド
# パッケージをインストール
pip install numpy pandas jupyterlab

# コンテナから出る
exit

変更後のコンテナイメージを作成

# コンテナの停止
$ docker container stop python-con1

# 現在のコンテナをイメージ化
$ docker container commit python-con1 python-img:ver1

イメージが作成できている事を確認

$ docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
python-img   ver1      34ad01ba7efb   41 seconds ago   1.19GB
python       3         d1eef6fb8dbe   2 weeks ago      885MB

作成したイメージから再度コンテナを作成する。
 ※その際に、ポートマッピングやホスト側のディレクトリをマウント

$ docker container run -it -d \
-p 8888:8888 \
#-v
--name python-con2 python-img:ver1
# jupyter lab --ip=0.0.0.0 --allow-root --LabApp.token=""

コンテナに入りJuypterlabを起動。
 ※上記のコンテナ作成のタイミングで起動しても良い。(コメントアウト部分)

$ docker container exec -it python-con2 /bin/bash
コンテナ内で実行するコマンド
jupyter lab --ip=0.0.0.0 --allow-root --LabApp.token=""

この状態でホスト側の8888番ポートにアクセスして、juypterlabが開かれれば問題なし。
 ※ホスト側の8888番ポートは開放しておく。
 
ここまで確認できたら、コンテナは一旦削除。

3.SSHサーバー機能を追加

各コンテナに対して直接操作を行える様にするためにSSHサーバーもインストールし、SSH接続ができる状態にしておく。

# コンテナ作成
$ docker container run -it -d --name python-con2 python-img:ver1

# コンテナに入る
$ docker container exec -it python-con2 /bin/bash 
コンテナ内で実行するコマンド
apt update
apt install -y openssh-server
apt install nano

サービスの起動に必要なフォルダを作成、共通鍵の登録
※鍵の生成はTera Termなどでしておく。今回はrootユーザーでアクセスする想定。

コンテナ内で実行するコマンド
mkdir /var/run/sshd
mkdir /root/.ssh/
nano /root/.ssh/authorized_keys
# 鍵の中身は公開鍵の[.pub]ファイルの中身をコピー

変更後のコンテナイメージを作成

# コンテナの停止
$ docker container stop python-con2

# 現在のコンテナをイメージ化
$ docker container commit python-con2 python-img:ver2

イメージが作成できている事を確認

$ docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
python-img   ver1      34ad01ba7efb   41 seconds ago   1.19GB
python       3         d1eef6fb8dbe   2 weeks ago      885MB

作成したイメージから再度コンテナを作成する。
 ※その際に、ポートマッピングやホスト側のディレクトリをマウント

$ docker container run -it -d \
-p 8888:8888 \
-p 20022:22 \
--name python-con3 python-img:ver2 \
/usr/sbin/sshd -D

この状態で、ローカルPCのTera Termなどからdockerホストの20022ポートにSSH接続できれば正常に動いている。
 ※ホスト側のポートを開放しておくこと。

4.JuypterlabとSSHの同時起動

JuypterLabSSHサーバが立ち上がるshファイルを作成しておき、コンテナ作成時のCMD上書き命令で、そのshファイルを実行する事でコンテナの再起動時に毎回自動でサービスが立ち上げる様にしたかったが、上手くいかなかった。
原因はshファイル自体が実行完了するとコンテナが落ちてしまうため。無限ループする様なshファイルも試してみたが、結局うまく行かなかったので別の方法で実施することにした。

まずは下記のコマンドでコンテナを作成し、コンテナ起動のタイミングでSSHサービスが立ち上がる様にしておく。

docker container run -it -d \
-p 8888:8888 \
-p 20022:22 \
--name 【任意のコンテナ名】 python-img:ver2 \
/usr/sbin/sshd -D

そして、その後SSH接続して以下のコマンドを実施する。

jupyter lab --ip=0.0.0.0 --allow-root --LabApp.token=""

 ※別ブラウザで立ち上げたコンソールからコンテナに入って上記のコマンドを実行しても良いが、個人的には上記のやり方の方が一手間少ないと思う。

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

docker registryにクライアントPCからhttpでアクセス

環境

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.1 LTS
Release:    20.04
Codename:   focal
$ docker -v
Docker version 20.10.1, build 831ebea

手順

/etc/docker/daemon.jsonを作成、registryを指定

daemon.json
{ "insecure-registries": [ "192.168.1.1:5000" ] }

docker再起動

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

ちょっと躓いた

内容

/etc/docker/daemon.jsonにinsercure-registriesを記載しても反映されない

解決

daemon.json「"」と「:」の間にスペースがあったため

# OK
{ "insecure-registries": [ "192.168.1.1:5000" ] }

# NG
{ "insecure-registries" : [ "192.168.1.1:5000" ] }

その他

一度設定できてしまえば、空白があっても反映できるようになった

参考

https://python5.com/q/desfwrhm

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

Dockerfile, docker-composeの書き方と解説

はじめに

docker初心者の自分が同じようにdocker初心者の方向けに作成したものです。
Dockerfileやdocker-composeでよく使われている用語を抜粋してこの記事を書かせていただきました。皆さんの参考になれば幸いです。✊

対象者

  • Docker, docker-compose 初心者の方
  • ファイルの書き方を忘れてしまった方

Dockerfile とは

Dockerfile は、命令を取り込み自動的にイメージをビルドしてくれるテキストファイルである。pull しなくても自分で Dockerfile を書けば好きなようにイメージを作成することができる。

Dockerfile よく使われる命令解説(例付き)

FROM で Docker イメージを指定(ローカルにイメージがなくても勝手に作成する)

FROM python:3.7

ENV で 環境変数(key, value)を設定する

ENV PYTHONUNBUFFERED 1

RUN で イメージ作成前にシェルを実行する

RUN mkdir /code

CMD で イメージ作成後にシェルを実行、複数用いても最後の 1 つだけ実行する

CMD python3 app.py

WORKDIR で docker コンテナ がコマンドを開始するディレクトリを指定

WORKDIR /usr/share/nginx/html

COPY で ホストからファイルを Docker イメージにコピー、圧縮ファイルの場合解凍されない

# /~/で囲うと絶対パス、無いとWORKDIRの相対パス
COPY index.html index.html

ADD で ホストからファイルを Docker イメージにコピー、圧縮ファイルの場合解凍される

# /~/で囲うと絶対パス、ないとWORKDIRの相対パス
ADD requirements.txt /code/

VOLUME でホスト側のデータをマウントするディレクトリを指定

VOLUME /code


docker-compose とは

docker-compose は、YAML ファイルを使って複数のコンテナを定義し実行する Docker アプリケーションのためのツール。

docker-compose 解説(例付き)

サンプル

version: '3'

services:
    db:
        image: postgres
        container_name: docker_compose_postgres
        ports:
            - "5555"
        environment:
          - POSTGRES_DB=postgres
          - POSTGRES_USER=postgres
          - POSTGRES_PASSWORD=postgres
        networks:
          - docker_link

    web:
        build: .
        command: python3 manage.py runserver 0.0.0.0:8000
        volumes:
            - .:/code
        ports:
            - "8000:8000"
        depends_on:
            - db
        networks:
            - docker_link

    networks:
        docker_link:

  • version:docker-compose のバージョン
  • service:動かすアプリケーション
    • image:Docker イメージ指定
    • container_name:コンテナ名
    • ports:ホスト側とコンテナ側の両方のポートを指定だけでなく公開用のみも指定できる
    • environment:環境変数を追加
    • build:Dockerfile の存在するディレクトリを指定
    • command:デフォルトのコマンドを上書き
    • volumes:ホストのディレクトリをマウントするディレクトリを指定
    • depends_on:サービス間の依存関係を指定
    • networks:どのネットワークに接続するかを指定
  • networks:ネットワークの指定

参考にしたサイト

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

DockerでPython(Django)学習環境を作ってVSCodeでデバッグできるようにする(ほぼ自分用手順メモ)

この記事について

タイトルの通りです。
Djangoの勉強をするにあたって学習環境を構築したので、その手順メモをここに残します。
解説は一切ないので、どういうツールが入ってるとかどういう仕組みで動いてるとか一切興味ない、あるいはもう知ってるから環境構築だけさせてくれ!という人向けの記事です。
というか自分の備忘録的メモです。
Windows10環境にて実行しています。

やりたいこと

  • Djangoの勉強をしたい
  • VSCodeでデバッガを使ってステップ実行とかもしたい
  • Python仮想環境がどうとかで煩わしい思いをしたくない、PCの環境汚したくない

⇒Dockerで環境作ればいいよね!

WSL2をセットアップする

WSL2(Windows Subsystem for Linux 2)が未セットアップの場合、まずはWSL2をセットアップします。手順は下記です。
https://docs.microsoft.com/ja-jp/windows/wsl/install-win10

使用するLinuxディストリビューションはどれでもいいです。
私はUbuntuにしました。

Docker Desktopをインストールする

Docker Desktopをインストールします。
https://www.docker.com/products/docker-desktop
インストーラーに従ってデフォルトのままインストールすれば問題ありません。

VSCodeをインストールする

VSCodeをダウンロードしてインストールします。
https://azure.microsoft.com/ja-jp/products/visual-studio-code/

続けて、Remote Containersという拡張をインストールします。
https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers

開発環境ファイルを取得する

本来であればここからDockerfileを書いたりVSCodeの設定ファイルを作ったりゴニョゴニョするのですが、学習用の環境ファイル一式を作成したので、下記から取得してください。
https://github.com/nendo-code/djangostudyenv

Djangoの起動、デバッグ

VSCodeで、先ほど取得した「djangostudyenv」のフォルダを開きます
open.png

VSCodeの画面左下にある、緑色のアイコンを押します。
midori.png
コマンドパレットが表示されるので、「Remote-Containers:Open Folder in Container」を選択します。
フォルダ選択するダイアログが出るので、先ほど取得した「djangostudyenv」のフォルダを指定します。
remote.png

Dockerによる環境構築(と、VSCodeの拡張のインストール)が始まります。
「Starting Dev Container(show log)」をクリックすると、環境構築の進捗状況が表示されます。
showlog.png

これでDockerコンテナ上にDjangoの開発環境が構築できたので、Djangoのプロジェクトを作成します。
ターミナルを開いて下記のコマンドを実行します。

$ cd /code/web
$ django-admin startproject app

これで「app」というdjangoのプロジェクトが作成されます。
VSCodeの左側の「実行」メニューで「Python: Django」を選択して、デバッグの開始ボタンを押下します。
django.png

これでdjangoで作成したアプリケーションが起動するので、試しに
http://localhost:8000/
にアクセスします。
下記の通りdjangoのスタートページが表示されれば成功です。
django_success.png

これで環境構築は完了です。
あとはブレークポイントをコード上に置いて止めたり、ステップ実行したり、デバッガを使って開発できます。
devug.png

カスタマイズ

環境をカスタマイズしたい場合は下記の箇所を修正するとカスタマイズできます。

・コンテナ側にVSCodeの拡張機能を入れたい

.devcontainer/devcontainer.jsonの"extensions"に、入れたい拡張を追加する。

・djangoのプロジェクトフォルダの名称を変えたい、実行時のオプションを変えたい

.vscode/launch.jsonのconfigrationsを編集する。

参考記事

https://docs.docker.jp/compose/django.html
https://docs.djangoproject.com/ja/3.1/intro/tutorial01/
https://qiita.com/nokonoko_1203/items/33a05c86f359027afb33
https://qiita.com/firedfly/items/00c34018581c6cec9b84

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