20210117のdockerに関する記事は9件です。

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.yml
version: '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.txt
Django
uwsgi
PyMySQL
  • django/.env
django/.env
MYSQL_ROOT_PASSWORD=root
MYSQL_DATABASE=db
MYSQL_USER=bbt-user
MYSQL_PASSWORD=password
  • nginx/nginx.conf
nginx/nginx.conf
user  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/.env
MYSQL_ROOT_PASSWORD=root
MYSQL_DATABASE=db
MYSQL_USER=bbt-user
MYSQL_PASSWORD=password
TZ='Asia/Tokyo'
  • sql/init.sql
sql/init.sql
GRANT 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

参考

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

[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.yml
command: bash -c "rm -f tmp/pids/server.pid ; bundle exec rails s -p 3000 -b 0.0.0.0"
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.yml
version: '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:3306

ymlに書いている属性?で、自分が理解していることを以下の表に書いてみる
(間違っているところを指摘してくれる優しい人いたら教えてください)

./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.yml
  mysql:     ←これ!!!
    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=utf8

default_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
こちらへアクセス

qiita_20200117_01.png

以上!

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

【コピペ】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を開くこと!

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

Debianのsystemdを更新するとdockerが動かなくなる件

Debian の systemd はパッケージバージョン 247.2-2 でデフォルトcgroupのバージョンを1から2に変更している。これに対応するにはdocker.ioのDebianパッケージバージョンを20.10以降に新しくすればよい。dockerのcgroup v2対応は20.10から

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

WSL2 の CentOS7 と Docker Desktop で作る快適なDocker環境

はじめに

Windowsに慣れ親しんでいる人にとってはLinux系のCLIはなかなかとっつきにくいですよね。
Windows版の Docker Desktop に搭載されているWSL2統合機能を使えば、WindowsのGUIでコンテナの管理ができるのでいくらか扱いやすくなったので紹介します。

前提

  • Windows 10 Pro バージョン2004
  • CentOS7

手順

大まかな手順は以下の通り。

  1. WSL2 に CentOS7 をインストール
  2. CentOS7 に Docker をインストール
  3. Windows10 に Docker Desktop をインストール
  4. Docker Desktop で WSL2 統合設定

1. WSL2 に CentOS7 をインストール

CentOS7 の入手

GitHubからCentOS7.zipをダウンロードする。
https://github.com/wsldl-pg/CentWSL/releases/tag/7.0.1907.3

CentOS7 のインストール

ダウンロードしたファイルを以下の場所に解凍する。
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 lvm2

Dockerのレポジトリを追加する。

$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

yumのパッケージインデックスを更新しておく。

$ 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 permitted

3. Windows10 に Docker Desktop をインストール

Docker公式を参照。

4. Docker Desktop でWSL2統合設定

Docker Desktopの設定画面を開き、 Resources -> WSL INTEGRATION と進む。
image.png

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と連動していることがわかる。
image.png

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したりコンソールにアクセスしたりしてください。

どこかの誰かのお役に立てれば幸いです。

参考記事

WSLでCentOS7をインストールする

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

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の概念としては、

image.png

図のように、Container definitionTask definitionServiceClusterの4つがあり、こらをウィザードに従って3画面で設定してきます。

では、始めます。
ECSの初期画面、またはクラスターの今すぐ始めるをクリックして開始します。

image.png
または
image.png
今すぐ始めるをクリックして開始します。(クリック1回目)

Container definition/Task definition設定

最初の画面でContainer definitionとTask definition設定を行います。
コンテナ定義では、デフォルトでhttpd、nginx、tomcatが用意されています。(今回はhttpdを選択)
コンテナ定義、タスク定義いずれも右上に編集ボタンが用意されており、一部パラメータのカスタマイズは可能です。
とりあえず今回はデフォルトのままをクリック。(クリック2回目)

image.png

Service設定

次はサービス設定です。ロードバランサーとしてALBを組み込めるようですが、とりあえずなしのままをクリック。(クリック3回目)

image.png

Cluster設定

最後にクラスター設定です。と言ってもクラスター名だけなのでデフォルトのままをクリック。(クリック4回目)

image.png

確認画面

確認画面が表示されるので、確認して作成をクリック。
以上!クリック5回で作成完了です!!

image.png

作成画面

内部的にはCloudFormationを使っているようなので、頑張ってVPCから作ってくれていて問題がなければ2,3分後に作成されます。

image.png
2,3分後、、、
image.png

サービスの表示をクリックしてみましょう。
作成されたVPCやサブネット、セキュリティグループの情報が確認できす。

image.png

タスクタブから作成されたタスクをクリックすると

image.png

パブリックIPが割り当てられているので、
http://{割り当てられていたパブリックIP}/
でアクセスしてみます。

image.png

↓が表示されていれば問題なく作成できています。
AWS ECSでのWebアプリケーションの公開完了です!

image.png

実体としては、コンテナ定義の中に定義されている以下のようです。

image.png

はい、クリック5回完了です。
あとはコンテナ定義などいじくり倒しましょう^^

補足1:自作Webアプリケーションのコンテナイメージの設定

Container definition設定のcustomで自分で作成した今回のようなhttp(80ポート)のWebアプリケーションのコンテナイメージを指定するだけで簡単にWebアプリケーションの公開ができそうですね。

image.png
開いた画面でコンテナのイメージを設定
image.png

補足2:作成したWebアプリケーションの削除

クラスターメニューのクラスターの削除から簡単にできます。
CloudFormationを使っているのでVPCからコンテナのタスク定義までまるっと削除されます。

image.png

まとめ

想像したよりずっと簡単に作成できました。
今のままだとデフォルト設定のままなので今後は設定内容等、もう少し詳しくみてみます(^^)

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

とりあえず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.war

tomcatのバージョンは現行で利用している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ファイル名}/ にアクセス

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

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=ISO

CPU2個、メモリ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-Server

Dockerインストールを終えると、記事作成時点では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:     false

Windows 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-ltsc2019

DockerHubの説明ではWinNATの問題でhttp://localhostではアクセスできないと書いてあるが、Windows Server 2019では解消しているのか、試しにWebブラウザでアクセスしてみると問題なくIISの画面が表示される。
image.png

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\"

Webブラウザをリロード。
image.png

docker logsコマンドでIISのログは表示されない。これはそのうち公式イメージ側で何とかして欲しいところ。

おわりに

まあ、結局、リモートデスクトップでつないで管理できるのがWindows Serverの一番良いところであるが、それが解消というか、出来るようになるという気配は今もこれっぽちもない。ていうか、Windows Virtual Desktop掘り下げる方がMicrosoft的にも有意義なのは間違いないし。彼らの方向性は正しい。ゲームストリーミング市場に次世代のITを牽引して欲しい。

Kubernetes界隈でWindowsをノード統合したい人たちってのはほんと、いったい何がしたいんだか。。

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