forget for get

覚えるために忘れる

DockerでPHPからMySQLに接続してみる

Dockerfile

FROM php:7.4-apache
RUN docker-php-ext-install pdo_mysql
COPY src/ /var/www/html/

src/my.php

<?php
echo '接続します<br />';
try {
  $dbh = new PDO('mysql:host=mysql_1;dbname=test', 'root', 'root123');
  foreach($dbh->query('select * from users') as $row) {
    echo $row['name'] . '<br />';
  }
} catch (PDOException $e) {
    echo $e;
    die();
}
$dbh = null;
echo "end";

Dockerネットワーク作成

docker network create test-network
docker network ls
docker run -p 80:80 --network test-network -v /vmshare/php_docker/src:/var/www/html -d --name php_docker_1 php_docker
docker run --name mysql_1 --network test-network  -v /vmshare/mysql_docker/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root123 -d mysql:8.0

Dockerチュートリアル

Dockerチュートリアル

https://docs.docker.jp/get-started/part2.html

 

サンプル Dockerfile

# 親イメージとして公式イメージを使う
FROM node:current-slim

# 作業用(working)ディレクトリを指定
WORKDIR /usr/src/app

# ホスト上のファイルを現在の場所にコピー
COPY package.json .

# イメージのファイルシステム内でコマンドを実行
RUN npm install

# 実行時、コンテナが特定のポートをリッスンするよう Docker に通知
EXPOSE 8080

# コンテナ内で指定したコマンドを実行
CMD [ "npm", "start" ]

# 残りのソースコードをホスト上からイメージのファイルシステム上にコピー
COPY . .

 

docker build --tag bulletinboard:1.0 .
docker image ls
docker run --publish 8000:8080 --detach --name bb bulletinboard:1.0
docker ps -a
docker stop bb
docker rm --force bb

 

PHPの公式イメージ

 

https://docs.docker.jp/get-started/part2.html

 

サンプル Dockerfile

FROM php:7.4-apache
COPY src/ /var/www/html/

 

docker build -t php_docker .
docker run -p 80:80 -d --name php_docker_1 php_docker

 

これだとsrc/index.phpを修正しても反映されない。
-vでディレクトリをマウント

docker run -p 80:80 -v /vmshare/php_docker/src:/var/www/html -d --name php_docker_1 php_docker

 

docker exec -it php_docker_1 php -v
docker exec -it php_docker_1 /bin/bash

 

MySQLの公式イメージ

https://hub.docker.com/_/mysql

docker run --name mysql_1 -e MYSQL_ROOT_PASSWORD=root123 -d mysql:8.0
docker exec -it mysql_1 mysql -uroot -proot123

サンプルSQL

create database test;
use test
create table users (id int, name varchar(10));
insert into users set id=1,name='hoge';
select * from users;

これだとインスタンスを消すとデータも消えるので、共有ディレクトリにする

docker run --name mysql_1 -v /vmshare/mysql_docker/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root123 -d mysql:8.0

dockerコンテナが起動しない

WARNING: Host is already in use by another container
ERROR: for api  Cannot start service api: driver failed programming external connectivity on endpoint docker_api_1 (e819fe...): Error starting userland proxy: listen tcp4 0.0.0.0:80: bind: address already in use
ERROR: Encountered errors while bringing up the project.

 

80番ポートが既に使われているっぽい

 

lsof -i:80
COMMAND  PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
apache2 4666     root    4u  IPv6  38177      0t0  TCP *:http (LISTEN)

 

apache2がいた!

 

apache2を停止する。
自動起動も無効にする。

 

service apache2 stop
systemctl disable apache2
docker-compose up
Starting docker_api_1         ... done

起動できた!

.vimrcでエラー E254: Cannot allocate color 7

いつものように~/.vimrcを編集してvimを起動したらエラーが出た

E254: Cannot allocate color 7

バージョンによっては7なんて色はないらしい。
LightGrayに変更して解決。

~/.vimrc

highlight SpecialKey cterm=NONE ctermfg=7 guifg=7
highlight JpSpace cterm=underline ctermfg=7 guifg=7
↓
highlight SpecialKey cterm=NONE ctermfg=LightGray guifg=LightGray
highlight JpSpace cterm=underline ctermfg=LightGray guifg=LightGray

foreachで参照渡しで値を変更するとバグる

foreachで参照渡しで値を変更するとバグる

$vals = [1,2,3];
foreach ($vals as &$val) {
  $val *= 2;
}
echo json_encode($vals);
//[2,4,6]

foreach ($vals as $val) {
  echo $val . ',';
}
//2,4,4,

何が起こっているか

$vals = [1,2,3];
foreach ($vals as &$val) {
//$valに$vals[0],$vals[1],$vals[2]への参照が入っていきます
  $val *= 2;
}
echo json_encode($vals);
//[2,4,6]

//$valに$vals[2]への参照が残ったままです

foreach ($vals as $val) {
//$vals[2]へ$vals[0],$vals[1]の値が入っていき、
//$vals[2]には$vals[1]の値が残ります
  echo $val . ',';
}
//2,4,4,

unsetして解決

$vals = [1,2,3];
foreach ($vals as &$val) {
  $val *= 2;
}
echo json_encode($vals);
//[2,4,6]

unset($val); //$vals[2]への参照を解除します

foreach ($vals as $val) {
  echo $val . ',';
}
//2,4,6,

Dockerまとめ

公式ドキュメント

https://docs.docker.com/

https://docs.docker.jp/ (日本語版)

 

インストール

CentOS8 Docker/Docker Composeインストール

https://qiita.com/chenglin/items/8e13e7ad45cc9bae264a

 

記事リスト

docker-composeでLaravel環境構築(PHP/nginx/MySQL) - forget for get

Dockerチュートリアル - forget for get

DockerでPHPからMySQLに接続してみる - forget for get