애니리뷰

도커 알아둘 것

두원공대88학번뚜뚜 2022. 11. 4. 16:24

docker-compose.yml

version: '2.3'

services:
  main:
    build:
      context: ./
      dockerfile: Dockerfile
    runtime: nvidia
    restart: always
    env_file:
      - "docker-compose-env/main.env"
    volumes:
      - ./data/:/data
    expose:
      - "8000"
      - "22"
    ports:
      - "10000:8000"
      - "10022:22"
    stdin_open: true
    tty: true

Dockerfile

FROM nvidia/cuda:11.6.1-cudnn8-devel-ubuntu20.04

ENV TZ Asia/Seoul
ENV LC_ALL=C.UTF-8
ENV LANG=C.UTF-8
ARG DEBIAN_FRONTEND=noninteractive

RUN apt-get update \
    && apt-get -y install python3 \
    python3-pip \
    python3-dev \
    git ssh vim

RUN ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
RUN ln -s /usr/bin/python3 /usr/bin/python
RUN echo "root:password" | chpasswd
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes #prohibit-password/' /etc/ssh/sshd_config

RUN pip install --upgrade pip
RUN pip install setuptools

WORKDIR /workspace
ADD . .

RUN chmod -R a+w /workspace

EXPOSE 8000

Dockerfile 과 Docker-compose.yml의 차이점

dockerFile과 docker-compose.yml 의 차이점 (velog.io)

 

dockerFile과 docker-compose.yml 의 차이점

도커를 공부하다보니 궁금한 점이 생겼다. 원하는 어플리케이션을 도커에 띄울 때 dockerFile을 사용하기도 하고 docker-compose.yml을 사용하기도 한 다. 왜 둘이 분리해놓은 것일까? 다른 점은 무엇일

velog.io

8. Dockerfile 과 Docker-compose.yml (tistory.com)

 

8. Dockerfile 과 Docker-compose.yml

1. Dockerfile 1) 목적 - base image 파일로 수정된 image 만드는 일련의 과정들을 정리해 놓은 파일 입니다. - docker는 Dockerfile을 이용하여 손쉽게 동일한 이미지를 반복해서 만들수 있습니다. 2) 문법 #FROM

doitnow-man.tistory.com

Dockerfile : Docker 이미지 설정 파일. 여기에 설정된 내용대로 이미지를 생성

docker-compose.yml : 앱이 실행되는 동안 컨테이너 관리

 

두 번째 링크에 어느 정도가 정리된 상태. docker-compose.yml의

1) 목적

    - 연결된 다수의 container를 하나로 통합하여 관리 하는 도구

2) 유의 사항 

    - docker-compose는 host level에서만 동작 합니다.

    - docker swarm에 배포 하기 위해서는 docker stack deploy를 사용 해야 합니다.

3) docker-compose.yml

     - container실행 옵션을 미리 정의한 문서 입니다. 

     - docker-compose를 docker-compose.yml에 정의된 데로 container를 실행 합니다.

4) 설치 

     - apt-get install docker-compose

#버전 정의
# 버전에 따라서 지원하는 형식이 다릅니다.
version: '3.0'

#service 정의
# docker-compose로 생성 할 container의 옵션을 정의 합니다.
# service안의 container들은 하나의 project로서 docker-compose로 관리 됩니다.
services:
    #생성 할 container 이름을 지정 합니다.
    container-이름:
        #container 생성시 사용 할 이미지 지정
        image: node-server:v1
        #build 옵션
        # docker-compose build 옵션에서 사용 됩니다.
        # dockerfile에 명시된 FROM의 image를 사용하여 위에 명시된image 이름과 tag로 새로운 image를 생성 합니다.
        build:
            #dockerfile의 위치를 지정 합니다.
            context: .
        #container port mapping 정보
        ports:
            - "80:80"
        #EXPOSE
        # 도커 컨테이너가 실행되었을 때 요청을 기다리고 있는(Listen) 포트를 지정합니다. 여러개의 포트를 지정할 수 있습니다.
        expose:
            - "80"
        #환경 변수 리스트를 정의
        environment:
            UPDATE_URL: "https://www.doitnow-man.com"
        #실행 환경 설정
        stdin_open: true       #docker run -i
        tty: true              #docker run -t
        entrypoint: /bin/bash  #exec /bin/bash

위는 일종의 docker-compose.yml 포맷이라 함.


이전에 제공받은 것

docker-compose.yml

version: '2.3'

services:
  main:
    container_name: RoadView_datagen
    build:
      context: ./
      dockerfile: Dockerfile
    restart: always
    env_file:
      - "docker-compose-env/main.env"
    volumes:
      - type: volume
        source: nfs_shared
        target: /nfs_shared
        volume:
          nocopy: true
      - "/media/mmlab/hdd:/hdd"
    expose:
      - "8000"
    ports:
      - "40000:22"
      - "40050:6006"
      - "40100:8000"
    ipc: host
    stdin_open: true
    tty: true

volumes:
  nfs_shared:
    driver_opts:
      type: "nfs"
      o: "addr=mldisk.sogang.ac.kr,nolock,soft,rw"
      device: ":/volume3/nfs_shared_"

Dockerfile

FROM nvidia/cuda:11.6.0-cudnn8-devel-ubuntu20.04

RUN apt-get update

RUN DEBIAN_FRONTEND=noninteractive apt-get -y install python \
    apt-utils \
    python3-pip \
    python-dev \
    git vim \
    openssh-server


RUN DEBIAN_FRONTEND="noninteractive" apt-get -y install tzdata

RUN pip install --upgrade pip
RUN pip install setuptools
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes #prohibit-password/' /etc/ssh/sshd_config

WORKDIR /workspace
ADD . .

ENV PYTHONPATH $PYTHONPATH:/workspace

# RUN pip install -r requirements.txt

RUN chmod -R a+w /workspace

Docker의 port 번호에 관해...

[Docker] ports와 expose의 차이 (tistory.com)

 

[Docker] ports와 expose의 차이

개발, 배포, 운영에 큰 장점이 있는 가상화/컨테이너 애플리케이션인 도커(docker)는 그 이점들이 있기 때문에 최근 많이 사용이 되고 있습니다. 도커를 사용함에 있어서 초보자들에게 매우 헷갈

growd.tistory.com

docker-compose.yml을 보면 exposeports가 있는 것을 볼 수 있다.

expose는 하나의 번호로 구성되어 있고, ports###:NNN 로 구성되어 있으며, 여러개가 있을 수 있는 것으로 보임. 이 때

호스트 : 도커를 설치한 호스트를 뜻함. 따라서 나의 경우는 내가 할당받은 서버 mango.

 

expose : 호스트 내부의 다른 컨테이너만 액세스 가능

따라서, 도커 내부에서 컨테이너 간의 통신만 필요한 경우에 쓰임.

 

ports : ports에 설정한 호스트 포트번호로 호스트 외부의 다른 호스트도 액세스가 가능.

따라서, 파이참을 보면 SSH 연결 시, Host의 ports를 기입하라고 나오는데, 이 때 ###를 넣는 것으로 보임.

도커를 설치한 호스트의 ###를 컨테이너의 NNN에 연결하는 방식이니, 파이참의 한 프로젝트를 Host의 ###과 연결하면, 그 ###는 마치 파이프라인처럼 NNN과 연결되니 그곳으로 연결되는 것.

15. [Docker] 도커에서 Container 포트와 Host 포트의 개념 : 네이버 블로그 (naver.com)

 

15. [Docker] 도커에서 Container 포트와 Host 포트의 개념

Docker를 처음 접하는 사람이라면 응당 리눅스를 사용할 것이고, 포트에 대한 개념도 알고 있을 것이다. ...

blog.naver.com


 0.0.0.0:40000->22/tcp, :::40000->22/tcp, 0.0.0.0:40050->6006/tcp, :::40050->6006/tcp, 0.0.0.0:40100->8000/tcp, :::40100->8000/tcp

위의 PORTS는 아래로부터 기인한다.

expose:
  - "8000"
ports:
  - "40000:22"
  - "40050:6006"
  - "40100:8000"

말 그대로 ###:NNN 의 형태를 띠고 있는 것을 볼 수 있다.

 

그런데 내가 직접 다른 것을 작성한 결과, 이상한 결과를 획득했다.

expose:
  - "5565"
ports:
  - "5565::5565"
0.0.0.0:49154->5565/tcp, :::49154->5565/tcp

49154는 대체 어디서 튀어나온 거임?

아무래도 expose와 ports의 ###는 서로 다르게 해야 하는 건지도?


추후 수정. yaml파일 작성법이 뭔가 잘못 되어있었나봄.

그리고 파이참과 연결하려면, NNN을 무조건 22로 하고 파이참엔 22를 넣어야 함.