ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 03. docker 사용해보기
    toy_project 2022. 2. 25. 00:54
    728x90

    vscode설치

    백엔드 파일, 디비 파일, 프론트엔드 파일 존재하는 git을 pull받음

    • front-end폴더 안에는 Node.js로 돌아가느 http-server란 프로그램으로 빌드된 파일들로 웹사이트를 띄운다
    •  Node.js는 브라우저가 아닌 내 컴퓨터에서 자바스크립트를 사용할 수 있게 해주는 것
    •  만약 내 컴퓨터에 node.js가 깔려 있고 자바 스크립트로 돌아가는 http-server도 글로벌로 설치가 되어있다면 터미널에서 front-end 디렉토리안으로 들어간 다음 http-server -p 8000 ./public(빌드된것들) 명령어를 통해서 웹서버를 실행함
    •  하지만 node.js가 깔려 있지 않으면 http-server와 자스코드도 실행할 수 없음
    •  이래서 도커가 필요한것

     

    터미널에 docker run -it node

    -> 자바스크립트 코드를 실행할 수 있음

    -> 컨테이너 만들어지자마자 입력창이 뜸

    이 node.js는 도커허브에서 이미지로 받아진거임

     

    도커에서 이미지란? 리눅스 컴퓨터의 특정 상태를 캡쳐해서 박제해 놓은 것

    node 이미지는 리눅스에 node.js가 설치된 상태를그대로 클라우드에 올려놓은 것

     

    도커는 일단 내 컴퓨터에서 그 이미지를 찾아본 뒤, 없으면 도커 허브에서 그 이름(node.js)로 등록된 이미지를 다운받게 됨

    docker run명령어는 이미지를 다운 받아서 내 컴퓨터에 컨테이너로 만들어줌

    이미지를 한번 받으면 컨테이너를 몇개든 만들어 낼 수 있다 -> 이미지는 컨테이너를 찍어내는 틀

    -it 는 컨테이너 환경안에서 CLI를 사용한다는 것

     

    이미지는 컨테이너만 만들어서 설치되면 바로 node 명령어가 실행되도록 설계되어있음

     

    docker 터미널 말고 다른거 터미널 하나 더 열어서

    docker images 치면 어떤 이미지들이 다운 받아 졌는지 볼 수 있음

    docker ps는 컨테이너 고유의 id와 임의로 주어진 컨테이너명도 볼 수 있음(진행중인 거만 볼 수 있음)

    이거 docker앱으로 들어가서 도커 터미널에입력했던 내용 다 뜸

     

    docker exec -it jolly_raman bash

    임의로 만들어진 컨테이너 명 > jolly_raman 컨테이너에서 bash shell을 실행한다는 것

    컨테이너 매부를 통해 가상의 리눅스 환경으로 들어간 것

    -> 컨테이너 마다 각각 이 파일시스템과 네트워크가 있는 것

    이 리눅스 환경은 도커 데탑 프로그램으로 구현되고 있는 것

    맥이든 윈도우든 도커는 리눅스 가상환경의 형태로 돌아감

     

    comman+c로 도커 종료

     

    컨테이너 삭제

    docker rm  {컨테이너 이름}

    이미지 삭제

    docker irm {옵션} {이미지 이름}

     

    전체 삭제

    docker rm 'docker ps -a -q'

     

     

    back_end

    database

    front_end

    세가지 디렉토리 안에 dockerfile이 존재하고

    이 세가지 디렉토리를 묶어준 폴더 안에도 dockerfile이 존재함

     

    컴퓨터에서 http-server를 돌릴라면 node.js만 설치되어 있으면 안됨

    -> npm으로 http-server가 전역으로 깔려 있어야 함

    Node.js에다가 http-server까지 깔린 상태가 이미지로 있으면  컨테이너로 서비스를 실행하기 수월

    FROM node:12.18.4
    
    # 이미지 생성 과정에서 실행할 명령어
    RUN npm install -g http-server 
    
    # 이미지 내에서 명령어를 실행할(현 위치로 잡을) 디렉토리 설정
    WORKDIR /home/node/app
    
    # 컨테이너 실행시 실행할 명령어
    CMD ["http-server", "-p", "8080", "./public"]
    
    # 이미지 생성 명령어 (현 파일과 같은 디렉토리에서)
    # docker build -t {이미지명} .
    
    # 컨테이너 생성 & 실행 명령어
    # docker run --name {컨테이너명} -v $(pwd):/home/node/app -p 8080:8080 {이미지명}

    from node:12.18.4 버전의 node이미지에 덧붙여서 

    run명령어로 이미지를 생성하는 과정에서 http-server를 실행함

    node.js이미니까 npm명령어도 먹힘

     

    노드 컨테이너 다운받고 지정한 명령어 실행됨

    http-server를 가지고 있는 노드로 다운받아짐

     

     

    docker run --name 컨테이너명 -> 컨테이너 명 지정

    -v : volume의 약자로 컨테이너와 특정 폴더를 공유하는 걸 말한다

    코드는 내 컴퓨터,pwd는 현위치로 지금 위치한 폴더안의 내용들이 컨테이너의 app폴더에 들어간다

    -p : 포트를 컨테이너의 포트와 연결

    만약 컨테이너가 두개 이상이면 포트 충돌이 일어날 수 있음 같은 이미지에 다른 컨테이너를 실행할 때는 컨테이너 포트를 8081로 연결하라고 바꾸면 됨

    frontend-img : 컨테이너를 실행할 이미지 명

     

    FROM mysql:5.7
    
    # 이미지 환경변수들 세팅
    # 실전에서는 비밀번호 등을 이곳에 입력하지 말 것!
    # 서버의 환경변수 등을 활용하세요.
    ENV MYSQL_USER mysql_user
    ENV MYSQL_PASSWORD mysql_password
    ENV MYSQL_ROOT_PASSWORD mysql_root_password
    ENV MYSQL_DATABASE visitlog
    
    # 도커환경에서 컨테이너 생성시 스크립트를 실행하는 폴더로
    # 미리 작성된 스크립트들을 이동
    COPY ./scripts/ /docker-entrypoint-initdb.d/
    
    # 이미지 빌드 명령어 (현 파일과 같은 디렉토리에서)
    # docker build -t {이미지명} .
    
    # 실행 명령어 (터미널에 로그 찍히는 것 보기)
    # docker run --name {컨테이너명} -it -p 3306:3306 {이미지명}
    
    # 실행 명령어 (데몬으로 실행)
    # docker run --name {컨테이너명} -p 3306:3306 -d {이미지명}

     

    ENV명령어로 생성될 컨테이너 안의 환경변수를 미리 지정한다

    컨테이너가 db접속정보가 적힌채로 만들어짐

     

    copy명령어로 스크립트 안에 있는 파일들을 이미지 내부에 지정된 경로로 복사함

    db이미지는 copy로 저장된 경로로 쿼리 명령어들이 실행됨

     

    이미지 빌드 할때 m1의 서러움,,, mysql안깔림 -> 호환성 문제라고 합니다

    docker build --platform linux/amd63 -t database-img .

    실행하면 됨

     

    컨테이너가 돌아가는 동안은 터미널을 사용할 수 없음

    터미널을 하나 열어서 중지 -> 데몬으로 실행

    데몬으로 볼때 실시간 로그 확인 방법

    docker logs -f database-con 

     

     

    이렇게 매번 요소들 하나하나 이미지를 다운받고 컨테이너를 실행하는건 번거로움

    또 네트워크가 분리되어있어서 백엔드와 디비는 데이터를 주고 받지 못함

    이 요소들을 연결해서 서비스를 간편하게 실행하는 방법 -> docker-compose.yml

     

    version: '3'
    services:
      database:
        # Dockerfile이 있는 위치
        build: ./database
        # 내부에서 개방할 포트 : 외부에서 접근할 포트
        ports:
          - "3306:3306"
      backend:
        build: ./backend
        # 연결할 외부 디렉토리 : 컨테이너 내 디렉토리
        volumes:
          - ./backend:/usr/src/app
        ports:
          - "5000:5000"
        # 환경변수 설정
        environment: 
          - DBHOST=database
      frontend:
        build: ./frontend
        # 연결할 외부 디렉토리 : 컨테이너 내 디렉토리
        volumes:
          - ./frontend:/home/node/app
        ports:
          - "8080:8080"

    데베, 백엔, 프엔 전부 들어가 있음

    docker-compose파일이 있는 곳에서 docker-compose up실행

     

    https://stackoverflow.com/questions/65456814/docker-apple-silicon-m1-preview-mysql-no-matching-manifest-for-linux-arm64-v8

     

    Docker (Apple Silicon/M1 Preview) MySQL "no matching manifest for linux/arm64/v8 in the manifest list entries"

    I'm running the latest build of the Docker Apple Silicon Preview. I created the tutorial container/images and it works fine. When I went to create a custom YAML file and run docker-compose I get the

    stackoverflow.com

     

    m1이 정말 싫다

    mysql이 안된다

        platform: linux/x86_64
        image: mysql:5.7

    이것도 추가해봤지만 

     => ERROR [practice-docker_database internal] load metadata for docker.io/library/mysql:5.7             

    계속같은 에러를 뱉는다

     

     

    아직 해결이 안됨

    728x90

    'toy_project' 카테고리의 다른 글

    05. rest framework 시작하기 (핵기초)  (0) 2022.03.01
    04. DRF로 웹 만들어보기 : 기획  (0) 2022.02.25
    02. Django 간단한 로그인 페이지 구현  (0) 2022.02.21
    01. instagram_crawler  (0) 2022.02.15
    00. instagram crawler  (0) 2022.02.15
Designed by Tistory.