[태그:] docker

  • CMake Quick Guide (with docker compose)

    1. 개요

    CMake는 C/C++ 등 여러 프로그래밍 언어로 작성된 프로젝트의 빌드 자동화 도구입니다. GNU Make나 Ninja 같은 하위 빌드 시스템의 설정 파일을 생성하는 메타 빌드 시스템(Meta Build System) 이라고 할 수 있습니다.

    2. CMake의 핵심 개념

    2.1. CMakeLists.txt

    • CMake 프로젝트는 이 파일을 중심으로 구성됩니다.
    • 빌드 설정, 소스 코드 목록, 컴파일 옵션 등을 명시합니다.

    2.2. 빌드 디렉토리 분리 (Out-of-source build)

    • 소스 코드와 빌드 결과물을 분리하여 관리 가능
    • 예:
    Bash
    mkdir build
    cd build
    cmake ..
    make
    Bash

    2.3. 다양한 플랫폼 지원

    • Windows, macOS, Linux 등에서 동일한 CMakeLists.txt로 빌드 구성 가능
    • Visual Studio, Makefile, Ninja 등 다양한 빌드 시스템을 지원

    3. 주요 명령어

    명령어설명
    cmake .현재 디렉토리의 CMakeLists.txt를 바탕으로 빌드 설정 생성
    cmake ..상위 디렉토리의 CMakeLists.txt를 사용해 빌드 설정 생성
    make생성된 Makefile로 실제 빌드 수행
    cmake --build .플랫폼 독립적 빌드 명령

    4. 주요 기능

    • install, test, configure_file 등 다양한 프로젝트 관리 기능 내장
    • find_package로 외부 라이브러리 탐색
    • target_link_libraries로 라이브러리 연결
    • option, if 등을 활용한 조건부 설정

    5. 예시 프로젝트 구조

    Bash
    MyCMakeWithDockerCompose/
    ├── app/
       ├── CMakeLists.txt
       └── hello-world.cpp
    └── docker-compose.yml
    Bash

    app/CMakeLists.txt:

    CMake
    cmake_minimum_required(VERSION 3.10)
    
    set(CMAKE_C_COMPILER "/usr/bin/gcc")
    set(CMAKE_CXX_COMPILER "/usr/bin/g++")
    
    project(HelloWorld)
    
    add_executable(HelloWorld hello-world.cpp)
    CMake

    app/hello-world.cpp:

    C++
    #include <iostream>
    
    int main() {
        std::cout << "Hello, World!" << std::endl;
        return 0;
    }
    C++

    docker-compose.yml:

    YAML
    services:
      hello-cmake:
        image: ubuntu:18.04
        container_name: hello-cmake
        volumes:
          - type: bind
            source: ./app
            target: /app
        working_dir: /app
        command: >
          bash -c "
            apt update &&
            apt install -y cmake build-essential &&
            mkdir -p build &&
            cd build &&
            cmake .. &&
            make
          "
    YAML

    6. 예시 프로젝트 빌드

    Bash
    root@centricone:~/MyCMakeWithDockerCompose# docker compose up
    [+] Running 1/1
      Container hello-cmake  Created
    Attaching to hello-cmake
    hello-cmake  | 
    
    ...... 생략 ......
    
    hello-cmake  | [100%] Linking CXX executable HelloWorld
    hello-cmake  | [100%] Built target HelloWorld
    hello-cmake exited with code 0
    root@centricone:~/MyCMakeWithDockerCompose# ls -l app/build/
    total 40
    -rw-r--r-- 1 root root 12200 May 19 02:14 CMakeCache.txt     
    drwxr-xr-x 5 root root  4096 May 19 02:15 CMakeFiles
    -rw-r--r-- 1 root root  1460 May 19 02:14 cmake_install.cmake
    -rwxr-xr-x 1 root root  8928 May 19 02:14 HelloWorld
    -rw-r--r-- 1 root root  4839 May 19 02:15 Makefile
    root@centricone:~/MyCMakeWithDockerCompose/app# ./build/HelloWorld 
    Hello, World!
    root@centricone:~/MyCMakeWithDockerCompose#
    Bash

    1: 도커 컨테이너 실행

    12: 빌드내용 확인을 위해 디렉터리 조회

    17: 빌드된 HelloWorld 바이너리

    7. CMake의 장점

    • 다양한 옵션 제공: 테스트, 설치, 패키징 등 통합 관리
    • 유지보수 용이: 큰 프로젝트에서도 구성 관리가 쉬움
    • 크로스 플랫폼: 다양한 OS 및 빌드 도구에 대응
    • 모듈화: 서브 디렉토리 단위 구성 가능

  • docker 실습 – container run — env

    Bash
    docker container run --name db --rm mariadb
    Bash

    Bash
     You need to specify one of MARIADB_ROOT_PASSWORD, MARIADB_ROOT_PASSWORD_HASH, MARIADB_ALLOW_EMPTY_ROOT_PASSWORD and MARIADB_RANDOM_ROOT_PASSWORD
    Bash

    MARIADB_ROOT_PASSWORD, MARIADB_ROOT_PASSWORD_HASH, MARIADB_ALLOW_EMPTY_ROOT_PASSWORD and MARIADB_RANDOM_ROOT_PASSWORD 중 하나를 명시하라는 메시지를 출력합니다.

    Bash
    docker container run \
      --name db \
      --env MARIADB_ROOT_PASSWORD=secretpw \
      --publish 3306:3306 \
      --rm \
      mariadb
    Bash

    Bash
    mariadb --host=127.0.0.1 --port=3306 --user=root --password=secretpw
    Bash
  • docker-compose down과 stop의 차이

    1. 개요

    도커 컨테이너를 종료할 때는 docker-compose down과 docker compose stop을 사용합니다.

    이 둘은 모두 컨테이너를 종료하는 데 사용되지만 명령에 따른 효과는 차이를 보입니다.

    본 글에서는 이 두 명령어의 차이점에 대해 서술합니다.

    2. docker-compose stop

    • 현재 docker-compose up 으로 실행 중인 **컨테이너를 “중지(stop)”**합니다.
    • 컨테이너는 삭제되지 않으며, 상태는 “중지됨(stopped)” 상태로 남아 있습니다.

    2.1. 실행 효과

    • 컨테이너 상태 : 중지 (삭제되지 않음)
    • 네트워크 : 그대로 유지됨
    • 볼륨 : 그대로 유지됨
    • 다시 시작 가능 : docker-compose start 로 빠르게 재시작 가능
    • 캐시 / 설정 유지 : ✅ 그대로 유지됨

    2.2. 실행 예시:

    Bash
    docker-compose stop
    Bash

    3. docker-compose down

    • Compose 환경 전체를 정리하고 종료
    • 모든 관련 리소스 (컨테이너, 네트워크, 기본 볼륨 등)를 삭제

    3.1 실행 효과

    • 컨테이너 상태: 완전 삭제
    • 네트워크 : 삭제됨 (사용 중인 전용 네트워크 포함)
    • 볼륨 : 기본은 유지됨, -v 옵션 시 삭제
    • 이미지 : 기본은 유지됨, --rmi 옵션 시 삭제 가능
    • 다시 시작 가능 여부 : up으로 재생성 필요

    3.2. 실행 예시:

    Bash
    docker-compose down
    Bash

    4. 요약

    • stop일시정지 (컨테이너는 남아 있음)
    • down완전종료 + 컨테이너/네트워크/옵션에 따라 볼륨 삭제
  • docker exec script

    기존의 docker exec 실행 과정:

    command line 인터페이스에서 docker exec를 실행하는 다음의 과정은 타이핑이 많고 다소 번거롭게 느껴졌다.

    Bash
    root:/# docker ps          # 컨테이너 목록에서 container_id를 알아냄
    CONTAINER ID   IMAGE                     COMMAND                  CREATED        STATUS                 PORTS
                                                                                        NAMES
    82c74c62c057   node:18.19-alpine         "docker-entrypoint.s…"   47 hours ago   Up 6 hours             0.0.0.0:9970-9972->9970-9972/tcp, :::9970-9972->9970-9972/tcp                                                               node-18.19-alpine
    de21f0a597ce   alpine/node:latest        "/bin/sh /home/node/…"   2 days ago     Up 2 days              0.0.0.0:9990-9992->9990-9992/tcp, :::9990-9992->9990-9992/tcp                                                               alpine-node-1
    108328fc0449   postgres:latest           "docker-entrypoint.s…"   5 months ago   Up 8 days              5432/tcp, 0.0.0.0:5436->5436/tcp, :::5436->5436/tcp                                                                         postgres
    6c58225e976e   gitlab/gitlab-ce:latest   "/assets/wrapper"        6 months ago   Up 4 weeks (healthy)   0.0.0.0:32769->22/tcp, :::32769->22/tcp, 0.0.0.0:9780->80/tcp, :::9780->80/tcp, 0.0.0.0:32768->443/tcp, :::32768->443/tcp   gitlab
    
    root:/# docker exec -it 6c5822 /bin/bash   # 쉘 실행
    root@gitlab:/# 

    간소화 스크립트 코드 작성:

    그래서 다음과 같이 스크립트를 작성해보았다.

    #!/bin/bash
    
    # script file name: exec.gitlab.sh
    
    if [ $# -ge 3 ]; then
        echo "Usage: $0 [command]"
        exit
    fi
    
    container_name='gitlab'
    command="/bin/bash"
    
    if [ $# -ge 1 ]; then
        command=$1
    fi
    
    dockerid=`docker ps | grep -i $container_name | awk '{ print $1 }'`
    docker exec -it $dockerid $command

    실행 예:

    실행 예는 다음과 같다. 타이핑 수와 실행단계가 줄었다.

    root:/# ./exec.gitlab.sh ls     # ls 실행
    RELEASE  boot  gitlab  lib32   linuxrc  opt   run   sys  var
    assets   dev   home    lib64   media    proc  sbin  tmp
    bin      etc   lib     libx32  mnt      root  srv   usr
    root:/# ./exec.gitlab.sh pwd    # pwd 실행
    /
    root:/# ./exec.gitlab.sh        # 인자가 없다면 쉘 실행
    root:/#

  • 도커(Docker)란?, 핵심개념, 장단점, 기본명령어

    🐳 도커(Docker)란?

    • Docker는 애플리케이션을 컨테이너(container)라는 단위로 실행할 수 있도록 도와주는 가상화 기술입니다.
    • 컨테이너를 사용하면 애플리케이션과 필요한 모든 환경(라이브러리, 설정 파일 등)을 하나로 묶어 어디서든 동일한 환경에서 실행할 수 있습니다.

     
     
     


    💡 Docker의 핵심 개념

     

    1️⃣ 컨테이너(Container)

    • 애플리케이션과 실행에 필요한 모든 요소(코드, 라이브러리, 설정 등)를 포함한 독립적인 환경
    • 가상 머신(VM)과 달리 OS 전체를 포함하지 않고, 경량화된 실행 방식을 가짐
    • 어디서 실행해도 동일한 환경 보장 (Windows, Mac, Linux 상관없이 실행 가능)

     

    2️⃣ 이미지(Image)

    • 컨테이너를 실행하기 위한 설정된 파일 시스템과 애플리케이션을 포함한 패키지
    • 여러 개의 레이어(layer)로 구성되며, 변경이 필요할 경우 새 레이어를 추가하는 방식
    • Docker Hub 또는 개인 저장소에 업로드 가능

     

    3️⃣ Dockerfile

    • 컨테이너를 만들기 위한 설정 파일
    • 컨테이너를 생성할 때 실행할 명령어, 환경 변수, 설치 – 패키지, 실행 프로그램 등을 지정
    • docker build 명령어를 통해 이미지 생성 가능

     

    4️⃣ Docker Hub

    • 공식적으로 Docker 이미지를 공유하는 클라우드 기반 저장소
    • 다양한 운영 체제, 개발 프레임워크, 데이터베이스 등의 공식 Docker 이미지를 제공
    • 웹사이트 URL: https://hub.docker.com

     

    5️⃣ Docker Compose

    • 여러 개의 컨테이너를 한 번에 실행하기 위한 오케스트레이션 도구
    • docker-compose.yml 파일을 이용해 웹 서버, 데이터베이스, 캐시 서버 등을 한꺼번에 실행 가능

     
     
     


    💎 Docker의 장점

     

    1️⃣ 환경 일관성 유지

    • 개발 환경, 테스트 환경, 배포 환경이 모두 동일하게 유지됨 (더 이상 “내 로컬에서는 잘 되는데?” 없음!)
    • 개발자가 코드를 실행하는 환경과 실제 서버 환경이 동일하므로 예측 가능한 동작 가능

     

    2️⃣ 가벼운 컨테이너 (vs 가상 머신)

    • 가상 머신(VM)은 각각 별도의 OS를 설치해야 하지만, Docker 컨테이너는 호스트 OS의 커널을 공유하기 때문에 훨씬 가볍고 빠름
    • VM보다 메모리 사용량이 적고, 실행 속도가 빠름

     

    3️⃣ 빠른 배포 및 확장

    • 컨테이너 기반의 애플리케이션을 손쉽게 복사하고 여러 서버에서 실행 가능
    • 마이크로서비스 아키텍처(MSA)와 궁합이 잘 맞음

     

    4️⃣ 의존성 문제 해결

    • 특정 애플리케이션이 요구하는 라이브러리, 패키지, 설정 값을 컨테이너 안에서 완전히 독립적으로 유지 가능
    • 예: Python 3.7 기반 프로젝트와 Python 3.9 기반 프로젝트를 동시에 실행 가능

     

    5️⃣ 다양한 운영 체제 지원

    • Docker 이미지를 만들면 Linux, Windows, Mac 어디에서든 실행 가능
    • 클라우드, 로컬, 서버 어디서든 배포 가능

     
     
     


    ⚠️ Docker의 단점

     

    1️⃣ GUI 애플리케이션 지원이 어려움

    • Docker는 CLI(Command Line Interface) 환경에서 실행되므로, GUI 기반의 프로그램 실행은 어려움

     

    2️⃣ 성능 저하 가능성

    • 네이티브 실행보다는 약간의 성능 저하가 발생할 수 있음
    • 특히 디스크 I/O, 네트워크 속도가 중요한 애플리케이션에서는 성능 문제를 고려해야 함

     

    3️⃣ 초기 학습 필요

    • Docker를 처음 접하는 개발자에게는 Dockerfile, Compose, 네트워크 설정 등이 어렵게 느껴질 수 있음
    • 컨테이너 간의 네트워크 연결, 데이터 볼륨 관리 등을 익히는 데 시간이 걸림

     
     
     


    🖥️ Docker 기본 명령어

     

    1. Docker 설치 확인

    docker --version

     

    2. Docker 컨테이너 실행

    • hello-world 컨테이너를 실행하여 정상적으로 설치되었는지 확인
    docker run hello-world

     

    3. 실행 중인 컨테이너 확인

    • 현재 실행 중인 컨테이너 목록 조회
    docker ps

     

    4. 종료된 컨테이너 포함한 전체 목록 확인

    docker ps -a

     

    5. 컨테이너 중지

    docker stop [컨테이너 ID]
    

     

    6. 컨테이너 삭제

    docker rm [컨테이너 ID]

     

    7. 모든 컨테이너 강제 삭제

    docker rm -f $(docker ps -aq)

     

    8. Docker 이미지 목록 확인

    docker images

     

    9. Docker 이미지 삭제

    docker rmi [이미지 ID]

     

    10. Docker Compose 실행

    • docker-compose.yml 파일을 기반으로 여러 개의 컨테이너를 실행
    docker-compose up -d

     

    11. Docker 컨테이너내부로 파일복사

    docker cp 로컬경로 아이디:컨테이너내부경로
    • 예시 (로컬의 run.sh파일을 컨테이너내부의 /tmp로 복사):
    $ docker ps                     # 컨테이너 아이디 확인
    CONTAINER ID   IMAGE      COMMAND                ...
    1060abab28f6   server     "bash -c 'server…"     ...
    $ docker cp run.sh 1060:/tmp    # 파일 복사
    Successfully copied 337kB to 1060:/tmp

     

     

     


    🏁 결론

    • Docker는 애플리케이션을 쉽고 빠르게 배포할 수 있도록 도와주는 컨테이너 기술입니다.
    • 가벼우면서도 환경 일관성을 유지할 수 있어 개발, 테스트, 운영 환경에서 매우 유용하게 활용됩니다.

    ✅ Docker가 필요한 경우

    • 여러 개발 환경(Windows, Mac, Linux)에서 동일한 환경을 유지해야 할 때
    • 배포 자동화를 원할 때
    • 여러 개의 애플리케이션을 컨테이너로 관리하고 싶을 때
    • 마이크로서비스 아키텍처(MSA) 기반의 애플리케이션을 구축할 때

    💡 Docker는 현대 소프트웨어 개발에서 필수적인 도구 중 하나이며, DevOps, CI/CD(지속적 통합/배포)에도 자주 사용됩니다! 🚀

     
     
     

    참고자료