Docker
- 가상 머신 (VM, Virtual Machine)
- 편하게 원하는 이미지가 구성된 것을 받을 수 있음
Docker 기본 명령어
docker pull 다운로드할이미지이름:태그명
: 이미지 다운로드
- 예시 1)
docker pull mysql
// mysql 이미지 다운로드, 태그명 생략시 :latest
와 동일
- 예시 2)
docker pull mysql:8
// mysql 8 버전 다운로드
docker images
: 로컬 시스템에 다운로드된 이미지 조회
$ 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 조회, -a
옵션 추가시 중지된 container도 보여줌
docker container ls -a
와 동일
- 예시
$ 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
docker start 컨테이너명
: 중지되어 있는 container를 실행
docker stop 컨테이너명
: 실행되고 있는 container를 중지
docker rmi
: 도커 이미지 삭제
docker rm
: 도커 container 삭제 (docker container가 중지되어 있는 경우만 삭제)
docker run
: container를 생성과 동시에 실행
docker exec
: 실행 중인 container에 접속 (Command 실행 전달 또는 Terminal 연결)
- 예시
docker exec -it mysqladmin /bin/sh
- -it : 컨테이너에 대화형으로 연결
- mysqladmin : 연결할 container 이름
- /bin/sh : 실행할 Shell
- 예시
Host$ docker exec -it mysqladmin /bin/sh
Container
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
/var/www/html
Container
uid=0(root) gid=0(root) groups=0(root)
MySql 네트워크
Docker 네트워크 생성
- mysql, phpmyadmin 네트워크를 구성
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 경우 root 패스워드 설정 시 MYSQL_ROOT_PASSWORD=<패스워드> 전달
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
- 컨테이너 이름은 mysqldb이고, 앞서서 생성한 mysql-network로 네트워크 구성.
- 포트포워딩은 3306(Container Port) -> 3306(Host Port)로 전달 한다. (Host에서 MySQL 접속시 3306 포트로 접근, MySQL 기본 포트는 3306 이다.)
- MYSQL_ROOT_PASSWORD=<패스워드>로 인해 root 패스워드는 dbpasswd이다.
- 이미지(mysql:8)는 mysql 8 버전을 선택.
- -character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci는 MySQL 옵션을 전달
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
- 컨테이너 이름은 mysqladmin이고, 앞서서 생성한 mysql-network로 네트워크 구성.
- 포트포워딩은 80(Container Port) -> 8080(Host Port)로 전달 한다. (Host에서 phpMyAdmin 접속시 8080 포트로 접근)
- PMA_ARBITRARY=1는 phpMyAdmin 서버 주소 표기. (안해도 됨)
- PMA_HOST=mysqldb 기본 연결 주소 (mysqldb는 mysql-network를 통해 네트워크를 구성하였기 때문에 container 이름을 입력하면 된다.)
- PMA_PORT=3306는 phpMyAdmin이 MySQL에 접속할 포트 번호
- phpMyAdmin 이미지 명을 입력 (태그명이 없기 때문에 무조건
:latest
와 동일)
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 접속
- http://127.0.0.1:8080
- 서버: mysqldb 또는 입력 안해도 됨 (위에서 PMA_HOST=mysqldb로 기본값 명시)
- 사용자명: root
- 암호: dbpaddwd (앞서서 MYSQL_ROOT_PASSWORD=dbpasswd 로 지정)
커맨드 버전
Host$ docker exec -it mysqladmin /bin/sh
Container
Database 생성
- Database 생성시 인코딩을
utf8mb4_general_ci
으로 선택하여 생성 해야 함.
- MySQL 기본 인코딩이
utf8mb4_0900_ai_ci
이며, 한글 검색 이슈가 발생하므로, utf8mb4_general_ci
으로 변경하여 DB 생성