Docker

Docker 기본 명령어

$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
phpmyadmin   latest    511d0d6a7b22   10 days ago    562MB
mysql        8         ae2502152260   2 months ago   574MB
$ docker ps -a
CONTAINER ID   IMAGE        COMMAND                   CREATED          STATUS          > PORTS                               NAMES
61827bbd3579   phpmyadmin   "/docker-entrypoint.…"   25 minutes ago   Up 25 minutes   0.> 0.0.0:8080->80/tcp                mysqladmin
4c572e31623d   mysql:8      "docker-entrypoint.s…"   25 minutes ago   Up 25 minutes   0.> 0.0.0:3306->3306/tcp, 33060/tcp   mysqldb
Host$ docker exec -it mysqladmin /bin/sh
Container# ls
ChangeLog  composer.json          doc          js         package.json            > sql        tmp      yarn.lock
LICENSE    composer.lock          favicon.ico  libraries  robots.txt              > templates  url.php
README     config.sample.inc.php  index.php    locale     show_config_errors.php  > themes     vendor
Container# pwd
/var/www/html
Container# id
uid=0(root) gid=0(root) groups=0(root)

MySql 네트워크

Docker 네트워크 생성

docker network create mysql-network

생성된 네트워크 확인

docker inspect mysql-network
[
    {
        "Name": "mysql-network",
        "Id": "91cade27ba94713b36bfbc5a3574aa08813164eaa28acbd5cffe39f921e75f5c",
        "Created": "2023-10-23T09:35:10.08115057Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

MySQL 구성

Docker 이미지 다운로드

docker pull mysql:8
docker pull phpmyadmin

run 명령어 설명

docker run -d --name <컨테이너이름> --net=<도커네트워크> -p <Host Port>:<Container Port> -e <컨테이너 환경 변수> <이미지 이름>:<태그명>

-d: 실행과 동시에 Detach
-name: 생성될 container 이름
--net=: docker network 이름
-p: Port Forwarding, : -e: container에게 전달할 환경 변수 (docker image 마다 다 다름)

MySQL 컨테이너 실행

docker run -d --name mysqldb --net=mysql-network -p 3306:3306 -e MYSQL_ROOT_PASSWORD=dbpasswd mysql:8 --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci

phpMyAdmin 컨테이너 실행

docker run -d --name mysqladmin --net=mysql-network -p 8080:80 -e PMA_ARBITRARY=1 -e PMA_HOST=mysqldb -e PMA_PORT=3306 phpmyadmin

Docker Network 확인

$ docker inspect mysql-network
[
    {
        "Name": "mysql-network",
        "Id": "91cade27ba94713b36bfbc5a3574aa08813164eaa28acbd5cffe39f921e75f5c",
        "Created": "2023-10-23T09:35:10.08115057Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"          // mysql-network 게이트웨이
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "4c572e31623d36b9da3d502e4e483ef6259d994846c9e78b616f01d5a3b4b527": {
                "Name": "mysqldb",
                "EndpointID": "6a6bd387fc0c22eac1ea493bd61631b1d78c1dd474c49a6cf2d821d7c964f364",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",          // MySQL IP 주소
                "IPv6Address": ""
            },
            "61827bbd3579e79b3e7d289d27498ec9b6e6faa29f2a56ff5e285332ef524f21": {
                "Name": "mysqladmin",
                "EndpointID": "cc9d0900e513992baf77ed384ed3073ec5fb6854a336c3e6d802b157e782c7f3",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",          // phpMyAdmin IP 주소
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

DB 접속 테스트

phpMyAdmin 접속

커맨드 버전

Host$ docker exec -it mysqladmin /bin/sh
Container# php -r '$c = mysqli_connect("mysqldb", "root", "dbpasswd", "", "3306"); if(!$c) { echo "Cannot connect"; } else { $result = $c->query("SELECT User from mysql.user"); print_r($result->fetch_all()); }'

Database 생성