20200320のdockerに関する記事は12件です。

よく利用するDocker, Docker-compose コマンド

Docker

Dockerの起動

$ sudo systemctl start docker

Docker hubへのログイン/ログアウト

$ docker login/logout

Docker image一覧

$ docker image ps

REPOSITORYはイメージの名前。

Docker image ダウンロード

$ docker image pull [オプション] [イメージ名:タグ名]
$ docker image pull [URL]
例:
$ docker image pull centos:7

DockerへアップロードしたImageをダウンロードすることも可能。
$ docker pull [dockerhubのユーザ名]/[イメージ名:タグ名]

タグ名を省略されると、最新版がダウンロードされます。-aオプションを指定すると、すべてのイメージがダウンロードされます。

Docker imageの詳細

$ docker image inspect centos:7

イメージID、作成日、Dockerバージョン、CPUアーキテクチャ

Dockerでイメージにタグ名を設定

$ docker image tag [イメージ名] [dockerhubユーザ名]/[コンテナ名]:[バージョン]

イメージの検索

$ docker search --limit 検索キーワード

未使用のdockerイメージの削除

$ docker image prune [オプション]
オプション:
--all, --a 使用していないイメージをすべて削除
--force, --f イメージを強制的に削除する

Docker container一覧

$ docker container ps
$ docker ps -all

Docker container 起動/停止/削除

$ docker container run/start/stop/rm [コンテナ名]
------
runは生成&起動です。
-dオプションをつけると、バックグラウンドで動きます。

コンテナのログの確認

$ docker container logs -t [コンテナ識別子]

コンテナ起動の最も簡単な一例

$ docker container run -it --name "test1" centos /bin/cal
------
docker container runはコンテナを作成、実行
-itはコンソールに結果を出すオプション
--name "test1"はコンテナ名
centosはイメージ名
/bin/cal/はコンテナで実行するコマンド。/bin/bashを入力すると、コンテナ内でシェルを実行することもできます。

Dockerイメージの中に入る

イメージの一覧からログインしたいイメージを確認します。
$ docker images
REPOSITORYカラムに表示されている名称を指定して、以下のコマンドでイメージにログインします。
$ docker run --rm -t -i イメージ名 /bin/bash

container 稼動確認

$ docker container stats コンテナ名

コンテナへ入る

$ sudo docker exec -it [コンテナID] bash

containerの起動/停止

$ docker start/stop コンテナ名

Dockerの実行環境確認
コンテナの数、Dockerのバージョン、ストレージドライバの種類、OSの種類、アーキテクチャ

$ docker system info

Dockerのディスク利用状況(詳細確認-v)

$ docker system df

Docker 応用編

$ docker container run --name webserver -d -p 8080:80 nginx

Dockerイメージnginxを使ってwebserverという名前のDockerコンテナを起動します。その際、ブラウザからHTTP80番ポートでのアクセスを許可するため、-pオプションでコンテナからの転送を許可しています。
ホストの8080ポートにアクセスすると、コンテナ上で動作しているNginx(80番ポート)のサービスにアクセスできます。また、指定したレンジのポート番号を割り当てたいときは、--exposeオプションを使用します。さらに、ホストマシンの任意のポートを割り当てるときは、-Pオプションを使用します。

そのほかに、DNSサーバ、MACアドレスの指定も可能です。

コンテナをtarファイル出力

$ docker container export [コンテナ識別子]
例:
$ docker container export [コンテナ識別子] > [ファイル名.tar]
生成されたtarファイルの中身を確認する。

$ tar -tf [tarファイル名] | more

Docker-compose

Dockerコンテナのシェルの中に入る

$ docker exec -i -t コンテナ名 bash

複数のDockerコンテナの起動/リソース削除/停止/確認

$ docker-compose up/down/stop/ps/logs

Compose定義ファイルのバージョンとDokcer Engineのバージョンにマッピング関係があります。
それぞれに対応するバージョンがあります。

コンテナの生成

$ docker-compose up --build

任意の名前のDockerfileをビルドするときは、[dockerfile]を指定します。その際、DockerfileがあるディレクトリのパスやGitレポジトリのURLをcontextで指定します。

services:
 webserver:
  build:
   context: /data
   dockerfile: Dockerfile-alternate
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PyCharmのProject Interpreterに、リモートRaspbian DockerのPythonを設定する

前回からの続きです。今回はpycharmを介して、リモートdockerコンテナ内でpythonファイルを実行します。少しややこしいのでまとめると以下を行います。

  • ファイルの編集はローカル上で行うが、これをリモート上と同期させる

  • 実行時は、リモートのdockerにあるpythonインタプリタをpycharmに認識させて実行する

  • リモートのdockerはリモート上のファイルを認識して実行する

dockerを使うかdocker composeを使うか以外はこちらと同一です。(PyCharmが直接リモート上のコードを編集できれば良い気がするのですが、なぜかこれはできません。)ややこしくなったので、まとめると以下のようになります。

Raspbian上のdockerの設定

Dockerのサービスにアクセスするには

Dockerはクライアント・サーバモデルのアプリケーションであり、dockerデーモン(サーバ)に対して処理を要求を行うことでdockerを利用することができます。dockerコマンドを通す際などデフォルトではUnixソケットを通して通信を行っていますが、設定を行えばTCPソケットを通して通信を行うこともできます。これを利用するとローカルからリモート上のdockerデーモンに処理を要求することができます。この辺りのdockerの仕組みに関してはこちらのサイトが参考になりました。ちなみに、ローカルのUnixソケットをリモート上のUnixソケットにフォワードすれば、リモートからサーバのdockerを動かすこともできるみたいです。

設定

参考サイトそのままですが、以下を実行することで、remoteのdockerにtcpソケットを通して処理を要求することができます。(本来は、通信を行う際に証明書を利用しないと本番環境では危ないないらしいですが、それはまた別途設定することにしましょう。この辺りはこちらと公式のこちらが詳しいです。)

サーバ上で以下を実行することで、TCPソケットを介してpycharmからdockerを叩けるようになります。

# 設定の修正
$ sudo vim /etc/systemd/system/docker.service.d/startup_options.conf

# 設定への記載内容
$ cat /etc/systemd/system/docker.service.d/startup_options.conf
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H unix:// -H tcp://0.0.0.0:2376

# 読み込み&再起動
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker.service

# 設定の確認
# "/usr/bin/dockerd -H unix:// -H tcp://0.0.0.0:2376"があればOK
$ service docker status
Redirecting to /bin/systemctl status docker.service
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/docker.service.d
           └─docker-bridge-yj.conf, startup_options.conf
   Active: active (running) since Tue 2019-06-18 12:54:47 JST; 4 days ago
     Docs: https://docs.docker.com
 Main PID: 4595 (dockerd)
    Tasks: 26
   Memory: 9.2G
   CGroup: /system.slice/docker.service
           └─4595 /usr/bin/dockerd -H unix:// -H tcp://0.0.0.0:2376

PyCharmのリモートとローカルのファイルの同期

Preference>Build, Execution, Deployment>DeploymentのConnectionタブから同期の設定を行います。

Host: Raspberry piのIPアドレス、User name: raspbianのユーザ名、Passwordにユーザのパスワードを入力します。Root pathはRaspberry Piのどこを"ルート"として認識させるかを設定します。(つまりこれはRaspberry Piのルートパス/とは一致している必要はありません。)
Web server URLにはhttps://[Raspberry PiのIPアドレス]と入力します。

スクリーンショット 2019-12-21 1.11.05.png

続いて、Mappingタブからの設定も行います。
こちらのLocal path: で同期したいローカルフォルダを設定します。また、Deployment pathで先ほど設定したRoot pathからの相対パスとして、同期したいパスを指定します。

スクリーンショット 2019-12-21 1.11.58.png

Tools>Deployment>OptionsからUpload changed files automatically to default serverにチェックをつけておけば、ファイルを書き換えると同時に、勝手に同期を行ってくれて便利です。

スクリーンショット 2019-12-21 2.22.07.png

Docker-composeを利用したPythonインタプリタの設定

公式はこちら

Dockerの設定

Preference>Build, Execution, Deployment>Deployment>DockerでリモートのDockerを追加します。TCPソケットは、tcp://[IPアドレス]:[先ほど設定した番号]です。

スクリーンショット 2019-12-21 2.07.00.png

Preference>Project>Project Interpreterから歯車のマークをクリックし、Project Interpreterを追加します。Serverで先ほど設定したDockerを選択します。また、Configuration file(s)には自分で作成したdocker-compose.ymlを設定します。

スクリーンショット 2019-12-21 2.06.40.png

以上でpycharm上からRUNをすると、dockerコンテナ内のpythonインタプリタがうごくはずです。

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

PyCharmを介して、リモートRaspbian上のDockerコンテナ内でPythonファイルを実行する

前回からの続きです。今回はpycharmを介して、リモートdockerコンテナ内でpythonファイルを実行します。少しややこしいのでまとめると以下を行います。

  • ファイルの編集はローカル上で行うが、これをリモート上と同期させる

  • 実行時は、リモートのdockerにあるpythonインタプリタをpycharmに認識させて実行する

  • リモートのdockerはリモート上のファイルを認識して実行する

dockerを使うかdocker composeを使うか以外はこちらと同一です。pycharmが直接リモート上のコードを編集できれば良い気がするのですが、なぜかこれはできません。

Raspbian上のDockerの設定

Dockerのサービスにアクセスするには

Dockerはクライアント・サーバモデルのアプリケーションであり、dockerデーモン(サーバ)に対して処理を要求を行うことでdockerを利用することができます。dockerコマンドを通す際などデフォルトではUnixソケットを通して通信を行っていますが、設定を行えばTCPソケットを通して通信を行うこともできます。これを利用するとローカルからリモート上のdockerデーモンに処理を要求することができます。この辺りのdockerの仕組みに関してはこちらのサイトが参考になりました。ちなみに、ローカルのUnixソケットをリモート上のUnixソケットにフォワードすることでも、リモートからサーバのdockerを動かすこともできるみたいです。

設定

参考サイトそのままですが、以下を実行することで、remoteのdockerにtcpソケットを通して処理を要求することができます。(本来は、通信を行う際に証明書を利用しないと本番環境では危ないないらしいですが、それはまた別途設定することにしましょう。この辺りはこちらと公式のこちらが詳しいです。)

サーバ上で以下を実行することで、TCPソケットを介してpycharmからdockerを叩けるようになります。

# 設定の修正
$ sudo vim /etc/systemd/system/docker.service.d/startup_options.conf

# 設定への記載内容
$ cat /etc/systemd/system/docker.service.d/startup_options.conf
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H unix:// -H tcp://0.0.0.0:2376

# 読み込み&再起動
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker.service

# 設定の確認
# "/usr/bin/dockerd -H unix:// -H tcp://0.0.0.0:2376"があればOK
$ service docker status
Redirecting to /bin/systemctl status docker.service
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/docker.service.d
           └─docker-bridge-yj.conf, startup_options.conf
   Active: active (running) since Tue 2019-06-18 12:54:47 JST; 4 days ago
     Docs: https://docs.docker.com
 Main PID: 4595 (dockerd)
    Tasks: 26
   Memory: 9.2G
   CGroup: /system.slice/docker.service
           └─4595 /usr/bin/dockerd -H unix:// -H tcp://0.0.0.0:2376

PyCharmのリモートとローカルのファイルの同期

Preference>Build, Execution, Deployment>DeploymentのConnectionタブから同期の設定を行います。

Host: Raspberry piのIPアドレス、User name: raspbianのユーザ名、Passwordにユーザのパスワードを入力します。Root pathはRaspberry Piのどこを"ルート"として認識させるかを設定します。(つまりこれはRaspberry Piのルートパス/とは一致している必要はありません。)
Web server URLにはhttps://[Raspberry PiのIPアドレス]と入力します。

スクリーンショット 2019-12-21 1.11.05.png

続いて、Mappingタブからの設定も行います。
こちらのLocal path: で同期したいローカルフォルダを設定します。また、Deployment pathで先ほど設定したRoot pathからの相対パスとして、同期したいパスを指定します。

スクリーンショット 2019-12-21 1.11.58.png

Tools>Deployment>OptionsからUpload changed files automatically to default serverにチェックをつけておけば、ファイルを書き換えると同時に、勝手に同期を行ってくれて便利です。

スクリーンショット 2019-12-21 2.22.07.png

Docker-composeを利用したPythonインタプリタの設定

公式はこちら

Dockerの設定

Preference>Build, Execution, Deployment>Deployment>DockerでリモートのDockerを追加します。TCPソケットは、tcp://[IPアドレス]:[先ほど設定した番号]です。

スクリーンショット 2019-12-21 2.07.00.png

Preference>Project>Project Interpreterから歯車のマークをクリックし、Project Interpreterを追加します。Serverで先ほど設定したDockerを選択します。また、Configuration file(s)には自分で作成したdocker-compose.ymlを設定します。

スクリーンショット 2019-12-21 2.06.40.png

以上でpycharm上からRUNをすると、dockerコンテナ内のpythonインタプリタがうごくはずです。

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

[Docker]CMDとENTORYPOINTの挙動の違い

はじめに

Docker初心者です。自分用に記載。
今回、Dockerfileに記述する命令、CMDENTRYPOINTに関する記事を投稿してみました。

Dockerとは

Dockerはコンテナ仮想化を用いてアプリケーションを開発・配置・実行するためのオープンソースソフトウェアあるいはオープンプラットフォームである。

Dockerはコンテナ仮想化を用いたOSレベルの仮想化によりアプリケーションを開発・実行環境から隔離し、アプリケーションの素早い提供を可能にする。かつその環境自体をアプリケーションと同じようにコード(イメージ)として管理可能にする。Dockerを開発・テスト・デプロイに用いることで「コードを書く」と「コードが製品として実行される」間の時間的ギャップを大きく短縮できる。
(Wikipediaより)

つまりdockerを使うメリットは、

  • 起動・実行にかかる処理の負荷(オーバヘッド)が少ないため、高速
  • 環境をコード化(イメージ化)することで、そのコードをもとに誰でも同じ環境を作ることができる。
  • 環境の設定を変更したとき、再構築の時間が短くて済む。また、システムの廃棄も容易。

Dockerfileとは

Dockerイメージを作るやつ。

わからなかったこと

CMDENTRYPOINTもどちらもコンテナ起動時に実行するコマンドなのははわかったが、
docker run実行時に、どう挙動が違うのか?

CMDとENTRYPOINTの挙動の違い

これらの記事を参考にしました。
http://docs.docker.jp/engine/reference/builder.html#cmd-entrypoint
https://gist.github.com/goldeneggg/e2b2d7ca9ea2e649df5f

docker run の際、コマンド引数指定ありの時に挙動の違いがありました。
また、ENTORYPOINTのみ、シェルを介す書き方と、介さない書き方にも違いがあることもわかりました。

CMD ls(シェルを介す) CMD ls -l(オプションあり) CMD ["ls", "-l"](シェルを介さない) ENTRYPOINT ls(シェルを介す) ENTRYPOINT ls -l(オプションあり) ENTRYPOINT ["ls", "-l"](シェルを介さない)
docker run の際、コマンド引数指定なし CMDで指定したコマンドを実行するだけ CMDで指定したコマンドを実行するだけ CMDで指定したコマンドを実行するだけ ENTRYPOINTで指定したコマンドを実行するだけ ENTRYPOINTで指定したコマンドを実行するだけ ENTRYPOINTで指定したコマンドを実行するだけ
docker run の際、コマンド引数指定あり 引数で指定したコマンドが実行される 引数で指定したコマンド(とオプション)が実行される 引数で指定したコマンド(とオプション)が実行される ENTRYPOINTで指定したコマンドがそのまま実行される ENTRYPOINTで指定したコマンドがそのまま実行される エラーになる (引数で指定したコマンドがオプション扱いになるため)

CMDの場合

  • 上の表を見てわかる通り、シェルを介す場合でも介さない場合でもdocker runの際、コマンド引数を指定してあると、CMDで書いたものは無視されます。(公式で言うと、上書きされます。)

ENTRYPOINTの場合

  • シェルを介す場合
    • docker runの際、コマンド引数を指定してあげても、Dockerfileに書いたENTRYPOINTで指定したコマンドがそのまま実行されます。引数の方は無視されます。
  • シェルを介さない場合
    • docker runの際、コマンド引数を指定してあげてしまうと、エラーになります。これがちょっとややこしい。実際例を見てもらったほうが分かりやすいと思います。
Dockerfile
FROM centos
MAINTAINER hoge

ENTRYPOINT ["ls", "-l"]
% docker run --rm IMAGE_ID ls -lh
ls: cannot access ls: No such file or directory
:

このように、ENTRYPOINTのparam部分 -lが コマンド引数 ls で上書きされます。
つまり、paramの部分だけ上書きされます。

であれば、docker runの際、lsコマンドの引数としてオプションを指定したらどうなるのでしょうか?
結果

% docker run --rm IMAGE_ID -lh
dr-xr-xr-x  2 root root 4.0K Apr 12 01:10 bin
drwxr-xr-x  4 root root  80K May  2 07:57 dev
drwxr-xr-x 40 root root 4.0K May  2 07:57 etc
drwxr-xr-x  2 root root 4.0K Sep 23  2011 home
:

エラーを吐かず、オプションとして認識されました。

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

docker run コマンドの-iオプションについて調べてみた

docker初学者です。間違えなどありましたら、ご指摘いただければ幸いです。

docker runのiオプションについて少し調べてみたました。

オプションiについて

docker公式では、以下のように書かれている。

-i, --interactive アタッチしていなくても STDIN を開き続ける

STDINは標準入力のことらしい。キーボードからの入力を可能にするとのこと。いつもお世話になっているわかりそうでわからないサイトには以下のように記載されていました。

キーボードからの入力だよ
「特に指定をしていないときは、ここから入力されたデータが来るはず!」なデータの通り道だよ
https://wa3.i-3-i.info/word11636.html

つまり、アタッチしなくても標準入力を開き続けるということだと思うが、よくわからないので実際にコマンドを打ってみました。!!

ubuntuイメージを使用して挙動を調べる

オプションありとなしのパターンで挙動を調べてみた!コンテナを起動してコンテナに入り、入力したコマンドが実行されるかを確認する。

①まずdocker runで-iありで起動して挙動を確認

MacBook-Pro:~ $  docker run -it -d --name test ubuntu /bin/bash
d43a339cc5ca000850c680ddfe75721321d58f8ff45145bb504f4be95c3854f234
MacBook-Pro:~ $ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
d43a339cc5ca        ubuntu              "/bin/bash"         4 seconds ago       Up 3 seconds                            test

STATUSの項目がUp 3 secondsになっていることから、上手くubuntuイメージの起動している。次にアタッチしてコンテナ内に入ってみる。

※コマンドについて
docker attach <image-name> : このコマンドを実行することでコンテナ内に入ることができる。コンテナ内ですでに実行しているシェルを使ってコンテナとのやりとりをする。また、コンテナから抜ける時は、exitまたはCtl+p からのCtl+qを実行する。
exitの場合は、コンテナから抜けるとともに、コンテナが停止してしまう。
Ctl+p からのCtl+qの場合は、コンテナから抜けるだけで、コンテナを停止することはない。
今回はexitを使用してコンテナから抜けることにする。

MacBook-Pro:~ $ docker attach test
root@d43a339cc5ca:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@d43a339cc5ca:/# exit
MacBook-Pro:~ $  docker ps -a
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS                     PORTS               NAMES
d43a339cc5ca        ubuntu                "/bin/bash"              26 seconds ago      Exited (0) 7 seconds ago                       test

lsコマンドが実行されコンテナ内の情報が出力された。
exitを実行したため、コンテナ自体も停止しているのがわかる。

②次に-iなしで起動してみる。

先ほどのコンテナは削除して、-iオプションなしで起動してみる。

MacBook-Pro:~ $ docker run -t -d --name test ubuntu /bin/bash
40b1356e365135c8c1df8514e64239156de4216927dec2bfdd0571972d11147d
MacBook-Pro:~ $ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
40b1356e3651        ubuntu              "/bin/bash"         9 seconds ago       Up 8 seconds                            test

問題なく起動している。次にattachして、コンテナ内で「ls」コマンドを入力して出力が返ってくるかを確認。

MacBook-Pro:~ $ docker attach test
root@40b1356e3651:/# ls

何も反応が返ってこない。
標準入力(キーバードからの入力情報など)ができない状態のため、出力はされていない。
コンテナから出る。

root@40b1356e3651:/# exit
MacBook-Pro:~ $ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
40b1356e3651        ubuntu              "/bin/bash"         3 minutes ago       Up 3 minutes                            test

exitで抜けたのに、コンテナが停止していない。。
STATUSの項目がUp 3 minutesとなっている。。
attachコマンドでコンテナ内に入った場合、exitコマンドを入力するとコンテナから抜けるかつコンテナが停止してしまうのだが、今回のケースではコンテナが起動したままであった。。

これは、-iオプションを付けない場合、標準入力ができないため、ubuntuイメージから起動したコンテナに対しては、exitコマンドを実行した情報すら伝わらないため、コンテナが終了せず起動しっぱなしのままであるのだと思う。

結論

以上-iオプションを付けずにコンテナを起動してしまうと、コマンドなどの入力情報がコンテナまで伝わらないということがわかった。(公式ドキュメント通りの挙動を確認できた!)

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

Docker DesktopをWindows 10 HomeにインストールしてWSLからdockerコマンドを実行する。

結論

インストール・起動は問題ないですが、WSL2からdockerコマンドが使えない場合は、
現状は以下の設定を ~/.bashrc などの設定ファイルに追記しておきましょう。

~/.bashrc
alias docker='docker.exe'
alias docker-compose='docker-compose.exe'

前提

  • Windows 10 Home
  • WSL2 Ubuntu (他のDistroでもおそらく同じ)

WSL2環境のセットアップ

WSL2環境の準備については、以下の記事を参考にすると良いと思います。

Docker Desktop をインストール

2020/03/20 の時点ではWSL2自体が正式版ではないので、Docker DesktopもStableではなくEdgeチャンネルを使うことになります。
(2020/05頃にはおそらくWSL2もDocker Desktopも正式版が来るはず!)

以下の記事にEdgeチャンネルのDocker Desktopのダウンロードリンクが貼られているので、そちらからダウンロードします。

(Docker Desktop Edge 2.2.2.0) となっているところです。

以下の公式のDocker Desktop for Windowsの提供ページから Edgeチャンネルのものをダウンロードしても大丈夫です。

インストール作業は、特になにか設定等は必要なく、デフォルトのままインストールすれば問題なく入りました。

WSLからdockerコマンドを実行する

そのままインストールしただけだと、WSL2 から docker とコマンドを打ってもダメでした。

image.png

docker.exe はWindows側にインストールされていて、コマンドプロンプトやPowerShellから問題なく動きます。

image.png

それをWSL2からも実行したらどうなるか試してみました。

image.png

うん。動きます。

試しにnginxを起動してみましょう。

docker.exe run --rm -p 80:80 nginx

Windows セキュリティの重要な警告 ダイアログが表示されるので、アクセスを許可する を選択します。

この状態で docker ps を実行してみましょう。

WSL2側からも、Windows側からも、どちらも同じDocker Daemonに繋ぎにいっていることがわかります。

image.png

image.png

nginx はWindows側で起動しているので、ブラウザで http://localhost:80 にアクセスするとDockerで起動したnginxコンテナに繋がります。

image.png

WSL2からもlocalhostでWindows側にアクセス可能なので、問題なくnginxコンテナに繋がります。
image.png

エイリアスの設定

Windows 10 HomeにDocker Desktopをインストールして、WSL2からdockerを使用するのが問題なさそうだとわかりましたが、docker.exe とするのは面倒なので、エイリアスを設定しておきます。

~/.bashrc
alias docker='docker.exe'
alias docker-compose='docker-compose.exe'

これで他の環境やコマンドのサンプル通りに docker だけでコマンドが使えるようになります。
また、docker-compose についても、 docker-comopose.exe でインストールされているので、こちらにもエイリアスを設定しておきました。

image.png

補足

試したWindowsの環境は、次のようなコマンドで一度dockerを導入したことがあるので、もしかしたらそれがWSL2側にdockerコマンドがすんなり入らない原因かもしれません。
インストール済みの場合は apt remove で除去しておきましょう。

sudo apt install docker-ce docker-ce-cli containerd.io docker-compose
 -y
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Docker][apache][CakePHP]The requested URL was not found on this server.

はじめに

結構あやふやな回答ですが、あまりパッと見つからないので書いてみました。かなりメモ的な感じです

現在の環境ざっくり:blush:気が向いたらもう少しちゃんと調べて書きます。
Docker
apache
CakePHP
でやってます。

❗️対象
❗️ちなみに一回はパス表示までできている方対象です。
❗️その他ルートは表示できている方対象です。
❗️apacheファイルの設定などは既に終わっている方。

上記エラー解決

※rewriteはapacheでcakePHP使うなら必須モジュールをです。
参考:https://book.cakephp.org/4/ja/installation.html

mod_rewriteと言うものがないとリライトが機能しないので、、、

・Dockerapacheコンテナに入って、確かルート部分で

$ a2enmod rewrite
$ service apache2 restart

:sweat:この記述普通はDockerfileに書く感じかな、、、

・Dockerのコンテナから出て以下コマンドうつ←ここポイントな気がしています、、

$ docker-compose up --build -d
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel+Mysql+Vue.jsの開発環境をDockerで構築

はじめに

Laravel+Mysql+Vue.jsでSPAのWebアプリケーション作成の勉強をしたくて、Dockerで開発環境構築をしました。
開発の常で、開発環境構築に苦戦したので備忘録を兼ねて構築手順を記述します。
記載内容に誤り等ございましたら、ご指摘をよろしくお願いいたします。

開発環境

$ docker --version
Docker version 19.03.8, build afacb8b

$ docker-compose --version
docker-compose version 1.25.4, build 8d51620a

$ php artisan --version
Laravel Framework 7.2.0

$ mysql --version
mysql  Ver 14.14 Distrib 5.7.29, for Linux (x86_64) using  EditLine wrapper

$ npm list vue
`-- vue@2.6.11 

参考

ディレクトリ構成

project
├ docker-compose.yml
├ docker
│  ├ php
│  │  ├ php.ini
│  │  └ Dockerfile
│  └ nginx
│    └ default.conf
└ server

手順

1. ファイルを準備

以下のファイルを作成します。

  • Dockerfile
  • docker-compose.yml
  • php.ini
  • default.conf
project/docker/php/Dockerfile
FROM php:7.4.1-fpm
COPY php.ini /usr/local/etc/php/

RUN apt-get update \
  && apt-get install -y zlib1g-dev libzip-dev zip mariadb-client-10.3 libpng-dev libjpeg-dev curl wget \
  && docker-php-ext-install zip pdo_mysql

# nodejs install
RUN curl -sL https://deb.nodesource.com/setup_12.x | bash -
RUN apt-get install -y nodejs

# Composer install
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php -r "if (hash_file('SHA384', 'composer-setup.php') === '$(wget -q -O - https://composer.github.io/installer.sig)') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
RUN php composer-setup.php
RUN php -r "unlink('composer-setup.php');"
RUN mv composer.phar /usr/local/bin/composer

ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /composer
ENV PATH $PATH:/composer/vendor/bin
WORKDIR /var/www
RUN composer global require "laravel/installer"

mysql-clientのパッケージは削除されているので注意。

project/dockerfile-compose.yml
version: '3'
services:
  php:
    container_name: php
    build: ./docker/php
    volumes:
      - ./server:/var/www
    depends_on:
      - db
  nginx:
    image: nginx
    container_name: nginx
    ports:
      - 80:80
    volumes:
      - ./server:/var/www
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php
  db:
    image: mysql:5.7
    restart: always
    container_name: db-host
    environment:
      MYSQL_ROOT_PASSWORD: yourpassword
      MYSQL_DATABASE: phpapp_db
      TZ: 'Asia/Tokyo'
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
    volumes:
      - ./docker/db/data:/var/lib/mysql
      - ./docker/db/my.conf:/etc/mysql/conf.d/my.cnf
      - ./docker/db/sql:/docker-entrypoint-initdb.d
    ports:
      - 3306:3306
project/docker/php/php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
project/docker/nginx/default.conf
server {
  listen 80;
    index index.php index.html;
    root /var/www/public;

  location / {
    root /var/www/public;
    index  index.html index.php;
    }

  location ~ \.php$ {

    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass php:9000;
    fastcgi_index index.php;
    include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_param PATH_INFO $fastcgi_path_info;
  }
 }

2. dockerコンテナを立ち上げる

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

3. phpコンテナに入ってlaravelプロジェクトを作成する

$ docker-compose exec php bash
$ laravel new

4. dockerコンテナを一旦停止する

$ docker-compose down

5. .envファイルを編集する

以下のように無いパラメーターは追加し、すでに記述されているパラメーターは修正する。

project/server/.env
DB_CONNECTION=mysql
DB_HOST=db-host
DB_PORT=3306
DB_DATABASE=phpapp_db
DB_USERNAME=root
DB_PASSWORD=yourpassword

6. コンテナを立ち上げる

$ docker-compose up -d

7. ローカルホストにつながることを確認する

ブラウザから以下のURLにアクセスして正常に接続できることを確認する。

正常に接続できれば以下のような画面が表示される。

Built_laravel_environment_1

8. migrateが実行できることを確認する

phpコンテナに入ってmigrateを実行する。

$ docker-compose exec php bash
$ php artisan migrate

migrateが失敗する場合は以下の記事等を参考にして頂くと良いと思います。

9. Vue.jsの導入

npmでvueのパッケージをインストール。

$ npm install
$ npm install -D vue

vueのパッケージがインストールできていることを確認。

$ docker-compose exec php bash
$ npm list vue

開発環境構築は以上です。

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

DB Containerに大容量のデータをインポートしたい場合は、コンテナに入ってから実行する

はじめに

WSL2で、ホストからMysql コンテナに3GBのデータをインポートしようとした際、詰まったので共有します

結論

//dumpファイルをMysqlコンテナにコピー
docker cp [import file name] [container id]:[container file path]

//Mysqlコマンドでログイン
mysql -u [user name] -p [db name]

//Sourceコマンドでインポート
source [container file path]

詳細

最初、コンテナの外からインポート実行しましたが、コマンド実行中のまま止まってました。

docker exec -i mysql -u [user name] -p [db name] > [import file path]

処理を止めてDBを見にいっても、何も書かれていないので動いていないと判断。

インポートファイルのサイズが大きい場合、Mysqlの中に入って実行しない駄目っぽい記事を見つけ、解消。

おわりに

再度Importファイルを指定しようとしたら、サイズが0になってたので、以後コピーしてから実施しよう。。
Exportしなおすのに時間を浪費してしまった。

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

Macの初期化→リストアを良い感じにする

BrewfileMackupDockerDropboxを使って良い感じにリストアできる環境を作ったので、まとめます。

以下の記事をめちゃくちゃ参考にしました。
macOSでの開発環境を全部Docker化したらリストア時間が1時間半になった

使用する主なツール

  • Brewfile
    • 必要なアプリをファイルに列挙して、コマンド一発で全部インストールできる。コマンドラインで使うツール、インストーラーを使ってインストールするアプリ、AppStoreからインストールするアプリ、全てコマンド1つ。最高。(Brewfileを使う
  • Mackup
  • Dropbox
    • 重要なファイルやBrewfile、Mackupで抽出した設定ファイルを保存。ソースコードもここで保存する(当初はGitHubだけで良いと考えたけど、Git管理対象外のファイルを復元するのが予想以上に大変だった)
  • GoogleDrive
    • クラウド上のゴミ箱として。必要ないけど削除するのは嫌なファイルを保存
  • Docker
    • 開発環境をDockerで作り、ローカルの言語やツールに依存しない状態を保つ
  • Bitwarden
    • パスワードマネージャー

初期化(Total 1h)

バックアップ

  • 大切なファイルをDropboxに
  • 大切ではないけど消すのは嫌なファイルをGoogleDriveに
  • アプリの設定ファイルをMackupでバックアップ
  • 開発環境を全部Dockerで作っておく
    • ローカルに入ってる言語とかを使わない
  • DBの接続情報(特にパスワード)をBitwardenにメモ
  • 個別のバックアップ機能を持っているアプリの対応
    • Biscuitの設定をエクスポートしてDropboxに保存
    • Transmitの接続情報をエクスポートしてDropboxに保存。パスワードはBitwardenのメモで管理。

最新のOSにアップデート(30m)

念のため先にアップデート。
データ消去の後に何かのコマンドを押してると勝手に最新OSが入るみたいですが、押し忘れたりしたらしんどいので。

「りんごマーク」>「このMacについて」>「ソフトウェア・アップデート」

リカバリーモードでmacを起動

シャットダウン → コマンド + Rを押しながら起動

データを完全削除

「macOSユーティリティ」→「ディスクユーティリティ」→「内蔵」→「Macintosh HD – Data」→「ボリューム>マイナスマーク」→「Macintosh HD」→「削除」

[完全版]macOS Catalinaをクリーンインストールする方法

OSを再インストール(25m)

「macOSユーティリティ」→「macOSを再インストール」

リストア(Total 1.5h)

システム設定を変える

システム環境をいじくって、トラックパッドやキーボードなどの設定を自分好みに変更します。
Macのシステム設定まとめ

Bitwardenをインストール

AppStoreから。パスワードがわからないと何も始まらないので

Chromeをインストール

グッバイSafari。Googleアカウントにログイン→同期して、ブックマークや拡張機能を復活させましょう。

Dropboxをインストール

これでいろいろと復元できます。
インストールしたらすぐに環境設定を開き、
- Brewfile
- Mackupディレクトリ

以外を同期しないようにします。その他のディレクトリは一通り設定が終わったあとで一気に同期しましょう。

Homebrewをインストール

$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Finderのサイドバーに表示する項目を整理する

  • Dropbox
  • ダウンロード
  • ホームディレクトリ
  • スクリーンショット
  • iCloud Drive
  • Macintosh HD

あたりを表示

その他アプリを一括でインストール

$ cd ~/Dropbox
$ brew bundle

Brewfile
cask_args appdir: "/Applications"
brew 'git'
tap 'heroku/brew'
brew 'heroku'
brew 'jpegoptim'
brew 'mackup'
brew 'mas'
brew 'pngquant'
brew 'rmtrash'

cask 'adobe-creative-cloud'
cask 'alfred'
cask 'biscuit'
cask 'docker'
cask 'tableplus'
cask 'transmit'
cask 'visual-studio-code'

# cask 'dropbox'
# cask 'google-chrome'
# cask 'karabiner-elements'

mas 'Kindle', id: 405399194
mas 'LINE', id: 539883307
mas 'Magnet', id: 441258766
mas 'Quick Stopwatch', id: 976930151
mas 'Todoist', id: 585829637

# mas 'Bitwarden', id: 1352778147

Dropboxに保存してあるBrewfileを元に必要なアプリを全て揃えます。

設定ファイルを復元

$ cd ~/Dropbox
$ mackup restore

これでほぼ全てのアプリの設定が復元されます。.vimrcとか.zshrcとかも。
vscodeの拡張機能はデフォルトではサポートされていませんが、独自に定義して管理できるようにしています。

設定(クリックで表示)
~/.mackup/vsex.cfg
[application]
name = vsex

[configuration_files]
.vscode/extensions

Dockを整理

  • 不要なアプリを削除
  • 必要なアプリを追加
  • アイコンのサイズを小さめに
  • 「Dock環境設定」>「Dockを自動的に表示/非表示」

Dropboxの残りのファイルを同期

このあたりで、先ほど行った同期するディレクトリを制限する設定を解除しちゃいましょう。

各種アプリの動作確認

アプリがちゃんと動くか確かめます。
Mackupで設定を管理できないアプリもあるので、その場合は個別に設定をしましょう。

Adobe Creative Cloud

起動→ログインして
イラレとXDをインストール

Alfred

  • Ctrlのダブルタップで起動できるように
  • 検索バーの帽子マークを非表示(appearances>options>how he looks)
  • 検索バーのショートカットを非表示(appearances>options>how he looks)
  • メニューバーの帽子マークを非表示(appearances>options>how he looks)
  • 出現場所をやや下に(appearance>options>図から変更)
  • 起動時に入力モードを半角英数にする(appearances>options>Focusing>Compatibility mode →advanced > force key board > romaji)
  • クリップボードの履歴を記録(features>clipbord history>keep plain text)

最初は同期の機能を使おうと思いましたが、うまく連携ができなくてやめました。大した設定していないので、手動でやります。

Biscuit

最初にエクスポートしておいた設定ファイルをインポート。
あと、アイコンが好きじゃないので自分が持っているicns形式の画像に変更。
「Application」>「Biscuit」>「右クリック」>「情報をみる」>「アイコンをドラッグ&ドロップ」

Docker for Mac

システムに実行の許可を出す。

GoogleChrome

常に表示する必要の無い拡張機能を隠す。Bitwardenをダークテーマに。

LINE

ログイン

Magnet

アクセシビリティ周りの設定。ログイン時に起動する設定。

TablePlus

接続先のパスワードはMackupで管理されていないよう。手動でパスワードを再入力する必要あり。

Todoist

Googleアカウントでログイン

Transmit

Mackupでは接続先の情報を管理できない。予め書き出して置いた移行用のファイルを実行。
また、こちらもパスワードは引き継がれないのでメモから復元

VScode

サイドバーからデバッグのマークを消す&並び替え

よく使うサイトにログイン

  • Amazon
  • GitHub
  • Pocket
  • Qiita
  • Twitter
  • はてな

開発環境のコンテナを作成

各プロジェクトのルートディレクトリに移動し

$ docker-compose build
$ docker-compose up -d
RubyonRailsの場合
$ docker-compose exec <サービス名> /bin/bash
$ rails db:create
$ rails db:migrate
$ rails db:seed

Railsアプリをcloneした後にDocker上で動かすまで

日常的に気を付けること

  • アプリのインストールはBrewfileを使う
  • アプリを追加した時には、そのアプリの設定の管理方法を考える(Mackupで管理できないなら個別にバックアップ)
  • 大切なファイルはDropboxで管理
  • DBの接続先が増えた時、Bitwardenに記録
  • FTPの接続先が増えた時、TransmitのバックアップをDropboxに保存+パスワードをBitwardenにメモ
  • Biscuitで管理するアプリが増えたら、設定をエクスポートしてDropboxに保存

このあたりを意識していれば、いつPCがぶっ壊れても(データ的には)割と大丈夫。
そんなに大変じゃないはず。

注意点、ハマったところ

Mack up、すごく便利なのですが、最初は何がバックアップできていて何ができていないかがよくわからず苦労しました。
vscodeの拡張機能、preztoのプログラム本体、FTPやDBのパスワードなどはデフォルトではバックアップされません。
自分で設定をカスタマイズすることで、パスワード以外はバックアップすることができました。

めんどくさがらずに公式の公式のドキュメントを読むとかなり理解が進みます。
英語ですがすごくわかりやすく説明されているので、ぜひ読んでみてください。

あと、スピードを追求する場合はDiskMaker Xとかで起動ディスクを作るともっと時間を短縮できるみたいです。

感想

BrewfileMack upがやばい。またDockerのありがたみも強く実感しました。
この環境を2018年に完成させていた@saboyutaka さんはまじでイケてると思う。

参考

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

Docker のチートシート

Docker Desktop 2.2.0.4
Windows 10 Professional

以前にいちど Docker の知識をゲットしたはずなのに、きれいサッパリ忘れた。自分の脳は信用できないので、あらためてチートシートを作り Qiita で永続化することにした。

Docker 基礎コマンド

docker images イメージ一覧
docker ps 起動中のコンテナの一覧
docekr ps -a すべてのコンテナの一覧

docker rmi ImageName イメージの消去
docker rm ID/ContainerName コンテナの削除

docker pull ImageName イメージのダウンロード

docker run ImageName イメージからコンテナを生成し実行
docker stop ID/ContainerName コンテナの停止

Docker 実用コマンド

docker run -it ImageName /bin/bash
   対話形式からの抜け方
    Ctrl P Q   起動中のコンテナからログアウト
    exit     起動中のコンテナの停止

docker stop $(docker ps -a -q) コンテナ一括停止
docker rm -f $(docker ps -a -q) コンテナ一括消去
docker rmi $(docker images -q) イメージ一括消去

docker exec ContainerName Command 外からコンテナでコマンド実行

docker-compose 基礎コマンド

docker-compose up コンテナを起動する
docker-compose run COMMAND コンテナ内部でコマンドを実行する

AWSにインストール

Docker インストール

sudo yum update
sudo yum install -y docker

docker info

起動

sudo service docker start

sudo がなくてもいいようにする

sudo usermod -a -G docker ec2-user

docker-compose インストール

sudo curl -L https://github.com/docker/compose/releases/download/1.21.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose

パーミッション変更

sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version

おわり

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

Docker + django + Nginx + MySQL を理解する

Windows 10 Professional
Docker Desktop 2.2.0.4
docker-commpose 1.25.4 ※

Django + Nginx + MySql で開発環境を作るための情報。Qiita 内に優れた記事があり、その通りやれば動くのだが、何をやっているのかよく分からなかったので調べた。

参考サイト
https://qiita.com/kenkono/items/6221ad12670d1ae8b1dd

※ Docker Desktop for Windows をインストールしたら、同時に docker-compose もインストールされている。

まず Windows 側での作業ディレクトリの準備

概要

c:\Local 以下にこういうディレクトリ構造を作成。名前は django とした。

c:\Local
django
├── docker-compose.yml
├── mysql
├── sql
├── nginx
│   ├── conf
│   │   └── app_nginx.conf
│   └── uwsgi_params
└── python
    ├── Dockerfile
    └── requirements.txt
ディレクトリ名 内容 格納するファイル
django 作業用フォルダ docker-compose.ymlを格納
django\mysql MySQL データ 初期は空
django\nginx Nginx 設定用ファイル uwsgi_params を格納 綴りに注意
django\nginx\conf Nginx 設定用ファイル app_nginx.conf を格納
django\nginx\log Nginx ログ 初期は空 自分で追加
django\python dockerfile と requirements.txt を格納
django\sql MySQL 初期化ファイル init.sql
django\src django のソース 初期は空
django\static Web の静的ページ用 あとで入れる

準備するファイル

uwsgi_params

wsgi(Web Server Gateway Interface)は、Python で Web サーバーと Web アプリケーションをつなぐインターフェース。古い技術だと CGI にあたるもの。uwsgi_params は Nginx の wsgi 設定用のファイル。特に書き換える必要がないとされていて、ネット上でも「こう書いておけばいいのだ」とスルーされている。

uwsgi_params
uwsgi_param  QUERY_STRING       $query_string;
uwsgi_param  REQUEST_METHOD     $request_method;
uwsgi_param  CONTENT_TYPE       $content_type;
uwsgi_param  CONTENT_LENGTH     $content_length;

uwsgi_param  REQUEST_URI        $request_uri;
uwsgi_param  PATH_INFO          $document_uri;
uwsgi_param  DOCUMENT_ROOT      $document_root;
uwsgi_param  SERVER_PROTOCOL    $server_protocol;
uwsgi_param  REQUEST_SCHEME     $scheme;
uwsgi_param  HTTPS              $https if_not_empty;

uwsgi_param  REMOTE_ADDR        $remote_addr;
uwsgi_param  REMOTE_PORT        $remote_port;
uwsgi_param  SERVER_PORT        $server_port;
uwsgi_param  SERVER_NAME        $server_name;

app_nginx.conf

Nginx のメインの設定ファイル。要変更点は特になし。
upstream で、django のサーバーを指定する。サーバーはドメイン名か IP アドレスとオプションでポートを指定する。/static には静的コンテンツを入れるが、url を変える場合は /web という部分を書きかえる。location 以降の記述によって、nginx にアクセスのあった static を除くすべての情報が Django 側へ行く。server_tokens off; はエラーページに nginx のバージョンを非表示にする。

app_nginx.conf
upstream django {
    ip_hash;
    server python:8001;
}

server {
    listen      8000;
    server_name 127.0.0.1;
    charset     utf-8;

    location /web {
        alias /static;
    }

    location / {
        uwsgi_pass  django;
        include     /etc/nginx/uwsgi_params;
    }
}

server_tokens off;

init.sql

要変更点はデータベース名
docker の MySQL image は /docker-entrypoint-initdb.d/ にあるスクリプトで、最初に image を起動したときの初期化が行える。後に django を実行する際に DB 作成を許可するデータベース名は必要に応じ変更。

init.sql
GRANT ALL PRIVILEGES ON test_todoList.* TO 'user'@'%';

FLUSH PRIVILEGES;

requirements.txt

要変更点はバージョン指定。バージョンを省略すると最新版が入るが、バージョン合わせは結構大変なので、そのまま使っておく。このバージョンは 2019/05 頃の最新のもの。
pip で指定のパッケージを指定のバージョンで一括インストールすることができる。

requirements.txt
Django==2.0.4
uwsgi==2.0.17
PyMySQL==0.8.0

dockerfile

要変更点は、python のバージョン(元は 3.6)。
ENV PYTHONUNBUFFERED 1は、バッファがたまってから出力するのを避ける指定。RUN 命令は既存イメージ上でコマンドを実行し、その結果得られたイメージは Dockerfile の次のステップで使われる。WORKDIR 命令は Dockerfile で次の行の ADD の実行時の作業ディレクトリの指定。もし WORKDIR が存在しなければディレクトリを作成する。

dockerfile
FROM python:3.6
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/

docker-compose.yml

docker-compose の本体の設定ファイル。YAML ファイルのインデントはスペース 2 個単位で行わないと、エラーが出ることに注意。

Nginx 記述部

要変更点は、イメージのバージョン(元は 1.13)、ポート番号(8000)。volume はファイルの配置で、Windowsのパス:コンテナ内のパス。

db 記述部

要変更点は、MySql のバージョン(元は 5.7)、データベース名、ユーザー名、パスワード名、ログ出力先。ボリュームは必要に応じ変更。データは、Windows 側の mysql フォルダと同期して永続化する。command は MySQL の文字コードの設定で、デフォルトの latin1 から utf-8 に変える。

python 記述部

要変更点は django のプロジェクトの名前。
command は uwsgi を使用してポート 8001 を開放。app.wsgi の app は Django のプロジェクト名で、django-admin startproject app の app部分。--py-autoreload 1 は Django アプリ開発の際に、ファイル等に変更があった際は自動リロードする。--logto /tmp/mylog.log はログを残す指定。

docker-compose.yml のファイル全体

正常に立ち上がるまでは、ユーザー名などは下記に記載のままやる方が、トラブルが少なく得策。

docker-compose.yml
version: '3'

services:
  nginx:
      image: nginx:1.13
      ports:
        - "8000:8000"
      volumes:
        - ./nginx/conf:/etc/nginx/conf.d
        - ./nginx/uwsgi_params:/etc/nginx/uwsgi_params
        - ./static:/static
      depends_on:
        - python

  db:
      image: mysql:5.7
      command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
      ports:
        - "3306:3306"
      environment:
        MYSQL_ROOT_PASSWORD: root
        MYSQL_DATABASE: todoList
        MYSQL_USER: user
        MYSQL_PASSWORD: password
        TZ: 'Asia/Tokyo'
      volumes:
        - ./mysql:/var/lib/mysql
        - ./sql:/docker-entrypoint-initdb.d

  python:
      build: ./python
      command: uwsgi --socket :8001 --module app.wsgi --py-autoreload 1 --logto /tmp/mylog.log
      volumes:
        - ./src:/code
        - ./static:/static
      expose:
        - "8001"
      depends_on:
        - db

イメージのダウンロードとコンテナ作成、設定

ここまでの時点で作成した django フォルダのバックアップを取っておくと、このあと各イメージのバージョンが合わないなどの不具合があったときに、やり直しが早く済む。

インストールと docker-compose の実行

まずは django のプロジェクトは置かない状態で下記のように実行し、app という名前の新規プロジェクトを作成する。ダウンロードとインストールが進む間、変なエラーが出ていないかを見続けておく方がいい。

docker-compose run python django-admin.py startproject app .

データベースの切り替え

エラーが出なかったら、次にデータベースをデフォルトの sqlite から MySQL に切り替える。\django\src\app 内の stttings.py に記載を追加する。import os のあとに、以下の行を追加する。(import os は 2 行は要らないので念のため)

settings.py
import os
import pymysql

# connect mysql
pymysql.install_as_MySQLdb()

同ファイルにはデータベースの指定をする記述があるので、それを以下の記述に置き換える。要変更点は、データベース名、名前、ユーザー、パスワード。だが正常に立ち上がるまでは、とりあえずこの設定のまま動かした方が確実。

settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'todoList',
        'USER': 'user',
        'PASSWORD': 'password',
        'HOST': 'db',
        'PORT': '3306',
    }
}

マイグレーション

データベースの変更を django に知らせて反映させる。データベースのバージョンが合わなかったりすると、この時点でエラーが出る。

docker-compose run python ./manage.py makemigrations
docker-compose run python ./manage.py migrate

管理者の設定

django の管理者のユーザー名とパスワードを設定する。ユーザー名はデフォルトで root となっている。まずは捨てパスでいいと思うが、あまりいい加減なパスワード(password など)を入力するとダメと言われる。

docker-compose run python ./manage.py createsuperuser

コンテナの起動

docker-compose up -d

ブラウザで http://localhost:8000 にアクセスして Django のページが見えたら完成。停止は docker stop $(docker ps -a -q)で、起動はdocker-compose up -dで。

作成したソースの反映

新しいアプリを置き django の設定を更新

開発したアプリ(ここでは memo とする)をプロジェクトに入れる。フォルダ memo ごと src 下に置く。

settings.py の INSTALLED_APPS に'memo.apps.MemoConfig'を追加

src\app\settings.py
INSTALLED_APPS = [
    'memo.apps.MemoConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

app\urls.py にfrom django.urls import includeと、 url へのパスpath('memo/', include('memo.urls'))を追加

src\app\urls.py
from django.urls import include

urlpatterns = [
    path('memo/', include('memo.urls')),
    path('admin/', admin.site.urls),
]

変更をマイグレーションして django に認識させる

docker-compose run python ./manage.py makemigrations
docker-compose run python ./manage.py migrate
docker-compose up -d

これでブラウザからhttp://localhost:8000/webで \static に置いた静的な html ファイルが見える。http://localhost:8000/memoで、memo アプリケーションが見える。

おわり

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