> [!date] published: 2022-12-10
## 🌟 요약
아래 내용들이 너무 의식의 흐름으로 적혀 있어서 깔끔하게 정리한 내용을 위로 올렸다.
### ✨ docker-compose와 docker compose의 차이
참고 : [docker compose \| Docker Docs](https://docs.docker.com/compose/reference/)
새로운 Compose V2는 Docker CLI의 `compose` 명령으로 속해 있다.
`compose` 명령은 기존 `docker-compose`의 특징과 옵션을 거의 모두 지원하기 때문에 비슷하게 사용하면 된다.
이건 뇌피셜이지만 `docker-compose`는 이전버전, `docker compose`는 새로운 버전의 Compose를 실행할 수 있게 되는 것 같다.
### ✨ docker 설치의 여러 방법
```shell
apt-get update && apt-get -y upgrade
apt-get install -y docker
```
```shell
curl -fsSL <https://get.docker.com> -o get-docker.sh
# DRY_RUN=1 라인은 옵션임 (테스트 실행, 스크립트 실행 단계를 미리 볼 수 있다.)
DRY_RUN=1 sudo sh ./get-docker.sh
sudo sh get-docker.sh
```
### ✨ docker compose up 옵션
- `-d` : Detached mode: Run containers in the background / 백그라운드에서 실행
- `-build` : Build images before starting containers / 이미지도 빌드
- `-no-build` : Don't build an image, even if it's missing. / 이미지가 없어도 빌드하지 않는다.
### ✨ MariaDB 관련 내용들
- mysql 설치는 `/var/lib/mysql` 여기에 되어 있었다.
데이터베이스가 생성되면 이곳을 루트로 해서 관련된 내용들을 담는 디렉토리가 생성되었다.
- `IF NOT EXISTS` 옵션
- DB를 생성할때나 USER를 생성할 때 기존에 같은 이름으로 생성된 내용이 있다면 error를 띄운다.
- `IF NOT EXISTS` 옵션을 붙여주면 존재하지 않을 경우를 조건으로 걸 수 있어서 기존에 같은 이름이 있을 경우에도 error가 아닌 warning으로 처리가 된다.
- 예고편 (이자 todo)
- **`mysql_install_db`**
- **`mysqladmin`**
## 🌟 시작
삽질 기록을 중구난방으로 정리해두니 이걸 정리했는지 안했는지, 이걸 한건지 안한건지 머릿속에서 뒤죽박죽이 되어서 일단 퇴고없이 여기에 정리해두기로 했다.
사실 이러려고 따로 블로그 만든건데 이것도 블로그라고 계속 퇴고의 퇴고를 반복하다보니 안올리고 미루고미루고미루고미루더라…
## 🌟 docker-compose와 docker compose의 차이
저번 버전 서브젝트에는 `docker-compose`를 사용하라고 되어 있었는데 지금 서브젝트에는 `docker compose`를 사용하라고 되어 있다.
잠깐 찾아봤을 때에는 단순히 `docker compose`가 `docker-compose`로 alias 되어 있는 것이라고 생각했었는데, 이번에 환경 세팅을 다시 하면서 보니 docker의 최신 버전에 Compose가 들어 있어서 `docker-compose`를 쓰지 않고 `docker compose`를 사용할 수 있는 것이었다. (실제로 그냥 `apt-get`으로 도커를 설치했을때에는 `docker compose` 명령을 찾지 못했다. (이것도 왜 안되었는지 의문….))
다시 보니까 애초에 docker docs에 주황박스로 중요 공지가 되어 있었다.
[docker compose \| Docker Docs](https://docs.docker.com/compose/reference/)
![[f04c9253-ac6c-4465-879a-42e8cdd938be.png]]
서브젝트에서 바꾸기를 요구한 이유는 Compose의 최신 버전을 사용하기 위함이었던 것 같다.
최신 Compose V2는 `compose` 커맨드로 도커의 일부로 포함되어 있기 때문에, docker의 `compose` 커맨드로 Compose V2를 사용할 수 있다. (기존 `docker-compose`의 특성과 옵션 대부분 지원)
이건 뇌피셜이긴 하지만 `docker-compose`는 구버전을 의미하고 있는게 아닐까… 그래서 최신 버전을 사용하는 것을 서브젝트는 원한게 아닐까…
## 🌟 docker 설치하기
`apt-get`으로는 원하는 버전을 설치하는 방법을 모르겠어서 설치 스크립트를 사용하기로 했다.
이것도 버전을 선택할 수 있을지는 잘 모르겠는데… 모르겠다. 요즘 걍 아무것도 모르겠음;
[Debian \| Docker Docs](https://docs.docker.com/engine/install/debian/)
```
curl -fsSL <https://get.docker.com> -o get-docker.sh
DRY_RUN=1 sudo sh ./get-docker.sh
sudo sh get-docker.sh
```
`DRY_RUN=1` : 스크립트가 실행할 단계를 먼저 확인해 볼 수 있는 옵션
```
$ docker --version
Docker version 20.10.21
```
## 🌟 docker compose hangs on Attaching to
저번에 다 해 두었던 nginx 세팅을 올리고 돌려봤는데
```
[+] Running 1/1
⠿ Container nginx Recreated 0.1s
Attaching to nginx
```
여기서 멈추어서 더이상 진전이 안되었다.
[\[Docker\] docker-compose up 중에 Attaching 완료가 안되는 문제](https://beeodoc.tistory.com/27)
이 블로그에서처럼 마지막에 `-d` 옵션을 넣어주면 해결된다. (분명히 비슷한걸 예전에 했었는데..? 또 이렇게 기억을 못한다.)
`-d` : 백그라운드에서 실행한다는 뜻
(참고) : `-build` : 이미지도 빌드한다는 뜻. `—no-build` 옵션은 이미지를 빌드하지 않는다.
여기까지 하고 예전에 해 두었던 nginx를 돌려보니 일단 깡통 nginx (나중에 php-fpm 관련 설정도 추가로 해 줘야 하는 것으로 알고있음… 🫠) 는 잘 돌아가는 것 같다. curl 통해서 일반 http로 접속하니 접속도 막아줌 굿~!
## 🌟 mariaDB setup
저번 글에서 DB 셋업은 sql 파일로 바로 리다이렉트해서 입력해주겠다 했었는데 조금 보니까 그렇게 해 주면 또 스크립트를 써서 이런저런 설정을 해야 하는 것 같아서 (일단 이 글을 쓰는 시점에서는 정확히 뭘 설정해줘야하는진 잘 모르겠음.. 암튼 뭔가 추가 작업이 필요함) 그냥 다시 마지막 ENTRYPOINT로 셋업 스크립트 파일을 실행시키는 방식으로 변경했다.
사실 저번 글에서 셋업을 다 하고 에러만 좀 잡으면 되겠다 생각했는데 아무것도 잘 된게 없었다 🫠
그래서 처음부터 다시 봄.
### ✨ MariaDB 설치와 설정
(일단 손으로 직접 설정해봅니다.)
```bash
apt-get update && apt-get -y upgrade
apt-get install -y mariadb-server mariadb-client
```
설치된 경로 : `/var/lib/mysql`
```
root:/var/lib/mysql# ls
aria_log.00000001 debian-10.3.flag ib_logfile0 ibdata1 mysql_upgrade_info
aria_log_control ib_buffer_pool ib_logfile1 mysql performance_schema
```
DB를 임의로 만들어서 다시 확인해보니
```
root:/var/lib/mysql# ls -al
total 122956
drwxr-xr-x 5 mysql mysql 4096 Dec 10 14:41 .
drwxr-xr-x 1 root root 4096 Dec 10 14:38 ..
-rw-rw---- 1 mysql mysql 16384 Dec 10 14:25 aria_log.00000001
-rw-rw---- 1 mysql mysql 52 Dec 10 14:25 aria_log_control
-rw-r--r-- 1 root root 0 Dec 10 14:25 debian-10.3.flag
-rw-rw---- 1 mysql mysql 972 Dec 10 14:25 ib_buffer_pool
-rw-rw---- 1 mysql mysql 50331648 Dec 10 14:40 ib_logfile0
-rw-rw---- 1 mysql mysql 50331648 Dec 10 14:25 ib_logfile1
-rw-rw---- 1 mysql mysql 12582912 Dec 10 14:25 ibdata1
-rw-rw---- 1 mysql mysql 12582912 Dec 10 14:40 ibtmp1
-rw-rw---- 1 mysql mysql 0 Dec 10 14:40 multi-master.info
drwx------ 2 mysql mysql 4096 Dec 10 14:25 mysql
-rw-r--r-- 1 root root 15 Dec 10 14:25 mysql_upgrade_info
drwx------ 2 mysql mysql 4096 Dec 10 14:25 performance_schema
-rw-rw---- 1 mysql mysql 24576 Dec 10 14:40 tc.log
drwx------ 2 mysql mysql 4096 Dec 10 14:41 testdb // 이거!
```
이렇게 이 폴더 하위에 DB 이름으로 디렉토리가 생성되어 있더라.
중복된 데이터베이스를 만드려고 시도하면 이렇게 에러가 나기 때문에 확인 작업을 거쳐 주는게 좋을 것 같다.
```
MariaDB [(none)]> CREATE DATABASE testdb;
ERROR 1007 (HY000): Can't create database 'testdb'; database exists
```
(추가) `IF NOT EXISTS` 옵션을 넣어주면 warning만 주고 정상작동되는 것 같다. 이렇게하면 되겠다! (유저에도 동일하게 동작함.)
```
MariaDB [(none)]> CREATE DATABASE IF NOT EXISTS testdb;
Query OK, 0 rows affected, 1 warning (0.000 sec)
MariaDB [(none)]> CREATE USER 'newbie'@'%' IDENTIFIED BY 'passwd';
Query OK, 0 rows affected (0.002 sec)
MariaDB [(none)]> CREATE USER 'newbie'@'%' IDENTIFIED BY 'passwd';
ERROR 1396 (HY000): Operation CREATE USER failed for 'newbie'@'%'
MariaDB [(none)]> CREATE USER IF NOT EXISTS 'newbie'@'%' IDENTIFIED BY 'passwd';
Query OK, 0 rows affected, 1 warning (0.000 sec)
```
## 🌟 좀 더 찾아봐야 하는 키워드
- **`mysql_install_db`**
- **`mysqladmin`**
위 내용 참고 : [42 inception 과제 기초 가이드 - 도커 컴포즈로 실제 서비스를 올려보자](https://epicarts.tistory.com/159)
## 🌟 끝
![[1da50a3a-1f7a-4607-9e0f-613997ee1412.png| 300]]
나갈때마다 인사해주는데 왜 접속할때는 인사를 안해줄까… 아쉽다.