[DevOps] Docker 실습

나무나무·2025년 8월 29일

DevOps

목록 보기
3/5

1. 도커 설치

  • 도커 사용 시 → 시스템 > 정보 에서 윈도우 버전 확인하기(WSL 2 기능 지원하는지?)
  • WSL(Window Subsystem for Linux)
    • 윈도우즈에서 경량 가상화 기술을 써서 리눅스
  • 가상화 ‘사용’으로 되어 있는지 확인
  • https://www.docker.com/products/docker-desktop/ 에서 도커 다운

WSL(Window Subsystem for Linux)
- 윈도우에서 경량 가상화 기술을 이용해 리눅스 구동을 돕는 기능
- 가상 머신을 사용하는 것보다 빠르게 윈도우 환경에서 리눅스 환경을 구축할 수 있음


2. 이미지 실습

2-1) 이미지 검색

  • 컨테이너 생성 전 필요한 이미지 확인
  • https://hub.docker.com 에서 확인
  • docker search [키워드] 명령어로 이미지 조회 가능
  • 필자는 tomcat 이미지를 Docker 홈페이지에서 다운 받을 예정
  • 공식 사이트에서 올린 이미지는 OFFICIAL이라는 키워드에 [OK]라고 붙어 있음

2-2) 이미지 다운

  • docker pull [이름] 으로 도커 이미지 다운
  • tag를 추가하지 않으면 자동으로 latest image가 다운됨
  • docker images → 다운 받은 이미지들 확인
  • docker image inspect [이미지명] [Tag] or docker image inspect [이미지 ID] → 특정 이미지에 대한 상세 정보 확인
  • Cmd : 명령어 → 이미지를 가지고 컨테이너 생성 시 가장 먼저 실행될 명령어 catalina.sh run 방식으로 실행됨

2-3) 이미지 저장

  • docker save -o ./[저장할 이름] [저장할 이미지] → 도커 이미지 파일 로컬에 저장
  • docker load -i .\redis_image → 파일로 저장된 이미지를 load 하기

2-4) 이미지 삭제

  • docker rmi [이미지 이름] → 도커 이미지 삭제
  • docker tag [기존 이미지명] [새로운 이름] → 이미지 아이디는 동일하지만 부르는 이름만 다른 셈
  • tag로 이름 붙인 이미지는 ID로 삭제할 수 없음. 이름으로 따로 따로 삭제해주어야 함


3. 컨테이너 실습

3-1) 컨테이너 생성 & 실행

  • docker run 으로 컨테이너 생성 → 실행, 이미지가 없으면 먼저 다운 받은 다음에 실행함
  • docker ps : 현재 실행 중인 컨테이너 확인
  • Tomcat을 종료할 경우, 컨테이너도 같이 종료됨. → 컨테이너는 애플리케이션 단위로 가상화 되기 때문
  • docker run --name [원하는 이름] [이미지 이름] : 컨테이너 실행

3-2) 컨테이너 삭제

  • docker stop [컨테이너 이름] : 현재 실행중인 컨테이너는 삭제 불가 -> 어지간해선 종료하고 지우자
  • force remove로 삭제할 수는 있음(-f)

3-3) 컨테이너 실행 모드

  • attach 모드
    foreGround 에서 실행
  • detach 모드
    우리에게 보이지 않게 백그라운드에서 실행 → 현재 터미널에서 분리되어 실행
    터미널에서 애플리케이션 실행하는 Attach 모드(Foreground 실행)과 달리 프롬프트가 바로 돌아옴 → docker ps -a 로 확인할 경우 실행중임을 확인할 수 있음

3-4) 포트 포워딩 설정

  • 외부 접속을 위해선 포트 포워딩을 해주어야 함
  • localhost:8080으로 접속하기 위해선 호스트의 특정 포트를 열어서 컨테이너에 연결해주어야 한다.
  • docker run -p [호스트포트]:[컨테이너포트] 이미지이름
  • ex) 8080:80 인 경우, 호스트(내 컴퓨터)의 8080번 포트로 접속 시 → Docker가 이 요청을 컨테이너 내부의 80번 포트로 전달해줌

3-5) 컨테이너 실행

  • docker exec [컨테이너 이름] [명령어] → 컨테이너에 접근 / 이미 실행중인 컨테이너에 새로운 명령어 실행
  • 사용자와 컨테이너 사이 상호 입출력 → -i
  • 상호 입출력은 터미널을 통해서 사용 → -t
  • docker exec -it tomcat_10.1.39 /bin/bash → 가상의 터미널을 생성해 컨테이너와 상호 입출력 하겠다 → 터미널 지정 했으니 컨테이너 내부에서 셀 프로그램 실행하겠다 → bin/bash shell로 입력하겠다-
  • 톰캣 서버 시작 시 webapps디렉토리에 있는 모든 앱을 자동으로 배포, 실행함
  • 기존의 webapps를 삭제한 뒤, webapps.dist 이름을 webapps으로 변경
  • docker run -it --name alpine-linux alpine:latestalpine 리눅스 실행
  • 실행 시 바로 shell이 터미널과 연결되도록 -it로 실행.
  • shell 실행 되어도 터미널과 연결되어 있지 않을 경우 컨테이너가 죽음 → 터미널이 종료된 상태로 간주, 프로그램 종료 → 컨테이너 종료


4. 로그 확인

  • docker logs [컨테이너 이름]
  • docker logs -t [컨테이너 이름] → timestamp도 찍힘
  • docker logs -t --tail 20 [컨테이너 이름] → 마지막 20줄만 출력
  • docker logs -t -f --tail 20 [컨테이너 이름] → 실시간 로그 확인


5. 도커 볼륨 설정

  • docker volume create [생성할 볼륨 이름] : 도커 볼륨 생성 명령어 -> 볼륨은 호스트에 저장되는 저장소
  • docker run -v [볼륨 이름]:[컨테이너 내부 디렉토리 경로] --name [컨테이너 이름] [이미지 이름] : 생성한 볼륨을 컨테이너 내부에 있는 디렉토리랑 연결 -> 컨테이너에서 해당 디렉토리에 저장된 내용은 볼륨에 저장됨 -> 컨테이너 삭제 후 해당 볼륨 내 데이터는 남아있음
  • docker volume ls : 현재 생성된 볼륨 목록 확인
  • docker volume inspect [볼륨 이름] : 볼륨 상세 정보 확인 (실제 경로 포함)
  • docker volume rm [볼륨 이름] : 볼륨 삭제
  • docker volume prune : 사용하지 않는 볼륨 모두 삭제


6. 도커 네트워크

  • Docker는 기본적으로 Bridge 네트워크 모드를 사용해 컨테이너들 간 통신을 가능하게 해준다.
  • Bridge 네트워크는 같은 네트워크에 속한 컨테이너들끼리 서로의 컨테이너 이름으로 통신이 가능하도록 설정해준다.
    → 간단히 말해 "같은 Docker 네트워크 안에 있는 컨테이너들은 내부 IP나 컨테이너 이름을 통해 자유롭게 통신할 수 있다."
  • 직접 Docker 네트워크 이름, DNS, 구조화 기능 지정도 가능

네트워크 타입

  • bridge : 기본 네트워크, 컨테이너 간 통신 가능
  • host : 호스트 네트워크 공유 (포트 포워딩 없이 사용)
  • none : 네트워크 없음 (완전 격리)

6-1) 도커 네트워크 실습

  • docker network create university : 컨테이너 전용 네트워크(university) 생성 / 애플리케이션 배포할 네트워크를 하나 만들 예정
  • 컨테이너들을 한 네트워크에 포함시킬 예정 → 같은 네트워크 내에서 컨테이너 간 통신 가능하도록 설정
  • docker-root, docker-beyond 두 개의 컨테이너를 포트 3307에 연결
  • MariaDB 컨테이너에 볼륨과 네트워크 설정 적용
  • 재부팅해도 자동 실행되도록 --restart=always 사용

6-2) 명령어

  • docker network ls : 네트워크 목록 확인
  • docker network inspect [네트워크 이름] : 네트워크 상세 정보 확인
  • docker network create [네트워크 이름] : 사용자 정의 네트워크 생성
  • docker run --network [네트워크 이름] ... : 네트워크에 컨테이너 연결 - 컨테이너 생성 시 바로 연결
  • docker network connect [네트워크 이름] [컨테이너 이름] : 이미 생성된 컨테이너 연결
  • docker network disconnect [네트워크 이름] [컨테이너 이름] : 네트워크에서 컨테이너 분리
  • docker network rm [네트워크 이름] : 네트워크 삭제
  • docker network prune : 사용되지 않는 네트워크 삭제
profile
백엔드 개발자 나무입니다

0개의 댓글