[Docker] Docker 컨테이너화 및 배포(2)

구유정·2024년 7월 17일
0

Cloud

목록 보기
8/9
post-thumbnail

📍 Docker 이미지를 Docker Hub에 푸시

↑ Docker Hub 홈페이지로 이동해 회원가입 진행! (https://hub.docker.com)

↑ Repositories로 이동해 새로운 레포지토리 생성

↑ Repositories 이름을 적고 Visibility는 public으로 한 뒤 Create 버튼 클릭

↑ 터미널에서 Docker 로그인

↑ tag를 가진 bootcamp 이미지를 빌드

docker tag [이미지명]:[태그명] [사용자명]/[레포지토리명]:[태그명]

↑ 이미지를 적절한 레포지토리 이름으로 태그를 추가

docker push [사용자명]/[레포지토리명]:[태그명]

↑ 태그를 추가한 이미지를 Docker Hub에 푸시

↑ Docker Hub에 이미지가 정상적으로 올라온 것을 확인



📍 Docker Hub에서 이미지 다운로드 및 실행 테스트

docker pull [사용자명]/[레포지토리명]:[태그명]

↑ docker에서 이미지를 pull 받는다.

docker images

↑ 정상적으로 다운로드 되었는지 확인!

docker run -it [사용자명]/[레포지토리명]:[태그명] /bin/bash

↑ 컨테이너를 생성하여 해당 이미지를 실행

apt update
apt install python3
apt install python3-pip
rm /usr/lib/python3.12/EXTERNALLY-MANAGED
pip install flask

↑ 동일한 방식으로 python3, pip, flask 설치

python3 app.py

↑ app.py를 실행하면 동일한 결과가 나오는 것을 확인할 수 있다.



📍 Docker Compose

version: '3.8'

services:
  web:
    build:
      context: ./app
      dockerfile: Dockerfile
    ports:
      - "5001:5001"
    environment:
      - FLASK_ENV = development
      - DATABASE_URI=mariadb://user:password@db/mydatabase
    volumes:
      - ./app:/app
    depends_on:
      - db
    networks:
      - app-network

  db:
    image: arm64v8/mariadb
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: mydatabase
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    ports:
      - "3306:3306"
    volumes:
      - db-data:/var/lib/mysql
    networks:
      - app-network

volumes:
  db-data:

networks:
  app-network:

version: '3.8'

services:
  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: mydatabase
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    ports:
      - "3306:3306"
    volumes:
      - db-data:/var/lib/mysql
    networks:
      - app-network

volumes:
  db-data:

networks:
  app-network:

version: '3.8'

services:
  web:
    build:
      context: ./app
      dockerfile: Dockerfile
    ports:
      - "5000:5000"
    environment:
      - FLASK_ENV=development
      - DATABASE_URI=mysql://user:password@db/mydatabase
    volumes:
      - ./app:/app
    depends_on:
      - db
    networks:
      - app-network
  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: mydatabase
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    ports:
      - "3306:3306"
    volumes:
      - db-data:/var/lib/mysql
    networks:
      - app-network

volumes:
  db-data:

networks:
  app-network:

FROM alpine

COPY . .

↑ 위와 같은 코드를 가지는 docker-compose-arm.yaml, docker-compose.yaml, docker-compose-intel.yaml, Dockerfile 파일 생성

app 파일에는 다음과 같은 파일들을 생성

FROM python:3.8

WORKDIR /app

COPY requirements.txt requirements.txt

RUN pip install -r requirements.txt

COPY . .

CMD ["python", "app.py"]

from flask import Flask
import os

app = Flask(__name__)

@app.route('/')
def index():
	return 'Hello, Docker Compose!'

if __name__ == '__main__':
	app.run(host='0.0.0.0', port=5001)

Flask
pymysql

↑ app 파일에 Dockerfile, app.py, requirements.txt 파일들을 생성

↑ Dockerfile 이미지 빌드

↑ 이미지가 정상적으로 빌드 된 것을 확인!

↑ 컨테이너 실행

↑ 컨테이너가 생성된 것을 확인!

↑ Docker에서 모든 컨테이너의 목록을 표시, 이름을 복사(funny_hellman)(이름은 다를 수 있음!)

docker cp [이름]:/docker-compose-arm.yaml /tmp
docker cp [이름]:/docker-compose.yaml
docker cp [이름]:/docker-compose-intel.yaml
docker cp [이름]:/app

↑ Docker 컨테이너에서 호스트 시스템으로 파일들을 복사

↑ 백그라운드에서 docker-compose 실행

↑ 다중 컨테이너가 생성되고 실행되고 있는 것을 확인!

↑ Hello, Docker Compose!가 정상적으로 실행이 됨!



📍 Docker 네트워크 설정 및 검증

↑ Docker 네트워크 생성

docker network inspect [네트워크 이름]

↑ 네트워크에 연결된 컨테이너 확인

docker ps

↑ 위를 입력하여 web 컨테이너 id를 확인 후 복사

docker exec -it [웹컨테이너id] /bin/sh

↑ 해당 컨테이너 내부로 접근

ping db

↑ 컨테이너간 통신 확인



📍 Docker 볼륨 설정 및 데이터 영속성 테스트

FROM python:3.8-slim

WORKDIR /test

COPY . /test

CMD ["python", "./app.py"]

import os

with open('/data/test_file.txt', 'w') as f:
    f.write('Hello, Docker Volume!')

print('/data/test_file.txt')

↑ Dockerfile2와 app.py 파일을 생성

↑ 이미지를 생성

↑ 이미지가 정상적으로 생성된 것을 확인

↑ volume 생성

↑ 생성한 볼륨과 함께 컨테이너 run

↑ 영속성을 테스트 하기 위해 생성한 컨테이너를 멈추고 삭제

↑ busybox 컨테이너를 실행하여, 이전에 test_volume에 저장된 test_file.txt 파일의 내용을 출력한다. --rm 옵션을 사용하였기 때문에, 명령어가 완료되면 컨테이너는 자동으로 삭제된다.

↑ 정상적으로 내용이 출력된 것을 볼 수 있다!

profile
고수를 향해 나아가는 중

0개의 댓글