이전 포스팅에서 간단하게 docker 설치를 마쳤다.
이번에는 이 docker에 환경을 올려보자
docker를 이용하기 위해서 컨테이너와 이미지라는 개념을 살짝 알아두어야 하는데, docker의 동작 방식을 먼저 보자
가상환경을 구축한다는 점에서 docker는 Virtual Machine(VM)과 항상 비교된다.
docker는 VM과 달리 Guest OS가 설치되지 않는다.
즉, docker는 Guest OS가 없어 Host OS의 커널(linux)을 공유해, 격리된 공간에서 프로세스가 동작하는 방식이다.
그러므로 VM보다 훨씬 가볍고, 끄고 켜는 동작들도 빠르다.
여기서 격리된 공간에서 동작하는 프로세스가 컨테이너다.
- 각각 독립적으로 실행돼서 다른 프로세스들에 영향을 주지 않는다.
- 백그라운드로 돌릴수도 있다.
- 컨테이너에 접속해 명령어를 실행할 수도 있다.
- Host의 파일/디렉토리를 가져올 수 있으며, 포트를 연결해 컨테이너 밖에서도 접속이 가능하다.
이미지는 이러한 컨테이너를 올리기 위한 기반으로 컨테이너 실행에 필요한 파일/설정 등을 포함한 하나의 객체 정도이다.
즉, docker 이미지는 하나의 상태를 저장해놓은 객체라고 볼 수 있다.
이러한 이미지는 직접 만들수도 있고(Dockerfile), 이미 만들어둔 것을 가져와 사용할 수 있다. (hub.docker.com)
docker hub는 이러한 이미지들이 저장된 저장소로, 가입해서 이미지를 올리거나 내려받을 수 있다. (github과 유사)
간단하게 컨테이너와 이미지 개념만 알아보았다.
이제 컨테이너를 올려보자
+) docker는 모든 동작에 root 권한이 필요하다. sudo 명령어를 매번 입력하기 귀찮다면 docker 계정을 추가해서 사용하자
이미지 목록 보기
docker image ls
docker를 막 설치하고 나면 이미지가 없을 것이다. 예시로 docker hub에서 ubuntu가 설치된 이미지를 가져와보자
이미지 가져오기(pull)
docker pull ubuntu
유명한 기술스택의 경우 docker hub에 공식 이미지로 존재한다.
docker hub에 올라간 이미지는 버전관리가 되어있는 경우가 있는데, 특정 버전의 이미지를 받고 싶은 경우 뒤에 태그를 붙여준다.
docker pull ubuntu:[태그명]
태그가 없는 경우 latest(가장 최신) 버전으로 받아진다.
컨테이너 실행
docker run [옵션] [이미지명]
실행할 때에 다양한 옵션을 줄 수 있는데, 가장 대표적인 것들만 몇개 적어보았다.
옵션 | 설명 |
-d | daemon 모드, 컨테이너를 백그라운드로 돌릴때 사용 |
-i | interactive 모드, 컨테이너에 표준입력을 통해 명령어를 주고받을수 있음, 주로 -t 옵션과 붙어서 사용 |
-t | tty 모드, 컨테이너에서 bash를 사용하기위해 설정, 주로 -i 옵션과 붙어서 사용 |
-p | 호스트와 컨테이너간의 포트 연결, [호스트포트]:[컨테이너포트] 형태로 사용한다. (포트포워딩) |
--name | 컨테이너의 이름 설정, 설정 안해주면 랜덤한 값이 지정됨 |
컨테이너 접속
docker exec -it [컨테이너명/ID] [shell]
백그라운드로 돌린 컨테이너에 접속할때 쓰는 방법이다. bash쉘이 없는 경우 sh쉘로 붙자
+) 컨테이너나 이미지를 관리할때에는 이름대신 ID값을 넣어도 된다. 물론 전체ID가 아닌 일부만 넣어줘도 인식한다.
컨테이너 종료 & 삭제
# 컨테이너 중지
docker stop [컨테이너명/ID]
# 컨테이너 삭제
docker rm [컨테이너명/ID]
이미지 삭제
docker rmi [이미지명/ID]
이미지를 삭제할 때, 해당 이미지를 사용한 컨테이너가 올라가 있는 상태면 삭제가 불가능하다.
-f 옵션으로 강제로 삭제가능하긴 하나, 추후에 의존성이 꼬일 수 있다.
따라서, 이미지 삭제할때에는 이미지를 사용중인 컨테이너를 먼저 삭제해주자
컨테이너 로그보기
docker logs [컨테이너명/ID]
tomcat 이미지를 가져와서 올리고 로그를 확인한 상황이다.
-f 옵션으로 로그를 실시간으로 확인할 수 있다.
이렇게 컨테이너와 이미지 관리를 간단하게 알아봤다.
다음에는 Dockerfile을 통해 직접 docker 이미지를 만들어보자