[springboot&docker] push한 도커 이미지가 적용이 안된다면?

vector13·2022년 11월 20일
1

도커 이미지를 배포환경에 배포하는 것은 간단하다.
이전에 도커 이미지를 만들어 뒀기 때문에 ec2를 생성해서 docker 에 필요한 패키지를 설치하고 pull을 받아 run을 시키면 된다.

그런데 실행을 시킨 후에 여러가지 코드를 고칠 것이 필요해서 코드를 고쳐서 "같은 이름으로" 여러번 Image build, push pull을 했는데 변경 내용이 적용이 안된 문제를 만났다.

명령어 모음

docker tag local-image:tagname new-repo:tagname
docker push new-repo:tagname

# 생성된 이미지로 컨테이너를 실행 (포트 두개인 이유: host port와 container port) 
docker run -d -p 8080:8080 tpgus4796/ae-springserver-repo
#실행 중인 컨테이너를 확인
docker ps 
# Docker 이미지 확인
docker image ls

# sudo docker pull {계정명}/{repository명}:태그명
sudo docker pull tpgus4796/ae-springserver-docker:v1

# 실행중인 도커 컨테이너 확인
sudo docker ps 

# 도커 컨테이너 중지 stop
sudo docker stop {id앞 4자리} 

# 도커 컨테이너 삭제 rm 컨테이너&이미지 삭제는 : docker rmi 
#docker rm {컨테이너 id} 
sudo docker rm {id앞에4자리}

#image pull from docker hub 
sudo docker pull tpgus4796/ae-springserver-docker:v1
#image run -> make container 
sudo docker run -d -p 8081:8081 tpgus4796/ae-springserver-docker:v1

## log 쳌 
sudo docker logs -f [container name]

1 문제와 예상원인, 해결방안 아이디어

  • 문제 : spring 처음에 띄운 것 대로 nickname이 null로 들어가고, “kakao”, “apple”처럼 fix 된 string을 넣도록 코드를 고쳐서 다시 docker image 빌드를 했으나 계속해서 nickname이 null로 들어가는 문제 발생
  • 문제 예상 원인 : docker Image의 버전관리를 안하고 "같은 이름"으로, "같은 태그"인 latest 로 계속 배포했던 것 때문에 변경된 코드가 적용이 안됐을 것이라고 예상. Ec2에서 docker가 어떤 생태 흐름으로 흘러가는지는 모르나, docker image를 다운받아 저장하는 repository가 따로 있을 것이고, 여기서 docker image의
    • 1 이름이 같거나 특정 어떤것이 같다면 이전의 이미지를 run 시키거나
    • 2 저장된 이미지 이름은 여러개 (pull여러번 받아서) sudo docker run 자체가 image 이름으로 run 시키므로, 가장 앞의(다운 받은지 오래된) 이미지를 run 시킬 가능성이 있다.
  • 예상 해결방안 : 도커의 흐름을 일단 이해하고, Image 이름을 다르게 해서 (Tag로 분리하거나 이름 뒤에 version을 붙이기) docker hub에 push 하고 pull받아보기

2 도커에 대한 이해

2-1 도커 동작 원리 using docker hub

밑의 그림처럼

IN 개발환경 (Local)

springboot에서 dockerfile을 기반으로 docker 를 build 해서 “Image”를 생성하고, 그 Docker Image를 push 해서 DocekrHub에 올리고

IN 배포환경 (ec2)

배포할 ec2 인스턴스 환경에서 dockerhub의 image 이름을 가지고 Docker image pull을 진행해 파일을 저장한다. Docker run을 통해서 컨테이너화를 시켜 독립적으로 실행시킨다.

여기서 도커의 장점이 나오는 것 같은데, 개발환경의 모든 것을 가져와서 그대로 배포 환경에서 구현할 수 있다는 것이 가장 장점이고 ,이게 동작과정에서 나오는 것 같다.

2-2 Docker 이미지 명 또는 태그 변경 (이미 배포된 상황에서)

기존의 Docker 이미지명을 새로운 이름으로 변경하거나, 새로운 태그명을 붙일 때 docker image tag 명령을 사용

docker image tag <기존의 이미지명>:<기존의 태그명> <새로운 이미지명>:<새로운 태그명>
# Docker 이미지 확인
docker image ls

문제가 발생한 ec2에서 docker 이미지를 확인해보면 같은 이름으로 3개가 있다.

근데 이건 이미지에 태그를 붙여서 push 하는것이 아니라 push 후에 바꾸는 것이므로 다른 명령어 필요

image build 과정에서 tag 붙이기

이제까지 무지성으로 사용했던

$ docker image build -t javatest:latest 의 -t 명령어가 이름과 태그를 붙이는 옵션이었다.

태그명은 생략 가능한데, 생략하면 기본적으로 latest가 붙는다

image build& push with Tag!

며칠 전에도 :뒤에 테그를 붙이려했는데 안됐던 경험이 있어서

다시 한번해보겠다

cmd 를 관리자모드로 띄우고 여기서 진행

태그 이름을 v1으로 해보겠음

docker build --build-arg JAR_FILE=build/libs/ae_SpringServer-0.0.1-SNAPSHOT.jar -t tpgus4796/ae-springserver-docker:v1 .

도커 허브에 푸시  

docker push tpgus4796/ae-springserver-docker:v1

빌드 성공

Docker desktop에서도 v1 태그로 잘 보임

푸시는 명령어 말고 docker desktop에서 해보겠음

더보기에서 Push to hub를 클릭해서 해보겠음 (IntellJ에서 하면 계속 http error 떠서 )

나의 경우에는 intellJ 터미널에서 명령어를 입력하는 것보다

cmd 관리자 모드에서 build하고, Docker desktop에서 push를 누르는 것이 더 빨랐음


도커허브에도 잘 안착되었다

Ec2에서 pull 받기

# sudo docker pull {계정명}/{repository명}:태그명
sudo docker pull tpgus4796/ae-springserver-docker:v1

이미지 리스트 확인하면 v1이 잘 들어와있다.

현재 실행중인 컨테이너를 끄고 v1으로 실행해야하므로

# 실행중인 도커 컨테이너 확인
sudo docker ps 

# 도커 컨테이너 중지 stop
sudo docker stop {id앞 4자리} 

# 도커 컨테이너 삭제 rm 컨테이너&이미지 삭제는 : docker rmi 
#docker rm {컨테이너 id} 
sudo docker rm {id앞에4자리}

이름으로 삭제해보려햇으나 명령어가 안먹어서 id로 삭제

아하 끄기 전에 stop을 해야하는군 !

지워졌다.

이제 pull 받아야지

#image pull from docker hub 
sudo docker pull tpgus4796/ae-springserver-docker:v1
#image run -> make container 
sudo docker run -d -p 8081:8081 tpgus4796/ae-springserver-docker:v1

pull 을 받고 docker ps 를 하면 아직 run을 안시켰기에 아무것도 안나오고

run을 시키고 ps 를 해보면 컨테이너 아이디가 나온다.

그리고 image ls 로 이미지 리스트를 확인하면 v1이 나와있음

Docker Container 로그 확인

sudo docker logs -f [container name]

원하는 대로 잘 들어간다

끝!

profile
HelloWorld! 같은 실수를 반복하지 말기위해 적어두자..

0개의 댓글

관련 채용 정보