코드가 "내 컴퓨터에서만" 돌아가는 문제를 줄이고, 팀원 누구나 같은 방식으로 실행, 배포, 디버깅할 수 있는 환경 구성
-
핵심 도구 : CLI(Terminal), Docker, Git, Github
-
목표 :
- 터미널로 작업 디렉토리와 권한 관려
- Docker를 설치, 점검하고 컨테이너 실행/관리
- 웹서버를 Dockerfile로 컨테이너화, 포트 매핑, 접속 확인
- 바인드 마운트/볼륨으로 "변경 반영", "데이터 영속성'을 검증
-
⚠️ "왜 이런 설계가 필요한지"를 설명 가능한 형태로 정리
| 항목 | 값 |
|---|---|
| OS | macOS 15.7.7(24G720) 3.1 GHz 6코어 Intel Core i5 |
| Shell / 터미널 | /bin/zsh |
| Docker | 28.5.2(orbstack) |
| Git | 2.53.0 |
| 편집기 | VSCode |
- OrbStack 환경 확인 → 로그 01
- 터미널 기본 조작 (pwd/ls/cd/mkdir/cp/mv/rm/cat/touch) → 로그 02
- 권한 실습 — 파일 1 + 디렉토리 1, 변경 전/후 비교 → 로그 03
- Docker 설치/점검 (
--version,info) → 로그 04 - hello-world 실행 → 로그 04
- ubuntu 컨테이너 진입 및 내부 명령, attach/exec 차이 관찰 → 로그 04
- Dockerfile 직접 작성 → 커스텀 이미지 빌드/실행 → Dockerfile, 로그 05
- 포트 매핑 접속 2회 (8080, 8081) → 로그 05 image01 image02
- 바인드 마운트 변경 반영 → 로그 06
- 볼륨 영속성 (컨테이너 삭제 전/후) → 로그 06
- Git 설정 + GitHub/VSCode 연동 → 로그 07 image03 image04 image05
- (보너스) Compose 멀티 컨테이너 + 네트워크 통신 + 환경 변수 → 로그 08
- (보너스) Github SSH 키 설정 → 로그 09
mission-1/
├── README.md # 본 문서
├── Dockerfile # 직접 작성한 커스텀 이미지 정의
├── docker-compose.yml # 보너스: web + redis 멀티 컨테이너
├── app/ # 웹 서버 정적 콘텐츠
│ └── index.html
└── docs/
├── logs/ # 수행 로그 (명령어 + 출력)
└── images/ # 접속/연동 스크린샷
git clone https://github.com/newids/codyssey-e1-1.git
cd codyssey-e1-1
# 커스텀 이미지 빌드 및 실행
docker build -t mission1-web:1.0 .
docker run -d -p 8080:80 --name mission1-web-8080 mission1-web:1.0
curl http://localhost:8080 # 또는 브라우저에서 접속
# 보너스: Compose로 실행
docker compose up -d
curl http://localhost:8083
docker compose down| 검증 대상 | 명령 | 확인 내용 | 증거 |
|---|---|---|---|
| 데몬 동작 | docker info |
Server 버전/컨텍스트 응답 | 로그 04 |
| 설치 정상 | docker run hello-world |
"Hello from Docker!" 출력 | 로그 04 |
| 컨테이너 수명 | docker ps -a 비교 |
메인 프로세스 종료 = 컨테이너 종료 | 로그 04 |
| 이미지 빌드 | docker build + docker images |
mission1-web:1.0 생성 | 로그 05 |
| 포트 매핑 | curl × 2포트 |
8080/8081 모두 HTTP 200 | 로그 05 |
| 접속 화면 | 브라우저 | 페이지 렌더링 | images/ |
| 마운트 반영 | 호스트 파일 수정 → curl |
v1 → v2 즉시 반영 | 로그 05 |
| 볼륨 영속성 | rm -f 후 재연결 → cat |
데이터 유지 확인 | 로그 06 |
| Git 설정 | git config --global --list |
user/defaultBranch 설정 | 로그 07 |
| 컨테이너 간 통신 | nc -zv redis 6379 |
서비스 이름으로 연결 성공 | 로그 08 |
- 절대 경로는 루트(
/)부터 시작해 현재 위치와 무관하게 항상 같은 곳을 가리킨다:/Users/newids7705/Documents/codyssey-e1-1 - 상대 경로는 현재 디렉토리 기준이다:
../..(두 단계 위),codyssey-e1-1/app - 실습 증거: 로그 02
- 권한은 소유자(u)/그룹(g)/기타(o) 세 자리, 각 자리는 r(4)+w(2)+x(1)의 합.
755=rwxr-xr-x,644=rw-r--r--.- 디렉토리의
x는 진입(cd),w는 내부 파일 생성/삭제 권한 —chmod 500상태에서touch실패로 직접 확인. - 실습 증거: 로그 03
nginx:alpine베이스에 LABEL/ENV/COPY/HEALTHCHECK를 추가해 커스텀 이미지를 빌드했다.- 이미지는 설계도, 컨테이너는 실행 인스턴스 — 같은 이미지로 8080/8081 두 컨테이너를 띄워 확인.
- 증거: Dockerfile, 로그 05
- 컨테이너는 격리된 네트워크 네임스페이스에서 동작하므로,
-p host:container로 호스트 포트를 포워딩해야 외부에서 접속할 수 있다. - 호스트 포트만 바꾸면 같은 서비스를 여러 개 동시 실행할 수 있다 (8080/8081 실험).
- 증거: 로그 05
- 컨테이너 쓰기 레이어는 컨테이너 삭제와 함께 사라지지만, 볼륨은 Docker 관리 영역에 독립적으로 존재한다.
- 컨테이너를
rm -f로 삭제한 뒤 새 컨테이너에 같은 볼륨을 연결해도 데이터(persistent-hello)가 유지됨을 확인. - 증거: 로그 06
- Git: 로컬에서 완결되는 분산 버전 관리 시스템 (커밋/브랜치/이력).
- GitHub: Git 저장소를 호스팅하는 원격 협업 플랫폼 (PR/이슈/CI).
- GitHub 없이도 Git은 동작하며, GitHub는 Git 기반 서비스 중 하나다.
- 정리: 로그 07
- 문서/로그의 이메일은
<masked>처리했고, 토큰·비밀번호·개인키는 어떤 로그에도 포함되지 않았다.
grep -rniE "ghp_|github_pat_|password|api[_-]?key|token|<내 이메일>" \
README.md docs/ app/ Dockerfile- 커밋 전
git grep으로ghp_,token,password등 민감 패턴 부재를 확인했다.
git grep --cached -nE "ghp_[A-Za-z0-9]{36}|(token|password|secret|api[_-]?key)\s*[:=]"