docker-compose์ cmake
๋ชฉํ
๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ
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ํ์ฌ ๊ด์ฐฐํ ๊ฒ์ธ๊ฐ?