Dev개발
98
2020-02-04 06:58:22 작성 2020-02-04 11:21:00 수정됨
8
704

도커 이미지/컨테이너 1개에 여러프로그램 sw 같이 실행 못시키나요?


도커 이미지/컨테이너 1개에 여러프로그램 sw 같이 실행 못시키나요?

가능하다면 도커 이미지/컨테이너  한 개에 여러 프로그램(우분투 + node.js/Java + express/Spring + Nginx/'Apache Tomcat' +  MariaDB/MongoDB +  기타)을 동시에 띄워 실행하고 싶습니다. VMWare 나 VirtualBox 처럼요.

아니면 컨테이너를 여러개 실행 시켜야 하는건지? 아니면 도커 파일에 한 이미지에 여러프로그램이 실행되게 기입해놓으면 제가 원하는게 되는건지 아직 잘 모르겠습니다.


도커 책 보기랑 검색을 통해, 실습 중인데요, 책은 약간 목차 구성이 백과 사전식 나열 같아서, 제가 원하는 부분을 목차만 봐선 찾을 수 없더군요. 책은 초반부분, 필요한 부분 보는 중이고요.

컨테이너를 여러개 실행 시켜야 하는건지? 아니면 도커 파일에 여러프로그램 실행되게 기입해놓으면 제가 원하는게 되는건지 아직 잘 모르겠습니다.

키워드 몇개 넣어서 검색해봐도 도커 이미지/컨테이너 1개에 여러프로그램 sw  를 실행 시킬수 있는 개념인지 바로 안나오더라고요. 책을 다 봐야 알 수 있는 부분인지요? 문법 나열식, 모든 기능 나열식 책은 저한테는 현재 다 볼 필요 없어 보여서 , 가지고있는 책 한 권은 웬 만하면 필요한 부분만 읽고 실제 적용하거나 검색/다른 책을 보고 싶네요.

도움 주시면 감사하겠습니다.

0
1
  • 답변 8

  • 아범테크
    565
    2020-02-04 08:42:04

    당연히 여러개 프로그램 실행할 수 있지만, 도커의 존재의미를 생각하면 컨테이너를 여러개 실행시키는 패턴이 더 흔하죠. 도커 컴포즈가 그걸 위해 있는거고요.

    1
  • Dev개발
    98
    2020-02-04 09:18:26 작성 2020-02-04 09:19:18 수정됨

    @아범테크 :  그렇군요. 답변 감사합니다. 어쨋든 하나의 도커 이미지엔 여러개의 어플리케이션을 넣는게 되는 군요.


    책을 보니 Docker에선 권장 사항으로 하나의 이미지엔 하나의 앱만 넣고 여러 컨테이너를 조합하여 서비스를 구축하는 방법을 권장한하고 있다고 나오네요.

    책을 더 보도록 하겠습니다만 현재 다 볼 필요는 없고 빨리 프로젝트 진행해야 하므로, 중간에 누가 도움되는 답변 주시면 감사하겠습니다.

    0
  • 고졸비전공자
    245
    2020-02-04 09:45:03 작성 2020-02-04 09:45:42 수정됨

    compose를 이용하셔서 여러개의 도커를 동시에 실행하고 관리할 수 있습니다. 네트웤등요!

    저도 도커 한번 써본게 다긴한데 첨에는 컨테이너에 다 넣어놓고 간편하게 쓰는겁다 햇는데 생각해보니 하나에 다 때려박으면 서버면 서버 디비면 디비등 업데이트및 유지보수가 어려워지잖아요 컨테이너 하나당 뭐 디비면 디비 그리고 서로 링킹만 되잇음 나중에 디비바꿀때 디비 컨테이너만 바꾸면되고 그런 편리함이 아닐까요

    참고자료

    https://docs.docker.com/compose/


    위 링크 내용중 

    Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration


    Compose는 여러개의 컨테이너를 정의하고 실행시킬 수 있는 툴 입니다. YAML 파일에 각 서비스를 설정 해놓으면 명령어 하나로 설정된 모든 서비스를 동시에 실행 시킬 수 있습니다.

    1
  • Keloper245
    1k
    2020-02-04 09:53:52 작성 2020-02-04 09:56:46 수정됨

    보통은 

    앱 작성

    작성한 앱을 이미지로 빌드

    앱이 내부적으로 사용하는 서드파티들과 함께 컨테이너 실행

    즉, 작성한앱 + DB + 프록시를 따로따로 컨테이너로 띄우고 같은 네트워크로 묶어줍니다.


    복수의 컨테이너를 한번에 관리하는 docker-compose라는 놈이 있으니 참고하시구요.


    밑에는 예시입니다.

    밑에나오는 

    port

    expose

    volume

    환경변수 설정하는 법은 필수적으로 아셔야 고생안하십니다.


    test_application용 image를 dockerfile로 제작

    FROM openjdk:8-jdk
    
    COPY ./test-application /test-application
    WORKDIR /test-application
    
    CMD ["./gradlew", "bootRun"]

    docker-compose 작성

    version: "3"
    services:
    
        test_web:
            image: nginx
            ports:
              - 80:80
            volumes:
              - ./nginx/conf.d:/etc/nginx/conf.d
            depends_on:
              - test_application
    
        test_database:
            image: 'bitnami/mariadb:latest'
            container_name: mariadb
            restart: always
            environment:
                - MARIADB_ROOT_USER=${MYSQL_ROOT_USER}
                - MARIADB_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
                - MARIADB_DATABASE=${MYSQL_DATABASE}
                - MARIADB_USER=${MYSQL_USER}
                - MARIADB_PASSWORD=${MYSQL_PASSWORD}
            ports:
                - 3306:3306
            volumes:
                - ./data/mysql:/bitnami
    
        test_application:
            build: .
            expose:
              - 8080
            depends_on:
              - test_database
    2
  • Dev개발
    98
    2020-02-04 11:13:18 작성 2020-02-04 11:14:19 수정됨

    @Keloper245 님, @고졸비전공자: 답변이 도움이 됐습니다. 바쁘신데 감사합니다.


    각 sw별로 이미지 만들어 각각 컨테이너에 담고 콤포즈compose로 환경설정해서 한번에 여러 컨테이너를 실행시키면 되는 거였군요.


    1
  • 고졸비전공자
    245
    2020-02-04 13:18:29

    @Keloper245 


    선배님 expose가 내부커뮤니케이션에 쓰인다고 들었는데,

    이게 그럼


    A (p:3000) 서버가 있고, B가 A와 통신하기 위해 연결한다고 했을 때, 

    도커 넷웤 같은데로 묶어 놓아도, A가 3000번 포트를 Expose 해놓지 않으면, 

    연결이 불가능 한건가요?


    version: '3'
    services:
      web:
        build:
          context: .
          dockerfile: Dockerfile
        depends_on:
          - mongo
        links:
          - 'mongo:database'
      mongo:
        image: mongo
        ports:
          - '27017:27017'
      nginx:
        build:
          context: .
          dockerfile: nginx\Dockerfile
        links:
          - 'web:app'
        ports:
          - '80:80'


    요게 제가 전에 세팅해놨던건데 webapp은 웹서버구요.

    nginx랑 db만 외부에서 보여야 됬어서 포트 바인딩해놨구,

    nginx에서 webapp에 links 걸고 app을 주소로 써서 웹앱으로 들어가게 프록시만 세팅해놨구요.


    web은 8080포트로 서버를 엽니다. 그런데 제가 웹 서버 도커파일안에 따로 EXPOSE를 안해놨거든요. 그런데 nginx에서 잘 건네주더라고요. links를 하면, 모든 포트가 expose 되는가봐요.


    저기서 links 안해놓고, 도커 네트워크 만들어서, web은 8080포트 EXPOSE 안한 상태에서 nginx랑 저 web 서버를 같은 네트워크에 둬도 포트를 expose 하지 않으면, 통신이 불가능한건가요?

    0
  • Keloper245
    1k
    2020-02-04 14:10:35

    링크는 곧 사라질 옵션이기 때문에 사용하지 않는걸 권장하고 있습니다.

    expose는 포트를 호스트와 연결하고 외부에는 노출하지 않는 옵션 입니다.


    https://jungwoon.github.io/docker/2019/01/13/Docker-4/

    도커 네트워크에 관련해서 잘 설명해준 글이니 한번 읽어보세요.

    1
  • 고졸비전공자
    245
    2020-02-04 18:55:30

    @Keloper245 


    정말 감사합니다!!!! 

    우한폐렴 조심하세요!!


    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.