일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- java
- Zeppelin
- vue
- Mac
- Docker
- spring
- gradle
- SpringBoot
- 젠킨스
- 자동
- 레디스
- 클러스터
- redash
- 간단
- config
- 예제
- fastcampus
- EMR
- 설정
- login
- aws
- 자바
- hive
- Redis
- ec2
- 로그인
- Cluster
- Kafka
- Jenkins
- 머신러닝
- Today
- Total
코알못
[Docker] Nexus - docker image repository 이용 실습 본문
이전 시간에 nexus 관련 실습을 두가지 진행 하였다.
이번 시간에는 docker image를 nexus에 올려 사용하는 실습을 진행해보자!
nexus는 이전 시간에 생성 하였으니 접속하여 docker image repository를 생성해보자!
nexus UI 'http://[nexus IP]:8081' 에 접속하여 아래와 같이 Create repository를 클릭한다.
노란 표시는 중요한 부분이며 설명 하자면 repository 이름은 'docker-image' 연결할 포트는 5443 이며 http 연결 하고 로그인 하지 않아도 docker pull 할 수 있도록 한다는 의미이다.
이미지를 올리기 이전에 docker login 테스트를 진행해보자!
우선 5443 포트도 열어줘야 접근이 가능하므로 기존에 띄운 nexus 컨테이너를 죽이고 2개의 포트를 열어준다.
- 5443 : nexus docker image repository
- 8081 : nexus ui
$ docker rm -f [container id]
$ docker run --name nexus -d -p 8081:8081 -p 5443:5443 -v ~/nexus-data:/nexus-data -u root sonatype/nexus3
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
712bc1b251c3 sonatype/nexus3 "/opt/sonatype/nexus…" 3 seconds ago Up 2 seconds 0.0.0.0:5443->5443/tcp, :::5443->5443/tcp, 0.0.0.0:8081->8081/tcp, :::8081->8081/tcp nexus
nexus EC2 의 보안 그룹 5443 포트를 열어준다. (EC2 > 보안그룹 > nexus 보안그룹 선택하여 인바운드 수정)
이제 nexus로 방화벽이 정상적으로 오픈 되어 있는지 확인 한다.
$ telnet [nexus ip] 5443
Trying [nexus ip]...
Connected to [nexus ip].
Escape character is '^]'.
^CConnection closed by foreign host.
방화벽은 열려있으니 도커 로그인을 진행해보자!
$ docker login -u [ID] -p [PW] [nexus ip]:5443
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Error response from daemon: Get "https://[nexus ip]:5443/v2/": http: server gave HTTP response to HTTPS client
위와 같은 오류가 발생하며 로그인 되지 않으며 이는 docker 에서 http 통신이 불가능하게 되어 있기 때문이며
docker 설정에서 해당 IP는 http 통신이 되도록 설정하며 해당 파일이 없다면 생성하자!
'/etc/docker/daemon.json'
$ cat daemon.json
{
"insecure-registries" : ["nexus ip:5443"]
}
이제 도커를 재기동 한다.
$ sudo systemctl restart docker
로그인 하면 성공적으로 되는것을 볼 수 있다.
$ docker login -u admin -p admin [nexus ip]:5443
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /home/ubuntu/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
이제 테스트로 도커 이미지를 올려보자! 뒤에 'Djib.allowInsecureRegistries','DsendCredentialsOverHttp' 옵션은 http 통신하기 위한 옵션으로 해당 옵션을 주어 진행하자! (운영 환경에서는 nexus https 로 셋팅)
./gradlew jib -Djib.to.image=[nexus ip]:5443/dev-olivia-app:28 -Djib.console='plain' -Djib.allowInsecureRegistries=true -DsendCredentialsOverHttp=true
nexus 가보면 아래와 같이 정상적으로 생성됨을 확인 할 수 있다.
이제 배포 서버에서 해당 이미지로 컨테이너가 정상적으로 동작 하는지 확인 한다.
$ docker pull [nexus ip]:5443/dev-olivia-app:28
28: Pulling from dev-olivia-app
111111111333: Already exists
244324sdsada: Already exists
244324sdsada: Already exists
111111111333: Already exists
244324sdsada: Already exists
244324sdsada: Already exists
sadas3423233: Already exists
ddd222222222: Already exists
sadsa4535453: Already exists
244324sdsada: Already exists
c9fa70972d0a: Pull complete
Digest: sha256:123asd
Status: Downloaded newer image for [nexus ip]:5443/dev-olivia-app:28
[nexus ip]:5443/dev-olivia-app:28
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[nexus ip]:5443/dev-olivia-app 28 123asd 6 minutes ago 689MB
컨테이너가 정상적으로 기동 되었으며 정상적으로 데이터가 나온다!
$ docker run -d -p 80:8080 [nexus ip]:5443/dev-olivia-app:28
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
zxczxczxczxc [nexus ip]:5443/dev-olivia-app:28 "java -jar app.jar" 39 seconds ago Up 38 seconds 0.0.0.0:80->8080/tcp, :::80->8080/tcp charming_goldberg
$ curl localhost:80
hello corin
이제 Jenkinsfile의 파이프라인 'Build Docker Image by Jib & Push to Nexus Repository'를 추가하고 'Deploy to AWS EC2 VM' 를 수정 해보자!
우선 상단에 nexus 환경을 정의한다.
def nexusUrl="[nexus ip]:5443"
def nexusId="test"
def nexusPw="test"
이미지 빌드후 nexus 저장소에 올린다.
stage('Build Docker Image by Jib & Push to Nexus Repository') {
steps {
sh """
cd ${mainDir}
docker login -u ${nexusId} -p ${nexusPw} ${nexusUrl}
./gradlew jib -Djib.to.image=${nexusUrl}/${repository}:${currentBuild.number} -Djib.console='plain' -Djib.allowInsecureRegistries=true -DsendCredentialsOverHttp=true
"""
}
}
하단에 nexus 저장소 도커 로그인후 해당 이미지를 pull 하여 어플리케이션을 띄운다.
stage('Nexus Deploy container to AWS EC2 VM'){
steps{
sshagent(credentials : ["deploy-key"]) {
sh "ssh -o StrictHostKeyChecking=no ubuntu@${deployHost} \
'docker login -u ${nexusId} -p ${nexusPw} ${nexusUrl}; \
docker rm --force app-nexus; \
docker run --name app-nexus -d -p 8088:8080 -t ${nexusUrl}/${repository}:${currentBuild.number};'"
}
}
}
stage('Deploy to AWS EC2 VM'){
steps{
sshagent(credentials : ["deploy-key"]) {
sh "ssh -o StrictHostKeyChecking=no ubuntu@${deployHost} \
'aws ecr get-login-password --region ${region} | docker login --username AWS --password-stdin ${ecrUrl}/${repository}; \
docker rm --force app-ecr; \
docker run --name app-ecr -d -p 80:8080 -t ${ecrUrl}/${repository}:${currentBuild.number};'"
}
}
}
이제 소스를 배포하고 Jenkins 빌드 진행 해보자!
우선 Jenkins 컨테이너 안에서 nexus repository에 접근하기 위해서는 docker login 명령어를 사용하기 위해 docker 가 설치 되어 있어야한다.
컨테이너 내부에 docker daemon을 무겁게 설치할 필요 없이 docker socket은 로컬에 있는것을 연결하여 사용하며 컨테이너 내부에는 docker-cli 를 설치 하도록 한다. (이미 설치된 bin 파일 사용시 os 관련 오류 발생하므로 cli는 컨테이너에서 직접 설치 하도록 한다)
우선 jenkins 를 지우고 아래와 같이 진행하자!
$ docker rm -f [jenkins container id]
$ docker run --name jenkins -d -p 8080:8080 -v ~/jenkins:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -u root jenkins/jenkins:latest
$ docker exec -it 6d /bin/bash
# curl https://get.docker.com > dockerinstall && chmod 777 dockerinstall && ./dockerinstall
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dsasada23213 jenkins/jenkins:latest "/usr/bin/tini -- /u…" 4 minutes ago Up 4 minutes 50000/tcp, 0.0.0.0:80->8080/tcp, :::80->8080/tcp jenkins
이제 Jenkins 빌드 버튼을 눌러 배포를 진행해보자!
40번으로 빌드 성공하였으며 Nexus, ECR 모두 이미지 정상적으로 업로드 되었다.
이제 배포 서버에서 컨테이너 확인시 'app-nexus', 'app-ecr' 명칭으로 정상적으로 떠있는것을 볼 수 있으며
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
213213213213 1111111111.dkr.ecr.ap-northeast-2.amazonaws.com/dev-olivia-app:40 "java -jar app.jar" 4 minutes ago Up 4 minutes 0.0.0.0:80->8080/tcp, :::80->8080/tcp app-ecr
sdsadsadsdad [nexus ip]:5443/dev-olivia-app:40 "java -jar app.jar" 4 minutes ago Up 4 minutes 0.0.0.0:8088->8080/tcp, :::8088->8080/tcp app-nexus
두 컨테이너 모두 테스트 시 정상적으로 나온다!
$ curl localhost:80
hello corin
$ curl localhost:8088
hello corin
끝!!
# 참고
1) 오류
$ docker login -u test -p test [nexus ip]:5443
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Error response from daemon: login attempt to http://[nexus ip]:5443/v2/ failed with status: 401 Unauthorized
- 해결 방안 :
2) Error response from daemon: Get "https://[nexus ip]:5443/v2/": http: server gave HTTP response to HTTPS client
- 해결 : '/etc/docker/daemon.json' 파일 추가 후 docker restart
$ cat daemon.json
{
"insecure-registries" : ["nexus ip:5443"]
}
$ sudo systemctl restart docker
// 재기동시 컨테이너도 stop 되며 기동 해준다.
$ docker start [container id]
'ETC' 카테고리의 다른 글
[kubernetes] 쿠버네티스 설치 및 셋팅 (0) | 2023.05.06 |
---|---|
[kubernetes] 쿠버네티스란? (0) | 2023.04.23 |
[Zeppelin] 노트 저장 경로 local > S3 로 변경 (0) | 2023.03.31 |
[EKS] 알아보자! (0) | 2023.03.29 |
[Docker] Nexus - meven proxy로 활용하여 빠른 빌드 실습 (0) | 2023.03.25 |