Dangil project(3)

Junyoung·2024년 5월 23일

Dangil Project

목록 보기
3/20

인프라를 구축하고 여러가지의 프로세스를 구축해야 한다.

추후에 각 인스턴스를 가변적으로 생성/삭제시 컨테이너 로드밸런싱을 진행해야 한다.

각 프로세스 즉 서버들을 독립적으로 구성한다면 보안성 결합도 측면에서도 유리하다.

배포되는 서비스의 Version 을 관리하고 각 버전을 이미지화 시켜 놓는다면 서버 이동에도 유리하다.

코드만 작성해 놓는다면 알아서 가상 머신을 통해서 서버를 제작해준다면 좋다.

이 모든 장점을 가지고 개발자를 지원해주는 Docker 라는 친구를 학습하고자 합니다.


Docker

  • 컨테이너

하나의 애플리케이션(ex) Spring ) 의 실행에 필요한 라이브러리, 애플리케이션을 한곳에 담아서 하나의 컴퓨터처럼 실행을 시킬수 있다 .

일반 서버에 모든 애플리케이션 들을 올린다면 서버에 설정된 동일한 IP 주소로 통신한다 !

컨테이너화 시켜 각 서버들을 올린다면 IP 주소를 각 컨테이너가 독점 하고있는 것처럼 사용한다 ,.

  • 도커

내부의 컨테이너화 구조로 실행에 필요한 환경을 하나의 이미지로 모아두고 한꺼번에 컨테이너를 띄우는 기술이다 !

도커는 이식성이 매우 뛰어나다

개발자의 local 환경에서 docker 를 사용해서 띄워놓고 사용한다면

EC2 환경에서도 같은 설정과 환경으로 돌아가기 때문에

배포시 겪는 리스크의 위험이 훨신 감소된다

큰 기능 3가지

  1. 이미지를 만드는 기능 (Build)

하나의 이미지에는 하나의 역할만하는 애플리케이션을 넣어두도록 권장되고 있다 ..

해당 이미지를 해당 디렉터리에서 docker 명령어를 사용해서 이미지화 할 수 있지만

DockerFile 을 통해서 자동으로 이미지를 만들 수 있다 ! 딜리버리 관점에서 이게 더 맞다 !

  1. 이미지를 공유하는 기능 (Ship)

Hub 에 올려놓고 → Hub 에서 계정을 통해서 불러오고 넣어놓고 할수있다 .

  1. 컨테이너를 작동시키는 기능 (Run)

Docker는 Linux 상에서 컨테이너 단위로 서버 기능을 작동시킵니다. 이미지만 있다면 언제든 몇개의 컨테이너든 띄워놀수 있다.

기동, 정지, 파기를 진행할수 있고,

도커는 다른 가상화와 달리 OS 상에서 프로세스를 실헹 시키는 것과 같다 !

Run 을 모두 하나의 EC2 에서 다 띄우는 일은 보통 드물기 때문에 ! → 오케스트레이션 (VPC) 을 사용한다

  • 네트워크 구성

8080:8080 으로 설정하면 → 8080 으로 들어가면 8080으로 외부 포트를 열어놓구

내부에서 통신할때는 8080 으로 사용한다는 이야기이다 !

호스트(EC2)의 네트워크 개념과 도커의 네트워크 개념은 다르다


docker image pull

명령어로 이미지를 다운받아 오는것은 결국 hub에서 이미지를 다운 받아 오는것이다 !

docker image ls

docker image rm

docker image prune

도커 이미지 목록, 삭제, 안쓰는 이미지 삭제

docker


이미지를 컨이너에 띄워놓기 위해서 청사진을 등록한다 (이미지를 → 청사진화 시킨다)

docker container run

docker container start

docker container stop

docker container rm

컨테이너를 조작하기 위한 명령어이다 !

네트워크 → 지정이 가능하다 !

bridge 브리지 연결을 사용한다

none 네트워크에 연결하지 않는다 !

container 다른 컨테이너의 네트워크를 사용한다

host 컨테이너가 호스트의 OS 의 네트워크를 사용한다 !

network 사용자 정의 네트워크를 사용한다

docker container ls

컨테이너의 목록을 확인할수 있다

docker network ls

컨테이너들의 네트워크 목록을 볼수있다

추후 compose 에서 한꺼번에 지정이 가능하므로 패스 !


docker에 접근하기 !

컨테이너 내부에 접근한다 !

접근시에 쉘을 선택해서 들어갈수 있다 !

docker container exec -it [컨테이너 이름] /bin/bash

docker system prune -a

사용하지 않는 이미지 컨테이너 볼륨 네트워크를 한꺼번에 지울수 있다 .

docker 는 인프라의 구성 관리를 docker file 을 통해서 지정하고 구성한다 !

dockerfile 을 빌드 하므로써 안에있는 설정(OS, 미들웨어 설치, 파라미터 설정)들과 함께


Docker file

FROM
생성할 이미지의 베이스가 될 이미지를 뜻합니다. FROM 명령어는 Dockerfile을 작성할 때 반드시 한 번 이상 입력해야 합니다.
MAINTAINER
이미지를 생성한 개발자 정보를 나타냅니다.
RUN
이미지를 만들기 위해 컨테이너 내부에서 명령어를 실행합니다.
RUN 명령어에 ["/bin/bash", "echo hello" >> test.html"] 같이 입력하면 /bin/bash 셸을 이용해 'echo hello >> test2.html'을 실행한다는 뜻입니다.
ADD
파일을 이미지에 추가합니다.
Dockerfile이 위치한 디렉터리에서 파일을 가져옵니다.
ex) ADD test.html /var/www/html 이라면 Dockerfile과 같은 디렉토리에 있는 test.html 파일을 이미지 내부의 /var/www/html에 추가한다는 뜻입니다.
WORKDIR
명령어를 실행할 디렉터리를 나타냅니다. 배시 쉘에서 cd 명령어를 입력하는 것과 같은 기능을 합니다. 즉, 컨테이너 내부에서 작동을 합니다.
EXPOSE
Dockerfile의 빌드로 생성된 이미지에서 노출할 포트를 설정합니다. 그러나 EXPOSE를 설정한 이미지로 컨테이너를 생성했다고 해서 반드시 이 포트가 호스트의 포트와 바인딩되는 것은 아니며, 단지 컨테이너의 80번 포트를 사용할 것임을 나타내는 것뿐입니다.
CMD
CMD는 컨테이너가 시작될 때마다 실행할 명령어를 설정하며, Dockerfile에서 한 번만 사용할 수 있습니다.
ADD, COPY
ADD와 COPY는 큰 차이점이 없는 것처럼 보입니다. 하지만 차이점이 존재합니다.
COPY는 로컬 디렉터리에서 읽어 들인 컨텍스트로부터 이미지에 파일을 복사하는 역할을 합니다.
ADD는 외부 URL 및 tar 파일에서도 파일을 추가할 수 있다는 점이 다릅니다.
ADD를 사용하는 것은 그다지 권장하지 않습니다.
ENTRYPOINT, CMD
ENTRYPOINT, CMD 는 역할 자체는 비슷하지만 서로 다른 역할을 담당하는 명령어입니다.
위의는 entrypoint를 사용하지 않은 경우입니다. 이 때는 /bin/bash에 접속한 것을 볼 수 둘 다 컨테이너가 시작될 때 수행할 명령을 지정한다는 점에서 같지만, entrypoint는 커맨드를 인자로 받아 사용할 수 있는 스크립트의 역할을 할 수 있다는 점에서 다릅니다.

참고 DockerFile 명령어

dockerfile 텍스트 파일로 미리 만들어 놓는다, 이후 dockerfile 을 기준으로 docker 의 이미지를 제작한다.

도커 파일의 레이어를 통해서, 순서에 따른 이미지 빌드를 진행한다, 필요한 기본 이미지를 다운 받고, 나의 파일을 빌드해서 이미지를 합쳐서 제작해둔다 이를 통해서 멀티 스테이지 빌드가 가능하다.

또한 도커 파일을 실행할 당시에 gradle 같은 빌드 도구를 가져와 CI 도구에 해당 빌드 도구가 없어도 빌드가 가능하다 !


볼륨

컨테이너 내부에 영구데이터를 저장하는 것은 적합하지 않다 !

EC2 내부에 저장해두고 실행시 마운트해서 가져와야 한다 !

볼륨으로 연결을 해놓으면

EC2 내부에 마운트 해놓은 곳도 변경이 된다 !

ex) mysql을 컨테이너로 띄워놨다고 생각해보자!

해당 mysql 의 데이터가 저장되는 곳을

EC2에 mount 해놨다면 !

mysql 에 새로운 데이터가 생성시에 EC2에 데이터도 같이 변경된다 !

그렇기에 컨테이너가 갑자기 사라져도 데이터는 다 존재하고 계속해서 마운트 해올수있다는 이야기이다 !


Docker Compose

웹 3계층

프론트 서버

애플리케이션 서버

데이터베이스 서버

  • docker compose

여러 컨테이너를 일관적으로 관리할 수 있다.

YAML 형식으로 작성해서 사용한다.

compose의 구성은 다음과 같다 !

샘플 코드의 clone

이후 각 이미지의 컨테이너화 !

이후 가동중인 docker-compose를 보려면 ! → docker-compose ps 를 실행해서 확인할수 있다 !

여러 docker 컨테이너 정지

docker-compose stop

여러 docker 컨테이너 리소스 삭제 !

docker-compose down

이미지 빌드는 dockerfile 을 통해서 진행하며

docker-compose 에서 dockerfile 의 위치를 지정해 build를 진행한다 !

서비스 의존관계 정의

depend_on →

예를 들어 Spring 서버는 DB가 생성된 이후에 실행시키고 싶다면 !

Spring을 정의하는 부분에

depend_on

  • DB

하면 된다 ! !! ! !! ! ! ! ! ! !

  • 환경변수 (enviroment) enviroment Time : AZ 이런식으로 리눅스의 환경변수를 지정할수잇다 !

하지만 이런식으로 compose 에서 지정하는게 아니고 !

env 파일에서 한꺼번에 지정해줄수도있다 !

docker compose와 같은 디렉터리에 두고 다른 설정들을 지정할수도 있다.

profile
라곰

0개의 댓글