몽고디비 서버가 구동되지 않는 오류 해결하기

개발중인 프로젝트에 도커를 도입하려고 하는데 몽고디비까지 추가해보려고 하다가 원래대로 되돌리려는 중 오류가 발생했습니다.

몽고디비를 아래과 같이 시작해보면 아무런 반응이 없네요.

$ sudo systemctl start mongod

현재 서비스 상태를 확인해 봅니다.

$ sudo systemctl status mongod
● mongod.service - MongoDB Database Server
   Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Fri 2019-04-19 14:00:59 KST; 3min 45s ago
     Docs: https://docs.mongodb.org/manual
  Process: 7925 ExecStart=/usr/bin/mongod --config /etc/mongod.conf (code=exited, status=100)
 Main PID: 7925 (code=exited, status=100)
      CPU: 21ms

 4월 19 14:00:59 doogle-ubuntu systemd[1]: Started MongoDB Database Server.
 4월 19 14:00:59 doogle-ubuntu systemd[1]: mongod.service: Main process exited, code=exited, status=100/n/a
 4월 19 14:00:59 doogle-ubuntu systemd[1]: mongod.service: Unit entered failed state.
 4월 19 14:00:59 doogle-ubuntu systemd[1]: mongod.service: Failed with result 'exit-code'.

서비스가 실패상태입니다. 당연히 몽고디비 서버는 떠있지 않네요.

로그 기록을 확인해 보면…

$ sudo tail mongod.log 
2019-04-19T14:00:59.937+0900 I CONTROL  [initandlisten] build environment:
2019-04-19T14:00:59.937+0900 I CONTROL  [initandlisten]     distmod: ubuntu1604
2019-04-19T14:00:59.937+0900 I CONTROL  [initandlisten]     distarch: x86_64
2019-04-19T14:00:59.937+0900 I CONTROL  [initandlisten]     target_arch: x86_64
2019-04-19T14:00:59.937+0900 I CONTROL  [initandlisten] options: { config: "/etc/mongod.conf", net: { bindIp: "127.0.0.1", port: 27017 }, processManagement: { timeZoneInfo: "/usr/share/zoneinfo" }, storage: { dbPath: "/var/lib/mongodb", journal: { enabled: true } }, systemLog: { destination: "file", logAppend: true, path: "/var/log/mongodb/mongod.log" } }
2019-04-19T14:00:59.937+0900 I STORAGE  [initandlisten] exception in initAndListen: IllegalOperation: Attempted to create a lock file on a read-only directory: /var/lib/mongodb, terminating
2019-04-19T14:00:59.937+0900 I NETWORK  [initandlisten] shutdown: going to close listening sockets...
2019-04-19T14:00:59.937+0900 I NETWORK  [initandlisten] removing socket file: /tmp/mongodb-27017.sock
2019-04-19T14:00:59.937+0900 I CONTROL  [initandlisten] now exiting
2019-04-19T14:00:59.937+0900 I CONTROL  [initandlisten] shutting down with code:100

밑에서 5번째 줄을 보면 원인을 확인 할 수 있습니다.

Attempted to create a lock file on a read-only directory: /var/lib/mongodb, terminating

/var/lib/mongodb 디렉토리가 읽기만 가능해서 lock 파일을 생성할 수 없는거 같네요.

경로 권한을 확인해 봅니다.

$ sudo ls -al
... (중략)...
drwxr-xr-x  4           999 mongodb       32768  4월 19 13:34 mongodb/
... (중략)...

보시는 바와 같이 디렉토리 및 하위 파일들 포함 모두 사용자가 바뀌었습니다. 아무래도 도커버전의 몽고디비가 한 짓(?)인거 같네요.

다음과 같이 권한을 복구해 줍니다.

$ sudo chown -R mongodb:mongodb mongodb

이제 다시 서비스를 시작하면 되겠습니다.

$ sudo systemctl start mongod

서비스 상태를 봐보면 정상적으로 구동중이라는 것을 확인할 수 있습니다.

$ sudo systemctl status mongod
● mongod.service - MongoDB Database Server
   Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2019-04-19 14:20:36 KST; 13s ago
     Docs: https://docs.mongodb.org/manual
 Main PID: 9963 (mongod)
    Tasks: 27
   Memory: 148.4M
      CPU: 926ms
   CGroup: /system.slice/mongod.service
           └─9963 /usr/bin/mongod --config /etc/mongod.conf

 4월 19 14:20:36 doogle-ubuntu systemd[1]: Started MongoDB Database Server.

리눅스에서는 항상 파일 권한 문제가 생길 수 있습니다. 주의하시기 바랍니다.

Docker Composer 오류 해결하기 – services.server.build contains unsupported option: ‘image’

아래와 같이 docker-composer 실행하면 바로 에러가 뜨는 경우가 있는데요.

ERROR: The Compose file './docker-compose.yml' is invalid because:
services.server.ports contains an invalid type, it should be an array
services.server.build contains unsupported option: 'image'
더 보기 “Docker Composer 오류 해결하기 – services.server.build contains unsupported option: ‘image’”

실무에서 사용하기 위한 docker 활용법 – private docker registry 구축하기

docker 를 알아보다 보면 슬슬 실무에 적용해 보고 싶어지는데요. 실제로 배포등을 처리하려면 docker hub 가 필요합니다. 하지만 docker hub 는 계정당 1개만 private 저장소를 지원하는데요.

이를 해결하기 위해서는 자체적으로 구축한 도커 저장소가 있는게 아무래도 편하겠죠?

더 보기 “실무에서 사용하기 위한 docker 활용법 – private docker registry 구축하기”

docker 이미지 저장 경로 변경하기

docker의 경우 이미지 때문에 기본적으로 용량을 많이 차지한다. 그래서 기본 파티션이 용량이 작은 경우 추가로 붙인 볼륨의 파티션으로 경로를 변경해줄 필요가 있다.

먼저 아래와 같이 도커 설정 파일을 만든다.

$ sudo vi /etc/docker/daemon.json

설정 파일에 아래와 같은 json 형식으로 설정값을 지정하면 된다.

{
    "graph": "/원하는/경로"
}

마지막으로 docker 서비스를 재시작하면 된다.

$ sudo systemctl restart docker

이제 해당 경로로 가보면 docker 에서 생성한 여러 폴더들을 볼 수 있다.

$ cd /원하는/경로
$ ls -al
total 0
drwx--x--x 14 root root 182 Jan 14 18:11 ./
drwxr-xr-x  3 root root  20 Jan 14 16:11 ../
drwx------  2 root root  24 Jan 14 18:11 builder/
drwx------  4 root root  92 Jan 14 18:11 buildkit/
drwx------  2 root root   6 Jan 14 18:11 containers/
drwx------  3 root root  22 Jan 14 18:11 image/
drwxr-x---  3 root root  19 Jan 14 18:11 network/
drwx------  3 root root  40 Jan 14 18:11 overlay2/
drwx------  4 root root  32 Jan 14 18:11 plugins/
drwx------  2 root root   6 Jan 14 18:11 runtimes/
drwx------  2 root root   6 Jan 14 18:11 swarm/
drwx------  2 root root   6 Jan 14 18:11 tmp/
drwx------  2 root root   6 Jan 14 18:11 trust/
drwx------  2 root root  25 Jan 14 18:11 volumes/

이런식으로 나오면 정상적으로 경로가 변경된 것이다.

이렇게 하면 서버의 용량 부족 문제를 해결할 수 있다 ^^
만약 한창 사용중이라면 docker 서비스를 중단한후 rsync 로 이동시키면 사용할 수 있을것으로 예상해 본다.

알 수 없는 Docker 오류 해결하기

이래저래 써먹어 보려고 Docker 를 테스트 해보다 보니 이미지 생성, 강제 삭제 등을 여러번 하다가 의존성이 깨진건지 이상한 에러가 발생하기 시작했다.

$ docker-compose build
...

$ docker-compose up
Recreating 1695e5fd230f_www1204dcokr_web_1

ERROR: for web  no such image: sha256:d6aeb5065849265e872ed19e5f5831b9bccc9ddd5f0d73d577c4102d27668a63: No such image: sha256:d6aeb5065849265e872ed19e5f5831b9bccc9ddd5f0d73d577c4102d27668a63
ERROR: Encountered errors while bringing up the project.

위와 같이 docker-compose 를 이용해 build 후 up 수행을 하면 이상한 에러를 뱉어내면서 중단된다.

이럴 때 해결할 수 있는 방법으로 아래와 같이 도커 리셋을 해보는 것이다. (root 계정으로 수행한다.)

# docker stop $(docker ps -a -q); docker rm $(docker ps -a -q); docker volume rm $(docker volume ls -qf dangling=true)

# docker network rm(docker network ls -q)

참조 : https://github.com/docker/compose/issues/3277#issuecomment-247964243

Nuxt.js Docker 작업 시 오류 해결 하기 – Module not found: Error: Can’t resolve ‘core-js/modules/es6.array.find’ in ‘/src/.nuxt’

Module not found: Error: Can't resolve 'core-js/modules/es6.array.find' in '/src/.nuxt'

Docker 이미지를 만들다가 위와 같은 에러가 무수히 많이 나는 경우가 있다. 일반적인 개발환경에서는 오류가 발생하지 않는데 docker 이미지로 만들때만 오류가 발생해 참 힘들게 한다.

이를 해결 하기 위해서는 다음과 같이 core-js 패키지를 추가해 주면 해결 된다.

$ yarn add --dev core-js

이렇게 하고 다시 도커 이미지를 빌드하면 정상적으로 빌드가 된다.

이와 비슷한 오류가 있는데 그경우도 webpack 을 추가해주면 해결된다.