Ruff! Ruff!
[오픈소스] - Docker를 활용한 개발 본문
1. Docker volume 활용
- 컨테이너의 문제점
: 컨테이너 내부 데이터는 컨테이너의 라이프사이클과 연관됨
: 컨테이너에서 생성된 데이터를 영구적으로 유지하기 위해서는 컨테이너 서비스에서 데이터와 로직의 분리 필요
- Docker volume : 호스트 파일 시스템의 디렉토리와 컨테이너의 디렉토리를 연결 👉 컨테이너가 삭제되어도 volume은 독립적으로 운영 가능
- Docker volume 타입
1) volume
2) bind mount
3) tmpfs mount
1) volume 타입
- 도커에서 권장하는 방법
- volume 생성 방법
- docker volume create 볼륨이름
-> volume을 만들고 mount를 원격에 해줌
- 여러 컨테이너가 공유 가능
- 기존 volume을 컨테이너에 연결하면 바로 데이터 사용 가능
- volume 관련 명령어
#--mount 옵션을 이용한 볼륨 지정.
$ docker run -d --name vol-testi \
>--mount source=my-appvol-1, target=/app \
> ubuntu:20.04
#-V 옵션을 이용한 볼륨 지정.
$ docker run-d--name vol-test2 l
> -v my-appvol-1:/var/log \
> ubuntu:20.04
# 사전에 docker volume create를 하지 않아도 호스트 볼륨 이름을 쓰면 자동 생성.
$ docker run -d --name vol-test3 \
› -v my-appvol-2:/var/log \
> ubuntu: 20.04
# 볼륨 제거, 현재 연결된 컨테이너가 있으면 아래와 같은 에러가 발생.
$ docker volume rm my-appvol-1
Error response from daemon: remove my-appvol-1: volume is in use - [1fa0d693e22af77a869a0672bb dd60f547b4661b0a77caea3faa4957a92ac21f, 5b0b4b3df8363515838a2cbf64852257037a0f408104d930f03a
a518e8299b]
# 연결된 컨테이너 제거 후 볼륨 삭제
$ docker stop vol-testl vol-test2
vol-testi vol-test2
$ docker rm vol-testi vol-test2
vol-testi vol-test2
§ docker volume rm my-appvol-1
my-appvol-1
2) bind mount 타입
- volume에 비해 사용이 제한적
- 호스트 파일 시스템 절대 경로 : 컨테이너 내부 경로 를 직접 마운트하여 사용
- 사용자가 파일 또는 디렉토리를 생성하면 해당 호스트 파일 시스템의 소유자 권한으로 연결
- 존재하지 않는 경우 자동 생성됨
- 자동 생성된 디렉토리는 루트 사용자 소유
- 컨테이너 실행 시 지정하여 사용
- 컨테이너 제거 시 바인드 마운트는 해제되지만 호스트 디렉토리는 유지
- volume은 컨테이너 제거 시 마운트 해제 + host dir 안 내용도 다 삭제 (volume은 남아있음)
- 관련 명령어
#--mount 옵션으로 사전에 생성한 경로와 바인드 마운트 지정.
$ mkdir /home/hylee/target
$ docker run -d -it --name bind-testi \
>--mount type=bind, source="$(pwd)"/target, target=/var/log \
> centos:8
#-v 옵션으로 사전에 생성한 디렉터리와 바인드 마운트 지정.
$ docker run -d -it --name bind-test2 \
> -v "$(pwd)"/target:/var/log \
> centos:8
# 사전에 생성하지 않은 디렉터리와 바인드 마운트 지정.
$ docker run -d -it --name bind-test3 \
› -v /home/hylee/target2:/var/log \
> centos:8
# 사전에 생성하지 않은 디렉터리에 읽기 전용 및 읽고 쓰기 바인드 마운트 지정.
$ docker run -d -it --name bind-test4 \
› -v /home/hylee/target_ro:/appl:ro \
› -v /home/hylee/target_rw:/app2:rw \
› centos:8
# 사전에 생성한 디렉터리는 현재 사용자 소유이고, -v에 지정한 절대경로는 자동으로 생성되고 루트 사용자 소유가 됨.
$ 1s -1
...
drwxrwxr-x 2 hylee hylee 4096 3₴ 1 20:25 target drwxr-xr-x 3 root root 4096 33 1 20:28 target2
2) tmpfs mount 타입
- 임시적으로 호스트 메모리에서만 지속
- 컨테이너가 중지되면 tmpfs 마운트가 제거되고 내부에 기록된 파일은 유지되지 않음
- 호스트 또는 컨테이너에서 지속할 필요는 없지만 중요한 파일을 임시로 저장하고자 할 때 활용
- 컨테이너 실행 시 지정하여 사용
- 컨테이너 해제 시 자동으로 해제됨
- 관련 명령어
#--mount 옵션으로 tmpfs 마운트.
$ docker run -d-it --name tmpfs-test1 \
>--mount type=tmpfs, destination=/var/www/html \
› httpd:2
#--tmpfs 옵션으로 tmpfs 마운트.
$ docker run -d-it --name tmpfs-test2 \
> --tmpfs /var/www/html \
> httpd:2
# tmpfs 마운트된 컨테이너 조회.
§ docker inspect tmpfs-test2
・.・
"Tmpfs": {
"/var/www/html": '"'
ふ
..・
$ docker inspect --format="{{ •HostConfig.Tmpfs }}" tmpfs-test2
map [/var /www/html:]
- 컨테이너를 지워도 데이터 보존
: 데이터베이스의 데이터 지속성 유지
: DB를 위한 볼륨 생성 및 Mysql 컨테이너 실행
# 볼륨을 포함한 MySQL 컨테이너 실행
docker run -it --name=mysql-vtest \
# MYSQL 컨테이너 접속
docker exec -it mysql-vtest bash
# 접속 후 데베 테이블 생성 등 해도 데이터 지속성 유지
: 컨테이너 정지 및 제거 후 새로운 컨테이너를 생성해도 데이터는 그대로 존재함.
2. Docker 네트워크
- 네트워크 개요
: Docker 컨테이너는 Docker 네트워크를 통해 다른 컨테이너 또는 다른 애플리케이션 워크로드와 연결 가능
: docker0 가상 이더넷 브릿지 네트워크를 통해 같은 호스트 컨테이너들 간 통신이 가능
- 컨테이너 네트워크의 종류
1) 기본 Bridge 네트워크
- 컨테이너 실행 시 기본으로 연결되는 네트워크
- 각 컨테이너에 할당된 IP주소를 활용해서 서로 접근 가능
2) 사용자 정의 Bridge 네트워크
- 사용자가 새롭게 생성하는 Bridge 네트워크
- IP 주소 또는 컨테이너 이름을 가지고 서로 접근 가능
- mysql 컨테이너와 php 컨테이너의 연동
- 애플리케이션 컨테이너 개발
1) 디렉토리 준비 및 이미지 포함 파일 모음
2) Dockerfile 작성
3) 어플리케이션 코드 작성
4) 컨테이너 이미지 빌드
5) 컨테이너 실행
6) 동작 확인
3. Docker를 활용한 개발
- 이미지 빌드 개요
1) 베이스 이미지 선택
2) 소프트웨어 패키지 설치
3) 애플리케이션 소스 코드 복사
4) Dockerfile 작성
- Dockerfile에 설정된 대로 이미지를 생성하게 됨
- 베이스 이미지의 리포지토리
- 설치할 패키지, 애플리케이션 코드와 설정 파일, 컨테이너 기동 시 실행될 명령어
- 빌드 실행 순서
1) 디렉토리를 준비하여 이미지에 포함시킬 파일을 모음
2) Dockerfile을 작성
3) 컨테이너에서 실행할 애플리케이션 코드를 작성하고 유닛 테스트를 진행
4) 이미지를 빌드
5) 컨테이너를 실행하고 동작을 확인
* 이미지 빌드시 특정 파일 무시하기
-> .dockerignore
* 빌드할 때 무조건 dockerfile 경로 적어줘야함
-> $ docker [image] build [옵션] Dockerfile경로
4. Dockerfile 작성법
<커맨드>
- FROM : 도커 이미지의 바탕이 될 베이스 이미지 지정/ 빌드시 먼저 FROM으로 지정된 이미지 다운로드
- RUN : 도커 이미지 빌드할 때 컨테이너 안에서 실행할 명령을 정의하는 Instruction, 여러 설치 명령을 연결해 RUN 커맨드의 수를 줄이며 이미지 레이어 수 감소 (shell, exec 방식 존재)
- CMD : 생성된 이미지를 컨테이너로 실행할 때 실행되는 명령 지정, RUN은 이미지 빌드할 때 실행되고, CMD는 컨테이너 시작할 때 한 번 실행
- ENTRYPOINT : CMD와 마찬가지로 생성된 이미지가 컨테이너로 실행 될 때 사용되는 명령어 및 인자 설정, docker run 실행 시 override 불가, 이미지 생성하는 사람이 컨테이너의 용도를 어느정도 제한하려는 경우에 유용
- COPY : 호스트 환경 파일, 디렉토리 이미지를 안에 복사하는 경우 사용, 빌드 작업 디렉토리 외부의 파일은 COPY 불가
- ADD : 파일을 이미지 안에 추가하는 경우 사용, URL 주소에서 직접 다운로드하여 이미지 안에 추가, 압축파일은 지정한 경로에 압축을 풀어서 추가
- EXPOSE : 문서 목적, 실제 컨테이너 동작과는 관련 없음
- ENV : 이미지 안에 각종 환경 변수를 지정하는 경우 사용, Dockerfile에서 env를 설정하면, run, workdir 등에서 환경변수 활용 가능
- VOLUME : 도커 볼륨을 미리 설정하는 경우 사용
-USER : 컨테이너의 기본 사용자를 root가 아닌 다른 사용자로 변경하고자 하는 경우 사용
-WORKDIR : 컨테이너 상에서 작업할 경로 전환을 위해 사용, RUN, CMD, ENTRYPOINT, COPY, ADD 명령문은 해당 디렉토리를 기준으로 실행
-ARG : docker build 시점에 변수 값 전달을 위해 --build-arg=인자 정의하여 사용
'CS' 카테고리의 다른 글
[오픈소스] - 컨테이너 오케스트레이션과 Kubernetes (1) | 2024.10.29 |
---|---|
[오픈소스] - CI 환경 구축 (0) | 2024.10.22 |
[오픈소스] - Docker 사용법 (3) | 2024.10.08 |
[오픈소스] - 컨테이너와 도커 (1) | 2024.10.01 |
[오픈소스] - GitHub을 활용한 협업방법 (0) | 2024.09.24 |