📍 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 옵션을 사용하였기 때문에, 명령어가 완료되면 컨테이너는 자동으로 삭제된다.
↑ 정상적으로 내용이 출력된 것을 볼 수 있다!