DX Data School

Docker 2

Kim J 2024. 4. 8. 14:06

1. Container 관련 명령

1) Container로 애플리케이션 실행

  • 이미지는 읽기 전용의 불변 값으로 만들어짐 (정적 - Class) 이러한 이미지를 바탕으로 도커 엔진은 컨테이너 (동적 - Instance)를 생성할 수 있는데 이 때 이미지와 함께 읽고 쓰기가 가능한 레이어를 추가해서 만들어진다.

 

2) Container는 Process

  • 컨테이너는 이미지를 기반으로 만들어지는 snapshot
  • 컴퓨터 프로그램이 실행중이면 프로세스라고 하는데 Container는 격리된 공간에서 동작하는 프로세스임
  • docker run 명령어로 컨테이너가 만들어지고 동작하는데 이는 서버 호스트 운영체제가 독립적으로 동작하는 것과 유사하다

 

3) Image를 받아 Container를 생성 및 실행 과정

  • gihyodocker/echo:latest 이미지 다운로드
    • docker pull gihyodocker/echo:latest
  • 컨테이너로 실행 - 하나의 애플리케이션 실행
    • docker container run -t -p 9000:8000 gihyodocker/echo:latest

 

4) Container 수동 제어

  • 컨테이너 생성
    • docker crate -it --name contariner-test1 ubuntu
실행 중인 컨테이너 확인
    • docker ps
실행중인 컨테이너 조회되지 않음!
  • 모든 컨테이너 확인
    • docker ps -a
  • 컨테이너 실행
    • docker start container-test1
  • 실행중인 컨테이너 확인
    • docker ps
실행 중 확인!
  • 컨테이너 접속
    • docker attach container-test1
  • 셸에서 exit를 입력해서 빠져나오기
  • 컨테이너 삭제
    • docker rm container-test1

 

5) docker run 명령으로 한번에 수행하기

  • docker run -it --name container-test1 ubuntu bash
컨테이너를 생성하고 바로 접속 됨

6) Container의 생명 주기

  • 실행 상태
    • docker run 명령의 인자로 지정된 Docker Image를 기반으로 Container가 생성되면 Image를 생성했던 Dockerfile에 포함된 CMD 그리고 ENTRYPOINT 명렁에 정의된 애플리케이션이 실행되고 이 애플리케이션이 실행 중인 상태가 Container가 실행 중인 것
      • 실행이 끝나면 정지상태가 됨
  • 정지 상태
    • 실행 중인 Container를 명시적으로 정지하거나 Container에서 실행된 애플리케이션이 정상/오류 여부를 막론하고 종료된 경우에는 Container가 정지되지 않음
    • Container가 정지되면 더 이상 동작하지 않지만 종료되던 시점의 상태가 저장되서 남아있기 때문에 다시 실행할 수 있음
  • 파기 상태
    • 정지 상태의 Container는 명시적으로 파기하지 않는 이상 디스크에 그대로 남아있음
    • 컨테이너를 자주 생성하고 정지해야 하는 상황에서는 컨테이너가 점점 디스크 용량을 많이 차지할것이므로 사용하지 않는 Container는 삭제하는 것이 바람직함

 

7) docker run

  • docker image pull, docker container create, docker container start + command 가 합쳐진 명령
    • 이미지가 존재하면 바로 컨테이너를 생성하지만 이미지가 존재하지 않으면 다운로드 받아 컨테이너를 생성하는 명령

 

  • 형식
    • docker run [옵션] 이미지이름 (인자)
      • 인자는 사용되는 이미지에 따라 달라진다.
      • MySQL 같은 경우는 사용할 데이터베이스, 유저 아이디 및 패스워드, 인코딩 방식 등을 인자로 받을 수 있다.
  • 옵션
    • --name 컨테이너 이름
      • 컨테이너 이름을 설정하는 옵션으로 생략하면 자동으로 부여한다.
    • -p [Host Port]:[Container Port]
      • 컨테이너 내부 포트를 외부에 공개하여 접속할 수 있도록 해주는 port forwarding
    • -P, --publish-all=[true|false]
      • 컨테이너 내부의 노출된 포트를 외부의 임의 포트에 port forwarding
    • -v, --volume=호스트경로:컨테이너경로
      • 볼륨 마운트 - 호스트의 디렉토리를 컨테이너에 연결해서 데이터를 공유
    • --net 네트워크이름
      • 네트워크 (다른 컨테이너들에 연결할 때 사용하는 묶음)에 연결
    • -i, --interface
      • 대화식 모드로 연결
    • -t
      • 단말 디바이스 할당
    • -d, --detach=true
      • 백그라운드에서 컨테이너를 실행 한 후 컨테이너 아이디를 등록
      • 계속해서 실행되고 있어야 하는 애플리케이션에 사용한다.
    • -e, --env
      • 환경 변수 설정
    • --rm
      • 컨테이너가 종료 될 때 컨테이너를 파기
    • --restart (no | on-failure | on-failure:횟수 | always)
      • 재시작 옵션
    • -h 호스트 이름
      • 호스트 이름을 설정하는 것으로 미지정시 컨테이너 ID가 이름으로 설정됨
    • --link=[container:컨테이너아이디]
      • 다른 컨테이너와 연결할 때 사용
    • -d 는 컨테이너를 백그라운드로 실행하는 옵션이고 -t와 -i는 컨테이너 내부에 터미널로 접속하기 위해 사용하는 옵션
      • -d 옵션 없이 컨테이너를 실행하게 되면 실행된 컨테이너가 프로그램의 실행을 마칠 때 까지 터미널의 제어를 차지하기 때문에 그 다음 명령을 입력할 수 없는 상태가 된다.
      • -i 와 -t 옵션없이 컨테이너를 실행하면 컨테이너 안의 파일 시스템에 접근이 안되기 때문에 컨테이너 안의 설정을 변경해야 하는 경우 i 와 t 옵션을 가지고 실행해야 한다.
  • 한 번만 실행되고 종료되는 애플리케이션은 d 나 i 그리고 t 옵션 없이 실행

 

8) 현재 실행 중인 컨테이너 확인

  • 형식
    • docker ps [옵션]
  • 옵션
    • a : 모든 컨테이너를 출력
  • 출력 항목
    • CONTAINER ID : 컨테이너 식별자로 64글자 이지만 12글자만 출력
    • IMAGE : 컨테이너를 만들 때 사용한 이미지 이름
    • COMMAND : 컨테이너 실행 시 실행하도록 설정된 프로그램의 이름 또는 명령어
    • CREATED : 컨테이너 생성 후 경과된 시간
    • STATUS : 컨테이너의 현재 상태로 실행 중이면 Up 종료된 상태면 Exited
    • PORTS : 포트 포워딩
    • NAMES : 컨테이너 이름

 

9) 컨테이너 중지와 삭제

  • 중지 : docker stop 컨테이너아이디 또는 이름
  • 전체 중지 : docker stop &(docker ps -a - q)

 

  • 삭제 : docker rm 컨테이너아이디 또는 이름
  • 전체 삭제 : docker rm &(docker ps -a - q)

 

10) 실습

  • Apache 이미지(httpd)를 컨테이너로 실행
    • 컨테이너 생성 및 실행
      • docker run --name apa000ex1 -d httpd
    • 실행중인 컨테이너 확인
      • docker ps
    • 컨테이너 중지
      • docker stop apa000ex1
    • 컨테이너 삭제
      • docker rm apa000ex1
    • 모든 컨테이너 확인
      • docekr ps -a
삭제된 것 확인 할 수 있음
  • 포트 포워딩
    • port forwarding
      • 내부의 개방된 포트를 외부에서 접근할 수 있도록 HOST의 포트와 매핑시키는 것
      • 포트 포워딩을 하게 되면 매핑된 외부 포트를 이용해 내부 포트로 접근이 가능하다.
    • Apache는 80번 포트를 이용해 웹 사이트에 대한 접근을 기다렸다가 사용자가 이 포트를 통해 접근하면 요청을 확인하고 웹 사이트의 페이지를 제공한다.
    • 포트 포워딩 하는 방법
      • -p 호스트포트 : 컨테이너내부포트

 

  • Apache의 80번 포트를 외부에서 접근하도록 설정
    • 컨테이너 생성 및 실행
      • docker run --name apa000ex2 -p 8080:80 -d httpd
    • 웹 브라우저에서 접속을 확인
      • localhost:8080

 

2. 다양한 이미지

1) 리눅스 운영체제가 담긴 이미지

  • debian
  • ubuntu
  • fedora
  • centos
  • busybox
  • alpine
    • busybox 기반으로 가볍고 간단한 보안성을 목적으로 한 리눅스 배포판으로 컨테이너에서 많이 이용함

 

2) web server

  • httpd
    • 하나의 웹 애플리케이션을 배포할 때 이용
  • nginx
    • 여러 개의 웹 애플리케이션을 하나로 접근해 사용할 수 있도록 할 때 이용
    • Load Balancer의 역할로 사용할 수 있음

 

3) Database

  • mysql
    • -e 옵션을 이용해 MYSQL_ROOT_PASSWORD로 루트 패스워드를 지정해야 함
  • mariadb
    • -e 옵션을 이용해 MYSQL_ROOT_PASSWORD로 루트 패스워드를 지정해야 함
  • postres
    • -e 옵션을 이용해 POSTGRES_ROOT_PASSWORD로 루트 패스워드를 지정해야 함
  • oracle
    • 버전에 따라 설정하는 옵션이 다름
  • mongodb
  • redis

 

4) 프로그래밍 언어의 런타임

  • 프로그래밍 언어로 만들어진 애플리케이션을 실행할 수 있도록 해주는 소프트웨어
    • openjdk : Java
    • python
    • php
    • ruby
    • perl
    • gcc : C 언어
    • node

 

5) nginx를 컨테이너로 실행

  • 80번 포트를 이용해 사용자의 요청을 받아들임
    • 컨테이너 생성 및 실행
      • docker run --name webserver1 -p 8001:80 -d nginx
    • 브라우저에서 확인
      • http://localhost:8001
    • 리소스 사용량 확인
      • docker stats webserver1
    • 실행 중인 프로세스 확인
      • docker top webserver1
    • 컨테이너의 접근 로그를 도커 명령으로 확인
      • docker logs -f webserver1

 

6) 실행 중인 컨테이너를 제외하고 모든 컨테이너를 제거

  • docker container prune

 

7) 사용하지 않는 Imag, Container, Volume, Network 등 모든 Docker 리소스를 삭제

  • docker system prune

 

'DX Data School' 카테고리의 다른 글

Deployment  (1) 2024.04.09
쿠버네티스 (Kubernetes)  (0) 2024.04.08
Docker  (0) 2024.04.05
Container 와 Virtualization  (0) 2024.04.05
CI/CD  (0) 2024.04.05