CS

docker-compose์™€ cmake

moaoh 2024. 11. 9. 23:38

๋ชฉํ‘œ

 

๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ

project
    - client
        - Dockerfile
        - CMakeLists.txt
        - src
            - ...
	- server
        - Dockerfile
        - CMakeLists.txt
        - src
            - ...
    - common
        - Dockerfile
        - CMakeLists.txt
        - src
            - ...
    - CMakeLists.txt
    - Docker-compose.txt

๋‚˜์˜ ํ”„๋กœ์ ํŠธ์—๋Š” ํฌ๊ฒŒ 3๊ฐœ์˜ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

 

๋‚˜์˜ ๋ชฉํ‘œ๋Š” ์ด์™€ ๊ฐ™๋‹ค.

๊ตฌ์กฐ๋ฅผ ๊ฐ๊ฐ CMake๋ฅผ ํ†ตํ•ด ์„œ๋กœ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  docker-compose๋ฅผ ํ†ตํ•ด์„œ ๊ฐ๊ฐ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ†ตํ•ด ํ†ต์‹ ์ด ๋˜๋„๋ก ๋งŒ๋“ค ์˜ˆ์ •์ด๋‹ค.

 

client

- docker container

- clinet์—์„œ common ์—ฐ๋™ ์‚ฌ์šฉ

 

server

- docker container

- server์—์„œ common ์—ฐ๋™ ์‚ฌ์šฉ

 

common

- client์™€ server์—์„œ ์ค‘๋ณต์œผ๋กœ ์‚ฌ์šฉ๋  ํ•จ์ˆ˜๋“ค์„ client์™€ server์—์„œ include๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋“ค์„ ๋‹ด์„ ๋””๋ ‰ํ† ๋ฆฌ

 


CMake ์—ฐ๊ฒฐ

main/CMakeLists.txt

# main/CMakeLists.txt
cmake_minimum_required(VERSION 3.29)
project(TransFile_TCP)

set(CMAKE_CXX_STANDARD 14)

add_subdirectory(common)
add_subdirectory(server)
add_subdirectory(client)
  • ์ „์ฒด์ ์ธ CmakeLists.txt ๋“ค์„ ๊ด€๋ฆฌํ•  Root CmakeLists.txt ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค.

 

common/CMakeList.txt

# common/CMakeList.txt
cmake_minimum_required(VERSION 3.29)

project(common)

add_library(common STATIC
        src/network_utils.cpp
)
target_include_directories(common PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src)
  • add_libraty : common ๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ ์ •์ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ƒ์„ฑํ•œ๋‹ค.
  • target_include_directories(PUBLIC) : ํ•ด๋‹น ํƒ€๊ฒŸ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ํ•ด๋‹น ํƒ€๊ฒŸ์„ ๋งํฌํ•˜๋Š” ์™ธ๋ถ€ ํƒ€๊ฒŸ์—๋„ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ์‚ฌ์šฉ
    ์œ„์™€ ๊ฐ™์€ ๊ฒฝ์šฐ common์„ ๋‹ค๋ฅธ (ex: server, clinet) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก PUBLIC์œผ๋กœ ์ƒ์„ฑ์„ ์ง„ํ–‰ํ•œ๋‹ค.

server/CMakeLists.txt

# server/CMakeList.txt
cmake_minimum_required(VERSION 3.29)

project(server)

add_executable(server
        src/server.cpp
)

# common ํ—ค๋” ํŒŒ์ผ ๊ฒฝ๋กœ ์ถ”๊ฐ€
target_include_directories(server PRIVATE ${CMAKE_SOURCE_DIR}/common)
# common ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋งํฌ
target_link_libraries(server PRIVATE common)
  • target_include_directories(PRIVATE) : ํ•ด๋‹น ํƒ€๊ฒŸ์—์„œ๋งŒ ํ•„์š”ํ•œ ํ—ค๋” ํŒŒ์ผ ๊ฒฝ๋กœ์ด๊ฑฐ๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ผ ๋•Œ ์‚ฌ์šฉ
    server์— ๊ฒฝ์šฐ์—๋Š” ์ถ”๊ฐ€์ ์ธ ๊ณต์œ ๋ฅผ ์•ˆํ•ด๋„ ๋˜๊ธฐ๋•Œ๋ฌธ์— PRIVATE์œผ๋กœ ์ƒ์„ฑ
  • target_link_libraries : ๋‹ค๋ฅธ ๋‹ค์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์‹ค์งˆ์ ์œผ๋กœ ๋งํฌ๋ฅผ ํ•ด์ฃผ๊ธฐ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.
    server์™€ common ์„œ๋กœ ๋งํฌ

์ฐจ์ด์  ์š”์•ฝ

๋ช…๋ น์–ด ๋ชฉ์  ํƒ€๊ฒŸ์— ๋Œ€ํ•œ ์˜ํ–ฅ  ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์‹œ์ 
target_include_directories ํ—ค๋” ํŒŒ์ผ ๊ฒฝ๋กœ ์ถ”๊ฐ€ (์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก) ํƒ€๊ฒŸ์˜ ์†Œ์Šค ํŒŒ์ผ์—์„œ ํ—ค๋”๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋จ ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ํ—ค๋” ํŒŒ์ผ์„ ์ฐพ์„ ๋•Œ ์‚ฌ์šฉ
target_link_libraries ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋งํฌ (๊ธฐ๊ณ„์–ด ์ฝ”๋“œ ์—ฐ๊ฒฐ) ํƒ€๊ฒŸ์ด ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ฝ”๋“œ๋ฅผ ํฌํ•จ์‹œํ‚ด ๋งํฌ ๋‹จ๊ณ„์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ๋ฅผ ์—ฐ๊ฒฐํ•  ๋•Œ ์‚ฌ์šฉ

 

 

client/CMakeLists.txt

# client/CMakeList.txt
cmake_minimum_required(VERSION 3.29)

project(client)

add_executable(client
        src/client.cpp
)

# common ํ—ค๋” ํŒŒ์ผ ๊ฒฝ๋กœ ์ถ”๊ฐ€
target_include_directories(client PRIVATE ${CMAKE_SOURCE_DIR}/common)
# common ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋งํฌ
target_link_libraries(client PRIVATE common)
  • server์™€ ์ดํ•˜๋™๋ฌธ

 


dockerfile

docker-compose.yaml

services:
  cmake-build:
    image: cmake-build
    container_name: cmake-build
    build:
      context: .
      dockerfile: cmake-build/Dockerfile
    volumes:
      - ./common:/app/common
      - ./server:/app/server
      - ./client:/app/client

  common:
    image: common
    container_name: common
    build:
      context: .
      dockerfile: common/Dockerfile
    depends_on:
      - cmake-build
    volumes:
      - ./common:/app/common

  server:
    image: server
    container_name: server
    build:
      context: .
      dockerfile: server/Dockerfile
    ports:
      - "8080:8080"
    depends_on:
      - cmake-build
    volumes:
      - ./server:/app/server
      - ./common:/app/common

  client:
    image: client
    container_name: client
    build:
      context: .
      dockerfile: client/Dockerfile
    depends_on:
      - cmake-build
    volumes:
      - ./client:/app/client
      - ./common:/app/common
  • services : build, common, server, client ์ด 4๊ฐœ ์กด์žฌ

 

cmake-build/Dockerfile

# cmake-build/Dockerfile
FROM alpine:latest

# ๊ณตํ†ต ๋นŒ๋“œ ํˆด ์„ค์น˜
RUN apk update && apk add --no-cache \
    build-base \
    cmake \
    g++ \
    && rm -rf /var/cache/apk/*

WORKDIR /app
COPY . /app

RUN rm -rf build && mkdir -p build && cd build && \
    cmake .. && \
    make
  • servcie๋งˆ๋‹ค ๋นŒ๋“œ ํˆด๋“ค ์„ค์น˜ ๋ฐ cmake ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋ชจ ๋ฐ ์‹œ๊ฐ„์ ์œผ๋กœ ์†ํ•ด๊ฐ€ ํฌ๊ธฐ๋•Œ๋ฌธ์— ์ „๋ฐ˜์ ์ธ ์ž‘์—…์„ ์ง„ํ–‰ํ•ด์ค„ img๋ฅผ ์ƒ์„ฑ

 

common/Dockerfile

# common/Dockerfile
FROM cmake-build

WORKDIR /app
COPY . /app
  • cmake-build ๊ธฐ๋ฐ˜์˜ build๋ฅผ ์‚ฌ์šฉ (๊ทธ๋กœ์ธํ•ด ์ถ”๊ฐ€์ ์ธ ์„ค์น˜ ํ•„์š” X)
  • common์— ๊ฒฝ์šฐ์—๋Š” server์™€ client์—๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ „๋‹ฌํ•ด์ฃผ๋Š” ์—ญํ• ์ด๊ธฐ๋•Œ๋ฌธ์— ๋”ฐ๋กœ CMD ๋™์ž‘ X

 

server/Dockerfile

# server/Dockerfile
FROM cmake-build

COPY ./ /app
WORKDIR /app

CMD ["/app/build/server/server"]
  • cmake-build ๊ธฐ๋ฐ˜์˜ build๋ฅผ ์‚ฌ์šฉ (๊ทธ๋กœ์ธํ•ด ์ถ”๊ฐ€์ ์ธ ์„ค์น˜ ํ•„์š” X)
  • ์ „์ฒด์ ์ธ ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ container ์•ˆ์œผ๋กœ ๋„ฃ์–ด์ฃผ๊ณ  CMD๋ฅผ ํ†ตํ•ด server ์‹คํ–‰

 

client/Dockerfile

# client/Dockerfile
FROM cmake-build

# ํด๋ผ์ด์–ธํŠธ ์†Œ์Šค ๋ณต์‚ฌ
COPY ./ /app
WORKDIR /app

# ํด๋ผ์ด์–ธํŠธ ์‹คํ–‰
CMD ["/app/build/client/client"]
  • server์™€ ์ดํ•˜๋™๋ฌธ

 


ํ•„์š”ํ•œ ์ˆ˜์ •์‚ฌํ•ญ

  • ํ˜„์žฌ์˜ CMake๋กœ ์ธํ•ด ์ƒ์„ฑ๋œ build ํŒŒ์ผ๋“ค์€ cmake-build ์•ˆ์—์„œ ๋งŒ๋“ค์–ด์ง„๋‹ค.
    ๊ทธ๋ ‡๊ฒŒ ๋–„๋ฌธ์— cmake-build ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋‚ด๋ ค๊ฐ€๋ฉด build ๊ด€๋ จ ํŒŒ์ผ๋“ค๋„ volumes๋ฅผ ํ•  ์ˆ˜ ์—†๊ฒŒ๋œ๋‹ค.
    ์ด๋Ÿด ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ build๊ด€๋ จํŒŒ์ผ๋“ค์„ volumesํ•˜์—ฌ ๊ด€์ฐฐํ• ๊ฒƒ์ธ๊ฐ€?