이번에 생활코딩이라는 개발자 커뮤니티 및 유튜브를 운영하시는
이고잉님께서 docker에 대한 아주 쉽고 친절한,
영상마다 10분이 넘지 않는 유튜브 강의를 개설하셨다.
도커에 대해 막연하게 알고 있던 내게 큰 도움이 되었으며,
[많은 사람들이 봤으면 하고자 하는 마음] + [복습] 목적으로
영상들의 내용을 두 개의 글로 정리하여 남긴다.
아래 영상을 함께 보면 좋을 것이며,
이 글은 영상 1번부터 4번까지의 내용을 담고 있다.
- 생활코딩 Docker 입문수업 3. 이미지 pull
- 생활코딩 Docker 입문수업 4. 컨테이너 run
- 생활코딩 Docker 입문수업 7. 호스트와 컨테이너의 파일시스템 연결
배경
과거
어떠한 애플리케이션을 만들기 위해서는
서버에 OS 등의 여러 기본적인 소프트웨어를 설치해야 하고,
만약 웹 애플리케이션이라면
웹 서버나 DB 등의 추가적인 앱이 필요하다.
이러한 소프트웨어 및 앱 등의 설치는 매우 귀찮고,
까다롭고,
한번에 제대로 되지 않는 경우가 대다수이다.
그래서 사람들은 아래와 같은 생각을 하기 시작한다.
'아, 어떤 설치의 전문가가 PC를 직접 구해서
OS와 웹 서버, DB 등 다 설치하고 주면 얼마나 좋을까?
네트워크로 그 PC에 연결만 하고!'
'아니면, 하나의 컴퓨터에 Vmware이나 VirtualBox 같은 것으로
가상 PC를 만들고 그 위에 OS를 설치한 후
웹 서버 혹은 DB를 설치하는 건 어떨까?
그럼 PC를 따로 장만하지 않아도 되는데!'
하지만, 웹 서버 하나 설치하고자
용량도 크고 리소스를 많이 잡아먹는 OS를 설치하는 것은 비효율적이다.
또한 기존에 존재하는 OS 위에 가상 PC의 OS를
또다시 설치하는 것이기 때문에 PC에도 엄청난 부담이 된다.
현재
그러다가 docker의 시발점이 되는 아래와 같은 생각을 하게 된다.
'그냥 하나의 컴퓨터 안에서 웹 서버, DB 등
각각의 애플리케이션을 실행시키는데,
이 앱들을 [격리된 환경]에서 실행시키면 되지 않나?'
위와 같은 개념을 떠올리며,
사람들은 OS가 설치된 곳을 Host,
Host 위에서 실행되는 격리된 각각의 실행 환경을
Container라고 부르기로 했다.
아까 과거의 생각 중 떠올린
Vmware나 VirtualBox 같은 가상 PC와
다를 것이 없다고 생각이 들 수 있다.
하지만 각각의 Container에는 OS 전체가 아닌,
각각의 앱을 실행하는데 필요한 최소한의 lib과
bin(실행파일)만 존재한다.
이미 Host에 존재하는 OS를 Container가 모두 공유하게 되니
따로 OS를 설치할 필요도 없고,
속도도 느려지지 않게 되며,
설치에 필요한 시간 등의 절약도 가능하게 됐고,
저장장치 용량도 아낄 수 있게 되었다.
이러한 Container 방식은
Linux OS에 이미 내장되어 사용되고 있다.
그와 같은 Container 개념을 이용하는 SW 중
가장 잘 나가는 제품이 바로 Docker인 것이다.
개념 및 설치
앞서 말했다시피,
Docker와 같은 소프트웨어가 사용하는 Container 기술은
Linux OS의 기술이다.
그렇기 때문에 Docker 위에서 돌아가는 Container,
Container 안에서 동작하는 각각의 앱들은
Linux OS에서 실행되는 앱임을 알 수 있다.
그럼 내가 가진 Host의 OS가 Linux가 아니라면
Docker를 사용하지 못하는 것일까?
그렇지 않다.
내가 가진 Host의 OS가 Windows, Mac 등이어도
그 위에 가상 머신을 설치하고,
해당 가상 머신에 Linux를 설치하면,
해당 Linux 안에서 Docker를 사용할 수 있다.
아니, 지금까지 그런 설치가 까다롭고 어렵고
뭐시기 했으면서?
그러한 역할을 바로 Docker가 해주는 것이다.
알아서 가상 머신을 만들어주고 그 위에 Linux를 설치해준다.
그렇기 때문에 어느 정도의 속도 저하는 감수해야 하며
만약 Host의 OS도 Linux를 사용한다면
아주 고성능으로 사용할 수 있지만,
그럼에도 편의성이 어마어마하기 때문에
현대의 백엔드 개발자라면 거의 필수로 사용한다.
(설치는 생활코딩 Docker 입문수업 2. 설치의
1분 58초부터 보면 된다)
Git처럼 Docker 또한 GUI(Graphic User Interface)가 아닌
CLI(Command Line Interface) 환경에서 사용해야
여러 기능을 잘 사용할 수 있다.
나는 현재 M1 맥북을 사용 중인데,
기존에 설치되어 있던 Docker를 간만에 실행시켜 보니
"The data couldn't be read because it is missing"
이라는 에러가 계속 발생했다.
알고 보니, 애플이 독자적으로 개발한 M1칩에서는
기존의 Docker가 정상적으로 작동할 수 없어서 생긴 오류였다.
나 같은 경우는 Docker 홈페이지에서
Apple칩 전용 dmg 파일을 다운로드하여
기존의 Docker 위에 덮어 씌우며 재설치하니 잘 작동했다.
설치 후, 터미널에서 "docker images"를 입력했을 때
오류 메시지가 없다면 정상적으로 설치된 것이다.
Docker의 추가적인 개념
Docker에도 GitHub처럼
Docker Hub라고 하는 Registry 서비스가 존재하여
마치 애플의 App Store에서 앱을 설치하듯이
내가 원하는 "격리된 환경"을 다운로드할 수 있다.
App Store에서 다운로드하여 실행시키는 행위에 비유하며
Docker에 대한 개념을 좀 더 알아보자.
App Store에서 다운로드한 것을 Program이라고 하는 것처럼,
Docker Hub에서 다운로드 한 것은 Image라고 부른다.
다운로드 한 Program을 실행하면 Process가 생기는 것처럼,
다운로드 한 Image를 실행시키면 Container가 생긴다.
Program이 여러 Process를 가질 수 있는 것처럼,
Image도 여러 Container를 가질 수 있다.
이때 Docker Hub에서 다운로드하는 행위를 Pull이라고 부르며,
다운로드 한 Image를 실행시키는 행위를 Run이라고 부르고,
Container 안에 내장되어 있는 여러 설치 프로그램들이 자동으로 설치되어
해당 앱(Apache Server 등)을 사용 가능하게 된다.
(생활코딩 Docker 입문수업 3. 이미지 pull의
1분 40초부터 Image를 Docker Hub로부터
다운로드하는 방법에 대해 볼 수 있다)
우리는 httpd(Apache Server Image)를 사용할 것이기 때문에
아래 명령어들을 통해 Image를 다운로드하고
Image가 잘 다운로드되었는지 확인한다.
// httpd 다운로드
docker pull httpd
// Image가 잘 다운로드 되었는지 확인
docker images
httpd?
생활코딩 Docker 입문수업에서는
Apache Server의 Image를 계속해서 사용할 텐데,
Docker Hub에서는 Apache Server Image를
httpd라는 단어로 지칭하고 있다.
Docker Hub에서 httpd를 검색해보면
"official image"라고 되어있는 문구를 볼 수 있는데,
이는 docker 측에서 직접 관리하는
믿을 수 있는 Image라는 것을 알 수 있다.
기본 명령어 (Run 하는 방법)
(생활코딩 Docker 입문수업 4. 컨테이너 run의
0분 12초부터는 GUI에서,
1분 46초부터는 CLI에서 하는 방법에 대해 볼 수 있다)
위에서 하나의 Image는 여러 Container를
만들 수 있었다고 언급했던 것을 생각하며
영상과 함께 아래 명령어들을 살펴보자.
// httpd 기반의 container 실행
docker run httpd
// httpd 기반의 또 다른 container 실행, 이번에는 container에 ws2라는 이름 지정
docker run --name ws2 httpd
// container 끄기
docker stop ws2[혹은 containerID]
// 지금까지 생성한 실행 중인 container 확인하기
docker ps
// 지금까지 생성한 실행 중이며 stop 된 container까지 확인하기(-a[all] 옵션 추가)
docker ps -a
// 껐던 ws2 container 다시 켜기
// 하지만 아래 명령어로는 log 출력이 되지 않음
docker start ws2
// log 출력시키기
// 하지만 아래 명령어를 입력했을 때만 log가 나오고 바로 종료됨
docker logs ws2
// -f 옵션을 추가하여 실시간으로 계속 log 출력
docker logs -f ws2
// container 삭제
// 실행 중인 container는 바로 삭제가 불가능, stop 후 삭제 가능
docker rm ws2
// stop을 하지 않고 한 방에 삭제하는 방법
docker rm --force ws2
// Image 삭제
docker rmi httpd
다음 글에서는 docker의 추가적인 기본 명령어와
네트워크를 통해 어떤 방법으로 container가 관리되는지,
host와 container는 어떤 관계를 갖고 있는지에 대해 알아본다.
끝!
'Study > Docker' 카테고리의 다른 글
[Docker][생활코딩] Container & Docker - (2) 네트워크, 파일 시스템, 실행 명령어, Host와 Container의 연결 (0) | 2021.08.24 |
---|