이 글에서는 Docker 명령어를 실습해 보며 Docker에 대한 이해를 깊이 있게 넓혀간다.


Docker가 무엇인지 아직 모른다면 

2024.09.04 - [Programming/Docker] - Docker란?

 

Docker란?

최근에 MLOps를 공부하면서 Kubernetes에 학습하는데 뭔가 이해가 완벽히 되지 않았다. Base가 되는 Docker를 제대로 모르고 있어서 그렇다고 생각을 하고 Docker 에 대해 정리를 해본다. Docker를 정확히

dream2reality.tistory.com

 

⚙️ Docker 설치

Docker 홈페이지에서 자신이 사용하는 OS에 맞게 선택하여 설치.

Windows나 MacOS에서는 Docker Desktop이 설치가 된다.

 

Docker Desktop이 실행이 잘된다면 설치가 완료.

 

 

Linux환경에서는 Terminal → `sudo docker images` 명령어를 통해 확인할 수 있다. 아래와 같이 출력되면 설치가 정상적으로 된 것이다. (windows나 macOS는 cmd에서 `docker images` 명령어 실행)

REPOSITORY                    TAG       IMAGE ID       CREATED        SIZE

 

🖼️ Docker Image Pull

우리가 App store에서 program을 다운 받아 실행하면 process가 동작하게 된다. Docker에서도 이처럼 Docker hub에서 image를 다운 받아 실행하면 container로 동작한다.

 

`Pull` : Docker hub에서 image를 다운

`Run` : Image를 실행. (실행하면 image가 container가 된다.)

 

docker hub에서 image들을 볼 수가 있다. 이 중에서 httpd를 pull 해본다.

 

 

이때 명령어는 아래와 같이 입력하면 된다. docker image pull 명령어에서 자세히 확인해 볼 수 있다.

docker pull httpd

 

명령어를 실행하면 이미지를 가져오는 것을 볼 수 있으며 `docker images` 명령을 실행하면 처음과 다르게 이미지가 추가된 것을 볼 수 있다.

REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
httpd        latest    a49fd2c04c02   6 weeks ago   148MB

 

 

📦 Docker Container Run

이제 docker hub에서 받은 image를 실행시켜 본다.

docker container run 명령어에서 자세히 확인할 수 있으며 아래와 같이 명령어를 입력해 준다.

 

docker run httpd

log가 출력되며 정상적으로 실행되는 것을 볼 수 있다. 다른 Cmd 창을 열어 `docker ps` 를 실행하면 현재 실행 중인 container들이 출력된다.

 

CONTAINER ID   IMAGE     COMMAND              CREATED         STATUS         PORTS     NAMES
f79ee26dc95e   httpd     "httpd-foreground"   9 seconds ago   Up 8 seconds   80/tcp    pensive_einstein

 

여기서 NAMES가 임의로 설정이 되었는데 `--name` 태그를 통해 NAMES를 설정할 수 있다.

docker run --name web-server httpd
CONTAINER ID   IMAGE     COMMAND              CREATED         STATUS         PORTS     NAMES
a1b01e05094f   httpd     "httpd-foreground"   3 seconds ago   Up 2 seconds   80/tcp    web-server
f79ee26dc95e   httpd     "httpd-foreground"   3 minutes ago   Up 3 minutes   80/tcp    pensive_einstein

 

 

실행중인 container를 멈추려면 아래와 같이 `docker stop` 명령어 뒤에 NAMES나 CONTAINER ID를 입력해 주면 된다.

docker stop a1b01e05094f
docker stop pensive_einstein

 

이렇게 멈춘 container는 `docker ps -a` 를 통해 볼 수 있다. 다시 실행하려면 `docker start` 명령어를 사용한다. 하지만 이럴 경우에 log가 보이지 않는다. Log를 보려면 `docker logs -f` 를 사용한다.

 

docker start a1b01e05094f
docker start pensive_einstein

docker logs -f web-server

 

docker container를 삭제하려면 container의 실행을 멈춰야 한다. 하지만 `docker rm --force [CONTAINER]` 를 통해 바로 삭제할 수 있다. docker image를 삭제하고 싶을 때는 `docker rmi [IMAGE]` 를 사용하면 된다.

 

 

🌐 Docker Network

아래 이미지를 통해 docker network를 이해할 수 있다. 우선 Docker image를 실행하면 Container로 동작하게 된다. 이때 docker image를 실행한 곳을 Host라고 칭한다. (Host안에서 container는 여러 개 가 존재할 수 있다.) 외부에서 80번 포트로 접속을 하려면 Host와 Container의 포트를 Port forwarding 해줘야 한다. 이를 수행하려면 `docker run -p 80:80 httpd` 명령을 입력하면 된다.

 

만약 아래 명령어를 통해 container를 실행하면 http://localhost:8080/index.html 에 접속.

docker run -p 8080:80 httpd

정상적으로 접속된 것을 볼 수 있다. 또한 cmd 창에서 접속 log를 볼 수 있다.

 

 

💬 Command 실행

실행 중인 container 내부에서 명령어를 실행하고 싶으면 `docker exec` 명령어를 사용한다. `-it` 태그를 사용하지 않으면 container와 지속적으로 연결이 되지 않는다. (이때 Container는 port forwarding을 진행한 container로 사용)

docker exec -it [Container] /bin/bash

 

위 명령어를 실행하면 해당 container에서 명령어를 실행할 수 있다. 여기서 `index.html`을 수정하여 웹페이지 내용을 수정할 수 있다. 우선, Docker hub에서 httpd의 document를 참고하여 아래 경로로 이동한다.

 

 

PS C:\Users\X299> docker exec -it charming_leakey /bin/bash
root@17416efdd9c8:/usr/local/apache2# cd /usr/local/apache2/htdocs

 

이후에는 nano 에디터를 설치해 수정을 한다.

apt update
apt install nano
nano index.html

 

 

🗃️ Host와 Container 파일 시스템 연결

위의 방법처럼 직접 Container에서 내용을 수정하면 Container가 삭제되었을 때 변경 사항이 모두 날아간다. 또한, Container를 생성하는 목적은 언제든지 손쉽게 생성하고 삭제하기 위함이기 때문에 Host와 Container의 파일 시스템을 연결시켜 이를 방지한다.

 

 

이렇게 하면 작업하기도 편하다. 수정은 host에서 진행하고 실행은 container에서.

우선 사용하는 에디터를 열어 간단한 index.html 파일을 생성해 준다.

 

 

 

이후에 해당 index.html과 container의 index.html을 연결해 준다. (windows의 파일 시스템 특성상.\htdocs다. Linux나 MacOS에서는./htdocs로)

 

docker run -p 8888:80 -v .\htdocs:/usr/local/apache2/htdocs/ httpd

 

이렇게 하면 두 폴더가 연결이 되면서 Host에서 내용을 수정하면 바로 반영이 되는 것을 볼 수 있다.

 

📃 참고 자료

https://opentutorials.org/course/4781

'Programming > Docker' 카테고리의 다른 글

Docker 이미지 공유하기  (1) 2024.10.01
Docker 이미지 만들기  (3) 2024.09.30
Docker란?  (0) 2024.09.04
딥러닝 개발용 Docker 이미지 생성  (0) 2023.12.29