도커란 무엇인가?
•
컨테이너를 만들고 배포하고 구동한다.
•
컨테이너 기반의 오픈소스 가상화 플랫폼으로 컨테이너를 보다 쉽게 만들어주는 툴
•
OS에 상관없이 애플리케이션을 개발하고 구동할 수 있도록 컨테이너 환경을 제공하는 소프트웨어
•
도커가 나오기 전에는?
•
README를 공유하여 그 파일에 적힌 순서대로 로컬 환경을 구성했음
•
OS를 서버마다 만들어야 했다.
도커의 장점
•
도커가 나온 이후에는 Dockerfile과 docker-compose.yml를 공유하여 실행하는 것 만으로도 동일한 로컬 환경을 구성할 수 있게 되었다.
•
Docker를 사용함으로써 OS에 구애받지 않고 애플리케이션을 사용 할 수 있다.
•
Docker는 독립적으로 가상화된 환경에서 운영되므로 가볍고 빠릅니다. 따라서 서버단위 환경에 잘 어울립니다.
이미지란?
•
image는 Docker 가상환경에 대한 설정과 설정해야할 Dependencis와 수행할 작업과 해당 프로젝트의 스냅 샷을 찍어 버전을 만들어 놓은 것이다. docker build 명령어를 통해 생성할 수 있다.
◦
docker build <옵션> <Dockerfile의 경로> : Dockerfile을 찾아서 해당 도커파일을 기반으로 이미지를 생성한다.
ex) 프로그램 설치 파일
FROM openjdk:11-jdk-slim
VOLUME /tmp
ADD /target/*.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
Bash
복사
FROM python:3.9
COPY . /app
ENV PYTHONPATH /app
WORKDIR /app
RUN pip install -r requirements.txt
CMD ["uvicorn", "app.main:app"]
Bash
복사
Docker Engine 이란?
•
생성된 이미지를 통해서 Container 라는 실행 객체를 만들고 실행하는 역할을 합니다.
컨테이너란?
•
철저하게 구분된 가상환경에서 Docker Engine을 통해 실행되기 때문에 Host OS환경과는 무관하게 어떤 환경에서도 동일하게 실행할 수 있게 해주고, Container는 종료되면 데이터는 사라집니다. 따라서 Docker Volume을 적용해 저장해두어야 할 필요가 있습니다.
ex) 프로그램
애플리케이션 실행방법
1.
mvn -DskipTests=true package : jar파일 만들기
a.
DskipTests=true : mvn package시 test 코드를 건너뛰고 싶을 때 사용.
•
정확히는, 컴파일(compile)은 되지만 실행(execute)되지는 않는다.
•
2.
java -jar target/crud-api-0.1-SNAPSHOT.jar : jar파일 실행
3.
url로 접속 : 서비스 환경 확인가능
컨테이너 만드는법
sudo docker build -t spring-boot-hospital-api .
Bash
복사
Dockerfile 작성 → 스냅샷 (Dockerfile내용 기반)→ image생성
→ docker run을 통해 docker engine → image를 통해 컨테이너를 만든다
포트포워딩을 해야하는 이유?
ex) -p 8080 : 8081는 무슨의미일까요??
서로 연결하기 위해
앞 : 외부 요청(8080) 들어오면
뒤 : 내부 포트(8081) 연결
외부 | Spring | Mysql |
80 | 8080 | 3306 |
외부 | 내부 |
Priority Property
우선순위
명령어
-d: demon, 컨테이너를 생성한 후에도 백그라운드에서 코드를 작성할 수 있게 한다.
-p: 앞의 port(외부에서 접속하려고 하는 port)를 뒤의 port(container의 port)에 연결
-e: image의 환경변수 설정
docker run -p 8080:8080 -d -e SPRING_DATASOURCE_URL=jdbc:mysql://ec2-3-38-111-117.ap-northeast-2.compute.amazonaws.com:3306/likelion-db
Java
복사
-i: 컨테이너의 표준 입력을 활성화하여 표준 입출력을 사용한다.(설정하지 않으면 표준출력만 사용)
-t: 가상터미널(tty, 리눅스의 콘솔)를 할당한다.
-v: $ docker run -v our-vol:/app --name one busybox touch /app/test.txt
--name: 컨테이너에 이름을 지정하여 관리하기 쉽게 한다. 이름을 지정하지 않으면 random으로 이름이 지정된다. ex. heuistic_bell
-u: 사용자 이름 지정
-f: rm또는 rmi와 같이 작성되면 강제 삭제
docker rm -f <container의 이름>
// 이름이 heuistic_bell인 container를 실행중이더라도 강제로 제거한다.
Java
복사
오류
Failed to obtain JDBC Connection
출처
1.
도커가 나오기 전에는?: https://www.coninggu.com/6