리눅스데브코스 [15주차 - 2]<리눅스 컨테이너와 Docker (2)>

심우열·2023년 7월 18일
0

1. Docker CLI 구조

docker [서브 명령][서브 명령의 옵션]

2. 서브 명령

1. Docker 컨테이너 라이프사이클

  • run : 배포/실행
  • stop: 실행 중인 컨테이너 정지
  • start: 정지 중인 컨테이너 싫애
  • rm: 배포한 컨테이너 삭제

2. Docker 컨테이너 제어

  • exec: 실행중인 컨테이너에 명령어 실행
  • logs: 컨테이너의 로그(표준 출력/ 표준 에러) 표시
  • inspect: 컨테이너/이미지의 상세정보 표시

3. Docker 이미지 제어

  • images: Docker Daemon에 있는 이미지 목록 표시
    -> image ls 와 같은 동작
  • rmi: Docker 이미지 삭제
    -> image rm 과 같은 동작

4. Docker 이미지 입출력

  • commit: 컨테이너의 상태를 새로운 이미지로 생성
  • tag: 기존 이미지의 새로운 태그(이름) 부여
  • save: 이미지를 파일로 내보내기
  • load: 이미지 파일을 (다른)Daemon으로 적재하기

5. Run: 배포와 실행

docker run [옵션] 이미지(:태그) [명령][인수...]

  • [옵션] : docker run 서브 명령의 옵션

이미지가 전개 된 후

  • [명령] : 이미지에서 사용 가능한 명령
  • [인수] : 명령에 대한 인수

특정한 이미지 선택: 태그

docker run ubuntu:20.04 cat /etc/lsb-release

6. search: 다른 이미지 탐색

docker search [이미지 이름]

7. ps: 실행중인 컨테이너 확인하기

docker ps

  • container ls 와 같은 동작

3. NGINX 실행해보기

1. NGINX 실행

docker run -d -P nginx

  • -d: Daemon으로 실행(백그라운드 실행)
  • -P: Expose 된 Port를 개방(호스트에서 접근 가능)

2. ps로 실행중인 NGINX 확인하기

  • 다음과 같이 호스트의 32768 포트가 NGINX 컨테이너의 80 포트로 포트포워딩됨을 확인할 수 있음

3. 지정된 포트를 개방하기

-p 옵션

  • -p 8080:80
  • 호스트의 8080 포트를 컨테이너의 80 포트로 포트포워딩

4. 네트워크 상태 확인하기

netstat -natp

  • Network 정보 확인
  • -t: TCP 프로토콜 확인
  • -p: 프로세스 정보 확인

5. NGINX 접속해보기

1. curl localhost:32768

2. 브라우저에서 localhost:32768

6. NGINX 컨테이너 중지

docker stop [옵션] 컨테이너 [컨테이너 ...]

  • [옵션]: stop 서브 명령의 옵션
  • 컨테이너: 컨테이너 이름 혹은 HASH ID

docker ps -a

  • -a: 실행중이지 않지만, 존재하는 모든 컨테이너 목록 표시

7. 중지된 NGINX 컨테이너 실행

docker start 컨테이너

  • 컨테이너: 컨테이너 이름 또는 HASH ID

8. rm: NGINX 컨테이너 삭제

docker rm [옵션] 컨테이너 [컨테이너 ...]

  • [옵션] : rm 서브 명령의 옵션
  • -f: 실행중인 컨테이너도 강제 중지 후 제거하고 싶을때

9. exec: 컨테이너에서 명령 실행

docker exec [옵션] 컨테이너 명령 [인수]

  • [옵션]: 서브 명령 exec 옵션
  • -t: 터미널 열기
  • -i: 상호작용(표준 입출력) 허용
  • 컨테이너: 컨테이너 이름 혹은 HASH ID
  • 명령: 컨테이너 내에 있는 명령어
  • [인수]: 명령의 인수

10. NGINX의 설정 파일 MD5SUM 구해보기

MD5SUM

  • 파일을 다운받거나, 이동하거나, 복사한 후에 원본파일과 동일한 파일인지 확인하는 목적으로 쓰이는 명령어
  • docker exec df9d048440e2 md5sum /etc/nginx/nginx.conf

11. NGINX 컨테이너 쉘로 접속해보기

  • docker exec -it df9d048440e2 /bin/bash

12. logs: 컨테이너 로그 확인

docker logs [옵션] 컨테이너

  • [옵션]: 서브 명령 logs의 옵션
  • -f: 향후 출력되는 로그를 게속 추적(종료하지 않고 새로운 로그를 대기)
  • 컨테이너: 컨테이너의 이름 또는 HASH ID

13. inspect: 컨테이너 정보 확인

docker inspect [옵션] 대상 [대상...]

  • [옵션]: 서브 명령 inspect의 옵션
  • 대상: 컨테이너의 이름 혹은 HASH ID / 볼륨의 이름 또는 HASH ID

4. Docker Hub

1. Docker Hub 정책 변경

Docker Hub의 익명, 무료 사용자에 대해

  • 익명(IP기반)
    -> 100개 컨테이너 이미지/6시간
  • 무료 사용자(계정 기반)
    -> 200개 컨테이너 이미지/6시간

2. Docker Hub Proxy 구성

  • 중간에 Proxy 서버를 두어 Docker Hub로의 요청 회수 감소

3. Docker Registry 사용

1. 설정 파일 준비

/etc/docker/registry/cofing.yml

2. registry/config.yml

proxy:
	remoteurl: https://registry-1.docker.io
    //Docker Hub 계정이 있는 경우
    username: [username]
    passworkd: [password]    

3. 실행하기

docker run -d \
-v /etc/docker/registry:/etc/docker/registry \ -p 5000:5000 \
--name registry \
registry:2

4. 테스트

docker pull localhost:5000/ubuntu:latest

localhost:5000

  • Docker HUb를 사용하지 않고, 레지스트리를 이용하고 싶을 때

4. Registry Mirror 설정

  • 매번 localhost:5000 을 쓰기 어려움
  • Proxy 서버에 있을 경우 받아오고 아닐경우 Docker Hub에서 받아오게 하는 방법

1. 설정 파일 수정

/etc/docker/daemon.json

2. docker/daemon.json

{
	... (생략)
	//서버 추가
	"registry-mirrors": ["http://localhost:5000"]
}

3. 테스트

1. docker 재시작

systemctl restart docker

2. Registry 시작

docker run -d \
-v /etc/docker/registry:/etc/docker/registry \ -p 5000:5000 \
--name registry \
registry:2

3. Image Pull Test

docker pull ubuntu:20.04
  • 먼저 daemon.json에 기술한 regisry-mirrors에 있는 서버들에 차례대로 시도한 후, Docker Hub에 접근

5. Docker Volume

1. 리눅스의 파일/블록 장치

1. 디스크

  • 원래는 자기 코팅된 혹은 원판 형태의 장치를 의미
    -> 물리적인 저장장치

2. 볼륨

  • 파일 시스템을 갖춘(갖출 수 있는) 저장 장치

3. DAS

  • Direct Attached Storage
  • 컴퓨터 시스템에 직접 연결된 저장장치

4. 네트워크 저장장치

  • SAN: Storage Area Network
  • NAS: Network Attached Storage

2. 디스크/볼륨 추상화

1. RAID

소프트웨어적/물리적으로 구성

  • 여러개의 물리적 블록 장치
    -> 하나의 볼륨으로 인식할 수 있도록 해줌
  • 물리적 장치의 고장에 대비
    -> 데이터 보호를 위해 데이터 중복 기법을 가지고 있음

RAID 종류

  • RAID 0
    ->
  • RAID 1
    ->
  • RAID 5
    ->

2. LVM (Logical Volume Manager)

운영체제 수준에서 구성

  • 여러개의 물리 볼륨을 묶어 논리적으로 관리
  • 볼륨을 두 단계로 나눔
    -> 논리적 레이어
    -> 물리적 레이어

LVM의 특징

  • 시스템 전체의 중단 없이 온라인(연결) 상태에서 크기 조정 가능
  • 디스크의 불연속 공간 사용(RAID 개념)
    -> 여러 물리적 디스크(볼륨)에 걸쳐 사용

3. 파일 시스템

1. 파일

논리적인 저장 단위

  • 정보 저장의 논리적 관점

관련 정보 자료들의 집합

  • 이를 부르는 이름 = 파일 이름
  • 파일을 관리하기 위한 각종 정보: 파일 속성/메타 데이터
    -> 이름, 유형, 위치, 크기, 권한, 소유자, 관련 시간

2. 파일 시스템

파일에 관련된 접근 기법 제공

  • 운영체제 수준에서 제공

파일에 관한 정보를 제공: 계층적 디렉토리 구조

  • 파일, 파일 메타데이터, 디렉토리 정보 등을 관리

4. Docker의 기본 파일시스템

/var/lib/docker

  • 이 경로를 root 로 사용함
  • 컨테이너에 대한 모든 정보와 디스크, 이미지, 볼륨이 관리되는 위치

1. Overlay2

  • 데이터 중복을 줄이기 위해 이러한 구조를 사용

6. 운영시 주의 사항

1. Docker 구성

  • 호스트 시스템 root 와 Docker의 root 분리

다른 파일 시스템으로 구성

  • 호스트 시스템은 큰 변화가 없ㅇ름
  • Docker는 Application의 동작으로 용량 등에 영향을 많이 미침

다른 블록 장치로 구성

  • I/O 연산이 호스트 시스템에 영향을 주지 않게 하기 위함

2. 저장 장치 관리

한번 수신한 Image는 삭제하지 않음

  • 정기적으로 사용하지 않는 이미지 제거 필요(CI/CD 운영시)

컨테이너의 관리

  • 종료된 컨테이너는 기본적으로 삭제 안됨
  • 실행 시 --rm 옵션으로 자동삭제 되도록 하거나
  • 정기적으로 불필요한 컨테이너 제거되도록 해줘야 함
profile
Dev Ops, "Git, Linux, Docker, Kubernetes, ansible, " .

1개의 댓글

comment-user-thumbnail
2023년 7월 19일

아주 유용한 정보네요!

답글 달기