10주차 수요일, 48일차 Today I Learned
Docker, K8s (3)
: Docker 명령어, Volume, cleanup, Multi-container로 구성된 소프트웨어 실행
✏️ 학습 내용
1. Docker 명령어 정리
1) Image 관련 명령어
# 빌드하기 (애플칩으로 만들어진 맥에서 리눅스 소프트웨어 빌드 시에 플랫폼 구문 지정 필요)
docker build --platform=linux/amd64 -t {name}/{name}
# 로컬에 저장된 이미지 리스트
docker images
docker image ls
# 이미지 삭제
docker rmi {이미지}
docker image rm {이미지}
2) Docker Hub 관련 명령어
docker login -u {사용자 ID} -p {사용자 pw} # 로그인
docker pull {name}/{name} # 다운로드 (hub to local)
docker push {name}/{name} # 업로드 (local to hub)
3) Container 관련 명령어
docker create
docker run --name -p -v {이미지}
docker ps
docker ps -a
docker ps -q
docker stop {컨테이너}
docker start {컨테이너}
docker restart {컨테이너}
docker kill {컨테이너}
docker pause {컨테이너}
docker unpause {컨테이너}
docker rm {컨테이너}
4) Container logs 명령어 - 컨테이너 안에서 실행되는 것들 확인
docker logs -f {컨테이너}
docker logs --tail 100 {컨테이너}
5) exec 명령어
docker run --name=hangman {name}/{name}
docker exec hangman cat /etc/hosts
6) Container detach & attach
docker run {name}
docker run -d {name}
docker attach {컨테이너}
2. Docker Volume
Docker Container가 실행되었다가 중단되면 데이터들은 유실된다. 그래서 재실행을 하여도 이전에 수정했던 데이터가 남아있지 않게 된다. 특정 소프트웨어가 컨테이너를 통해 1회성으로 동작하는 것이 아니라 계속해서 동작해야 한다면 데이터가 영구적으로 보관되어 있어야 하는데, 이를 보장하는 기능이 바로 Docker Volume이다.
이를 위해 컨테이너 내의 가상 파일 시스템과 호스트 시스템의 파일 시스템을 맵핑한다면 된다. 컨테이너와 호스트 시스템이 특정 폴더를 공유하게 되어 컨테이너가 사라지더라도 데이터는 남게 되는 것이다. 즉, 호스트 파일 시스템 폴더를 Docker Container 파일 시스템의 폴더로 마운트하는 것을 Docker Volume이라고 할 수 있다.
마운트란, 디스크와 같은 물리적인 장치를 파일 시스템의 특정 위치(폴더)에 연결해주는 것을 말한다.
Docker Volume 타입
- Host Volues
- Anonymous Volumes
- Named Volumes
Named Volumes가 가장 선호되는 방식으로, docker run -v를 실행할 때 이름과 컨테이너 패스를 지정한다. 하나의 볼륨을 다수의 컨테이너에서 공유하는 것도 가능하게 해준다.
이미지 생성 시에 Dockerfile에 입력해도 되지만, docker-compose를 통해 Docker Volume을 사용한다.
docker volume ls
docker volume rm
docker volume prune
docker volume inspect
3. 다수의 컨테이너로 구성된 소프트웨어 실행 (Docker compose 사용 전)
우선 Docker 환경을 클린업하는 방법에 대해 배우겠다. 클린업 방법은 커맨드라인을 이용하거나 Docker Desktop을 이용하는 두 가지 방법이 있다. 후자의 경우가 더 직관적이다.
클린업을 위해서는 컨테이너를 삭제하고 이미지를 삭제해야 한다. rm 명령어 뒤에 ID를 개별적으로 추가해서 삭제할 수도 있지만, 한 번에 실행하는 것이 좋으므로 -f 옵션을 통해 -aq, -q 옵션을 주어 한 번에 삭제를 진행하면 된다.
# 커맨드라인에서 클린업하기
# 1) 컨테이너 삭제
docker container rm -f $(docker container ls -aq)
# 2) 이미지 삭제
docker image rm -f $(docker image ls -q)
# 3) 삭제되었는지 확인하기
docker ps
docker images
데스크탑에서는 Troubleshoot 메뉴에 접속하여 [Clean / Purge data] 버튼만 클릭하면 클린업이 진행된다.
Docker에서 제공해주는 예제 프로그램인 'Voting application'은 고양이와 개 중에 하나를 선택하여 투표하는 기능의 애플리케이션이다. voting, result, in-memory db, db, worker 5가지의 컨테이너로 구성되어 있다.
이 프로그램을 실행할 예정이다. 컨테이너를 하나씩 실행하면 각 컴포넌트 간의 네트워크 연결이 안 된다. 따라서 Docker에서 네트워크와 관련된 기능을 사용해야 한다. 하나의 네트워크를 만들고 모든 컨테이너들을 이 네트워크 안으로 지정하면 된다. (연결 상황에 따라서 별개의 네트워크를 만들고 사용할 수도 있는데, 이는 내일 진행해볼 것이다.)
# 1) git clone 후 폴더 이동
# 2) 새 네트워크 생성
docker network create mynetwork
# 3) 컨테이너 실행
docker run -d --name=redis --network mynetwork redis
docker run -d --name=db -e POSTGRES_PASSWORD=password --network mynetwork postgres
docker run -d --name=vote -p 5001:80 --network mynetwork vote
docker run -d --name=result -p 5002:80 --network mynetwork result
docker run -d --name=worker --network mynetwork worker
💡 배운 점
- Docker 명령어에 관해 정리하였다.
- Docker Volume에 대해 새로 배웠다.
- Docker compose에 대해 배우기 시작했다.
- 다수의 컨테이너로 구성된 소프트웨어를 실행하고, 이를 네트워크로 연결하였다.
- 클린업을 실습해보았다.
☁️ 소감
Docker compose에 대해 중점적으로 배웠다. 나름 배우기 수월했다. 다만 클린업을 할 때, 불안할 것 같지만 그래도 사용 중인 것들은 삭제되지 않을 테고, 삭제되어도 다시 만들면 되니까 괜찮겠지 싶었다. 그래도 클린업의 주의사항에 대해서는 더 살펴보면 좋을 것 같다.
어제 배운 내용에서 나오지 않았던 퀴즈 리뷰가 나와서 당황스러웠다. 지난 기수는 퀴즈가 별도로 있었나보다. 2기라고 반복하면서도 아직 몇 개월 지나지 않았는데도 깜빡하고 챙겨주지 않는 부분이 너무 많고 잦다보니까 해당 데브코스 운영에 대해서 실망스러웠다.