요즘 도커에 대해서 계속 공부중인데, 정말 강력하고 사용이 쉬운 것 같다. 그리고 맥북을 쓰면서 터미널도 많이 써서 그런지 도커를 터미널에서 관리하니까 더 사용하기 쉬운 것 같다. 나중에 윈도우에서 사용할 수도 있으므로 나중엔 삼성 노트북으로 윈도우 환경에서도 도커를 사용해봐야지.
도커 - foreground & background
도커의 명령어에 다른 것을 붙이지 않으면 기본적으로 foreground에서 돌아간다.
docker run -p 8080:80 httpd
이렇게 포트포워딩을 하여 httpd를 실행하는 경우
다음과 같은 상태가 되어, 명령어를 사용할 수 없는 상황이 된다.
반면, docker run -d -p 8080:80 httpd를 실행하게 되면
이 상태로, 명령어를 계속 입력할 수 있다. 첫 번째 경우가 Foreground, 두 번째 경우가 Background이다.
이 둘의 차이점을 간단하게 보면
- Foreground : 프로세스가 터미널 점유, 사용자와 직접 상호작용. 명령어 입력한 터미널에서 프로세스 출력(로그, 에러메시지 등), 다른 명령어는 프로세스 중지(ctrl + c) 한 다음 가능
- Background : 프로세스가 터미널 뒤에서 실행. 터미널 점유하지 않으며, 다른 명령어 자유롭게 입력 가능. 백그라운드 프로세스는 터미널 꺼도 계속 실행(데몬 프로그램이 실행중이어야 함)
이며, Foreground는 위와 같은 특성 때문에 주로 쓰이는 곳이
- 디버깅 - 로그를 실시간으로 확인하면서 오류를 추적하거나 동작을 확인해야 하는 경우
- 간단한 테스트 - 특정 명령어를 컨테이너 내에서 실행하고 바로 결과 확인
- 대화형 쉘 : 컨테이너 내에서 쉘 실행, 직접 명령어 입력하며 상호작용하는 경우
위 경우들이다. 추가로 백그라운드에서 로그를 확인하고 싶은 경우
docker logs cont_id
를 입력하면 백그라운드 로그도 확인이 가능하다.
도커 - 실행중인 컨테이너에서 명령어 사용
이 경우는 두 가지로 나뉘는데 OS처럼, 데몬 프로세스가 없는 프로그램과 데몬 프로세스가 있는 프로그램으로 나뉜다.
간단하게 설명하자면 데몬 프로세스가 없는 경우 컨테이너를 실행하면 바로 종료되고, 데몬 프로세스가 있는 경우 컨테이너를 실행하면 백그라운드에서 데몬 프로세스가 계속 돌아서 실행이 유지된다.
데몬 프로세스가 없는 경우(OS ubuntu)
OS의 경우 컨테이너 실행하자마자 바로 종료되므로 background에서 bash를 계속 돌려주면 실행이 유지된다.
docker run -dit ubuntu bash # background에서 bash 실행
docker attach cont_id # 컨테이너에 접근하여 실행중인 bash 명령어 사용
위 명령어를 실행하게 되면,
다음과 같이 명령어 사용이 가능하며, exit로 bash를 종료할 수 있다. 이때 컨테이너도 종료되게 되는데, 다음 경우 뒤에 비교해보겠다.
데몬 프로세스가 있는 경우(httpd)
위 경우에는 attach를 사용하는 것이 아니라, 이미 -d를 이용해 백그라운드에서 실행중이므로 exec -it 명령어를 사용해야 한다. exec는 execute의 줄임말로, 실행한다는 의미를 가지고 있다.
docker run -d -p 8080:80 httpd # httpd를 백그라운드에서 실행
docker exec -it cont_id bash # 컨테이너에 접근하여 bash 실행
위 경우와 같이 처음에 -d를 이용하여 백그라운드에서 실행하고, exec -it를 사용하여 접근하고 bash를 실행한다.
-it는 -i(interactive), -t(tty)의 기능을 합친 것으로 가상 터미널을 할당하여 입력이 가능하게 하는 것이다.
위 이미지를 보면 명령어를 실행하는 것을 볼 수 있는데, exit를 사용하여 bash를 껐음에도 계속 실행중인 것을 볼 수 있다. OS의 경우와 다른 이유는 무엇일까?
백그라운드에서 bash가 돌고 있다 vs 백그라운드에서 apache 서버가 돌고 있다
- OS의 경우에는, 원래 실행하면 바로 종료되기 때문에 docker run -dit ubuntu bash 코드를 사용하여 백그라운드에서 bash를 실행시킨다. 따라서 bash를 종료하면 백그라운드의 bash가 종료되어 지속 실행되는 프로그램이 없어 바로 종료되는 것이다.
- 데몬 프로세스가 있는 httpd의 경우는 실행시킨 시점에 백그라운드에서 apache서버가 돌고 있어서 bash를 종료해도 백그라운드에서 apache 서버가 지속 실행되고 있어 종료되지 않는 것이다.
따라서 도커 컨테이너를 사용할 경우에 어떤 프로그램이 백그라운드에서 돌아가고 있는지 알고 있다면 훨씬 수월하다.
+
docker run -dit -p 8080:80 httpd
docker attach cont_id
위 경우 실행된 httpd의 컨테이너가 종료되는데, 찾아봐도 명확한 이유는 잘 안나와있다.
도커 - 볼륨
-v 명령어는 컨테이너에 볼륨(Volume)을 마운트하기 위한 옵션이다. 볼륨은 컨테이너와 호스트 간에 데이터를 공유하거나 컨테이너의 데이터를 지속적으로 유지하기 위해 사용된다.
docker run -v <호스트 경로>:<컨테이너 경로> <이미지 이름>
docker run -v /host/data:/container/data ubuntu
위 코드와 같으며, 호스트 경로 /host/data의 데이터를 컨테이너 경로 /container/data에 마운트하며 컨테이너 내부에서 /container/data를 통해 호스트 데이터에 접근 가능하다.
따라서 로컬에 폴더를 만들고 httpd를 실행했을때 그 폴더로 마운트하도록 볼륨을 하면
다음과 같은 화면을 출력이 가능하다.
도커 - commit / push
도커도 git과 비슷하게 commit과 push가 가능하다.
먼저 docker hub에 로그인한 다음, repository를 하나 생성해야한다.
다음과 같이 test라는 repository를 생성했고, 오른쪽에 docker commands에 이 repository로 push할 수 있는 코드가 나와있다.
ubuntu에서 간단하게 hello라는 파일을 만들어서 안에 Hello world라는 문장을 입력해보았다.
위와 같이 파일을 실행하면 Hello World라는 글이 나타나게 되는데, 이 이미지를 commit 한 후에 push해보면
Push가 완료 된 것을 볼 수 있으며, repository로 가보면
위와 같이 1.1 버전의 이름으로 올라간 것을 볼 수 있다. 만약 이 이미지를 다운받아서 사용하고 싶을 경우에는 오른쪽의 copy를 사용하여 pull이 가능한데, 원래 있던 이미지를 삭제하고 다시 pull 해보면
위와 같이 다운받아지고 원래 파일 그대로 있음을 확인할 수 있다. 그래서 이 방법으로 도커 허브에 배포를 진행하는 것인가 했는데, 그렇지는 않다고 한다. 문제점은 크게 세가지로,
- 변경 사항 추적 어려움
docker commit으로 생성된 이미지는 변경 사항이 명확하지 않아, 팀 협업이나 유지보수에 어려움을 준다. - 자동화 부족
수동으로 변경 작업을 진행하기 때문에 재현 가능성이 떨어지고, CI/CD 파이프라인과의 연계가 어렵다. - 일관성 문제
동일한 환경에서 이미지를 생성하기 어렵고, 작은 실수도 배포 환경에 영향을 미칠 수 있다.
위와 같으며 실제로 배포를 진행 할 경우에는
- Dockerfile을 작성
- 이미지를 빌드하고 푸시
- CI/CD 파이프라인 사용
와 같은 순서로 진행된다고 한다. commit과 push는 git과 비슷해서 사용이 편리하여 좋은 것 같다.
다음에는 dockerfile에 대해서 공부해볼 예정이다. 가장 중요한 만큼 더 꼼꼼하게 알아보고 공부해야겠다. Docker 공부가 끝나고 나면 쿠버네티스로 넘어가서 Container Orchestration에 대해서도 공부해봐야지. 내일도, 다음주도 화이팅
'공부노트' 카테고리의 다른 글
1/2, 스물 아홉 번째 날의 TIL (5) | 2025.01.02 |
---|---|
12/30, 스물 여섯 번째 날의 TIL(Dockerfile) (3) | 2024.12.30 |
12/26, 스물 네 번째 날의 TIL(도커) (3) | 2024.12.26 |
12/24, 스물 두 번째 날의 TIL(도커) (4) | 2024.12.24 |
12/23, 스물 한 번째 날의 TIL(NLP) (6) | 2024.12.24 |