본문 바로가기

개발공부/Docker & Kubernetes 실전 가이드 강의

Udemy : Docker & Kubernetes 실전 가이드 (2)

728x90

이미지와 컨테이너

1. 이미지 vs 컨테이너

컨테이너 : 애플리케이션, 웹사이트, 노드 서버, 전체 환경 등을 모두 포함하는 패키지 -> 소프트웨어 단위 실행

이미지 : 템플릿, 컨테이너의 청사진 -> 코드, 도구와 런타임을 포함

 

~ 한 이미지에 여러 컨테이너를 만들 수 있다

 

2. 사전에 만들어진 이미지 가져오기 : Dockerhub.com

ex) 터미널에서 docker run node : node 공식 이미지 가져오기

 

docker ps -a : 생성한 모든 컨테이너 조회

docker run -it node : 노드 대화형 세션 열기 ~ 인터렉티브 노드 터미널에 접속할 수 있다.

 

-> 이미지는 컨테이너에 필요한 모든 논리와 모든 코드를 보관하는 데 사용된다.

 

3. DockerFile을 이용해 커스텀 이미지 빌드

1) FROM : 다른 베이스 이미지에서 받아오는 이미지

2) COPY . . :

첫번째 경로 - 컨테이너, 이미지의 외부 경로 ~ 호스트 파일 시스템 ~  도커파일이 동일 폴더에 있을 때 .만 입력

두번쨰 경로 - 컨테이너, 이미지의 내부 경로 ~ 이미지/ 컨테이너 파일 시스템

~ 첫째 경로의 파일과 폴더가 컨테이너 내부의 두번째 경로에 복사된다, 폴더가 없는 경우 생성됨

~ ./ : 현재 작업 디렉토리 - 상대경로 지정방법

3) RUN : 명령 실행 ~ 컨테이너 및 이미지의 작업 디렉토리에서 실행-> 디폴트 : 컨테이너 파일시스템의 루트 디렉토리

4) WORKDIR : 3)의 작업 디렉토리를 설정할 수 있다.

핵심 : 이미지를 실행하는 것이 아니라 이미지를 기반으로 컨테이너를 실행하는 것

-> 5) CMD : 컨테이너가 실행될 때 명령어 ~ [실행 중인 컨테이너, 파라미터]

6) EXPOSE : 로컬에게 컨테이너가 어떤 포트에 노출될 지를 문서화한다.

~ EXPOST는 선택사항이다. 실제로 서버를 띄울때 docker run -p를 사용해 실제로 노출해야 한다.

 

4. 이미지를 기반으로 컨테이너 실행하기

- 터미널에서 docker build . 입력 : .은 프로젝트와 동일한 곳에 도커 파일이 있음을 의미

- 이미지 빌드되며 생성된 ID -> docker run ID 하면 컨테이너 실행됨

- CMD 에서 서버를 실행하는 명령을 했다면, 컨테이너는 서버가 종료될 때까지 실행 중인 상태가 된다.

- 컨테이너 종료 명령어 : docker stop 컨테이너 이름

- 컨테이너 목록 확인 : docker ps -a

- 로컬머신의 포트와 도커의 포트를 연결하기 위해 docker run -p 로컬포트:도커포트 ID로 옵션을 추가해야 한다.

~ 로컬 포트에 도커 포트를 publish 한 것

 

5. 이미지는 읽기 전용이다

- 한번 생성된 이미지는 소스 코드 상의 변경 등이 있어도 반영되지 않는다. ~ 생성 시에 이미지에 해당 프로젝트 구성 파일 등을 아카이빙했기 때문에, 스냅샷을 만든 것이기 때문에 -> 원칙 상 변경 내용을 반영하려면 이미지를 재빌드 해야한다.

 

6. 이미지 레이어

- 이미지는 캐싱된다. ~ 레이어 기반 아키텍처(Layer based architecture)

-> 도커 파일의 각 명령어는 레어이가 되고, 그 레이어가 변경되면 그 아래의 모든 레이어는 캐싱 결과를 사용하지 않고 새로 빌드한다.

- 최적화 : 변경된 레이어와 같이 있지만(ex : 소스 코드는 변경되었지만, 종속성에는 변화가 없는 경우) 캐싱 결과를 그대로 사용하고 싶은 파일은 COPY 명령어를 사용해 전체 파일 COPY 전 복사를 완료해둔다. ~ 전체 복사 시 캐싱 결과를 사용하므로 보다 빠르다.

이미지 & 컨테이너 관리

도커 도움말 : docker --help

1. 정지된 컨테이너 재시작 : docker start ID(NAME) ~ docker run과는 분명히 다르다

 

2. Attached & Detached 컨테이너

- dockcer start 명령어는 컨테이너의 프로세스를 즉시 완료한다 ~ 컨테이너를 정지하지 않고도 해당 터미널을 계속 사용할 수 있다.

( = 정지되었다가 다시 시작한 컨테이너는 백그라운드에서 실행 중이다 vs docker run으로 실행한 컨테이너는 포어그라운드(foreground)에서 실행 중이다)

이 설정은 바꿀 수 있다

- docker start는 detached 디폴트, docker run은 attached 디폴트

- Attached 모드 : 컨테이너의 출력 결과를 수신한다

Detached 모드 : 수신하지 않는다

Detached : docker run -p PORT -d ID로 적용 가능 (추후 다시 연결할 때는 docker container attach NAME)

~ detached 모드의 장점 : 터미널을 하나로 계속 사용할 수 있다.

+ docker logs 명령어를 사용해 컨테이너 출력 결과를 로깅할 수 있다. +f : follow 모드

 

3. 실행 중인 컨테이너에 다시 연결하기

docker start -a NAME

 

4. 인터렉티브 모드 : 도커화

docker run -i : 인터렉티브 모드 + -t : 입력 터미널을 만들 수 있다

docker start -a -i : 인터렉티브 모드 ~ run -i -t을 사용한 것과 같은 결과를 나타내는 명령어 조합

-> 도커는 웹 서버 등 뿐 아니라 다른 유틸 어플리케이션에서도 사용이 가능하다

 

5. 이미지 & 컨테이너 삭제하기

docker rm NAME : 컨테이너 삭제 먼저 실행이 중지된 상태여야 한다, 여러 개의 컨테이너를 모두 입력하면 한 번에 삭제할 수 있다

docker images : 이미지 리스팅

docker rmi NAME : 이미지 삭제, 컨테이너에서 사용하지 않는 이미지만 삭제 가능하다.

docker image prune ID : 사용하지 않는 모든 이미지를 삭제한다

 

 6. 중지된 컨테이너 자동 삭제하기

docker run --rm ID : 컨테이너가 중지될 때마다 자동으로 삭제된다 ~ 노드 컨테이너 등 코드 변경 시에만 컨테이너 중지하는 경우엔 유용하게 사용할 수 있는 명령어

 

7. 이미지 검사

docker image inspect ID

 

8. 컨테이너에/ 컨테이너로부터 파일 복사하기

docker cp localPATH(.은 모든 파일 복사) NAME : 로컬 호스트의 파일 이나 폴더를 컨테이너로 복사

docker cp containerPATH localPATH : 컨테이너의 파일을 로컬 호스트로 복사

 

9. 컨테이너와 이미지에 이름 & 태그 지정하기

docker run --name 지정하고 싶은 이름 ID : 컨테이너에 커스텀 네임 지정하기

이미지 태그

이미지는 이름(레포지토리)과 태그로 나뉜다 ~ 태그는 옵션으로 이미지의 그룹 내에서 특정 버전을 태깅할 때 사용한다

docker build -t NAME:TAG 빌드할 이미지에 이름과 태그를 커스텀 할 수 있다.

 

10. 이미지 공유

1) 도커 파일을 공유하는 방법

- 이미지 빌드를 해야된다

2) 빌드된 이미지를 공유하는 방법

- 컨테이너를 바로 생성할 수 있다.

 

11. DockerHub 또는 개인 레포지토리에 이미지 공유하기

docker push 도커허브아이디/ 레포지토리 이름

도커 허브와 연결하기 위해 ~ docker login/ logout

도커 허브에 있는 이미지는 푸시되지 않고, 새로 추가된 정보만 푸시된다.

 

12. 이미지 풀

docker pull 도커허브아이디/ 레포지토리 이름

풀하는 경우에는 도커허브에 로그인 되어있을 필요가 없다

docker run 이미지이름으로 실행할 때 로컬에 이미지가 없으면 도커 허브에서 찾아서 풀한 뒤 컨테이너를 실행하지만,

이전에 사용한 기록이나 로컬에 이미지가 있는 경우에는 풀하지 않고 해당 버전의 이미지를 사용한다.

 

 

 

728x90