Docker
- 도커(Docker)란?
- 도커와 vm
- 도커의 특징
- 도커의 장점
- 주요 개념
- 도커파일 예시
- 도커 컨테이너 실행 시(run) 자주 사용하는 옵션 명령어 목록
- 보안관리(계정 분리)
- 네트워크
- 기타 참고 자료
도커(Docker)란?
도커는 컨테이너 기반의 오픈소스 플랫폼입니다. 컨테이너는 소프트웨어를 일관된 환경에서 패키징하는 기술로, 개발부터 배포까지의 과정에서 일관된 환경을 제공합니다.
도커와 vm

도커의 특징
1. 경량성: 도커 컨테이너는 가상 머신과 달리 OS를 공유하므로 매우 경량화되어 있습니다.
2. 이식성: 도커 컨테이너는 어디서든 동일하게 실행됩니다. 개발 환경, 테스트 환경, 프로덕션 환경 등 어디서든 동일한 환경을 제공합니다.
3. 빠른 시작 및 중지: 컨테이너는 몇 초 내에 시작 및 중지될 수 있습니다.
도커의 장점
1. 환경 일관성: 개발자의 로컬 환경부터 프로덕션 환경까지 동일한 환경을 제공합니다.
2. 빠른 배포: 이미지 기반의 구조로 인해 애플리케이션과 그 의존성을 빠르게 배포할 수 있습니다.
3. 스케일링 및 분리: 서비스를 컨테이너로 분리하면 쉽게 스케일링하고 관리할 수 있습니다.
주요 개념
1. 도커파일(Dockerfile): 도커파일은 이미지를 생성하기 위한 스크립트 파일입니다. 소프트웨어, 라이브러리, 의존성, 실행 명령 등을 정의합니다.
2. 도커 이미지(Docker Image): 도커파일을 통해 생성된 스냅샷입니다. 이 이미지를 기반으로 컨테이너를 실행합니다. 이미지는 여러 레이어로 구성되며, 변경사항만 저장하는 방식으로 효율적인 저장 공간을 활용합니다.
3. 도커 컨테이너(Docker Container): 도커 이미지를 실행한 상태를 말합니다. 실제로 애플리케이션의 실행 환경을 제공하는 것은 컨테이너입니다.
도커파일 예시
wildfly가 설치된 이미지에 빌드한 war를 포함하여 실행가능한 도커이미지를 만드는 도커파일 스크립트
# 기본 이미지로 jboss/wildfly를 사용합니다. 이 이미지는 리눅스와 WildFly가 사전 설치된 상태입니다.
FROM jboss/wildfly
# 관리자 사용자를 추가하여 관리 콘솔에 접근할 수 있게 합니다. (선택 사항)
# RUN /opt/jboss/wildfly/bin/add-user.sh admin Admin#70365 --silent
# 특정 WAR 파일을 WildFly의 deployments 디렉토리에 복사하여 애플리케이션을 배포합니다.
# 여기서 'your-app.war'는 당신의 WAR 파일의 이름이며, 도커파일과 같은 디렉토리에 위치해야 합니다.
COPY your-app.war /opt/jboss/wildfly/standalone/deployments/
# WildFly가 사용하는 8080 포트를 열어 외부에서 접근 가능하게 합니다.
EXPOSE 8080
# WildFly 서버를 실행합니다.
CMD ["/opt/jboss/wildfly/bin/standalone.sh", "-b", "0.0.0.0"]
빌드 및 실행
docker build -t wildfly-app-image .
docker run -p 8080:8080 wildfly-app-image도커 컨테이너 실행 시(run) 자주 사용하는 옵션 명령어 목록
요약:
네트워크
- 포트 연결
- 네트워크 연결
운영
- 컨테이너 특정 이름 부여
- 재시작
- 환경변수 설정
- 종료 시 컨테이너 삭제
- 사용자 지정
파일시스템, 장치 엑세스
- 저장소 연결(도커가 설치된 호스트와 컨테이너의 파일시스템)
- 호스트 장치 엑세스 권한
-d / --detach: 컨테이너를 백그라운드 모드에서 실행합니다.
-p / --publish: 호스트와 컨테이너의 포트를 연결합니다. 예: -p 80:80은 호스트의 80번 포트와 컨테이너의 80번 포트를 연결합니다.
--name: 컨테이너에 특정한 이름을 부여합니다.
-e / --env: 환경 변수를 설정합니다. 예: -e MYVAR=value
--env-file: 환경 변수를 파일에서 읽어옵니다.
-v / --volume: 호스트와 컨테이너의 볼륨(저장소)을 연결합니다. 예: -v /host/dir:/container/dir
--rm: 컨테이너가 종료될 때 자동으로 컨테이너를 삭제합니다.
-it: -i와 -t 옵션의 조합으로, 컨테이너와 상호작용할 수 있는 터미널을 제공합니다.
--network: 컨테이너를 특정 네트워크에 연결합니다.
--restart: 컨테이너의 재시작 정책을 설정합니다. 예: --restart=always는 컨테이너가 중지될 때마다 항상 재시작합니다.
--link: (deprecated) 다른 컨테이너와 링크를 생성합니다. 현재는 --network를 사용하는 것이 권장됩니다.
-u / --user: 컨테이너에서 실행될 명령의 사용자를 지정합니다.
-w / --workdir: 작업 디렉토리를 설정합니다.
--privileged: 컨테이너에 호스트의 모든 장치에 대한 액세스를 허용합니다.보안관리(계정 분리)
도커를 사용하여 MSA(Microservices Architecture)를 구성할 때, 보안 및 권한 관리는 중요한 고려사항 중 하나입니다. 도커 이미지를 생성할 때, 기본적으로 root 사용자로 실행되는 것을 피하려는 경향이 있습니다. 이는 보안 위험을 줄이기 위한 것입니다.
도커 파일에서 OS 계정을 명시하여 권한을 분리하는 방법은 다음과 같습니다:
1. 사용자 생성: Dockerfile 내에서 useradd와 같은 명령어를 사용하여 새 사용자를 생성합니다.
DockerfileCopy codeRUN useradd -ms /bin/bash newuser3. 사용자 전환: USER 지시문을 사용하여 이후의 명령어가 새로운 사용자로 실행되도록 합니다.
DockerfileCopy codeUSER newuser5. 권한 설정: 필요한 디렉토리나 파일에 대한 권한을 적절하게 설정합니다. 예를 들어, 애플리케이션 로그를 쓰는 디렉토리에 대한 쓰기 권한을 부여할 수 있습니다.
이러한 방식으로 도커 컨테이너 내에서 실행되는 서비스나 애플리케이션의 권한을 제한하여, 잠재적인 보안 위험을 최소화할 수 있습니다.
그러나, 모든 마이크로서비스에서 이러한 방식을 적용할 필요는 없습니다. 중요한 서비스나 데이터에 접근하는 마이크로서비스에서 특히 이러한 권한 관리를 고려하는 것이 좋습니다.
네트워크
https://junstar92.tistory.com/163
기타 참고 자료
https://insight.infograb.net/docs/tips/docker_offline/
MSA 아키텍처
(도커 컨테이너로 분리하여 실행된 업무 서비스 컨테이너들, db와 각각 연결되어 있음)