도커 소개
어떤 애플리케이션을 만들기 위해서 여러 프로그램을 설치하고 환경에 맞게 설정하는 것은 여간 까다로운 일이 아니다. 대부분 한 번에 될 턱이 없다. 한 번에 돼도 개발자들은 왜 한 번에 되는지 의심한다…
따라서 누군가가 컴퓨터에 애플리케이션을 깔아주고 이를 제공해준다면 얼마나 편리할까? 그러나 애플리케이션 하나를 위해 여러 컴퓨터를 사야하는 것은 너무 비싸다.
그렇다면 하나의 컴퓨터에 여러 가상의 컴퓨터(OS)를 깔고, 각각에 애플리케이션에 필요한 프로그램을 설치한다면? 여러 컴퓨터를 살 필요는 없지만, 애플리케이션 하나 설치하기 위해서 용량이 큰 운영체제를 깔아야 한다는 것은 부담스럽다. 또 여러 운영체제가 있다보니까 실행속도도 느려지게 된다.
그래서 생각해낸 것이 바로 컨테이너 기술
이다. 그냥 한 대의 컴퓨터(OS) 안에서 각각의 프로그램을 실행시킨다. 단, 각각의 프로그램은 격리된 환경에서 실행된다. 이러한 격리된 환경을 컨테이너
라고 부른다.
여기서 운영체제가 설치된 컴퓨터를 호스트
호스트에 설치된 각각의 실행환경을 컨테이너
라고한다. 컨테이너에는 OS가 아닌 프로그램을 실행하기 위한 라이브러리와 실행파일들만 들어있다.
컨테이너 기술
은 독립된 실행환경을 제공하면서도, 컴퓨터에 직접 애플리케이션을 설치한 것과 같이 빠른 개발 환경을 제공한다. 무엇보다 일일이 프로그램을 설치할 필요 없이 이미 필요한 프로그램들이 설치 되어 있는 컨테이너를 hub와 같은 곳에서 가져다 쓰기만 하면 되기 때문에 굉장히 편리하다.
이러한 컨테이너 기술 중 가장 유명하고 많이 쓰이는 것이 바로 도커(Docker)
이다. 지금부터 도커를 사용하는 법에 대해 더 자세히 알아보자.
도커 설치
도커는 원래 Linux OS 기술이다. 즉, Linux OS 위에 컨테이너를 설치해서 컨테이너 기술을 사용할 수 있다. 그렇다면 만약 자신의 OS가 Linux가 아니라면 쓸 수 없는 것일까?
그렇지 않다. 자신의 OS 위에 가상머신을 설치하고 가상머신에 Linux를 설치하고, 그 위에 컨테이너를 설치하면 된다.
복잡해 보이지만, 위 과정은 도커를 설치하면 알아서 자동으로 해주기 때문에 도커만 잘 설치하면 된다. 다음 사이트에 접속해 자신의 OS에 맞는 도커를 설치하자.
Get Docker | Docker Documentation
도커를 무사히 설치하면 도커를 GUI 환경에서 편하게 볼 수 있는 docker desktop을 사용할 수 있고, 터미널 명령어를 통해서도 도커를 사용할 수 있게 된다.
-> docker desktop
-> 터미널 명령어
이미지 pull
이제 도커를 사용하기에 앞서, 도커와 관련된 개념들을 이해해야 한다.
도커를 통해 컨테이너를 실행하는 과정은 다음과 같다.
먼저 우리가 모바일 앱을 다운받는 상황을 생각해보자.
우리는 app store
에 들어가서 앱 program
을 다운받고 이를 실행시킨다. (process)
도커 역시 비슷한 원리로 동작한다.docker hub
에서 image
를 다운받고 이를 실행시킨다. (container)
여기서 이미지는 실행시키기 전의 program에 해당하고, 이를 실행시킨 것이 컨테이너이다. 하나의 이미지에서 필요에 따라 여러 컨테이너를 실행시킬 수 있다.
docker hub에 어떤 이미지가 있는지는 다음 사이트를 통해 확인할 수 있다.
Docker Hub
여기서는 실습을 위해 아파치 서버 이미지를 다운받아 볼 것이다.
아파치 서버 이미지 이름은 httpd
로, docker hub에서 확인해 볼 수 있다.
이미지는 pull
명령어를 통해 다운받을 수 있다.
+) 참고로 docker CLI 명령어는 docker doc 사이트를 통해 확인해볼 수 있다.
Reference documentation | Docker Documentation
이제 docker desktop과 docker images 명령어를 통해 설치된 이미지 목록을 확인할 수 있다.
컨테이너 run
이제 이미지를 실행시켜서 컨테이너를 만들어보자. 이미지는 run
명령어를 통해 실행시킬 수 있다. 이 때, name
옵션을 통해 컨테이너의 이름을 붙여줘야 컨테이너를 관리하기 쉽다.
- 형식: docker run [옵션] 이미지
실행 중인 컨테이너는 docker desktop이나 ps
명령어를 통해 확인할 수 있다.
컨테이너 실행을 중단하고 싶을 때는 stop
, 다시 시작하고 싶을 때는 start
명령어를 사용한다.
컨테이너를 stop 한다고 해서 컨테이너가 삭제되는 것은 아니다. 만약, 컨테이너를 완전히 삭제하고 싶다면 rm
명령어를 사용한다.
+) 참고로 컨테이너가 stop된 상태에서만 rm을 할 수 있다.
추가적으로, 컨테이너 뿐만 아니라 이미지 역시 삭제하고 싶다면 rmi
명령어를 사용한다.
-> 위 모든 과정은 docker desktop에서도 가능하니 편한대로 동작시키면 된다.
도커 네트워크
도커의 동작 방식을 네트워크 관점에서 더 자세히 알아보자.
위 그림을 참고하여,
만약, 브라우저에서 example.com
이라는 호스트 주소에 대해 도커 컨테이너 내부에 존재하는 index.html
파일에 접근하고 싶다면 어떻게 동작해야 할까?
복잡해 보이지만 원리는 간단하다. 바로 포트 포워딩
이다.
호스트와 컨테이너 각각은 독립된 공간으로써 각각 별도의 포트 번호를 갖고 있다. 그리고, 두 격리된 공간의 포트를 이어주기만 하면 된다.
위 예시에서, http://example.com:80/index.html 라고 호스트에 요청을 보냈다면,
- example.com 은 호스트 주소
- 80은 호스트의 포트 번호
- index.html은 접근을 원하는 파일이다.
이 때, 호스트의 포트 번호 80과 컨테이너의 특정 포트 번호를 이어준다면, 컨테이너 내부 파일에 접근할 수 있다. 여기서 컨테이너 포트 번호는 http 접속에 대한 약속된 포트 번호인 80을 사용했다.
정리하자면, 다음과 같은 과정으로 index.html 파일에 접근한다.
- http://example.com:80/index.html 요청
- 호스트 포트 번호 80으로 접속
- 호스트 포트 번호 80가 연결된 컨테이너 포트 번호 80에 접속
- 컨테이너 내부의 index.html 파일에 접근
- 해당 파일 웹 브라우저에 전송
실제 포트포워딩을 컨테이너 실행 시 적용하기 위해 run 명령에 대해 -p
옵션을 사용한다. 이번에는 호스트의 포트 번호 8081과 컨테이너의 포트 번호 80을 포워딩해보자.
컨테이너가 성공적으로 실행되었다면, 아래 주소로 컨테이너가 제대로 동작는지 확인해보자.
http://localhost:8081
만약 아래와 같은 화면이 생성된다면, 포트포워딩이 성공적으로 된 것이다.
+) 아래 화면은 도커 자체에 이미 저장되어 있는 index.html 파일이다.
명령어 실행
기본적으로 터미널에서 실행하는 명령어들은 호스트를 기반으로 실행된다.
만약, 컨테이너 내부에서 명령어를 실행하고 싶다면 어떻게 해야 할까?
exec
명령어를 통해 컨테이너 내부에서 명령어를 실행할 수 있다.
- 형식: docker exec [옵션] 컨테이너, …
일반적으로 위 명령어 형식을 사용한다. 컨테이너를 bash 환경에서 명령어를 통해 제어할 수 있는 형식이다. 각 옵션에 대한 자세한 내용은 docker doc을 참고하자.
호스트와 컨테이너의 파일시스템 연결
만약 도커 컨테이너 안에 있는 파일시스템에서 작업을 하던 도중, 갑자기 컨테이너가 삭제된다면 어떻게 될까? 그동안 작업했던 내용들은 모두 물거품이 되버린다.
또한, 자유롭게 껐다 켰다 하는 것이 장점인 컨테이너 기술 특성상 컨테이너를 중지할 때마다 해당 컨테이너의 파일에 접근할 수 없다면 굉장히 불편할 것이다.
따라서, 컨테이너의 파일과 호스트의 파일을 연결한다면? 그리고 수정이 될 때마다 서로 반영된다면 얼마나 좋을까? 굳이 컨테이너에 접근할 필요 없이 호스트에서도 컨테이너 내부의 파일을 자유롭게 접근하고 수정할 수 있을 것이다.
도커에서는 위 그림처럼 컨테이너의 index.html과 호스트의 index.html을 연결할 수 있다. 실행환경은 컨테이너에게 맞기고 파일 수정은 호스트에서 편리하게 작업할 수 있다.
이제 docker run 명령어 실행 시, 호스트와 컨테이너의 파일 시스템을 연결해보자.
다른 옵션을 앞서 설명했으니, 지금은 -v
옵션에 집중하자.
이는, 호스트의 ~Desktop/htdocs 디렉토리와 컨테이너의 /usr/local/apache2/htdocs 디렉토리를 연결하겠다는 뜻이다.
실제 ~Desktop/htdocs 디렉토리에서 index.html 파일을 하나 생성해보자.
<html>
<body>
Hello, Docker!
</body>
</html>
해당 index.html 파일은 컨테이너의 /usr/local/apache2/htdocs 디렉토리에도 자동으로 반영될 것이다.
따라서, 아래 주소에 접속하면 호스트에서 수정한 파일대로 원하는 화면을 볼 수 있다.
http://localhost:8081
지금까지 도커의 간단한 기능에 대해 알아보았다.
도커의 수많은 기능들을 명령어 한 줄로 사용할 수 있게 되었으며, 더 많은 기능들은 docker doc 등 여러 자료들을 통해 쉽게 찾아볼 수 있다.
'devops > docker' 카테고리의 다른 글
[Docker] Dockerfile로 Docker에서 Spring boot 서버 실행 (0) | 2022.07.22 |
---|---|
[Docker] 도커 컨테이너에 깃랩(Gitlab) 설치 (0) | 2022.07.01 |
[Docker] Dockerfile & build (0) | 2022.06.28 |
[Docker] Docker compose (0) | 2022.06.28 |
[Docker] Docker commit & push (0) | 2022.06.28 |