Docker
[Docker] 컨테이너 이미지, 명령어
삶_
2023. 1. 25. 12:40
도커와 컨테이너
- 컨테이너
- 개발한 애플리케이션(실행파일)과 운영환경이 모두 들어있는 독립된 공간
- 컨테이너가 각각 독립된 환경에서 실행되지만 동일한 커널을 사용.
- 읽기/쓰기 가능.
- 실제로 동작되는 프로세스에 해당.
- 도커엔 10만여개가 넘는 컨테이너를 갖고있음 (nginx, node.js … 등)
- 컨테이너를 쓰는 이유 : 확장을 쉽게 하기 위해. 어디에서나 킬 수 있게.
- 버전 관리를 자동으로 해줘서 편리
- 컨테이너 이미지
- 하나의 애플리케이션이 잘 실행될 수 있도록 하는 여러개의 레이어 구성
- 디스크에서 동작. 읽기만 가능
- 다운받는 파일에 해당.
- 도커 내 컨테이너 오케스트레이션
- 스웜, 쿠버네티스를 말함
- 웹 어플리케이션의 한계(과부하) -> CPU의 한계까지 유동적으로 코어를 늘려서 서버를 사용하는 의미
- 도커
- 컨테이너를 거의 씀 => 확장을 쉽게하려고. 어디에서나 킬수있음
- 버전관리를 자동으로 해줘서 편리함
도커 명령어
- docker search nginx // nginx 라는 컨테이너가 있는지 확인
- docker pull nginx:latest // 컨테이너 이미지들 가져오기
- docker run -d --name web -p 80:80 nginx:latest // 불러온 컨테이너 이미지를 컨테이너화해서 실행
용어
- docker host : 도커가 실행되고 있는 시스템
- docker daemon : 설치한 도커
- docker client command : 도커 실행 명령어
- docker hub : 도커 홈페이지에서 제공하는 도커 컨테이너 이미지를 모아놓은 공간
- 컨테이너 이미지 : 컨테이너 안에 도커 이미지를 레이어 별로 모아놓은 것
- 컨테이너 : 실제 동작되는 프로세스
도커 허브에서 컨테이너 이미지 검색
- docker version : 도커 버전 확인
- docker search nginx : 내가 원하는 도커 컨테이너가 존재하는지 확인
컨테이너 이미지 다운 후 이미지 레이어 보기
- docker images, docker image 특정이미지명 : 도커 이미지 있는지 확인
- docker pull nginx : 원하는 컨테이너 이미지를 다운받기
- 6개의 레이어 이미지로 구성되어있다는 의미
컨테이너 실행 후 확인하기
- docker run --name web -d -p 80:80 nginx
- web이란 이름 백그라운드 모드로 80:80 포트로 nginx 실행
- docker ps : 현재 실행중인 도커 컨테이너 등 프로세스 보여주기
- curl localhost:80 // 아까 만든 도커 호스트인 80포트로 실행
- docker stop web : web 이라는 컨테이너 중단 (실행 못함)
- docker rm web : web 이라는 컨테이너 지우기 (이미지는 지우지 않음.)
- docker rmi nginx : nginx 라는 컨테이너 이미지 지우기
도커 컨테이너 만들기
무엇을 컨테이너로 만드는지?
- 역할에 적합한 컨테이너를 각각 만들어 애플리케이션을 운영
도커파일
- 컨테이너를 만들수 있도록(빌드하도록) 도와주는 명령어 집합
- 대소문자 구분하지 않으나 가독성을 위해 사용한다
- 컨테이너 이미지를 생성할 수 있는 고유의 지시어를 가짐
- 문법
- // #으로 시작하면 comment 라인을 의미
- FROM // 컨테이너의 베이스 이미지. 운영환경.
- COPY // 컨테이너 빌드시 호스트의 파일을 컨테이너로 복사
- ADD // 컨테이너 빌드시 호스트의 파일을(tar, url 포함) 컨테이너로 복사
- WORKDIR // 컨테이너 빌드시 명령이 실행될 작업 디렉토리 설정
- ENV // 환경변수 지정
- USER // 명령 및 컨테이너 실행시 적용할 유저 설정 (빌드 중에 switch 하는 것. 보안적으로 필요한 기능.)
- VOLUME // 컨테이너가 동작 될 때 파일 또는 디렉토리를 컨테이너의 디렉토리로 마운트 하는 기능
- EXPOSE // 컨테이너 동작 시 외부에서 사용하는 포트 지정
- CMD // 컨테이너가 실행될 때 자동으로 동작되고 싶은 명령어 입력 (특정 파일 동작도 가능)
내가 만든 컨테이너를 배포하려면?
- docker build -t hellojs:latest . // 컨테이너 올리기. latest는 디폴트 값(태그를 의미). hellojs는 컨테이너 이름
- docker login // 허브에 진입하기 위한 유저로 로그인
- dokcer push hello.js:latest // 다른사람이 쓸수있도록 도커허브(사이트)에 컨테이너 넣기(=배포)
그 외
- apt-get update // 운영체제에서 사용 가능한 패키지들과 버전에 대한 정보(리스트)를 업데이트
파일의 레파지토리명 변경
- 컨테이너 저장소 변경
- docker tag hello:latest he/hello:latest
private registry 를 구축하는 법
- public registry : 도커 허브랑 같다고 보면 됨.
- 도커 허브 처럼 공개적이기 보단 개인적/사내에서 컨테이너 공간이 필요할 때 사용
- 컨테이너 레지스트리를 운영할수있도록 도와주는 컨테이너
- 컨테이너 레지스트리 : 컨테이너 이미지를 저장하고 서비스해줌
- 도커허브의 registry 를 이용하기
컨테이너 이미지 사용하기
- docker pull 이미지이름:태그
- docker run 이미지이름:태그
- 컨테이너가 애플리케이션에 올라가 서비스가 운영됨
컨테이너 이미지 관련 명령어
- docker search [옵션] <이미지이름:태그명> // 이미지 검색
- docker search nginx
- 기본적으로 도커 허브 내에 이미지가 있는지 검색함
- docker pull [옵션] <이미지이름:태그명> // 이미지 다운로드
- docker pull nginx:1.14 // 1.14 버전으로 nginx 다운받기
- 버전 안적으면 자동으로 latest(최신) 버전을 다운받음
- docker images // 다운받은 이미지 목록 출력
- docker inspect [옵션] <이미지이름:태그명> // 다운받은 이미지 상세보기
- docker inspect 컨테이너명 // 동작되는 컨테이너 상세보기
- docker inspect --format ‘{{.NetworkSettings.IPAddress}}’ 컨테이너명 // 컨테이너 내의 특정 정보만 꺼내 보기
- docker rmi [옵션] <이미지이름:태그명> // 이미지 삭제
컨테이너 실행과 종료
- [옵션] 과 <이미지이름:태그명> 은 꼭 필수로 적을 필요없음
- docker create [옵션] <이미지이름:태그명> // 컨테이너 생성
- docker create --name 명명할컨테이너명 nginx:1.14
- docker start [옵션] 컨테이너명 // 컨테이너 실행
- docker start 컨테이너명
- docker run [옵션] <이미지이름:태그명> // 컨테이너 생성 및 실행
- docker stop [옵션] 컨테이너명 // 컨테이너 중지
- docker rm [옵션] 컨테이너명 // 컨테이너 삭제. 실행중인 컨테이너는 삭제 불가능.
- docker rm -f 컨테이너명 // 컨테이너 강제 종료 및 삭제
컨테이너 관리
- docker ps [옵션] // 실행중인 컨테이너 목록 확인
- docker attach [옵션] 컨테이너명 // 포그라운드로 실행중인 컨테이너에 연결
- docker top [옵션] 컨테이너명 // 컨테이너 내 실행되는 프로세스 목록 확인
- docker logs [옵션] 컨테이너명 // 현재 실행중인 로그 정보 확인
- docker exec [옵션] 컨테이너명 명령어 // 현재 실행중인 컨테이너명에 명령어 추가 실행
컨테이너 리소스 제한
- 컨테이너는 호스트 하드웨어 리소스의 사용 제한을 받지 않음.
- 컨테이너 메모리 리소스 제한
- 제한 단위는 b, k, m, g 로 할당
- 옵션
- --memory, -m : 컨테이너가 사용할 최대 메모리 양
- --memory-swap : 컨테이너가 사용할 스왑 메모리 영역에 대한 설정. 메모리 + 스왑. 설정 생략시 메모리의 2배가 설정됨.
- --memory-reservation : --memory 값보다 적은 값으로, 최소 보장되는 값 설정
- --oom-kill-disable : 물리적인 메모리가 부족해도 가상메모리를 삭제하지 못하게 하는. oom killer가 프로세스 kill 하지 못하도록 보호
- docker run -d -m 512m nginx:1.14 // nginx 컨테이너 내부에서 최대로 쓸 수 있는 용량은 512mb 임. 만약 용량을 넘으면 컨테이너가 스스로 kill 함.
- docker run -d -m 1g --memory-reservation 500m nginx:1.14 // nginx 컨테이너 내부에서 최대로 쓸 수 있는 용량이 1gb 임. 최소 500mb 은 쓸 수 있게함.
- docker run -d -m 200m --memory-swap 300m nginx:1.14 // nginx 컨테이너 내부에서 최대로 쓸 수 있는 용량은 200mb 임. 메모리와 할당되는 스왑 영역을 합한 게 300mb. 스왑 영역은 300-200=100mb 에 해당.
- docker run -d -m 200m --oom-kill-disable nginx:1.14 // nginx 컨테이너 내부에서 최대로 쓸 수 있는 용량은 512mb 임.
cpu 리소스 제한
- 옵션
- --cpus : 컨테이너에 할당할 cpu core 수를 지정.
- --cpuset-cpus : 컨테이너가 사용할 수 있는 cpu나 코어 갯수를 할당. cpu index 는 0부터.
- --cpu-share : 컨테이너가 사용하는 cpu 비중을 1024 값을 기반으로 설정.
- 예시
- docker run -d --cpus=”.5” ubuntu:1.14 // 컨테이너가 최대 0.5개의 cpu 코어를 쓸 수 있다. 어떤 코어를 쓸지는 알 수 없음.
- docker run -d --cpu-shares 2048 ubuntu:1.14 // 기본 값보다 두 배 많은 cpu 자원을 할당.
- docker run -d --cpuset-cpus 0-3 ubuntu:1.14 // 0,1,2,3 번 코어에서만 동작해야함.
컨테이너 사용 리소스 확인
- docker stat // 실행중인 컨테이너의 런타임 통계를 확인
- docker event // 도커 호스트의 실시간 event 정보를 수집해서 출력