운영체계를 기반으로 만들어진 대부분의 Software는 그 실행을 위하여 OS와 Software가 사용하는 동적 Library에 대하여 의존성을 갖게되는데 Software의 실행을 위해선 OS, Library, Software가 필요로 하는 파일 등으로 구성된 실행환경이 필요한데, 하나의 시스템 위에서 둘 이상의 Software를 동시에 실행하려고 한다면 문제가 발생할 수 있다.
컨테이너를 사용한다면 이 문제를 회피하며 사용할 수 있다.
기존 OS를 가상화 시키던 것과 달리 컨테이너는 OS레벨의 가상화로 프로세스를 격리시켜 동작하는 방식으로 이루어진다.
process의 작업이 종료된다면 컨테이너도 종료된다.
컨테이너(Container)는 개별 Software의 실행에 필요한 실행환경을 독립적으로 운용할 수 있도록 기반환경 또는 다른 실행환경과의 간섭을 막고 실행의 독립성을 확보해주는 운영체계 수준의 격리 기술을 말한다.
컨테이너는 애플리케이션을 실제 구동 환경으로부터 추상화할 수 있는 논리 패키징 메커니즘을 제공한다.
ex)
환경(라이브러리, 언어 버젼,...)을 여러 개로 분리하여 다른 서버인 것처럼 사용이 가능하다.
docker image를 Daemon(api 요청수신, 이미지, 컨테이너, 네트워크 및 볼륨 같은 Docker 객체 관리)에서 동작하고 그로 인해 나오는 결과물이 컨테이너
컨테이너는 image layer에 read-write Layer를 추가하는 것으로 생성/실행된다.
생성
이미지를 기반으로한 단순 생성
docker create <option> image-name <command> <arg..>
docker container create <option> image-name <command> <arg..>
생성 후 실행
docker run <option> image-name <command> <arg..>
docker container run <option> image-name <command> <arg..>
실행
두개의 image를 실행한다.
docker start <option> container-name <container-name>
중지
docker stop <option> 컨테이너명 <container-name>
docker container stop <option> 컨테이너명 <container-name>
삭제
docker rm <option> 컨테이너명 <container-name>
docker container rm <option> 컨테이너명 <container-name>
특정 프로세스를 실행하기 휘한 모든 파일과 설정값을 지닌 것
사용할 컨테이너에 대한 청사진으로 변동이 불가능하다.
image는 class가 하는 동작과 유사하다.
동작하고 있는 app을 snap-shot한 후 이것들을 이용해 실제로 동작하는 각각의 컨테이너를 만들 수 있다.
컨테이너는 수정이 가능하지만 이미지에 영향을 끼치지 않는다.
레이어는 기존 이미지에 추가적인 파일이 필요할 때 해당 파일을 기존 이미지에 추가하기 위한 개념이다.
image는 read-only layer로 구성되어있고 파일이 추가된다면 새로운 layer가 생성된다.
docker는 여러 개의 layer를 묶어서 하나의 파일 시스템으로 사용할 수 있게 해준다.
이 layer는 Dockerfile로 관리된다.
이 file에서 한 줄 = 1layer 이며 layer의 순서에 따라 업데이트 | 다운 된다.
ex) 1,2,3,4 layer가 있고 3을 바꾼다면 3,4만 다운하면 된다.
Dockerfile는 사용자가 이미지를 조합하기 위해 명령줄에서 호출할 수 있는 모든 명령을 포함하는 텍스트 문서
베이스(base) image를 지정하는 명령 (ex. FROM httpd:alpine)
버전 정보 및 작성자 등의 image 설명을 작성하기 위한 명령 (ex. LABEL version="1.0.0")
docker container가 시작할 때, 실행되는 쉘 명령을 지정하는 명령
쉘 명령을 실행하는 명령 (단, RUN 명령은 image 작성 시 실행됨 : 일종의 새로운 image layer를 만드는 역할)
docker container가 시작할 때, 실행되는
docker container 외부에 오픈할 포트를 설정하는 명령 (ex. EXPORT 8080)
docker container 내부에서 사용할 환경 변수를 지정하는 명령 (ex. ENV PATH/usr/bin:$PATH)
docker container의 작업 디렉토리를 설정하는 명령
파일 또는 디렉토리를 docker container에 복사하는 명령
빈번히 바뀔 파일은 맨 마지막에 두는게 좋다
파일과 디렉토리 또는 특정 URL의 데이터를 docker image에 추가하는 명령 (ADD 명령은 COPY 명령과 유사하며, COPY 명령이 ADD 명령보다 명시적이므로 주로 COPY 명령을 사용함 : ADD 명령은 참고용)
쉘 프로그램을 지정하는 명령 (CMD 명령으로 대체 가능하므로 참고로만 알아둘 것)
dockerfile 내에서 필요한 변수를 설정하는 명령 (docker image와 container에서 사용하는 환경 변수를 설정하는 ENV 명령과 달리, ARG 명령은 dockerfile 스크립트 작성을 위해 필요한 변수를 설정하는 명령임)
docker image 및 container에서 작업하는 사용자 ID를 지정하는 명령 (ex. USER kim)
생성한 docker image를 기반으로, 새로운 image를 생성할 때 실행되는 명령을 지정하는 명령
docker image를 위한 볼륨을 생성하는 명령
#
dockerfile에서도 주석을 사용할 수 있음 (#를 사용하면 해당 라인은 주석이 됨)
참고
https://hoon93.tistory.com/48
https://cultivo-hy.github.io/docker/image/usage/2019/03/14/Docker%EC%A0%95%EB%A6%AC/
https://medium.com/@i01029407043/docker-aws-ec2%EC%97%90-docker-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EB%B0%B0%ED%8F%AC-d8251f27368c