DAY64 : TIL [도커]

안휘원·2021년 11월 15일
3

spartacodingclub

목록 보기
32/39

※ 일부 LG 노트북 유저들에겐 안타깝게도, LG 노트북에 내장된 DNA 프로그램과 충돌하여 docker 설치가 어렵다고 한다. 그리고 그건 나다... :)
추후 나홀로 실습을 위한 정리 목적의 글이라 순서 등이 뒤죽박죽 엉망일 수도 있음.

📚 DOCKER

1. 도커

  • *컨테이너 기반의 오픈소스 가상화 플랫폼
    *프로그램(소프트웨어)을 담는 격리된 공간.
  • 컨테이너는 Ubuntu, Java, MySQL, Python 등과 같이, 운영체제와 프로그램들을 담는다.

Why Docker?

  • 빠르고 가볍다.
    - 호스트의 운영체제(OS)를 공유하여 필요한 최소한의 리소스만 할당받아 동작하는 방식이기 때문
  • 개발언어나 툴에 종속되지 않는다.
    - Docker에서 만들어진 Application은 어디서나 실행될 수 있음
  • 보안성이 높다.
    - 각 컨테이너는 격리된 공간이므로, 하나의 컨테이너에 문제(예: 해킹)가 발생하더라도 원래의 서버와 다른 컨테이너들에 영향을 주지 않음

2. 도커 이미지

  • 컨테이너를 실행하기 위해 필요한 파일들의 모음
  • 이미지를 만들기 위해 **Dockerfile 필요
    **이미지 생성 파일
# 이미지 파일
FROM openjdk:8-jdk-alpine #베이스 이미지 파일
COPY build/libs/demo-0.0.1-SNAPSHOT.jar app.jar #컨테이너 내부로 파일 복사
ENTRYPOINT ["java","-jar","/app.jar"] #컨테이너 생성되면서 실행

# 이미지 생성
docker build -t {이미지명}:{태그} {Dockerfile 파일 위치}

3. (다중) 컨테이너

- Docker 컨테이너

# 컨테이너 생성
docker run --name {컨테이너 이름} -p {호스트 포트}:{컨테이너 포트} -d {이미지명}:{이미지태그}

# 생성된 컨테이너 확인
docker ps

# 컨테이너 정지
docker stop {컨테이너명}

# 정지된 컨테이너 확인
docker stop {컨테이너명}

# 정지된 컨테이너 삭제
docker rm {컨테이너명}

- Flask 컨테이너

# dockerfile 생성
FROM python:3.8-slim-buster

WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt

COPY . .

CMD [ "python3", "-m" , "flask", "run", "--host=0.0.0.0"]

# docker 이미지 생성
docker build -t my-flask

# docker 컨테이너 생성
docker run --name flask -p 5000:5000 -d my-flask

- Mysql 컨테이너

docker run --name some-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1234 -d mysql

- Springboot 컨테이너

# 데이터베이스 설정 추가
spring.datasource.url=jdbc:mysql://localhost:3306/layer
spring.datasource.username=root
spring.datasource.password=1234
spring.jpa.hibernate.ddl-auto=update

# 컨테이너 생성
docker run --name some-springboot -p 8080:8080 -d my-springboot

# 생성 확인
docker ps

# 로그 확인
docker logs -f some-springboot

# 데이터베이스 설정 수정
spring.datasource.url=jdbc:mysql://host.docker.internal:3306/layer
spring.datasource.username=root
spring.datasource.password=1234
spring.jpa.hibernate.ddl-auto=update

3. Docker-compose 이용

  • docker-compose란?
    - 다중 컨테이너 애플리케이션을 정의하고 공유할 수 있도록 개발된 도구
    - Compose에서 서비스를 정의하는 YAML 파일을 만들고, 단일 명령을 사용하여 모두 실행 or 모두 종료 가능
# docker-compose.yaml 설정 파일 생성
version: "3.9"
services:
  some-springboot:
    image: my-springboot
    ports:
      - 8080:8080
    networks:
      - backend
  some-mysql:
    image: mysql
    volumes:
      -  /Users/younghokwak/mysql-data:/var/lib/mysql
    ports:
      - 3306:3306
    environment:
	    - MYSQL_ROOT_PASSWORD=1234
    networks:
      - backend
networks:
  backend:
  
# application.properties 수정
spring.datasource.url=jdbc:mysql://some-mysql/layer
spring.datasource.username=root
spring.datasource.password=1234
spring.jpa.hibernate.ddl-auto=update
# 실행
docker-compose up -d

# 컨테이너 확인
docker-compose ps

4. 이미지 레이어 vs 컨테이너 레이어

1) 이미지 레이어

  • 이미지를 만들 때 생성되는 파일 시스템
  • 컨테이너 삭제 후 재생성 시에도 삭제되지 않음

2) 컨테이너 레이어

  • 컨테이너를 실행할 때 생성되는 파일 시스템
  • 컨테이너 삭제 시 레이어도 삭제되며, 컨테이너 재생성 시에도 존재 x

5. 이미지 활용

1) 도커 허브 레포지토리에 푸쉬

# 태깅
docker tag {이미지명}:{태그} {레포지토리 이미지명}

# 로그인
docker login

# 푸쉬
docker push {레포지토리 이미지명}:{태그}

2) EC2에서 이미지 사용하기

# 도커 설치
sudo apt-get update

sudo apt-get -y install \
apt-transport-https \
ca-certificates \
curl \
gnupg2 \
software-properties-common

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"

sudo apt-get update

sudo apt-get install -y docker-ce

sudo usermod -aG docker $USER

# 이미지 pull
docker pull {도커 허브 이미지명}:{태그}

# 컨테이너 실행
docker run --name {컨테이너 이름} -p 5000:5000 -d {이미지 이름}:{태그}

3) 새로운 이미지 업데이트

// 소스 추가
@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        System.out.println("main");
        SpringApplication.run(DemoApplication.class, args);
    }
}
# 이미지 업데이트
docker build -t my-springboot .

# 이미지 확인
docker images

# 이미지 업데이트
docker-compose up -d

6. 네트워크

1) Bridge 네트워크 (기본 네트워크)

  • 하나의 호스트 컴퓨터 내에서 여러 컨테이너들이 서로 소통
  • 컨테이너를 생성하게 되면, 각 컨테이너 마다 고유한 network namespace 영역이 하나씩 생성되며, 이때 docker0 브릿지에 컨테이너의 인터페이스들이 하나씩 바인딩 되는 구조

2) Host 네트워크

  • 컨테이너가 독립적인 네트워크 영역을 갖지 않고, 호스트와 동일한 네트워크 사용
  • 호스트 모드로 생성된 컨테이너의 경우, 브릿지 모드를 사용하지 않으므로, docker0에 바인딩 되지 않음



💬 Reference

아름답게 나이들게 하소서 | 도커의 2가지 네트워크 모드 (Host vs Bridge)
갓대희의 작은공간 | [Docker (1)]
towards data science | Docker Network

profile
우당탕탕 개발자 성장일지

4개의 댓글

comment-user-thumbnail
2021년 11월 16일

언제나 깔끔한 휘원님표 강의 정리 👍
설치되지 않는 도커에 굴하시지 않고 이렇게 정리 하시다니.. 고생 많으셨습니다🥺

1개의 답글
comment-user-thumbnail
2021년 11월 17일

와... 도커 설치를 못하셨는데 이렇게까지 정리하시다니 진짜 대단하다는 말밖에 안나오네요.👍
너무 잘 정리하셔서 머리속을 다시한번 정리해볼 수 있었습니다.
너무 잘 읽었습니다!

1개의 답글