[0708] Docker

nikevapormax·2022년 7월 8일
0

TIL

목록 보기
66/116
post-thumbnail
post-custom-banner

Docker

docker container 데이터 유지

docker image 실행하기

>>> 먼저 docker를 실행해 주어야 함!!

$ docker images
$ docker run -d -p 5000:5000 {image_name}:{tag}
$ docker ps

  • 브라우저로 가서 실행되고 있는지 확인
  • 포스팅 박스를 열어 게시글을 하나 작성하도록 하겠다.
  • 그 후 컨테이너를 멈춰보도록 하겠다.
$ docker stop {container_id}
$ docker ps -a

  • 아까 멈췄던 image를 다시 실행해 보면 서로 다른 컨테이너 아이디로 image가 실행되는 것을 볼 수 있다.
  • 그리고 다시 localhost:5000로 들어가 아까 저장했던 탑건이 남아있는지 확인해보자.
    • 내가 등록한 탑건이 사라진 것을 볼 수 있다.
  • 나의 메모가 사라진 이유는 메모리에 데이터를 저장하는데, 이미지를 껐다가 다시 시작하게 되면 메모리가 텅 빈 상태가 되기 때문이다.

docker container에 데이터 저장하기

  • container에 데이터가 저장되지 않았던 이유
    • 데이터를 컨테이너 안에다가 저장하면 되지 않나?? 라고 생각할 수 있다.
    • 하지만 시간이 지나면 코드는 진화하기 때문에 새로운 Docker container를 생성해야하는 경우가 존재하고
    • 새로운 이미지를 생성하거나, 새로운 서버에서 컨테이너를 생성해야 하는 일이 발생할 수 있어 데이터를 컨테이너 안에 저장하는 것은 의미가 없다.
    • 위의 예시에서 알 수 있듯이 동일 이미지를 사용하더라도 컨테이너끼리는 file system을 공유하지 않는다.
  • 따라서 docker는 두 가지의 해결책을 제시한다.
    • named volume
    • bind mount

mongoDB

  • 이전과 달리 mongoDB를 사용해서 데이터를 저장해보도록 하자.
    • --name : 이름을 설정해주는 옵션
    • -p : 포트를 연결해주는 옵션
    • -d : 백그라운드에서 이미지를 실행하게 해주는 옵션
$ docker run --name mongo_db -p 27017:27017 -d mongo
$ docker ps
  • 이번에도 처음 이미지를 생성하는 것이기 때문에 시간이 좀 걸린다.
  • mongoDB를 cli로 사용하는 것은 복잡하기 때문에 이번에는 robo 3T를 사용해보도록 하겠다.
  • mongoDB도 이전의 과정들과 같이 데이터를 넣고 컨테이너를 삭제하면 안에 있던 데이터가 날아가게 된다.

named volume

  • docker에서 유지되는 데이터를 관리해야 할 때 편리하게 이름으로 사용할 수 있게 만들어둔 volume
  • 아래의 명령어를 통해 생성할 수 있다.
$ docker volume create {volume_name}
$ docker volume inspect {volume_name}

  • 생성한 named volume을 mongoDB에 연결해보도록 하자.
    • -v : container의 /data/db와 memo를 연결시켜주겠다.
    • 뒤에 쓰인 mongo라는 이름을 쓰겠다.
$ docker run -p 27017:27017 -v memo:/data/db mongo
$ docker ps
  • 이렇게 연결을 하고 데이터를 브라우저에서 입력하면 데이터가 저장되고 robo 3T에서 확인할 수 있게 된다.
  • 위에서 생성한 named volume을 지우고 다시 생성하더라도 db에 데이터가 남아있게 된다.

named volume과 app 연결

  • docker에서 사용하고 있던 5000번 포트를 실행 종료를 하고, app.py를 실행한다.
  • docker를 사용하지 않고 실행한 이유는 container는 네트워크가 분리되어 있기 때문이다. mongo db를 실행했을 때 host와 통신이 가능했던 이유는 -p 옵션때문이지만, 컨테이너끼리 통신을 하려면 추가로 설정이 필요하다.
profile
https://github.com/nikevapormax
post-custom-banner

0개의 댓글