- 投稿日:2021-01-17T20:30:19+09:00
Docker-compose + Django + MySQL + Nginx + uwsgi を使った環境の初期設定
概要
- 表題を利用した環境を作る必要があったので、メモします。
- 合わせて日本語化など
環境
- Docker + Docker-compose が利用できること。
- Python3.6
- Django3.1(最新)
手順
ディレクトリの構成
- 下記構成でディレクトリとファイルを作成します。
./WORKDIR |--- docker-compose.yml # Docker-compose本体 |---.gitignore # git対象外用(今回は作るだ、gitを使うときに利用する) |---nginx |---nginx.conf # nginxの設定ファイル |---uwsgi_params # uwsgi用パラメータ |---django |---Dockerfile # Dockerfile |---requirements.txt # pipでインストールするリスト |---.env # django用の環境変数 |---mysql |---.env # mysql用の環境変数 |---sql |---init.sql # DB起動時(初回のみ)に流すスクリプトファイルの作成と編集
docker-compose.yml
docker-compose.ymlversion: '3' services: nginx: image: nginx:1.13 ports: - "8000:8000" volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf - ./nginx/uwsgi_params:/etc/nginx/uwsgi_params - ./static:/static depends_on: - django mysql: image: mysql:5.7 command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci ports: - "3306:3306" env_file: - ./mysql/.env volumes: - ./mysql:/var/lib/mysql - ./sql:/docker-entrypoint-initdb.d django: build: ./django command: uwsgi --socket :8001 --module app.wsgi --py-autoreload 1 --logto /tmp/mylog.log volumes: - ./src:/code - ./static:/static expose: - "8001" env_file: - ./django/.env depends_on: - mysql
.gitignore
mysql/*
django/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/
django/requirements.txt
django/requirements.txtDjango uwsgi PyMySQL
django/.env
django/.envMYSQL_ROOT_PASSWORD=root MYSQL_DATABASE=db MYSQL_USER=bbt-user MYSQL_PASSWORD=password
nginx/nginx.conf
nginx/nginx.confuser nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; upstream django_8001 { ip_hash; server django:8001; } server { listen 8000; server_name 127.0.0.1; charset utf-8; location /static { alias /static; } location / { uwsgi_pass django_8001; include /etc/nginx/uwsgi_params; } } server_tokens off; }
nginx/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;
mysql/.env
mysql/.envMYSQL_ROOT_PASSWORD=root MYSQL_DATABASE=db MYSQL_USER=bbt-user MYSQL_PASSWORD=password TZ='Asia/Tokyo'
sql/init.sql
sql/init.sqlGRANT ALL PRIVILEGES ON db.* TO 'user'@'%'; FLUSH PRIVILEGES;構築
- プロジェクトを作成する。
$ docker-compose run django django-admin.py startproject app .
- 下記が作成される。
./WORKDIR |--- docker-compose.yml |---.gitignore |---nginx |---nginx.conf |---uwsgi_params |---django |---Dockerfile |---requirements.txt |---.env |---src |---app |---__init.py__ # pythonであることの意味(編集しない) |---asgi.py # 利用しない |---settings.py # django本体の設定ファイル |---urls.py # URL処理をする |---wsgi.py # wsgiファイル |---manage.py # 管理用コマンド |---mysql |---.env |--- ~~ # 複数作成されるが編集しないため割愛 |---sql |---init.sql
src/app/settings.py
を編集する#### 追加 import os import pymysql STATIC_ROOT = '/static' pymysql.install_as_MySQLdb() #### 修正 ALLOWED_HOSTS = ['*'] DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': os.environ.get('MYSQL_DATABASE'), 'USER': os.environ.get('MYSQL_USER'), 'PASSWORD': os.environ.get('MYSQL_PASSWORD'), 'HOST': 'mysql', 'PORT': '3306', } } LANGUAGE_CODE = 'ja' TIME_ZONE = 'Asia/Tokyo'
- 起動
$ docker-compose up -d
- DBのマイグレーション
$ docker-compose exec django ./manage.py makemigrations $ docker-compose exec django ./manage.py migrate
- CSSを反映する
$ docker-compose exec django ./manage.py collectstatic確認
- 下記へアクセスできる。
http://<IP>:8000
http://<IP>:8000/admin
参考
- Django+Nginx+MySQLの開発環境をDockerで構築する
- 自分用に修正しただけでほぼお世話になってます。
- 投稿日:2021-01-17T20:13:09+09:00
[Docker+Rails]Railsサーバー起動失敗の対処方法
はじめに
サーバー起動しようと思った時に下記エラーログが出力されます。
A server is already running. Check /app/tmp/pids/server.pid.原因
前回のRailsサーバー起動時に作成された
server.pid
ファイルが残っているのが原因。解決方法
色々サイトで調べてみたところ3つ存在するはず。
①ターミナル再起動
参考:A server is already running 対処方法【Rails】
②server.pidファイルを削除
エラーが発生する度に、
/app/tmp/pids/server.pid
ファイルを削除する。
確実な方法ですが、面倒臭いですね…③サーバー起動時に自動でserver.pidファイルを自動で削除する(推奨)
これが一番、楽な方法だと思います。
docker-compose.yml
ファイルのcommand
部分を次の通り設定する。docker-compose.ymlcommand: bash -c "rm -f tmp/pids/server.pid ; bundle exec rails s -p 3000 -b 0.0.0.0"
- 投稿日:2021-01-17T19:33:54+09:00
Dockerでapache7.4+mysql8環境構築(初期データ入り)
今更ですが、Macで表題の環境を作らなくてはいけなくなったので、構築してみました。
備忘録として書いておきます。環境
マシン macOS Catalina 10.15.7
構成
ファイル、ディレクトリの構成はざっくりと以下のようにします。
任意のディレクトリ │ ├── docker-compose.yml │ ├── html/ │ └── index.html │ ├── mysql/ │ ├── Dockerfile │ ├── data/ │ ├── init/ │ │ └── init.sql │ └── my.cnf │ ├── php-apahce/ ├── Dockerfile └── php.iniこの構築の重要な部分
docker-compose.ymlとDockerfileがこの構築の重要な部分になります。
ファイル名 説明 docker-compose.yml コンテナの構成を定義するもの。コンテナ間通信の定義もできる。 Dockerfile dockerのイメージに対する定義。 docker-compose.ymlの要素
調べて自分が認識している限りだと以下の通り
名称 意味 build Dockerfileがある位置を指定 volumus ローカル内のマウントされる場所:コンテナ内のマウントする場所 ports ポートフォワード container_name コンテナの名前 docker container lsのname environment 環境変数?変数名で何を意味するかがなんとなくわかる Dockerfileの要素
調べて自分が認識している限りだと以下の通り
名称 意味 FROM 何をどのバージョンで EXPOSE どのポートを使用するか ADD ローカルファイルをコンテナ内ファイルに追記 CMD コンテナ起動時に実行されるやつ COPY ローカルファイルをコンテナ内ディレクトリにコピーする RUN イメージ作成時に呼ばれるやつ。なのでパッケージのインストール等を書く。 構築
本編はここからです。
確認
まずコンテナの状態確認
ksk@ksknoMacBook-Pro work % docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES何もいません
./docker-compose.yml
docker-compose.ymlとは、コンテナの構成を定義するファイル
docker-compose.ymlversion: '3' services: php-apache: build: ./php-apache/ volumes: - ./html:/var/www/html ports: - 8080:80 container_name: web mysql: build: ./mysql/ volumes: - "./mysql/data:/var/lib/mysql" - "./mysql/init:/docker-entrypoint-initdb.d" environment: - MYSQL_ROOT_PASSWORD=docker - MYSQL_DATABASE=mydb - MYSQL_USER=appuser - MYSQL_PASSWORD=appuser1 container_name: db ports: - 3306:3306ymlに書いている属性?で、自分が理解していることを以下の表に書いてみる
(間違っているところを指摘してくれる優しい人いたら教えてください)./html/index.php
動作確認するために使用。
とりあえず、DBのデータを表示できれば良しとする。
volumesの定義により、htmlがドキュメントルートとなる。index.php<?php try { $db = sprintf('mysql:host=%s:3306;dbname=%s', 'mysql', 'mydb'); $dbh = new PDO($db, 'appuser', 'appuser1'); foreach($dbh->query('select * from users') as $row) { echo $row['name'] . '<br>'; } $dbh = null; } catch (PDOException $e) { echo $e; die(); } $dbh = null;hostの指定で「'mysql'」としていますが、これはdocker-compose.ymlのservice名と理解しています。
docker-compose.ymlmysql: ←これ!!! build: ./mysql/ volumes:./mysql/Dockerfile
mysql側のDockerfile
DockerfileとはDockerイメージの定義を書くファイルです。FROM mysql:8.0 EXPOSE 3306 ADD ./my.cnf /etc/mysql/conf.d/my.cnf CMD ["mysqld"]./mysql/init/init.sql
適当なテーブルとデータを詰め込むような記述にしておく
use mydb; CREATE TABLE users ( id int(10) unsigned not null auto_increment, name varchar(255) not null, primary key (id) ); insert into users(name) values('hogeo'); insert into users(name) values('fugao');./mysql/my.cnf
my.cnf[mysqld] character-set-server=utf8 default_authentication_plugin=mysql_native_password [mysql] default-character-set=utf8 [client] default-character-set=utf8default_authentication_plugin=mysql_native_passwordについて
mysqlのデフォルト認証プラグインが変わったので、デフォルトの認証プラグインを変更しています。
mysqlの環境変数でユーザ(appuser)作っていますが、mysql_native_passwordという認証プラグインで設定されます。
デフォルトのままだと、phpがmysqlへのアクセスで失敗します。./php-apache/Dockerfile
色んなサイトを見て参考にさせてもらいました。
FROM php:7.4-apache COPY ./php.ini /usr/local/etc/php/ RUN apt-get update RUN apt-get install -y zip unzip vim libpng-dev libpq-dev RUN docker-php-ext-install pdo_mysql./php-apache/php.ini
色んなサイトを見て参考にさせてもらいました。
[Date] date.timezone = "Asia/Tokyo" [mbstring] mbstring.internal_encoding = "UTF-8" mbstring.language = "Japanese"docker-compose build
上記を作った後、docker-compose.ymlと同階層で以下のコマンド実行
ksk@ksknoMacBook-Pro work % docker-compose build 〜〜〜中略〜〜〜 Successfully built e5b1c15e825e Successfully tagged work_php-apache:latest Building mysql Step 1/4 : FROM mysql:8.0 ---> d4c3cafb11d5 Step 2/4 : EXPOSE 3306 ---> Using cache ---> e11d55e213ab Step 3/4 : ADD ./my.cnf /etc/mysql/conf.d/my.cnf ---> Using cache ---> 6dd70a6b7ecd Step 4/4 : CMD ["mysqld"] ---> Using cache ---> c22190479ddf Successfully built c22190479ddf Successfully tagged work_mysql:latestコンテナ作成&起動
ksk@ksknoMacBook-Pro work % docker-compose up -d Creating web ... done Creating db ... done確認
コンテナの状態確認
ksk@ksknoMacBook-Pro work % docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b416b97d3f7b work_mysql "docker-entrypoint.s…" 2 seconds ago Up 2 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp db 9985abb2eb90 work_php-apache "docker-php-entrypoi…" 2 seconds ago Up 2 seconds 0.0.0.0:8080->80/tcp webコンテナが確認できました
画面確認
http://localhost:8080
こちらへアクセス以上!
- 投稿日:2021-01-17T18:21:53+09:00
【コピペ】Docker ComposeでLaravel開発環境を構築その参
前回、docker-compose.yml達と一緒にLaravelをリポジトリ管理して、かなりスッキリした。
【コピペ】Docker ComposeでLaravel開発環境を構築その弐でも、ふと思った、、、Laravelは別リポジトリで管理したいな。。。
マシンスペック
- Mac mini 2018
- macOS Catalina(10.15.x)
- Intel Core-i7 3.2GHz 6コア
- メモリ 32GB
- SSD 512GB
やること
- Docker Compose環境のLaravelを別リポジトリにする
前提条件
- 空リポジトリを用意しておく
Docker Compose環境の準備
【コピペ】Docker ComposeでLaravel開発環境を構築その弐#使い方
src/laravelを別リポジトリにする
[Mac]$ pwd /Users/xxx/docker [Mac]$ cd src [Mac]$ mv laravel laravel_bak [Mac]$ git clone <前提条件で用意したリポジトリURL> laravel [Mac]$ cp -pR laravel_bak/. laravel以降は、IDEで src/laravel を開いてプッシュする
※注)dockerをIDEで開くと、dockerの方のリポジトリにプッシュされるので、src/laravelを開くこと!
- 投稿日:2021-01-17T16:48:41+09:00
Debianのsystemdを更新するとdockerが動かなくなる件
Debian の systemd はパッケージバージョン 247.2-2 でデフォルトcgroupのバージョンを1から2に変更している。これに対応するにはdocker.ioのDebianパッケージバージョンを20.10以降に新しくすればよい。dockerのcgroup v2対応は20.10から。
- 投稿日:2021-01-17T14:09:38+09:00
WSL2 の CentOS7 と Docker Desktop で作る快適なDocker環境
はじめに
Windowsに慣れ親しんでいる人にとってはLinux系のCLIはなかなかとっつきにくいですよね。
Windows版の Docker Desktop に搭載されているWSL2統合機能を使えば、WindowsのGUIでコンテナの管理ができるのでいくらか扱いやすくなったので紹介します。前提
- Windows 10 Pro バージョン2004
- CentOS7
手順
大まかな手順は以下の通り。
- WSL2 に CentOS7 をインストール
- CentOS7 に Docker をインストール
- Windows10 に Docker Desktop をインストール
- Docker Desktop で WSL2 統合設定
1. WSL2 に CentOS7 をインストール
CentOS7 の入手
GitHubからCentOS7.zipをダウンロードする。
https://github.com/wsldl-pg/CentWSL/releases/tag/7.0.1907.3CentOS7 のインストール
ダウンロードしたファイルを以下の場所に解凍する。
C:\Users\username\AppData\Local\Packages結果、以下のフォルダが作成され、フォルダに CentOS.exe が出力される。
C:\Users\username\AppData\Local\Packages\CentOS7解凍されたCentOS7.exeを実行するとインストールされる。
Windows Terminal をインストール
CentOS7 の操作用として、Windows Store からインストールする。
Windows Terminalから起動する
Windows Terminal を起動して新しいタブを開くと、リストに CentOS7 が追加されているのでクリックして起動することを確認する。
起動時のディレクトリをrootのホームディレクトリに変更する
CentOS7 起動時のカレントディレクトリがWindows上のユーザのホームディレクトリになっていて不便なので、設定を開きrootのホームディレクトリに変更する。
setting.json を任意のエディタで開き、CentOS7の設定箇所に startingDirectory の設定を追加する。
setting.json{ "guid": "{a8202b0e-781a-5dab-98e2-e9d469a63619}", "hidden": false, "name": "CentOS7", "source": "Windows.Terminal.Wsl", "startingDirectory" : "//wsl$/CentOS7/root" }CentOS7を起動しなおして設定が反映されていることを確認。
rootのパスワード設定は割愛。
2. CentOS7 に Docker をインストール
ここからは CentOS7 をCLIで操作する。
コマンドは4つだけなので頑張る。
各コマンドの詳細は Docker公式サイト「Docker CE の入手(CentOS 向け)」 を参照。まず以下のコマンドで Software Collections を導入。
$ yum install -y centos-release-scl-rh次に必要なパッケージをインストールする。
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2Dockerのレポジトリを追加する。
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repoyumのパッケージインデックスを更新しておく。
$ sudo yum makecache fastそして、CentOS用のDockerをインストールする。
(バージョン指定なしだとDockerが起動しなかったため、"centos"付バージョンをインストール)$ sudo yum install -y docker-ce-18.03.1.ce-1.el7.centosこの状態でDockerを起動しようとしてもエラーになるが気にしないこと。
#今はまだ動かない $ sudo systemctl start docker Failed to get D-Bus connection: Operation not permitted3. Windows10 に Docker Desktop をインストール
Docker公式を参照。
4. Docker Desktop でWSL2統合設定
Docker Desktopの設定画面を開き、 Resources -> WSL INTEGRATION と進む。
Enable integration with additional distros のところにある CentOS7 のトグルをONにする。
Apply & Restart ボタンを押す。
動作確認
CentOS7 から以下のコマンドを実行する。
$ docker run hello-world
hello-world のコンテナイメージがPullされてコンテナが起動し、"Hello form Docker!"と表示されていれば動作確認成功。
Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 0e03bdcc26d7: Pull complete Digest: sha256:31b9c7d48790f0d8c50ab433d9c3b7e17666d6993084c002c2ff1ca09b96391d Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/Docker Desktopで確認
imageの一覧に"hello-world"が追加されており、CentOSと連動していることがわかる。
CentOS7から確認
もちろんCentOS上からも同じものが確認できる。
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE httpd 2.4 dd85cdbb9987 5 weeks ago 138MB alpine/git latest 94f8849864da 3 months ago 28.4MB hello-world latest bf756fb1ae65 12 months ago 13.3kB
以上で終わり。
Docker Desktopからコンテナ状態をみたりRUNしたりコンソールにアクセスしたりしてください。どこかの誰かのお役に立てれば幸いです。
参考記事
- 投稿日:2021-01-17T13:34:03+09:00
AWS ECSでDocker環境を試してみる
概要
AWS資格取得に向けて利用してみたAWSサービスの具体的な利用方法についての投稿です。
今回はAWS上でのDocker利用、 Amazon ECS(Amazon Elastic Container Service)を利用してみる編です。15分程度でDockerを利用したWebアプリケーションが公開できます。資格試験の勉強法は記事は以下を参照。
AWS初心者がAWS 認定ソリューションアーキテクト – アソシエイト資格試験に合格した時の勉強法
AWS初心者がAWS 認定ソリューションアーキテクト – プロフェッショナル資格試験に合格した時の勉強法できるようになること
- AWS ECSでのWebアプリケーションの公開
およその作業時間
- 15分
- ECSの「今すぐ始める」メニューをやってみます
- すべてデフォルト値でも構築できその場合、5クリック5分で完了します^^;
必要な知識
- Docker
- AWS ECS
手順の概要
ではやってみましょう。
とは言うものの、ECSの「今すぐ始める」メニューのウィザードに従って入力するだけです。
最初に全体像だけ説明すると、ECSの概念としては、図のように、Container definition、Task definition、Service、Clusterの4つがあり、こらをウィザードに従って3画面で設定してきます。
では、始めます。
ECSの初期画面、またはクラスターの今すぐ始めるをクリックして開始します。
または
今すぐ始めるをクリックして開始します。(クリック1回目)Container definition/Task definition設定
最初の画面でContainer definitionとTask definition設定を行います。
コンテナ定義では、デフォルトでhttpd、nginx、tomcatが用意されています。(今回はhttpdを選択)
コンテナ定義、タスク定義いずれも右上に編集ボタンが用意されており、一部パラメータのカスタマイズは可能です。
とりあえず今回はデフォルトのまま次をクリック。(クリック2回目)Service設定
次はサービス設定です。ロードバランサーとしてALBを組み込めるようですが、とりあえずなしのまま次をクリック。(クリック3回目)
Cluster設定
最後にクラスター設定です。と言ってもクラスター名だけなのでデフォルトのまま次をクリック。(クリック4回目)
確認画面
確認画面が表示されるので、確認して作成をクリック。
以上!クリック5回で作成完了です!!作成画面
内部的にはCloudFormationを使っているようなので、頑張ってVPCから作ってくれていて問題がなければ2,3分後に作成されます。
サービスの表示をクリックしてみましょう。
作成されたVPCやサブネット、セキュリティグループの情報が確認できす。タスクタブから作成されたタスクをクリックすると
パブリックIPが割り当てられているので、
http://{割り当てられていたパブリックIP}/
でアクセスしてみます。↓が表示されていれば問題なく作成できています。
AWS ECSでのWebアプリケーションの公開完了です!実体としては、コンテナ定義の中に定義されている以下のようです。
はい、クリック5回完了です。
あとはコンテナ定義などいじくり倒しましょう^^補足1:自作Webアプリケーションのコンテナイメージの設定
Container definition設定のcustomで自分で作成した今回のようなhttp(80ポート)のWebアプリケーションのコンテナイメージを指定するだけで簡単にWebアプリケーションの公開ができそうですね。
補足2:作成したWebアプリケーションの削除
クラスターメニューのクラスターの削除から簡単にできます。
CloudFormationを使っているのでVPCからコンテナのタスク定義までまるっと削除されます。まとめ
想像したよりずっと簡単に作成できました。
今のままだとデフォルト設定のままなので今後は設定内容等、もう少し詳しくみてみます(^^)
- 投稿日:2021-01-17T12:12:22+09:00
とりあえずJavaで納品されたwarファイルをDockerで動かす
背景
他社で開発された
.war
ファイルを動かすことをしており、
現状EBのTomcatを利用して立ち上げていたがローカルでのさっとした動作確認やスケーリングのしやすさを考慮してDocker化したいお気持ちだけあった。さっくりと動かすぞぃ
ゴールはDockerfileを書いてさっとローカルのDockerfileを完成させることです。
Dockerfileを書いていく
FROM tomcat:8.5-jdk15-openjdk-slim ENV CATALINA_HOME /usr/local/tomcat ENV PATH $CATALINA_HOME/bin:$PATH WORKDIR $CATALINA_HOME COPY sample.war webapps/sample.wartomcatのバージョンは現行で利用している8.5系でひとまず立ち上げ。
tomcatではwebapps配下にwarファイルを配備すると自動で展開をしてくれるのでtomcatのセットアップをしてwarファイルをCOPYするだけ。起動する
あとは適当にタグ打ってコンテナ起動
$ docker build . -t sample:0.1 $ docker container run --name sample-container -p 80:8080 sample:0.1あとはwarファイルが展開されているので
http://localhost/{warファイル名}/
にアクセス
- 投稿日:2021-01-17T10:36:44+09:00
Windows Server 2019でDockerを動かしてみた
今のところ目を覆うひどい状況となっているWindowsコンテナ―。KubernetesがDockerサポートをやめると言ったので、少なくともDockerの目は将来にわたって潰えたかなと思うが、来る(来るのか)Containerdの前に死にゆくWindows Server + Dockerの現状を確認しておくのも、我が新ミニPCの投資回収目的のためには悪くないかと思った。
Dockerのインストール
まあ、手順を丁寧に抑えるのも価値が無いため簡潔に書くと、
1.Windows Server 2019の評価版ディスクを手に入れてVMware Workstationにインストールする。
https://www.microsoft.com/ja-jp/evalcenter/evaluate-windows-server-2019?filetype=ISOCPU2個、メモリ8GB、HDD 60GBで仮想マシンを作ったが、HDD 60GBだとmicrosoft/windowsコンテナのイメージをDocker saveするのにも容量が足りなくて失敗する。マジか。。。まあ、60GBでも十分。
2.Windows ServerにDockerをインストールする。
何かもう内容古そうだし、ところどころ書いてある通りには動かないのだけど以下が公式だろう。
https://docs.microsoft.com/ja-jp/virtualization/windowscontainers/quick-start/set-up-environment?tabs=Windows-ServerDockerインストールを終えると、記事作成時点ではMirantis Container Runtimeとかいうどこの馬の骨ともわからないベンダー(まあ、Docker EEをDockerから買収したところだ)のDockerエンジンが動作する。この時点で日本の商用環境で使えるかというところは絶望的である。
> docker version Client: Mirantis Container Runtime Version: 19.03.14 API version: 1.40 Go version: go1.13.15 Git commit: e820475 Built: 12/17/2020 19:30:16 OS/Arch: windows/amd64 Experimental: false Server: Mirantis Container Runtime Engine: Version: 19.03.14 API version: 1.40 (minimum version 1.24) Go version: go1.13.15 Git commit: 57e3a05525 Built: 12/17/2020 19:29:00 OS/Arch: windows/amd64 Experimental: falseWindows ServerのDockerを使ってみる
1.IISコンテナを動かしてみる。
まず、どのタグのイメージをデプロイすればいいのかを調べるにあたって、最近のWindows Serverのバージョン命名法の妙を知る。
https://hub.docker.com/_/microsoft-windows-servercore-iis最新のWindows、その名もWindows Server 2009というらしいのだが(2019より10ちいさい)、これは2020年9月にリリースされたWindowsの意であるらしい。重要なのは、これがうまいことに2016とか2019に被らず、次のリリースは2103になるというところだ。これは唸る。次のLTSCリリースでWindows Server 2022とか付けちゃうと2109より古いじゃん?といちゃもんが付くところまで見える。なので多分次のWindows Server LTSCは2022っていう名前じゃないな。Windows Server Xとかだろう。
とはいえいわゆる長期サポート(LTSC)が指定されているのは2019と2016のみであるため、それ以外はその時の気分で出来た不遇の子である。
また、Windows Server 2019(LTSC)の、上記ルールに沿っているっぽいバージョン名とビルド番号は、「システム」>「バージョン情報」によれば以下の通り。
バージョン: 1809
OSビルド: 17763.1697で、結局どのタグでpullすればいいんだよというのがいまいち判然とせずに30分くらい消費するも、結局ページの一番上に書いてある「windowsservercore-ltsc2019」が安全牌だろうという結論に落ち着いた。
> docker pull mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019なので、これを起動する。
いまだ経験したことがない長いイメージ名であり、Microsoftの歴史の重みを物語っている。> docker run -d -p 80:80 mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019DockerHubの説明ではWinNATの問題で
http://localhost
ではアクセスできないと書いてあるが、Windows Server 2019では解消しているのか、試しにWebブラウザでアクセスしてみると問題なくIISの画面が表示される。
2.コンテナのファイルを更新してみる
Windowsコンテナにdocker cpって効くのかね、と試してみたら、こちらは特に問題ない。PS> type index.html <!DOCTYPE html> Hello World! PS> $container = (docker ps -q) PS> docker cp .\index.html ${container}:"C:\inetpub\wwwroot\"
docker logs
コマンドでIISのログは表示されない。これはそのうち公式イメージ側で何とかして欲しいところ。おわりに
まあ、結局、リモートデスクトップでつないで管理できるのがWindows Serverの一番良いところであるが、それが解消というか、出来るようになるという気配は今もこれっぽちもない。ていうか、Windows Virtual Desktop掘り下げる方がMicrosoft的にも有意義なのは間違いないし。彼らの方向性は正しい。ゲームストリーミング市場に次世代のITを牽引して欲しい。
Kubernetes界隈でWindowsをノード統合したい人たちってのはほんと、いったい何がしたいんだか。。