티스토리 뷰

개발냥발

오픈소스 보고서 7주차

승이버섯 2023. 10. 23. 21:10

이번 주에는 도커로 실습하고, 도커로 개발하는 것에 대해 배워보았다!


[Docker Volume 활용]
컨테이너에서 생성된 데이터를 영구적으로 유지하기 위해서는 컨테이너 서비스에서 데이터와 로직의 분
리가 필요하다. 그래서 Docker volume 이라는 개념이 등장했는데, 이는 호스트 파일 시스템의 디렉토리와 컨테이너의 디렉토리를 연결한다. 특히, 컨테이너가 삭제되어도 volume은 독립적으로 운영이 가능하다!

Docker Volume 타입에는 volume, bind mount, tmpfs mount가 있다. 하나하나 알아보려고 한다!

(3p 사진)

1) volume
• Docker에서 권장하는 방법
• volume 생성 방법
docker volume create 볼륨이름
• 여러 컨테이너가 공유 가능
• volume 드라이버를 통해 원격 호스트 및 클라우드 환경에 volume 내용을 저장하고 암호화 할 수 있음
• 기존 volume을 컨테이너에 연결하면 바로 데이터 사용
가능

2) bind mount
• volume에 비해 사용이 제한적
• 호스트 파일 시스템 절대경로 : 컨테이너 내부경로를 직 접 마운트하여 사용
• 사용자가 파일 또는 디렉토리를 생성하면 해당 호스트
파일 시스템의 소유자 권한으로 연결
• 존재하지 않는 경우 자동 생성됨
• 자동 생성된 디렉토리는 루트 사용자 소유
• 컨테이너 실행 시 지정하여 사용
• 컨테이너 제거 시 바인드 마운트는 해제되지만 호스트
디렉토리는 유지

3) tmpfs mount
• 임시적으로 호스트 메모리에서만 지속
• 컨테이너가 중지되면 tmpfs 마운트가 제거되고 내부에 기록된 파일은 유지되지 않음
• 호스트 또는 컨테이너에서 지속할 필요는 없지만 중요한
파일을 임시로 저장하고자 할 때 활용
• 컨테이너 실행 시 지정하여 사용
• 컨테이너 해제 시 자동 해제됨

⭐️ Docker volume을 활용 시 장점
• 컨테이너를 지워도 데이터가 보존됨!
• 데이터베이스의 데이터 지속성 유지


[Docker 네트워크]
- Docker 컨테이너는 Docker 네트워크를 통해 다른 컨 테이너 또는 다른 애플리케이션 워크로드와 연결 가

• docker0 가상 이더넷 브릿지 네트워크를 통해 같은 호스트 컨테이너들 간 통신이 가능
(21p 사진)

{ 컨테이너 네트워크의 종류 }
- 기본 Bridge 네트워크
• 컨테이너 실행 시 기본으로 연결되는 네트워크
• 각 컨테이너에 할당된 IP 주소를 활용해서 서로 접근 가

- 사용자 정의 Bridge 네트워크
• 사용자가 새롭게 생성하는 Bridge 네트워크
• IP 주소 또는 컨테이너 이름을 가지고 서로 접근 가능

(23p 사진)

* 컨테이너 네트워크 목록 확인
docker network ls

* 컨테이너 네트워크 생성
docker network create 네트워크명

⭐️서로 다른 컨테이너끼리 연동 가능! (강의자료에 나온 예시 -> MySQL 컨테이너와 PHP 컨테이너의 연동)

{ 애플리케이션 컨테이너 개발 }
1) 디렉토리 준비 및 이미지 포함 파일 모음
2) Dockerfile 작성
3) 애플리케이션 코드 작성
4) 컨테이너 이미지 빌드
5) 컨테이너 실행
6) 동작 확인


[Docker를 활용한 개발]
(36p 사진)
이미지 빌드의 개요
① 베이스 이미지 선택
- Docker hub 참조

② 소프트웨어 패키지 설치
- 애플리케이션 실행에 필요한 소프트웨어 패키지 설치
- 패키지 매니저 활용
•apt (Ubuntu), yum (CentOS)
• pip (Python), npm (Node.js)

③ 애플리케이션 소스 코드 복사
- GitHub이나 로컬에 있는 소스코드를 이미지에 복사

④ Dockerfile 작성
- Dockerfile에 설정된 대로 이미지를 생성하게 됨
• 베이스 이미지의 리포지터리
• 설치할 패키지
• 애플리케이션 코드와 설정 파일
• 컨테이너 기동 시 실행될 명령어

{ 빌드 실행 순서 }
1) 디렉토리를 준비하여 이미지에 포함시킬 파일을 모

2) Dockerfile을 작성
3) 컨테이너에서 실행할 애플리케이션 코드를 작성하고
유닛 테스트를 실행
4) 이미지를 빌드
docker [image] build [옵션] Dockerfile경로
- 옵션
(-t: "이미지명:태그"를 지정)
(-f: Dockerfile이 아닌 다른 파일명을 사용하는 경우)
예) -f Dockerfile_nginx
- 경로
• 현재 경로에 Dockerfileol 있다면 *.”을 사용
• Dockerfile이 있는 절대경로 작성도 가능

5) 컨테이너를 실행하고 동작을 확인
예) $docker container run --name hello-con hello:1.0

⭐️이미지 빌드시 특정 파일 무시하기
- 특정 파일이나 디렉터리를 빌드할 이미지에서 제외
하고 싶을 경우 .dockerignore 파일 활용
(.gitignore와 비슷)



[Dockerfile 작성법]
커맨드의 종류가 여러개 있는데, 커맨드를 잘 이용하여 작성한다!

* FROM
- Docker 이미지의 바탕이 될 베이스 이미지를 지정
- Build시 먼저 FROM으로 지정된 이미지 다운로드
(Docker Hub 레지스트리 참조)

* RUN
- Docker 이미지를 빌드할 때 컨테이너 안에서 실행할
명령을 정의
- 여러 설치 명령을 연결하여 RUN 커맨드의 수를 줄이 면 이지미의 레이어 수 감소

* CMD
- 생성된 이미지를 컨테이너로 실행할 때 실행되는 명 령을 지정
- 여러 개의 CMD를 작성해도 마지막 하나만 처리됨
⭐️RUN vs CMD
• RUN은 이미지를 빌드할 때 실행되고, CMD는 컨테이너를 시작할 때 한 번 실행

* ENTRYPOINT
- CMD와 마찬가지로 생성된 이미지가 컨테이너로 실행 될때 사용되는 명령어 및 인자 설정
• docker run 실행 시 override 불가
• 이미지를 생성하는 사람이 컨테이너의 용도를 어느정도 제한하려는 경우에 유용
⭐️CMD vs ENTRYPOINT 비교
- ENTRYPOINT는 도커 컨테이너 실행 시 항상 수행해야 하는 명령어를 지정 (예: 웹 서버나 데이터베이스
등의 데몬 실행)
- CMD는 도커 컨테이너 실행 시 다양한 명령어를 지정하는 경우 유용.

* COPY
- 호스트 환경의 파일, 디렉토리를 이미지 안에 복사 하는 경우 사용
• 단순한 복사 작업만 지원
• 빌드 작업 디렉토리 외부의 파일은 COPY 불가

* ADD
- 파일을 이미지 안에 추가하는 경우 사용
• 호스트 환경의 파일, 디렉토리를 이미지 안에 복사
• URL 주소에서 직접 다운로드하여 이미지 안에 추가
• 압축 파일은 지정한 경로에 압축을 풀어서 추가
- 제약 조건
• 빌드 작업 디렉토리 외부의 파일은 ADD불가
• 디렉토리 추가 시에는 /로 끝나야 함

* EXPOSE
- Documentation 목적...
• 실제 컨테이너 동작과는 관련 없음
- docker container run -p 옵션
• Docker 컨테이너의 포트를 공개하여 외부에서 접근 가능하도록 설정 (예: -р 9000:8080)

* ENV
- 이미지 안에 각종 환경 변수를 지정하는 경우 사용
- Dockerfile에서 ENV를 설정하면, RUN, WORKDIR 등에서 환경변수 활용 가능

* VOLUME
- Docker volume을 미리 설정하는 경우 사용
- VOLUME으로 지정된 컨테이너의 경로는 볼륨의 기본
경로 /var/lib/docker와 자동으로 연결

* USER
- 컨테이너의 기본 사용자를 root가 아닌 다른 사용자
로 변경하고자 하는 경우 사용

* WORKDIR
- 컨테이너 상에서 작업할 경로 전환을 위해 사용
• 설정 시 RUN, CMD, ENTRYPOINT, COPY, ADD 명령문은 해 당 디렉토리를 기준으로 실행
• 지정한 경로가 없으면 자동으로 생성
• 컨테이너 접속 시 지정한 경로로 연결됨

* ARG
- docker build 시점에 변수 값 전달을 위해
--build-arg=인자 를 정의하여 사용
• 비밀번호 등 민감한 정보 사용 시 이미지에 그대로 존재 하여 노출될 위험이 있으니 주의

[개발된 웹소스의 배포]
1) 깃허브에서 웹 소스 압축 파일을 내려받기
2) 웹 소스와 분리된 디렉토리에 Dockerfile 생성
3) 베이스 이미지 작성
4) 작성자 정보 입력
5) 이미지 설명
6) apt 업데이트 후 필요한 패키지 설치
7) 다운로드한 웹 소스 압축 파일을 아파치의 기본 웹 페이지 경로에 복사
(*ADD 명령어는 압축 파일을 해제하여 경로에 복사하는 장점이 있다)
8) 해당 경로로 이동! 이후 컨테이너 실행 시 기본 경로로 설정됨
9) 컨테이너의 80번 포트 열어줌
10) 컨테이너 실행 시 자동으로 아파치 데몬 실행
11) 빌드킷을 이용하여 이미지 빌드
12) curl을 이용하여 테스트








댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함