누누타운

[Docker]docker container 도커 #3

Docker Container

도커 이미지를 만들었다면, 이미지 기반의 컨테이너를 생성할 차례

먼저 docker image를 local로 가져오기(나는 local에 있기 때문에 생략 가능)

docker pull dnjdsxor21/fastapi:v1

이미지 확인! docker images

Container run

본격적으로 컨테이너 띄워보기

docker run <image_name>

이때 줄 수 있는 옵션이 굉장히 많다.

docker run -p 3000:80 --name my-container -d <image_name>

-p : port옵션, Dockerfile에서 작성했던 port80을 실제로 열어주는 작업. 내 컴퓨터(또는 AWS EC2, GCP VM instance)의 포트 3000과 컨테이너의 포트 80을 연결
--name : 컨테이너의 이름을 지정. 안하면 랜덤으로 이름 지정
d: detach모드를 의미, docker run는 디폴트로 attach모드를 가진다. attach모드는 컨테이너의 터미널과 연결 되는 것을 의미한다.

컨테이너를 무사히 생성했다면, docker ps커맨드를 통해 “실행중인 컨테이너"를 확인 할 수 있다.
“모든 컨테이너"를 확인하려면 docker ps -a

나의 경우는 fastapi, uvicorn으로 백엔드 서버를 실행하기 때문에 코드가 계속 돌아가고 있다. 따라서 컨테이너는 계속 실행중이다.
main.py을 통해 port80에서 서버가 열려있다. 그 port80이 내 localhost port3000과 연결되어 있기 때문에 “localhost:3000"에 들어가면 서버가 정상적으로 작동하는 것을 확인 할 수 있다!

만약 코드가 한번 돌고 멈추는 코드라면, 컨테이너도 중지된다.

Container 관리

docker ps -a : 컨테이너 리스트 출력

docker stop <container-name> : 컨테이너 중지

docker start <container-name> : 컨테이너 재시작, 이때는 run과 다르게 디폴트가 detach모드, Dockerfile에서 작성한 CMD커맨드가 다시 실행

docker logs <container-name> : 컨테이너의 터미널에 출력된 로그를 출력

docker rm <container-name : 컨테이너 삭제

Container는 독립된 환경!

컨테이너는 독립된 환경으로, 내 로컬 환경과 공유되지 않는다. 따라서 Container를 삭제하면 그 안에 있는 파일들도 삭제 된다.

컨테이너 안의 파일을 백업하고 싶을 때, 또는 컨테이너 안의 파일을 추가, 수정 하고 싶을 때가 있다.

container이름을 my-container라고 하면,
파일 옮기기(컨테이너 -> 로컬)

docker cp my-container:/app/main.py .

파일 옮기기(로컬 -> 컨테이너)

docker cp my-file.py my-container:/app/

이미지와 컨테이너

이렇게 도커를 처음 쓸 때 이미지와 컨테이너만 이해한다면 쉽게 사용해 볼 수 있다!

물론 도커로 활용 가능한 기능은 아직 너무 많음,,

위에서 말했듯 Container는 독립된 환경이기 때문에 컨테이너 안의 파일들은 temporary의 특징을 가진다.
따라서 log, Database 등 permanent의 특징을 가지는 데이터를 관리하기 위해서는 새로운 기능의 필요성을 느꼈다.

이런 문제를 해결하기 위해 다음에는 Docker Volume를 알아봅시다요