- Application을 패키징 할 수 있는 도구
컨테이너 방식의 장점
의존성 충돌 문제를 해결해 준다 개발과 배포 환경을 일치시킨다 수평 확장을 쉽게 해준다 각 서버에 새로운 내용을 배포하기 쉽게 만들어준다
VM | Container |
Hardware-level 프로세스 격리 | OS-level 프로세스 격리 |
각각 독립된 OS 소유 | 하나의 OS 공유 |
부팅시간 오래 걸림 | 부팅시간 짧음 |
GB | KBs/MBs |
사전에 구축된 vm 찾기 어려움 | 사전 구축된 컨테이너를 쉽게 사용함 |
VM을 새 호스트로 쉽게 이동할 수 있음 | 컨테이너는 이동하지 않고 파괴되고 다시 생성 |
VM 생성에 상대적으로 시간이 오래걸림 | 몇 초만에 컨테이너 생성 가능 |
더 많은 리소스 사용 | 리소스 사용량 감소 |
컨테이너
컨테이너는 앞서 설명한 대로, 애플리케이션이 의존성, 네트워크 환경, 파일 시스템에 구애받지 않고, 도커라는 기술 위에 실행될 수 있도록 만든 애플리케이션 상자입니다.
이미지
실행되는 모든 컨테이너는 이미지로부터 생성됩니다. 이미지는 애플리케이션 및 애플리케이션 구성을 함께 담아놓은 템플릿으로, 이를 이용해 즉시 컨테이너를 만들 수 있습니다.
이미지를 이용해 여러 개의 컨테이너를 생성할 수 있습니다. 이를 이용해 앞서 설명한 애플리케이션의 수평 확장이 가능합니다.
이미지는 기본 이미지(base image)로부터 (마치 git을 사용하는 것처럼) 변경 사항을 추가/커밋해서 또 다른 이미지를 만들 수도 있습니다. 예를 들어 node.js로 작성된 애플리케이션을 이미지로 만들고 싶은 경우, nodejs 이미지를 기본 이미지로 삼고 내가 만든 애플리케이션을 추가해 넣고, 이미지화할 수 있습니다.
레지스트리
이미지는 레지스트리에 저장됩니다. 대표적인 이미지 레지스트리로는 Docker Hub, Amazon ECR이 있습니다. 도커 CLI에서 이미지를 이용해 컨테이너를 생성할 때, 호스트 컴퓨터에 이미지가 존재하지 않는다면, 기본 레지스트리로부터 다운로드 받게 됩니다.
도커 이미지

[NAMESPACE]
/[IMAGE_NAME]
:[TAG]
Docker Command
Images
docker image pull [Image Name]
# docker image 가져오기
docker images
# docker image list 확인
docker rmi [image Name]
# docker image 삭제
# image 삭제 시 버전 명시안하면 최신 버전 삭제됨
Container
docker container commit [Container_ID] [image_name]:[tag]
docker container ls
docker container ls -a
docker container rm `sudo docker container ls -a -q`
# 컨테이너 ID만 조회후 모두 삭제 진행
docker-compose
docker-compose up # 컴포즈 파일에 정의된 컨테이너 및 네트워크와 같은 주변 환경 생성
docker-compose down # 생성된 컨테이너와 네트워크를 종료
docker-compose -d # 백그라운드로 실행
docker-compose --no-color #화면 출력 내용을 흑백으로 함
docker-compose --no-deps # 링크된 서비스를 실행하지 않음
docker-compose --force-recreate # 설정 또는 이미지가 변경되지 않더라도 컨테이너를 재생성
docker-compose --no-create # 컨테이너가 이미 존재할 경우 다시 생성하지 않음
docker-compose --no-build # 이미지가 없어도 이미지를 빌드하지 않음
docker-compose --build # 컨테이너를 실행하기 전에 이미지를 빌드
docker-compose --absort-on-container-exit #컨테이너가 하나라도 종료되면 모든 컨테이너를 종료
docker-compose -t # 컨테이너를 종료할 때의 타임아웃 설정
docker-compose --remove-orphans #컴포즈 파일에 정의되지 않은 서비스의 컨테이너를 삭제
docker-compose --scale # 컨테이너의 수를 변경
docker run [Option] [image_Name, ID] [Command] [Parameter]
# docker run --name apache -p 818:80 httpd
docker ps
# 실행중인 컨테이너만 확인
docker ps -a
# 종료된 컨테이너까지 확인
docker logs -f [Container_ID]
# 도커 컨테이너 log 확인
docker exec -i -t [Container_ID]
# 컨테이너 내부 디렉토리 들어가기
docker kill [Container_ID]
docker start [Container_ID]
docker rm [Container_ID]
# 컨테이너 삭제
docker build --tag [image_name]:[tag] [build_directory]
# DockerFile을 참조하여 이미지를 생성
Docker File
Container 에 설치해야하는 패키지, 소스코드, 명령어, 환경변수 설정 등을 기록한 하나의 파일
FROM ubuntu:18.04
# 생성할 이미지의 베이스가 될 이미지(반드시 한번 이상 입력)
LABEL "purpose"="practice"
# 메타 데이터 표시
RUN apt-get update
RUN apt-get install apache2 -y
# 이미지를 만들기 위해 컨테이너 내부에서 명령어를 실행
ADD test.html /var/www/html
# 파일을 이미지에 추가
WORKDIR /var/www/html
# 명령어를 실행할 디렉토리. (bash shell에서의 cd명령어와 동일한 기능)
RUN ["/bin/bash", "-c", "echo hello > test2.html"]
EXPOSE 80
# 이미지에서 노출할 포트를 설정
CMD apachectl -DFOREGROUND
# Container 가 시작될 때마다 실행할 명령어
docker-compose.yml
항목 | docker run 커맨드의 해당 옵션 또는 인자 | 내용 |
version | – | 도커 컴포즈의 버전을 기재한다. |
services | – | 컨테이너를 정의한다. (컨테이너의 집합체를 주로 서비스라고 한다.) |
image | 이미지 인자 | 사용할 이미지를 지정 |
networks | —net | 접속할 네트워크를 지정 |
volumes | -v, —mount | 스토리지 마운트(볼륨)를 설정 |
ports | -p | 포트 설정 |
environment | -e | 환경변수 설정 |
depends_on | 없음 | 다른 서비스에 대한 의존관계를 정의 |
restart | 없음 | 컨테이너 종료 시 재시작 여부를 설정 |
#작성 순서
#주항목:
#↔이름:
#↔↔설정:
#(:) 콜론 하고 띄어쓰기 필수
# 도커컴포즈 버전 지정 ( 항상 첫줄 )
version: "2.1"
services: #컨테이너 설정
heimdall: #컨테이너 이름
image: linuxserver/heimdall # 컨테이너에서 사용하는 base image
container_name: heimdall # 컨테이너 이름
volumes:
- /home/user/appdata/heimdall:/config
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/London
ports:
- 80:80
- 443:443
restart: unless-stopped