Docker
가상화
- 개발할 때, 서비스 운영에 사용하는 서버에 직접 들어가서 개발하지 않음
- Local 에서 개발하고 완료되면 staging, production 서버에서 배포
- Local과 Production 서버의 환경이 다른 경우 충돌이 발생
- 다양한 설정을 README에 기록하고 항상 실행하도록 하지만, Human Error 발생 가능성이 높음
- 서버 환경도 모두 소프트웨어 화 할 수 없을까? Like 밀키트
- 가상화는 환경에서 사용하는 일종의 Template라고 할 수 있음
도커 등장 전

- Virtual Machine 사용
- 무겁다는 이슈가 있음
- container는 VM의 무거움을 크게 줄여줌

Docker 소개
- container 기술을 쉽게 사용할 수 있도록 나온 도구
- 2013년 오픈소스로 등장
- 컨테이너 기반 개발 및 운영을 확장
- Docker 이미지로 만들어두고, 재부팅하면 Docker Image 상태로 실행

- 도커를 통해 다른 사람들이 만든 소프트웨어를 가져와서 바로 사용할 수 있음
- Linux, Window, Mac 어디서도 사용할 수 있음
- 이미지를 만들면 공유 가능
- Container Registry : 원격 저장소
- docker hun 등
Docker 실습
https://www.docker.com/
docker pull "이미지 이름:태그"
docker images

docker run "이미지 이름:태그"
- 컨테이너 실행
- --name : 이름
- -e : 환경 변수 설정
- -d : 데몬 모드 (백 그라운드 형태로 실행 쉘을 꺼도 실행 가능)
- -p : 포트 지정 (local host port : container port)
docker ps

- 다음 코드로 컨테이너에 진입 가능
- 작동이 멈춘 컨테이너는 docker ps -a 명령어로 확인 가능
docker rm "컨테이너 이름"
- 멈춘 컨테이너를 삭제
- -f 옵션으로 실행중인 컨테이너도 삭제 가능

Volume Mount
- 컨테이너와 호스트는 연결이 안 되어있음 (파일 공유 불가)
- 따라서 컨테이너를 삭제할 때 파일 사라짐
- Volume Mount를 통해 연결 가능
- -v 옵션을 사용하며,-p 처럼 사용 가능

- 필요한 이미지는 dockerhub에서 오픈 소스를 찾아 실행하면 됨
Docker Image 만들기

- 간단한 프로젝트 생성
- Dockerfile라는 파일을 생성

From "이미지 이름: 태그"
- 이미지 빌드에 사용할 베이스 이미지를 지정 (보통 처음부터 만들지 않고, 이미 공개된 이미지를 기반으로 새로운 설정을 추가)
COPY "로컬 디렉토리" "컨테이너 내 디렉토리"
- 컨테이너는 자체적인 파일 시스템과 디렉토리를 가짐
- Copy 명령어는 dockerfile이 존재하는 경로 기ㅜㄴ 로컬 디렉토리를 컨테이너 내부의 디렉토리로 복사
- 파일을 컨테이너에서 사용하려면 copy 명령어로 복사해야 함
WORKDIR "컨테이너 내 디렉토리"
- Dockerfile의 여러 인자가 실행될 디렉토리 설정
ENV "환경변수 이름=값"
- 컨테이너 내 환경 변수를 지정
- 파이썬 애플리케이션의 경우 통상 위의 두 값을 지정
RUN "실행할 리눅스 명령어"
- 컨테이너 내에서 리눅스 명령어를 실행
- 명령어가 여러개 인 경우 && \ 로 이어줌
CMD ["실행할 명령어", "인자"]
- docker run으로 이 이미지를 기반으로 컨테이너를 만들 때, 실행할 명령어
- 이 이미지는 실행 즉시 python main.py를 실행할 것
이렇게 이미지를 다 만들었으면

- 다음 코드로 이미지를 빌드 해야 함
- build를 마치면 docker images 로 빌드한 이미지를 확인하자
총 정리

이후 도커 허브에서
docker login
docker tag "기존이미지:"태그" "내 계정 ID/이미지 이름:태그"
docker push "이미지 이름:태그"
- Layer가 나오며 push가 됨
- push한 이미지는 docker pull 명령어로 어디서든 받을 수 있음
