개발할 때, 서비스 운영에 사용하는 서버에 직접 들어가서 개발하는 게 아니라,
Local 환경에서 개발하고, 완료되면 staging 서버, production 서버에 배포하는 식으로 진행된다.
개발을 진행한 local 환경과 production 서버 환경이 다른 경우에,
os가 다르기 때문에 라이브러리, 파이썬 등을 다른 방법으로 설치해야 하는 경우가 많다.
또한 local 환경과 서버가 같은 OS를 사용해고, 서버에서 올바르게 작동하지 않을 수도 있다.
이를 해결하기 위해, 다양한 설정을 README 등에 기록하고, 항상 실행하도록 하는 방법이 있다. 하지만 이 방식에는 두 가지 한계가 존재한다.
- 사람이 진행하는 일이라 human error가 발생할 수 있고,
- 매번 이런 작업을 해야 하는 과정이 귀찮다.
또한 만약 운영하고 있는 서버가 100대라면?(=매우 많다면?)
이 부분에서 생기는 고민:
'서버 환경까지도 모두 한번에 소프트웨어화 할 수 없을까?'
( 밀키트를 만들어서 집에서도 사용하고 레스토랑에서도 사용할 수 있게 할 수 없을까? )
이런 고민을 해결하기 위해 나온 개념이 바로 '가상화'이다.(엄밀하게는 하드웨어 가상화 등 더 넓은 개념이지만, 여기선 소프트웨어 가상화로 한정한다.)
(출처: https://www.vembu.com/blog/containers-vs-virtual-machines-differences-and-advantages/)
Docker의 실행 : Docker Image로 만들어두고, 재부팅하면 Docker Image 상태로 실행됨
Docker Image
Docker Container
다른 사람이 만든 소프트웨어를 가져와서 바로 사용할 수 있음
- 예) MySQL을 Docker로 실행
- 예) Jupyter notebook을 docker로 실행
자신만의 이미지를 만들어 다른 사람에게 공유할 수 있음
docker run -it -p 8888:8888 -v /some/host/folder/for/work:/home/sujeongim/workspace jupyter/minimal-notebook
docker pull "이미지 이름:태그"
: docker pull mysql:8로 mysql 8 버전의 이미지를 다운(git clone과 비슷)
참고로 mac m1에서는 docker pull "이미지 이름:태그"만 치면 실행이 안된다. 위와 같이 linux/arm64/v8 에 해당하는 manifest가 없다는 오류가 나오는데, 이 경우 --platform 옵션을 사용해 플랫폼을 linux/x86_64로 명시해 주면 된다.(참고1,참고2)
아..이전 실습 때 내가 이미 mysql 최신 이미지를 다운 받아서 아래와 같이 결과가 나온다. 그러면 지우고 다시 해보자.
이미지를 지우는 명령어는 rmi이다. docker rmi "이미지 이름:태그"하면 이미지를 지울 수 있다.(docker 삭제 관련 링크)
그러면 다시 docker pull "이미지 이름:태그"로 이미지를 다운 받아보자.
다운로드가 성공적으로 되었다:)
다운 받은 mysql 이미지 기반으로 docker container 만들고 실행
명령어는 다음과 같은 형식으로 작성한다.
docker run --name "컨테이너 이름" -e 환경변수=환경변수값 -d -p "로컬 호스트 포트:컨테이너 포트" "이미지 이름:태그"
(m1의 경우 호환이 되지 않는다는 warning이 뜨는데, 아직 맞는 해결책을 찾지는 못했다..ㅠㅜ warning이기에 container가 생성되긴한다.)
컨테이너 이름 : 지정하지 않으면 랜덤으로 생성
환경 변수 설정 : 사용하는 이미지에 따라 설정이 다름, mysql은 환경변수를 통해 root계정의 비밀번호를 설정
포트 지정: "로컬 호스트 포트:컨테이너 포트" 형태로, 로컬 포트 3306으로 접근 시 컨테이너 포트 3306으로 연결되도록 설정. mysql은 기본적으로 3306 포트를 통해 통신(로컬 호스트:우리의 컴퓨터, 컨테이너 포트:컨테이너 이미지 내부)
실행한 컨테이너는 docker ps 명령어로 확인할 수 있다.
docker exec -it "컨테이너 이름(혹은 ID)" /bin/bash
mysql -u root -p
docker stop 명령어를 통해 실행 중인 컨테이너를 중지시킬 수 있다.
작동을 멈춘 컨테이너는 docker ps -a 명령어로만 확인할 수 있음
(docker ps는 실행중인 컨테이너 목록만 보여줌)
Dockfile은 한 줄씩 자세히 살펴보자.
FROM python:3.8.7-slim-buster
COPY . /app
WORKDIR /app
ENV PYTHONPATH=/app ...
RUN pip install
CMD ["python", "main.py"]
Docker Image Build 하기
빌드된 이미지 확인
방금 만든 이미지에 대해 컨테이너를 만들고 실행하기
다른 터미널을 열어 curl로 애플리케이션이 잘 작동하는지 확인할 수 있다.
Docker Image 만들기 정리!!