hide's memo
24 4月, 2023

apache + perl + cgi + mysql(DBD::mysql, DBI)環境をMacBook Air(M1)のDockerに構築

[English]

下図のようにMacBook Air(M1) 上の Docker に Ubuntuを入れて、そこに apache + perl + cgi + mysql(DBD::mysql, DBI)環境を作成する。

 

■1. Docker コンテナ作成

(1.1)Dockerイメージの取得

docker image pull amd64/ubuntu:focal

(1.2)Dockerコンテナ作成

docker run -p 8080:80 -p 3307:3306 -it -d --name ubuntu amd64/ubuntu:focal

 

■2. 作成したDockerコンテナの環境構築

(2.1)作ったDockerコンテナにログイン

docker exec -it ubuntu /bin/bash

(2.2)以下を実行し環境を構築

apt update
apt install -y apache2
    timezone を聞かれるので適当に応える。
apt install -y wget
apt install -y gcc
apt install -y make
apt install -y mysql-server
apt install -y libmysqlclient-dev
apt install libssl-dev
wget https://www.cpan.org/modules/by-module/DBI/DBI-1.643.tar.gz
tar xvzf DBI-1.643.tar.gz
cd DBI-1.643
perl Makefile.PL
make
make install
cpan update
cpan install DBD::mysql
a2enmod cgid

 

(2023/4/25追記)
DBIのインストールは、以下ではなく、

wget https://www.cpan.org/modules/by-module/DBI/DBI-1.643.tar.gz
tar xvzf DBI-1.643.tar.gz
cd DBI-1.643
perl Makefile.PL
make
make install

 

以下の方法でもOKです。

cpan install DBI

 

■3. MySQLのDB作成とサンプルデータ投入

(3.1)DBとユーザ作成

mysqld_safe --user=mysql &
mysql -u root
mysql>create database mydb;
mysql>create user 'test'@localhost identified by 'test';
mysql>grant all privileges on mydb.* to 'test'@localhost;
mysql>alter user 'test'@localhost IDENTIFIED WITH mysql_native_password by 'test';
mysql>quit

(3.2)DBに接続しデータをINSERTする。

mysql -u test -p
mysql>test
mysql>use mydb;
mysql>create table m_id(id varchar(30), name varchar(30));
mysql>insert into m_id values('001','admin'); 
mysql>insert into m_id values('002','Smith'); 
mysql>insert into m_id values('003','Johnson'); 
mysql>insert into m_id values('004','Williams'); 
mysql>commit;
mysql>quit

 

 

■4. サンプルCGIの設置

(4.1)以下のパスに以下のテスト用Perlプログラム配置

パス:/usr/lib/cgi-bin/test.cgi
ソース:

#!/usr/bin/perl
use strict;
use DBI;

my $DB_HOST="127.0.0.1";
my $DB_PORT="3306";
my $DB_NAME="mydb";
my $DB_USER="test";
my $DB_PASS="test";

sub get_db_conn()
{
  my $dbh=undef;
  eval {
    $dbh = DBI->connect("dbi:mysql:dbname=$DB_NAME;host=$DB_HOST;port=$DB_PORT","$DB_USER","$DB_PASS");
  };
  if($@){
    print STDERR "DB ERROR $@n";
    $dbh = undef;
  }
  return $dbh;
}

my $dbh = get_db_conn();
my $sql = "select id, name from m_id";
my $sth = $dbh->prepare($sql);
$sth->execute();
print "Content-type: text/html;\n\n";
print "<html>";
print "<body>";
print "<table border=1>";
while(my $ary_ref = $sth->fetchrow_arrayref){
  my($id, $name) = @$ary_ref;
  print "<tr><td>$id</td><td>$name</td></tr>";
}
print "</table>";
print "</body>";
print "</html>";

 

(4.2)実行権限をつける

chmod ugo+x /usr/lib/cgi-bin/test.cgi

 

■5. 動作確認

(5.1)apache起動

apachectl start

(5.2)MacのWebブラウザ上で以下にアクセス
http://localhost:8080/cgi-bin/test.cgi

15 4月, 2023

Docker Desktopが表示されなくなった場合

[English]

発生した環境:M1 MacBook Air  Ventura 13.2.1

Docker Destkop を、[x]ボタンで閉じた場合、次にLaunchpadから起動しようとしても表示されない。

どうも、プロセス自体がまだ残っているのが原因のようで、以下のようにプロセスをkillしてやるとLaunchpadから起動できた。

(1)以下のコマンドでDocker Desktop を探す

>ps -aef | grep -i docker | grep -i desktop | grep name
  501 19845 19811   0 10:13AM ??         0:06.63 /Applications/Docker.app/Contents/MacOS/Docker Desktop.app/Contents/MacOS/Docker Desktop --name=dashboard

(2)上記で見つけたプロセスIDを kill する。

注意!! Docker関連のプロセスが全てkillされるので、その後 launchpadからDocker Desktopを立ち上げたり。個別のDocker Containerをたちがる必要がある。