# Container Cooperation
* Container1: Apache + php
* Container2: Mysql

## step by step
### images install
* install
```bash=
$ sudo docker pull mysql
$ sudo docker pull radys/php-apache:7.4
```
```bash=
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest a3b6608898d6 4 weeks ago 596MB
radys/php-apache 7.4 51289344b921 2 years ago 422MB
```
### mysql
* sql set
```bash=
# 先建立映射的目錄
$ mkdir -p dbtest
$ pwd
/home/user/docker_php/dbtest
```
* run
```bash=
$ sudo docker run -d --network test-network --name hello-mysql -e MYSQL_ROOT_PASSWORD=123456 -v /home/user/docker_php/dbtest/:/var/lib/mysql mysql:3.0
8a98edbc2f656cd9da25dd2b5609096b7302d325be67614a994b038384779c77
[user@docker1 ~]$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8a98edbc2f65 mysql "docker-entrypoint.s…" 6 seconds ago Up 5 seconds 33060/tcp, 0.0.0.0:32768->3306/tcp, :::32768->3306/tcp hello-mysql
```
:::info
1. 網路建立: [Network Create](https://hackmd.io/b0ReOSeyS4WC5wubgCBZnQ#:~:text=address%20%27b3%27-,%E8%87%AA%E8%A8%82%20bridge%20network,-%E7%95%99%E8%A8%80)
2. "-p 3306" 不像以往 "-p 8080:80", 只要給內部互通而已, 沒有要對外, 所以 port 就不細設, 隨機分配

:::
```bash=
# 進入Container
$ sudo docker exec -it hello-mysql bash
bash-4.4#
# 透過 root 進入 mysql (密碼在建立container時設定)
bash-4.4# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.2.0 MySQL Community Server - GPL
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
```
* 資料庫簡易設定
```sql=
mysql> create database testdb;
Query OK, 1 row affected (0.01 sec)
mysql> use testdb;
Database changed
mysql> create table addrbook(name varchar(50) not null, phone varchar(100));
Query OK, 0 rows affected (0.03 sec)
mysql> insert into addrbook(name, phone) values ("Tom", "0912345678");
Query OK, 1 row affected (0.03 sec)
mysql> insert into addrbook(name, phone) values ("Marry", "0987654321");
Query OK, 1 row affected (0.00 sec)
mysql> select * from addrbook;
+-------+------------+
| name | phone |
+-------+------------+
| Tom | 0912345678 |
| Marry | 0987654321 |
+-------+------------+
2 rows in set (0.00 sec)
```
**這邊退出DB之後把container 儲存一份**
```bash=
$ sudo docker commit hello-mysql mysql:3.0
sha256:36bd9990c9d6ff0ae8d06e813b1f8aa395851924d4ffefa53433d5f5ddaccf34
```
### Apache + php
* run
```bash=
$ sudo docker run -d -p 80:80 --network test-network -v /home/user/docker_php/:/var/www/html --name hello-php radys/php-apache:7.4
2612686c5dec1a085709d79bdcf5141cf74db1fa4d389e402c117bb40171d983
```
* edit php (test)
```php=
<?php
phpinfo();
?>
```

* edit index.php
```php=
<?php
$servername="hello-mysql";
$username="root";
$password="123456";
$dbname="testdb";
$conn = new mysqli($servername, $username, $password, $dbname);
if($conn->connect_error){
die("connection failed:" . $conn->connect_error);
}
$sql="select name, phone from addrbook";
$result = $conn->query($sql);
if($result->num_rows >0){
while($row = $result->fetch_assoc()){
echo "name:" . $row["name"]." phone:".$row["phone"]."<br>";
}
} else {
echo "0 result";
}
?>
```

## docker-compose LAMP
### docker-compose (有瑕疵版, 必須利用前面commit的image)
```dockerfile=
version: '3.8'
services:
hello-php:
image: radys/php-apache:7.4
container_name: hello-php
depends_on:
- hello-mysql
ports:
- "80:80"
volumes:
- /home/user/docker_php/:/var/www/html/
networks:
- test-network
hello-mysql:
image: mysql:3.0
container_name: hello-mysql
environment:
MYSQL_ROOT_PASSWORD: 123456
ports:
- "3306"
volumes:
- /home/user/docker_php/dbtest/:/var/lib/mysql
networks:
- test-network
networks:
test-network:
```
### docker-compose
* 先把剛剛映射的目錄清空(或建立新的)
```bash=
[user@docker1 dbtest]$ sudo rm -rf *
```
* 測試的目錄裡要有
```bash=
[user@docker1 docker_php]$ ls
dbtest(目錄) docker-compose.yml dump(目錄) index.php
```
* 編輯 yml 檔
```dockerfile=
version: '3.8'
services:
hello-php:
image: radys/php-apache:7.4
container_name: hello-php
depends_on:
- hello-mysql
ports:
- "80:80"
volumes:
- /home/user/docker_php/:/var/www/html/
networks:
- test-network
hello-mysql:
image: mysql
container_name: hello-mysql
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: testdb # 這個是建立名為 testdb 的資料庫
ports:
- "3306"
volumes:
- /home/user/docker_php/dbtest/:/var/lib/mysql
- ./dump:/docker-entrypoint-initdb.d # 映射 dump 目錄上去
networks:
- test-network
networks:
test-network:
```
* 目錄 dump
```bash=
[user@docker1 dump]$ ls
dump.sql
```
* dump.sql
```sql=
use testdb;
create table addrbook(name varchar(50) not null, phone varchar(100));
insert into addrbook(name, phone) values ("Tom", "0912345678");
insert into addrbook(name, phone) values ("Marry", "0987654321");
```
* run
```bash=
$ sudo docker-compose up -d
[+] Running 3/3
✔ Network docker_php_test-network Created 0.1s
✔ Container hello-mysql Started 0.0s
✔ Container hello-php Started 0.0s
```
## docker-compose flask+redis
**計算連線次數**
* directory
```bash=
[user@d1 test6]$ ls
app.py docker-compose.yaml Dockerfile requirements.txt
```
* app.py
```python=
from flask import Flask
import time
import redis
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def get_index():
count = get_hit_count()
return 'HAHA, Already browse {} time.'.format(count)
app.run(host='0.0.0.0', debug=True)
```
* Dockerfile
```dockerfile=
[user@d1 test6]$ cat Dockerfile
FROM python:3.9
ADD ./ /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
```
* requirements.txt
```=
flask
redis
```
* docker-compose.yaml
```dockerfile=
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- ./:/code/
depends_on:
- redis
redis:
image: "redis:alpine"
```
* result
