이미지와 컨테이너
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 이미지이름으로 실행할 때 로컬에 이미지가 없으면 도커 허브에서 찾아서 풀한 뒤 컨테이너를 실행하지만,
이전에 사용한 기록이나 로컬에 이미지가 있는 경우에는 풀하지 않고 해당 버전의 이미지를 사용한다.
'개발공부 > Docker & Kubernetes 실전 가이드 강의' 카테고리의 다른 글
Udemy : Docker & Kubernetes 실전 가이드 (6) (0) | 2023.04.11 |
---|---|
Udemy : Docker & Kubernetes 실전 가이드 (5) (0) | 2023.04.10 |
Udemy : Docker & Kubernetes 실전 가이드 (4) (0) | 2023.04.10 |
Udemy : Docker & Kubernetes 실전 가이드 (3) (0) | 2023.04.08 |
Udemy : Docker & Kubernetes 실전 가이드 (1) (0) | 2023.04.04 |