Docker Compose

๋ฉ€ํ‹ฐ ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ

  1. ๋ฐ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†Œ์Šค์ฝ”๋“œ ๋‹ค์šด๋กœ๋“œ

    git clone https://github.com/youngwjung/to-do.git && cd to-do
  2. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†Œ์Šค ์ฝ”๋“œ ๋ฐ README ๋ฆฌ๋ทฐ

  3. Dockerfile ์ƒ์„ฑ

    cat <<EOF | tee frontend/Dockerfile
    FROM nginx:alpine
    COPY . /usr/share/nginx/html
    EOF
  4. ํ”„๋ก ํŠธ์—”๋“œ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ์ƒ์„ฑ

    docker image build -t frontend frontend/
  5. ํ”„๋ก ํŠธ์—”๋“œ ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ

    docker container run --name frontend -d -p 8080:80 frontend
  6. ์›น๋ธŒ๋ผ์šฐ์ €์—์„œ ์ปจํ…Œ์ด๋„ˆ๋กœ ์ ‘๊ทผ๋˜๋Š”์ง€ ํ™•์ธ - ์•„๋ž˜ ๋ช…๋ น์–ด๋กœ ์ฃผ์†Œ ํ™•์ธ ๊ฐ€๋Šฅ

    echo "$(curl -s ifconfig.io):8080"
  7. Dockerfile ๋ณ€๊ฒฝ

    cat <<'EOF' | tee frontend/Dockerfile
    FROM nginx:alpine
    COPY . /usr/share/nginx/html
    ARG API_ENDPOINT
    RUN sed -i 's/localhost:9000/'"$API_ENDPOINT"'/g' /usr/share/nginx/html/js/main.js
    EOF
  8. ํ”„๋ก ํŠธ์—”๋“œ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ์žฌ์ƒ์„ฑ

    docker image build --no-cache -t frontend \
    --build-arg API_ENDPOINT=$(curl -s ifconfig.io):9000 \
    frontend/
  9. ํ”„๋ก ํŠธ์—”๋“œ ์ปจํ…Œ์ด๋„ˆ ์žฌ์ƒ์„ฑ

    {
        docker container rm frontend --force
        docker container run --name frontend -d -p 8080:80 frontend
    }
  10. ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋กœ๋”ฉ๋œ ํŽ˜์ด์ง€ ๋ฆฌํ”„๋ ˆ์‹œ

  11. Dockerfile ์ƒ์„ฑ

    cat <<EOF | tee api/Dockerfile
    FROM golang:1.20-alpine as builder
    WORKDIR /app
    COPY go.mod go.sum ./
    RUN go mod download
    COPY *.go ./
    RUN go build -o /api
    
    FROM alpine
    RUN mkdir /app
    WORKDIR /app
    COPY --from=builder /api /app/api
    EXPOSE 9000
    CMD ["/app/api"]
    EOF
  12. API ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ์ƒ์„ฑ

    docker image build -t api api/
  13. API ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ

    docker container run --name api -d -p 9000:9000 api
  14. API ์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ ํ™•์ธ

    docker container ls -a
  15. API ์ปจํ…Œ์ด๋„ˆ ๋กœ๊ทธ ํ™•์ธ

    docker logs api
  16. MySQL ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ

    docker container run --name mysql -d -p 3306:3306 \
    -e MYSQL_ROOT_PASSWORD=asdf1234 mysql:5.7
  17. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ ์ƒ์„ฑ

    mysql -h 127.0.0.1 -u root -pasdf1234 < database/schema.sql
  18. API ์ปจํ…Œ์ด๋„ˆ ์žฌ์ƒ์„ฑ

    {
        docker container rm api --force
        docker container run --name api -d -p 9000:9000 \
        -e DATABASE_HOST=$(docker container inspect mysql --format '{{.NetworkSettings.IPAddress}}') \
        -e DATABASE_PASSWORD=asdf1234 \
        api
    }
  19. API ์ปจํ…Œ์ด๋„ˆ ๋กœ๊ทธ ํ™•์ธ

    docker logs api
  20. Redis ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ

    docker container run --name redis -d redis
  21. API ์ปจํ…Œ์ด๋„ˆ ์žฌ์ƒ์„ฑ

    {
        docker container rm api --force
        docker container run --name api -d -p 9000:9000 \
        -e DATABASE_HOST=$(docker container inspect mysql --format '{{.NetworkSettings.IPAddress}}') \
        -e DATABASE_PASSWORD=asdf1234 \
        -e REDIS_HOST=$(docker container inspect redis --format '{{.NetworkSettings.IPAddress}}') \
        api
    }
  22. ์‹คํ–‰์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ ๋ชฉ๋ก ํ™•์ธ

    docker container ls
  23. ๋ณด์•ˆ๊ทธ๋ฃน์— ์ธ๋ฐ”์šด๋“œ ๊ทœ์น™ ์ถ”๊ฐ€

    aws ec2 authorize-security-group-ingress \
    --group-id $(aws ec2 describe-security-groups \
    --filters Name=group-name,Values=$(curl -s http://169.254.169.254/latest/meta-data/security-groups) \
    --query "SecurityGroups[0].GroupId" --output text) \
    --protocol tcp \
    --port 9000 \
    --cidr 0.0.0.0/0 \
    --output text
  24. ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋กœ๋”ฉ๋œ ํŽ˜์ด์ง€ ๋ฆฌํ”„๋ ˆ์‹œ

  25. ๋ฆฌ์†Œ์Šค ์ •๋ฆฌ

    {
        docker container rm $(docker container ls -aq) --force
        docker image prune --all --force
        docker volume prune --force
        cd ~/environment
    }

Docker Compose

  1. Docker Compose ์„ค์น˜

    {
        sudo mkdir -p /usr/local/lib/docker/cli-plugins
        sudo curl -SL https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins/docker-compose
        sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
    }
  2. Docker Compose ์„ค์น˜ ํ™•์ธ

    docker compose version
  3. ์›Œ๋“œํ”„๋ ˆ์Šค๋ฅผ ๊ตฌ์„ฑํ•  Compose ํŒŒ์ผ ์ƒ์„ฑ

    mkdir wordpress && cd wordpress && \
    cat <<EOF | tee docker-compose.yml
    services:
      wordpress:
        image: wordpress
    EOF
  4. Compose ํŒŒ์ผ์— ๋ช…์‹œ๋œ ๊ตฌ์„ฑ๋Œ€๋กœ ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ ์ƒ์„ฑ

    docker compose up -d
  5. ์‹คํ–‰์ค‘์ธ Compose ํ”„๋กœ์ ํŠธ ๋ชฉ๋ก ํ™•์ธ

    docker compose ls
  6. Compose ํŒŒ์ผ ์ˆ˜์ •

    cat <<EOF | tee docker-compose.yml
    name: blog
    services:
      wordpress:
        image: wordpress
    EOF
  7. ์ˆ˜์ • ์‚ฌํ•ญ ๋ฐ˜์˜

    docker compose up -d
  8. ์‹คํ–‰์ค‘์ธ Compose ํ”„๋กœ์ ํŠธ ๋ชฉ๋ก ํ™•์ธ

    docker compose ls
  9. ์ˆ˜์ •ํ•˜๊ธฐ์ „ ๋ฒ„์ „์˜ Compose ํŒŒ์ผ๋กœ ์ƒ์„ฑ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ˆ˜๋™์œผ๋กœ ์‚ญ์ œ

    {
        docker container rm wordpress-wordpress-1 --force
        docker network rm wordpress_default
    }
  10. Compose๋ฅผ ํ†ตํ•ด์„œ ์‹คํ–‰์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ ๋ชฉ๋ก ํ™•์ธ

    docker compose ps
  11. Compose ํŒŒ์ผ ์ˆ˜์ •

    cat <<EOF | tee docker-compose.yml
    name: blog
    services:
      wordpress:
        image: wordpress
        container_name: wordpress
    EOF
  12. ์ˆ˜์ • ์‚ฌํ•ญ ๋ฐ˜์˜

    docker compose up -d
  13. Compose๋ฅผ ํ†ตํ•ด์„œ ์‹คํ–‰์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ ๋ชฉ๋ก ํ™•์ธ

    docker compose ps
  14. ์‹คํ–‰์ค‘์ธ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ ๋ชฉ๋ก ํ™•์ธ

    docker container ls
  15. NGINX ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ

    docker run --name nginx -d nginx
  16. ์‹คํ–‰์ค‘์ธ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ ๋ชฉ๋ก ํ™•์ธ

    docker container ls
  17. Compose๋ฅผ ํ†ตํ•ด์„œ ์‹คํ–‰์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ ๋ชฉ๋ก ํ™•์ธ

    docker compose ps
  18. ์ƒˆ๋กœ์šด ํ„ฐ๋ฏธ๋„์„ ์—ด๊ณ  Compose๋ฅผ ํ†ตํ•ด์„œ ์‹คํ–‰์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ ๋ชฉ๋ก ํ™•์ธ

    docker compose ps
  19. ์‹คํ–‰์ค‘์ธ Compose ํ”„๋กœ์ ํŠธ ๋ชฉ๋ก ํ™•์ธ

    docker compose ls
  20. ์ƒ์„ฑ๋œ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ์— ๋ถ€์—ฌ๋œ Label ํ™•์ธ

    docker container inspect \
    $(docker container ps -aq) --format '{{.Name}} - {{json .Config.Labels}}'
  21. ๊ธฐ์กด ํ„ฐ๋ฏธ๋„๋กœ ์ด๋™ํ•ด์„œ NGINX ์‚ญ์ œ

    docker container rm nginx --force
  22. Compose ํŒŒ์ผ ์ˆ˜์ •

    cat <<EOF | tee docker-compose.yml
    name: blog
    services:
      wordpress:
        image: wordpress
        container_name: wordpress
        ports:
        - 8080:80
    EOF
  23. ์ˆ˜์ • ์‚ฌํ•ญ ๋ฐ˜์˜

    docker compose up -d
  24. ์›น๋ธŒ๋ผ์šฐ์ €์—์„œ ํฌํŠธํฌ์›Œ๋”ฉํ•œ ํฌํŠธ๋ฅผ ํ†ตํ•ด์„œ ์ปจํ…Œ์ด๋„ˆ๋กœ ์ ‘๊ทผ๋˜๋Š”์ง€ ํ™•์ธ - ์•„๋ž˜ ๋ช…๋ น์–ด๋กœ ์ฃผ์†Œ ํ™•์ธ ๊ฐ€๋Šฅ

    echo "$(curl -s ifconfig.io):8080"
  25. Compose ํŒŒ์ผ ์ˆ˜์ •

    cat <<EOF | tee docker-compose.yml
    name: blog
    services:
      wordpress:
        image: wordpress
        container_name: wordpress
        ports:
        - 8080:80
        environment:
        - WORDPRESS_DB_HOST=mysql
        - WORDPRESS_DB_USER=wordpress
        - WORDPRESS_DB_PASSWORD=wordpress
        - WORDPRESS_DB_NAME=wordpress
        depends_on:
        - mysql
      mysql:
        image: mysql
        volumes:
        - mysql-data:/var/lib/mysql
        environment:
        - MYSQL_ROOT_PASSWORD=asdf1234
        - MYSQL_USER=wordpress
        - MYSQL_PASSWORD=wordpress
        - MYSQL_DATABASE=wordpress
    volumes:
      mysql-data:
    EOF
  26. ์ˆ˜์ • ์‚ฌํ•ญ ๋ฐ˜์˜

    docker compose up -d
  27. ์›น๋ธŒ๋ผ์šฐ์ €์—์„œ ์›Œ๋“œํ”„๋ ˆ์Šค ์‚ฌ์ดํŠธ ์žฌ์ ‘์† - ์•„๋ž˜ ๋ช…๋ น์–ด๋กœ ์ฃผ์†Œ ํ™•์ธ ๊ฐ€๋Šฅ

    echo "$(curl -s ifconfig.io):8080"
  28. Compose ํŒŒ์ผ ์ˆ˜์ •

    cat <<EOF | tee docker-compose.yml
    name: blog
    services:
      wordpress:
        image: wordpress
        container_name: wordpress
        volumes:
        - plugins:/var/www/html/wp-content/plugins
        ports:
        - 8080:80
        environment:
        - WORDPRESS_DB_HOST=mysql
        - WORDPRESS_DB_USER=wordpress
        - WORDPRESS_DB_PASSWORD=wordpress
        - WORDPRESS_DB_NAME=wordpress
        depends_on:
        - mysql
        - wordpress-init
      mysql:
        image: mysql
        volumes:
        - mysql-data:/var/lib/mysql
        environment:
        - MYSQL_ROOT_PASSWORD=asdf1234
        - MYSQL_USER=wordpress
        - MYSQL_PASSWORD=wordpress
        - MYSQL_DATABASE=wordpress
      wordpress-init:
        image: alpine
        volumes:
        - plugins:/plugins
        command:
        - "sh"
        - "-c"
        - "wget -O https://downloads.wordpress.org/plugin/classic-editor.1.6.3.zip && unzip -o classic-editor.1.6.3.zip -d /plugins"
    volumes:
      mysql-data:
      plugins:
    EOF
  29. ์ˆ˜์ • ์‚ฌํ•ญ ๋ฐ˜์˜

    docker compose up -d
  30. ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ถ”๊ฐ€ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ

  31. wp-cli๋ฅผ ํ†ตํ•ด์„œ ์›Œ๋“œํ”„๋ ˆ์Šค ํ…Œ๋งˆ ์„ค์น˜ ์‹œ๋„

    docker compose exec wordpress wp theme install blocksy --activate --allow-root
  32. Dockerfile ์ƒ์„ฑ

    cat <<EOF | tee Dockerfile
    FROM wordpress
    RUN curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar && \
        chmod +x wp-cli.phar && mv wp-cli.phar /usr/local/bin/wp
    EOF
  33. Compose ํŒŒ์ผ ์ˆ˜์ •

    cat <<EOF | tee docker-compose.yml
    name: blog
    services:
      wordpress:
        build: .
        container_name: wordpress
        volumes:
        - plugins:/var/www/html/wp-content/plugins
        ports:
        - 8080:80
        environment:
        - WORDPRESS_DB_HOST=mysql
        - WORDPRESS_DB_USER=wordpress
        - WORDPRESS_DB_PASSWORD=wordpress
        - WORDPRESS_DB_NAME=wordpress
        depends_on:
        - mysql
        - wordpress-init
      mysql:
        image: mysql
        volumes:
        - mysql-data:/var/lib/mysql
        environment:
        - MYSQL_ROOT_PASSWORD=asdf1234
        - MYSQL_USER=wordpress
        - MYSQL_PASSWORD=wordpress
        - MYSQL_DATABASE=wordpress
      wordpress-init:
        image: alpine
        volumes:
        - plugins:/plugins
        command:
        - "sh"
        - "-c"
        - "wget -O https://downloads.wordpress.org/plugin/classic-editor.1.6.3.zip && unzip -o classic-editor.1.6.3.zip -d /plugins"
    volumes:
      mysql-data:
      plugins:
    EOF
  34. ์ˆ˜์ • ์‚ฌํ•ญ ๋ฐ˜์˜

    docker compose up -d
  35. ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์œ„๋“œํ”„๋ ˆ์Šค ๋ฉ”์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ด์„œ ํ…Œ๋งˆ ํ™•์ธ

  36. wp-cli๋ฅผ ํ†ตํ•ด์„œ ์›Œ๋“œํ”„๋ ˆ์Šค ํ…Œ๋งˆ ์„ค์น˜

    docker compose exec wordpress wp theme install blocksy --activate --allow-root
  37. ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์œ„๋“œํ”„๋ ˆ์Šค ๋ฉ”์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ด์„œ ํ…Œ๋งˆ ํ™•์ธ

  38. wordpress ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰์ค‘์ธ ํ”„๋กœ์„ธ์Šค ํ™•์ธ

    docker compose top
  39. wordpress ์ปจํ…Œ์ด๋„ˆ์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์‹คํ–‰์ค‘์ธ ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ

    docker compose exec wordpress pkill apache2
  40. ์›Œ๋“œํ”„๋ ˆ์Šค ์‚ฌ์ดํŠธ์— ์ ‘์† ๋˜๋Š”์ง€ ํ™•์ธ

  41. Compose ํ”„๋กœ์ ํŠธ ์ƒํƒœ ํ™•์ธ

    docker compose ls
  42. wordpress ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰์ค‘์ธ์ง€ ํ™•์ธ

    docker compose ps -a
  43. Compose ํŒŒ์ผ ์ˆ˜์ •

    cat <<EOF | tee docker-compose.yml
    name: blog
    services:
      wordpress:
        build: .
        container_name: wordpress
        restart: always
        volumes:
        - plugins:/var/www/html/wp-content/plugins
        ports:
        - 8080:80
        environment:
        - WORDPRESS_DB_HOST=mysql
        - WORDPRESS_DB_USER=wordpress
        - WORDPRESS_DB_PASSWORD=wordpress
        - WORDPRESS_DB_NAME=wordpress
        depends_on:
        - wordpress-init
      mysql:
        image: mysql
        volumes:
        - mysql-data:/var/lib/mysql
        environment:
        - MYSQL_ROOT_PASSWORD=asdf1234
        - MYSQL_USER=wordpress
        - MYSQL_PASSWORD=wordpress
        - MYSQL_DATABASE=wordpress
      wordpress-init:
        image: alpine
        volumes:
        - plugins:/plugins
        command:
        - "sh"
        - "-c"
        - "wget -O https://downloads.wordpress.org/plugin/classic-editor.1.6.3.zip && unzip -o classic-editor.1.6.3.zip -d /plugins"
    volumes:
      mysql-data:
      plugins:
    EOF
  44. Compose ํ”„๋กœ์ ํŠธ ์žฌ์‹คํ–‰

    docker compose up -d
  45. ์›Œ๋“œํ”„๋ ˆ์Šค ์‚ฌ์ดํŠธ์— ์ ‘์† ๋˜๋Š”์ง€ ํ™•์ธ

  46. wordpress ์ปจํ…Œ์ด๋„ˆ์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์‹คํ–‰์ค‘์ธ ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ

    docker compose exec wordpress pkill apache2
  47. ์›Œ๋“œํ”„๋ ˆ์Šค ์‚ฌ์ดํŠธ์— ์ ‘์† ๋˜๋Š”์ง€ ํ™•์ธ

  48. wordpress ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰์ค‘์ธ์ง€ ํ™•์ธ

    docker compose ps
  49. wordpress ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‚ญ์ œ๋˜๋ฉด ๋‹ค์‹œ ์ƒ์„ฑ ๋ ๊นŒ์š”?

    docker container rm wordpress --force
  50. wordpress ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰์ค‘์ธ์ง€ ํ™•์ธ

    docker compose ps -a
  51. Compose ํ”„๋กœ์ ํŠธ ์‚ญ์ œ

    docker compose down
  52. Compose์— ๋ช…์‹œํ–ˆ๋˜ Volume๋“ค์ด ๋‚จ์•„ ์žˆ๋Š”์ง€ ํ™•์ธ

    docker volume ls
  53. Compose ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

    docker compose up -d
  54. ์›น๋ธŒ๋ผ์šฐ์ €์—์„œ ์›Œ๋“œํ”„๋ ˆ์Šค ์‚ฌ์ดํŠธ ์žฌ์ ‘์† - ์•„๋ž˜ ๋ช…๋ น์–ด๋กœ ์ฃผ์†Œ ํ™•์ธ ๊ฐ€๋Šฅ

    echo "$(curl -s ifconfig.io):8080"
  55. Compose ํ”„๋กœ์ ํŠธ ์‚ญ์ œ

    docker compose down --volumes
  56. ๋ฉ€ํ‹ฐ ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์—์„œ ๊ฐœ๋ณ„๋กœ ์ƒ์„ฑํ–ˆ๋˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋“ค์„ Docker Compose๋ฅผ ํ†ตํ•ด์„œ ๊ตฌ์„ฑ

  57. ๋ฆฌ์†Œ์Šค ์ •๋ฆฌ

    {
        docker compose down --volumes
        docker container rm $(docker container ls -aq) --force
        docker image prune --all --force
        docker volume prune --force
        docker system prune --all --force
        cd ~/environment
    }

Last updated