1. 설치
Docker 사이트에서 Docker Desktop for Mac을 내려받아 설치한다.
예전에는 Docker Hub 계정으로 로그인한 뒤 다운로드하는 흐름이었고, 계정이 없다면 이메일 인증까지 받아야 해서 사실 조금 귀찮았다. 현재는 Docker Desktop 다운로드 방식이 바뀔 수 있으니, 설치 화면의 안내를 따르면 된다.
아무튼 설치 파일을 다운로드해 실행한다. 내려받고 설치하는 용량이 꽤 크기 때문에 시간이 조금 걸릴 수 있다.
지루한 과정이 모두 끝나면 CLI에서 docker 명령어를 사용할 수 있게 된다.
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
위 명령이 에러 없이 실행되면 Docker CLI가 정상적으로 동작하는 것이다. 아직 실행 중인 컨테이너가 없다면 목록이 비어 있는 것이 정상이다.
2. Docker 이미지 만들기
간단히 Docker 이미지를 만들고 실행하는 예제를 진행한다. 우선 Spring Boot로 개발된 jar 파일을 실행하는 Docker 이미지를 만들 것이다.
현재 작업 디렉토리에는 다음 파일과 디렉토리가 있다고 가정한다.
- Dockerfile 파일
- target 디렉토리
그리고 target 디렉토리 안에 MyApp.jar가 있다고 가정한다.
2.1. Dockerfile
FROM openjdk:8-jre-alpine COPY target/MyApp.jar app.jar CMD ["java","-jar","/app.jar"]
이 Dockerfile은 Java 런타임이 포함된 이미지를 기반으로 하고, 로컬의 target/MyApp.jar 파일을 이미지 안의 app.jar로 복사한 뒤, 컨테이너가 시작될 때 java -jar /app.jar 명령을 실행한다.
2.2. 이미지 생성 커맨드
$ docker build -t myapp . Sending build context to Docker daemon 18.33MB Step 1/3 : FROM openjdk:8-jre-alpine ---> f7a292bbb70c Step 2/3 : COPY target/MyApp.jar app.jar ---> 69641f92ce02 Step 3/3 : CMD ["java","-jar","/app.jar"] ---> Running in e4a513f43578 Removing intermediate container e4a513f43578 ---> 793582135081 Successfully built 793582135081 Successfully tagged myapp:latest
-t myapp은 생성할 이미지에 myapp이라는 이름을 붙인다는 뜻이고, 마지막의 .은 현재 디렉토리를 빌드 컨텍스트로 사용한다는 뜻이다. 즉 현재 디렉토리에 있는 Dockerfile과 필요한 파일을 기준으로 이미지를 만든다.
3. Docker 이미지 실행
아래 8180:8180은 호스트 포트와 컨테이너 포트를 모두 8180으로 연결한다는 뜻이다. -p 옵션은 호스트 포트:컨테이너 포트 형식으로 지정한다. 예를 들어 컨테이너 내부 애플리케이션은 8180 포트로 실행되지만, 로컬에서는 8080 포트로 접속하고 싶다면 8080:8180으로 설정한다.
$ docker run -d -p 8180:8180 myapp ac4ebc1a070ad0e78e85c37b90098c2debad61e5266c3762394fa22a7a033714
-d 옵션은 컨테이너를 백그라운드에서 실행한다는 뜻이다. 실행 상태는 docker ps로 확인한다.
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ac4ebc1a070a myapp "java -jar /app.jar" 8 seconds ago Up 7 seconds 0.0.0.0:8180->8180/tcp naughty_lichterman
잘 실행되었다. 실제 확인은 브라우저나 curl로 8180에 접근해 보면 되겠다.
$ curl http://localhost:8180
테스트가 끝난 뒤 컨테이너를 중지하려면 docker ps에서 확인한 컨테이너 ID나 이름을 사용해 중지하면 된다.
$ docker stop ac4ebc1a070a
4. Docker 참고 문서
- Docker의 개념과 특징
- Docker 설치하기
- Docker 컨테이너 기동하기
- Dockerfile과 이미지 빌드
- 컨테이너 라이프사이클
- Automated Build
- Docker Machine
- Docker 컨테이너 네트워크 설정