
도커는 컨테이너 기반의 가상화 기술을 제공하는 플랫폼으로, 애플리케이션의 배포와 실행을 간소화하기 위해 개발되었다. 도커는 경량화된 컨테이너를 사용하여 애플리케이션과 필요한 모든 의존성을 하나의 단위로 패키징하고, 이를 어디서나 동일한 환경에서 실행할 수 있도록 한다.
도커 엔진은 도커의 핵심 구성 요소로, 도커에서 컨테이너를 생성하고, 이미지를 빌드하고, 네트워크 및 스토리지를 관리하는 모든 작업을 수행한다.
도커 이미지는 도커 컨테이너의 실행 환경을 정의하는 템플릿 역할이다. 이미지는 컨테이너를 생성하는 데 필요한 모든 정보를 포함하고 있으며, 애플리케이션 코드, 런타임, 라이브러리, 환경 변수, 구성 파일 등을 포함한 독립적이고 재사용 가능한 단위로 설계되어 있다.
도커 이미지를 저장하고 관리하는 저장소 역할을 한다. 애플리케이션을 컨테이너화할 때 생성한 도커 이미지를 다른 환경에서 재사용하기 위해 필요한 배포 공간이며, 이러한 이미지를 효율적으로 관리하고, 네트워크를 통해 접근할 수 있도록 지원하는 시스템이다.
도커 이미지를 생성하기 위한 파일로서, 이미지 빌드 과정에서 필요한 명령어와 설정을 정의한다. 확장자 없이 Dockerfile이라고 명명하여 사용한다. (필요에 따라서 언더바
_로 이름을 추가할 수도 있다.)
FROM 기초가 될 이미지로부터 하나의 레이어를 생성
CMD 컨테이너가 시작되는 시점에 기본적으로 실행할 명령어 지정 (명령어를 덮어쓴다.)
ENTRY POINT 컨테이너가 시작되는 시점에 기본적으로 실행할 명령어 지정 (명령어를 덮어쓸 수 없다.)
RUN 이미지를 빌드할 때 실행할 명령어 지정
WORKDIR 작업할 디렉토리 설정
COPY 호스트 환경의 파일을 레이어로 복사
리눅스 컨테이너와 같이 애플리케이션과 애플리케이션의 실행 환경을 호스트 환경으로부터 격리하여 도커 이미지로부터 실행된 결과물이다. 도커 이미지로부터 생성되며, 이미지에 저장된 애플리케이션과 설정을 기반으로 동작한다. 컨테이너는 운영체제 수준에서 프로세스를 격리하여 실행하기 때문에, 가상머신처럼 별도의 운영 체제를 부팅할 필요없이 호스트 운영체제의 커널을 공유한다.
쓰기 계층
격리 기능
-> 이러한 격리 기능으로 컨테이너 간의 간섭을 방지한다.
컨테이너 관리
docker run : 이미지 기반 컨테이너 생성, 실행docker stop, docker rm : 컨테이너 중지, 삭제
컨테이너는 기본적으로 서로 격리된 환경에서 실행되지만, 도커 네트워크를 통해 서로 데이터를 주고받거나 외부와 통신할 수 있다.
Bridge Network 하나의 Host에서 여러 컨테이너 통신
Host Network Host와 동일한 네트워크에서 컨테이너 연결
None Network 네트워크 없이 컨테이너의 IO만 사용
컨테이너가 생기고 삭제되는 동안에도 데이터를 지속적으로 저장하고 관리할 수 있도록 도와주는 도커의 스토리지 기능이다. 일반적으로 컨테이너는 가상화된 파일 시스템 위에서 동작하며, 컨테이너 내부에 저장된 데이터는 컨테이너가 삭제되면 함께 사라진다.
-v 옵션을 사용하여 볼륨을 컨테이너에 마운트할 수 있다.이미지 풀
docker pull {이미지 이름}
이미지 리스트 보기
docker images
docker image list
docker image ls
이미지 리스트 중에 찾기
docker images --filter reference=hello-world
docker images --filter reference="my*"
docker images -f reference=hello-world
docker images | grep hello
이미지 삭제
docker rmi nginx
docker rmi alpine:tag1 alpine:tag2
docker rmi alpine:tag1 && alpine:tag2 # 앞에 것이 성공해야 뒤에 걸 실행함.
tag가 특별히 명시되어있지 않으면 알아서 자동으로 latest를 붙여준다.태그 다르게 이미지 만들기
docker tag alpine:latest alpine:tag1
도커 컨테이너 만들기
docker container create {이미지 이름}
컨테이너 리스트
docker container list
docker ps # 실행 중인 컨테이너 프로세스
docker ps -a # 전체
컨테이너 필터링
docker ps -a --filter "name=peaceful"
컨테이너 시작
docker start peaceful_hugle
컨테이너 실행
docker run docker.io/library/ubuntu:24.04
docker run --name exp-ubt-1 ubuntu:24.04
docker run \
--name exp-ubt-3 \
--interactive \
ubuntu:24.04 \
bash
docker run -it --name exp-ubt-5 ubuntu:24:04 bash
ubuntu:24.04를 찾고 없으면 pull 당긴다. 컨테이너 중지
docker stop exp-ubt-6
컨테이너 정지
docker [container] pause
docker unpause exp-ubt-7
unpause를 할 시 다시 재개할 수 있다.컨테이너 삭제
docker rm exp-ubt-8
docker rm -f exp-ubt-8
docker container prune # Stopped 된 컨테이너들 다 지움.
네트워크 리스트
docker network list
네트워크 필터링
docker network list --filter driver=bridge
네트워크 생성
docker network create net_1
docker network create -d bridge net_2
docker network create -d host net_3
d로 지정해줄 수도 있다.네트워크 삭제
docker network rm net_2
볼륨 리스트 조회
docker volume ls
docker volume list
볼륨 필터링
docker volume ls | grep vol_1
docker volume ls -f driver=local
볼륨 생성
docker volume create vol_2
으아.. 어렵다 ! 막 이해가 안된다 어렵다는 아니고, 개념이 헷갈려서 계속 돌아가서 확인하고, 정리하고 이래야 하는 느낌이다. 리눅스 컨테이너가 뭔지, 컨테이너가 뭔지 개념을 확 머리에 넣어야 할 것 같다.
그래도 궁금했던 파트인데, 도커를 자세히 배워볼 수 있어서 너무 좋은 것 같다 !! 가상화 이런 건 누가 생각해냈을까.. 진짜 멋있다.. 대단하네.. 뇌도 가상화가 안되려나?