Docker

Docker 입문 (on M1 Mac) : Docker, Docker Install, Docker Basic Command

졸려질려 2022. 4. 6. 14:38
반응형

본 글은 이고잉님의 "생활코딩 Docker 입구 수업"을 보면서 실제로 해보고, 그 과정을 정리해둔 글이다.
글의 순서 또한 강의 영상의 순서에 따라 정리하였고, 글의 내용은 "생활코딩 Docker 입문수업 - 4. 컨테이너 run" 까지의 내용을 정리하고 실습한 것이다.


1. Docker

 본디 Docker는 Linux OS에서 실행된다. 그렇다면 Linux OS가 아닌 Windows나 MacOS에서는 Docker를 실행할 수 없을 것이다. 물론, Window에 가상머신을 실행하여 Linux OS를 돌리는 방법도 있을테지만, VM과 같은 가상머신을 따로 설치하고 구축하려면 불편하고 시간도 오래 걸리게 된다. 그러나 걱정할 필요 없다. Docker는 Window나 Mac OS에서 자동으로 Linux 가상 머신을 구축하고, 그 위에 Container들이 돌아갈 수 있도록 설정해준다. 물론 Linux OS에서 Docker를 돌릴 때보다는 낮은 효율을 얻게 될 것이다. 그래도 Docker가 인기 있는 이유는 그 외에 편의성이 어마어마하기 때문일 것이다.


2. Docker Install

Docker Desktop은 공식 홈페이지에서 설치하는 방법과 Homebrew를 통해 설치하는 방법이 있다. 주로 Homebrew를 사용해서 많은 툴들을 설치해왔는데, 이번 Docker는 공홈에서 설치하는 방법을 따라가보고자 한다.

1. docker.com -> [Developers] -> [Docs] -> [Download and install]

2. Docker Desktop 설치 (dmg 설치)

설치 가이드 문서에 따르면, M1 Mac과 같이 Apple Chip Mac에서 Rosetta2를 무조건 설치할 필요는 없어졌으나, 여전히 Rosetta2가 필요한 몇가지 명령 줄 툴이 있다고 한다. 혹시 모르니 아래 코드 한번 실행해주는 것도 괜찮을 것 같다.

3. Docker.dmg 실행 -> Docker 아이콘을 Applications로 드래그

4. Docker Desktop 실행 ("응용 프로그램" 폴더에서 실행 or Spotlight로 실행)

Spotlight -> Docker 실행
설치 후 Docker Desktop의 모습
터미널로 잘 설치되었는지 확인하는 방법


3. Docker Image Pull

 Docker Image를 Pull 한다는 것은 Container를 가지고 있는 Image를 Docker Hub에서 다운 받는 것을 의미한다. 그리고 Image에서 Container를 활성화 시키는 것을 Run 이라 한다. 우선 Docker Hub에서 Image를 Pull 해보자.

Docker Hub -> [Explore]

다양한 Docker Image들을 볼 수 있고, 이 중에서 Apache Webserver가 구축된 Image를 찾아보자. 검색창에 "Apache WebServer" 라고 검색해도 되는데, 공식적인 이름은 "httpd" 이다.

Official image : Docker에서 공식적으로 관리하는 Image

위 사진에 나온 httpd를 클릭하면 사용에 대한 매뉴얼이 나오게 되고, Image를 Pull 하는 명령어도 볼 수 있다. Terminal 창에서 "docker pull httpd" 를 입력하면 httpd image가 pull 된다. Pull이 끝난 후에 Image를 잘 가지고 있는지 확인하는 방법은 두 가지가 있다. Terminal에서 "docker images" 명령어를 통해 확인하는 방법이 있고, 아까 다운로드 받았던 Docker Desktop에서 확인하는 방법이 있다.

Pull Image : docker pull httpd
Check Image : docker images in Terminal
Check Image : Docker Desktop -> [Images]


4. Container Run

Container가 있는 Image를 잘 받았다면, 이번엔 Container를 실행(Run) 시켜보자.
Docker Desktop의 로컬 Image 목록에서 httpd를 찾아서 커서를 올려두면, 오른쪽 끝에 RUN 버튼이 나타난다.

Docker Desktop -> [Images] -> httpd [RUN]
[RUN] 을 클릭하면 나오는 팝업 -> [Optional Settings] 클릭
[Optional Settings] -> [Container Name] : ws1 입력 -> [Run] 클릭
ws1 Container가 활성화(Run)되어 있는 모습

httpd Container를 Run 했다면, 이번에는 Container 내부에서 어떻게 돌아가고 있는지 보고 싶을 것이다. 방법은 간단하다. 위 사진에 보이는 ws1을 클릭하면 된다.

내부를 보고싶은 Container 클릭

Container를 클릭하면 위와 같이 Container에서 출력하는 로그들을 볼 수 있다. 우측 상단에 [INSPECT], [STATS]를 클릭하여 현재 Container에 대한 전반적인 정보를 볼 수 있다. [STATS]에 들어가보면, "CPU USAGE", "MEMORY USAGE", "DISK READ/WRITE", "NETWORK I/O" 를 볼 수 있는데, 이와 같은 자원들은 모두 호스트 PC의 자원을 사용하는 것이다. 따라서 계속 켜두게 된다면 해당 자원이 계속 사용되는 중인 것이기 때문에, Container를 사용하지 않을 때는 잠시 꺼두는 것이 좋을 것이다. 그럴 때는 우측 상단에 익숙한 정지 버튼 모양을 클릭하면 된다.

Container - [STATS]

# Container Run in Terminal

이번에는 Docker Desktop이 아닌, Termianl 명령어로 Docker Container Run을 해보자.

Docker Run 명령어의 기본 구조는 다음과 같다.

 docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

여러 터미널을 사용하여 "docker run" 명령어를 사용해보자.

docker run httpd

 우선, "docker run httpd" 명령어를 실행한다. 그러면 위 사진처럼 run을 하고, 해당 로그들이 출력되는 것을 볼 수 있다.

docker ps

"docker ps" 명령어를 실행하면, 실행한 Container들의 정보를 나열하여 보여준다. 아무런 옵션 없이 "docker run httpd"를 실행했기 때문에, NAMES 칼럼의 값이 임의의 문자열로 들어간 것을 볼 수 있다. 이어서, 하나의 Docker Image는 여러 개의 Container를 만들 수 있기도 하다. 이번에는 같은 Image의 추가 Container를 생성해본다.

docker run --name ws2 httpd

이번에는 단순히 Run 하는 것이 아니라, name 옵션을 통해 임의의 NAME이 아닌 원하는 이름이 설정되도록 하였다.

docker run --name ws2 httpd // httpd의 이미지를 ws2라는 이름의 Container로 실행시키겠다.

docker ps

추가로 Container를 실행시킨 후에 Container 목록을 보면, 2개의 Container가 UP 상태인 것을 확인할 수 있다. 그리고 NAMES 칼럼을 보면 추가로 생성한 ws2 라는 이름의 Container가 있는 것도 확인할 수 있다.

Run이 있다면 Stop도 필요할 것이다. 아까도 언급했듯이, Container를 실행한다는 것은 호스트의 자원을 사용한다는 걸 뜻한다. 그래서 적재적소에 원하는 Container만 실행을 하고, 필요 없는 Container는 중지를 시키는 것이 좋다.

# Container Stop in Terminal

docker stop [NAMES or CONTAINER_ID]

"docker stop ws2" 명령어를 통해 ws2 라는 이름의 Container를 중지시켰다. ws2 Container의 실행 로그는 위 사진의 터미널 분할화면 중 가운데에서 출력되고 있었다. "docker stop ws2"를 맨 아래 분할 터미널에서 실행하자, 중간의 분할 터미널에서 보여주던 ws2 Container의 로그가 중단되는 것을 볼 수 있다. 더 정확히 알아보기 위해 "docker ps" 명령어를 실행해보자.

docker ps -a

위 사진을 보면 "docker ps"만 실행했을 때, ws2 Container의 정보가 출력되지 않은 것을 볼 수 있다. 이렇게만 보면 Container가 중지를 시키긴 했는데, 이게 삭제된 것인지? 아니면 잠깐 다른 곳에 있는 것인지? 궁금할 것이다. 그럴 때는 "docker ps -a" 명령어를 실행한다. "-a" 옵션을 통해 생성된 모든 Container들의 목록을 볼 수 있다.

# Container Start and Logs

이번에는 Stop한 Container를 다시 Start 하는 것을 터미널로 해보자. 명령어는 간단하다.

docker start ws2

"docker start ws2" 를 하면 ws2가 출력되고, 끝이다. 아마 처음 Run 했을 때 출력되는 로그가 나오길 바랄 수도 있다. 그럴 때는 로그를 출력해주는 명령어를 입력한다. "docker logs" 명령어를 사용한다.

docker logs ws2

 

docker logs ws2

docker stop 명령어를 사용하는 것처럼 docker start(logs) 뒤에 Container의 이름이나 ID 값을 같이 넣어주면 된다. 그런데 여기서 "docker logs ws2" 명령어를 입력했을 때, 현재 로그만 출력이 되고 마무리된다. 실시간으로 로그를 보고 싶다면 "-f" 옵션을 넣어주면 된다. "docker logs -f ws2" 명령어를 사용한다.

docker logs -f ws2

# Remove Container in Terminal

Stop 명령어는 Container를 멈추기만 할 뿐, 삭제까지 하지 않는다. 만약 Container를 삭제하고 싶다면 터미널에서 어떤 명령어를 쓰면 될까? "docker rm" 명령어를 사용하면 된다. 특정 Container를 지정하는 인자값은 위에서처럼 Container id나 Name을 쓰면 된다.

docker rm ws2

실행 중인 Container 'ws2'를 삭제하는 명령어를 입력하면 위 사진처럼 에러가 출력된다. 즉, 실행 중인 Container는 바로 삭제할 수 없다는 뜻이다. 그렇다면 아까 사용했던 stop 명령어를 먼저 쓰고, 삭제를 하도록 하자.

docker stop -> docker rm

만약 stop이 귀찮아서 한방에 삭제하고 싶다면, "docker rm --force" 명령어를 사용하면 된다.

# Remove Image

마지막으로 Docker Image를 삭제하는 방법이다. Image를 삭제하는 것도 Docker Desktop을 사용해도 되고, Terminal에서 해도 된다. 먼저, Docker Desktop 에서는 [Images]에서 삭제하고자 하는 Image의 [RUN] 옆에 옵션 버튼을 이용하면 된다.

Docker Desktop -> [Images] -> [Remove]

터미널에서 Image를 삭제할 때는 "docker rmi" 명령어를 사용한다. rmi 명령어도 rm 명령어와 같이 해당 Image를 실행 중인 Container가 있을 경우 정상적으로 작동하지 않는다.

"docker rm" 명령어를 수행했던 것처럼, httpd 이미지를 사용하는 생성된 Container 들을 모두 제거해주고 마지막에 Image를 제거하도록 하자.

반응형

'Docker' 카테고리의 다른 글

Docker 입문 (on M1 Mac) : Network, Command, FileSystem  (0) 2022.04.07