처음에 Docker라는 것을 알았을 때
자세히 알지 못했기 때문에,
개발자들이 왜 사용하는지 이해가 안갔었고,
그 때 당시
전세계 개발자들이 git을 사용하는 비율이 90% 이상이었지만,
docker는 50%에 못미쳤기 때문에
더 자세히 알아보지 않았다.
하지만 요즘
MSA 기술이 유행하고 있고,
웬만한 기업에서 docker, kubernetes 경험을 요구하고 있어
docker를 배우고자 한다.
(docker 설치 과정은 생략)
AWS에서 말하길
Docker는 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는
소프트웨어 플랫폼이라고 한다.
여기서 구축, 배포가 Docker의 핵심 기술이라고 생각한다.
docker image를 바탕으로 생성된
가벼우면서 독립적인 실행 단위이다.
container는 사용자의 OS나 다른 container에 독립적이다.
docker run -it --name "원하는 이름" -p 8080:8080 "image이름"
cmd에서 위 명령어를 실행시켜
"원하는 이름"을 name으로 가지고,
"image이름"으로 된 image를 가진
container를 생성(실행)할 수 있다.
run 명령어에는 다양한 옵션이 존재한다.
-i
옵션을 통해
표준 입력(stdin)을 활성화하며,
컨테이너와 연결(attach)되어 있지 않더라도 표준 입력을 유지한다.
이 옵션을 통해 터미널에서 명령을 입력할 수 있다.
-t
옵션을 통해
터미널을 연결한다.
--name
옵션을 통해
container의 이름을 정할 수 있으며 생략이 가능하다.
생략한다면 docker가 랜덤으로 이름을 지어준다.
-p "호스트 포트":"컨테이너 포트"
옵션을 통해
호스트 포트와 컨테이너 포트를 연결한다.
이외에도 다양한 옵션이 존재한다.
docker start "container 이름 || id"
생성된 container를 실행하는 명령어이며
container와 터미널을 연결하는 -a
옵션이나
run 명령어의 -i
옵션과 같은 옵션 등이 존재
docker stop "container 이름 || id"
실행중인 container를 종료하는 명령어이며
container 종료 대기시간을 설정할 수 있는
t
옵션 등이 존재한다.
docker ps
명령어를 통해
현재 실행 중인 container 목록을 볼 수 있으며
-a
옵션을 함께 사용하여 모든 container 목록을 볼 수 있다.
Docker에서 image는 container를 생성하기 위한 설계도이며
image에는 애플리케이션을 실행하는데
필요한 모든 환경이나 라이브러리, 코드 등을 포함하고 있다.
image는 한 번 생성되면 수정할 수 없다.
django의 경우 프로젝트 폴더에 최상위 경로에 존재하는
manage.py 파일을 실행하면 애플리케이션이 실행되기 때문에
dockerfile에 python manage.py runserver
명령어를 추가하기만 하면 됐었다.
spring boot의 경우 애플리케이션을 실행하려면
gradle의 bootjar를 통해 생성된
.jar파일이 필요하기 때문에
이미지를 생성할 때마다 프로젝트를 빌드하여
.jar 파일을 생성해야 한다.
bootjar를 통해 생성된 .jar 파일의 경우
build/libs/
아래에 생성되기 때문에
FROM openjdk:11
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
기본적으로 이와 같이 dockerfile을 생성한다.
FROM
의 경우 빌드할 이미지의 기반이 되는 이미지를 말하며
각 언어별 버전에 따라 설정하면 된다.
ARG
를 통해 dockerfile 내에서 사용할 변수를 설정한다.
COPY
를 통해 로컬 프로젝트내에 있는 파일이나 폴더를 이미지에 복사한다.
ENTRYPOINT
를 통해 container가 시작될 때 실행될 명령어를 설정한다.
최종적으로
docker build -t "image 이름"
을 통해 image를 build한다.
docker hub도 존재하여 github와 비슷하게
로컬에 생성한 image를 docker hub에 push
하여
다른 팀원들이 pull
해서 공유할 수 있다.
이제는 dockerfile만 잘 작성하게 된다면
아주 쉽게 사용할 수 있을거 같다.
정말 깊이 있는 글이었습니다.