둘 다 image를 만드는 명령어이다.
commit
: 사용하고 있는 container를 image를 만드는 (backup과 같은 느낌)
build
: dockerfile을 통해서(개발자가 원하는 속성을 추가한 후) 해당 image를 만들 수 있다. 예를들면, 개발자가 원하는 시간의 순서에 따라 image를 만들 수 있다. (생성)
✔️ 현재 나의 docker image는?
Dockerfile
을 작성했다면, docker build
명령어로 이미지를 생성할 수 있다.
✔️ docker build -t, -f
docker build -t <이미지 명> <Dockerfile 위치 경로>
: 이미지 생성
docker build -f /home/ubuntu/docker_test/Dockerfile-Server
: 파일 이름이름 Dockerfile이 아닌 경우 f를 사용해 파일이름 지정
✔️ docker container에서 docker build 실행
나 같은 경우 Dockerfile 위치 : /var/jenkins_home/workspace/d208jenkins/study_docker/chuno/
✔️ Jenkins pipeline에서 실행 결과
첫 실행할 때 23초, 이후 똑같은 내용일 경우 4초, 실행 완료된다.
✔️ 현재까지의 pipeline
pipeline {
agent any
stages {
stage('git clone') {
steps {
dir('study_docker') {
checkout scmGit(branches: [[name: '*/main']], extensions: [submodule(parentCredentials: true, reference: '', trackingSubmodules: true)], userRemoteConfigs: [[credentialsId: 'github-repo-user', url: 'https://github.com/ToDoStudy/study_docker']])
}
}
}
stage('build') {
steps {
dir('study_docker/chuno') {
sh "chmod +x gradlew"
sh "./gradlew clean bootJar"
}
}
}
stage('docker-build'){
steps {
script {
sh "docker build -t backendimage study_docker/chuno/"
}
}
}
}
}
docker push 할 때 참고 주소
https://kanoos-stu.tistory.com/53
💡 참고
생활 코딩 수업을 참고했습니다.
📝 이게 무엇이냐면?
docker hub
로 이미지를 공유하는 것이다.
✔️ docker hub에서 repository 만들기
public
: 누구나 사용할 수 있다.private
: 협업하는 사람들만 사용할 수 있다.
image이름
: lkc263/d208backenddocker build -t (image이름) (경로)
: 이때, image는 docker hub repository image이름에 맞게 만들어야 한다.
✔️ 현재 pipeline
pipeline {
agent any
stages {
stage('git clone') {
steps {
dir('study_docker') {
checkout scmGit(branches: [[name: '*/main']], extensions: [submodule(parentCredentials: true, reference: '', trackingSubmodules: true)], userRemoteConfigs: [[credentialsId: 'github-repo-user', url: 'https://github.com/ToDoStudy/study_docker']])
}
}
}
stage('build') {
steps {
dir('study_docker/chuno') {
sh "chmod +x gradlew"
sh "./gradlew clean bootJar"
}
}
}
stage('docker-build'){
steps {
script {
sh "docker build -t lkc263/d208backend:1.0 study_docker/chuno/"
}
}
}
}
}
✔️ docker push 적용
$ docker login : docker login을 한다.
$ docker push lkc263/d208backend:1.0 : docker hub lkc263/d208backend:1.0 repository에 저장한다.
$ docker pull lkc263/d208backend:1.0 : docker hub에서 repository을 가져온다.
✔️ 현재 문제점
=> 그래서 Credentials
(인증정보)에 docker hub 계정을 등록하면 된다. (등록할 시, pipeline에 생성한 인증 정보 id만 주면 docker hub 사용하기 위해 인증할 필요가 없다.)
🔔 Dockerfile 변경 - backend
dockerfile이 jar이 아닌 jenkins 기반으로 작성된 것 같아 수정했다.
# open jdk java11 버전 환경
FROM openjdk:11-jdk
# JAR_FILE 변수 정의
ARG JAR_FILE=./build/libs/chuno-0.0.1-SNAPSHOT.jar
# JAR 파일 메인 디렉터리에 복사
COPY ${JAR_FILE} app.jar
# 시스템 진입점 정의
ENTRYPOINT ["java", "-jar", "/app.jar"]
Dockerfile
은 docker build를 통해 image를 만들 때 사용된다.
Dashboard -> Jenkins 관리 -> Credentials
- `kind` : Username with password - `Username` : docker hub 계정 Id (공식사이트 아이디) - `Password` : docker hub 계정 password (공식사이트 비밀번호) - `ID` : 파이프라인 작성 시 사용할 이름 (DockerHub_IdPwd) - `Description` : 설명 (DockerHubIdPwd)
✔️ environment
environment {
imagename = "lkc263/d208backend"
registryCredential = 'DockerHub_IdPwd'
dockerImage = ''
}
environment
을 사용하면 유용하다.사용자id/repository이름
registryCredential
: 조금 전 credentials에서 만들었던 id (docker hub 계정 추가했었다.)
✔️ docker build
stage('docker-build'){
steps {
echo 'Build Docker'
dir('study_docker/chuno'){
script {
sh "pwd"
dockerImage = docker.build imagename
}
}
}
}
Dockerfile
이 존재한다.dockerImage
에 docker.build
imagename을 대입했다.사용자id/repository이름
docker.build
=> docker build -t
: 이미지 생성한다. (이때, Dockerfile이 실행된다.)
💡 참고
docker build -t (image이름) (경로)
: 이때, image는 docker hub repository image이름에 맞게 만들어야 한다.
✔️ docker push
stage('docker-push'){
steps{
echo 'Push Docker'
script {
docker.withRegistry('', registryCredential){
dockerImage.push("1.0")
}
}
}
}
docker.withRegistry('', registryCredential)
: withRegistry
은 docker hub Registry 인증 권한 처리하기 위해 사용한다.
✔️ 현재까지의 pipeline
pipeline {
agent any
environment {
imagename = "lkc263/d208backend"
registryCredential = 'DockerHub_IdPwd'
dockerImage = ''
}
stages {
stage('git clone') {
steps {
dir('study_docker') {
checkout scmGit(branches: [[name: '*/main']], extensions: [submodule(parentCredentials: true, reference: '', trackingSubmodules: true)], userRemoteConfigs: [[credentialsId: 'github-repo-user', url: 'https://github.com/ToDoStudy/study_docker']])
}
}
}
stage('build') {
steps {
dir('study_docker/chuno') {
sh "chmod +x gradlew"
sh "./gradlew clean bootJar"
}
}
}
stage('docker-build'){
steps {
echo 'Build Docker'
dir('study_docker/chuno'){
script {
sh "pwd"
dockerImage = docker.build imagename
}
}
}
}
stage('docker-push'){
steps{
echo 'Push Docker'
script {
docker.withRegistry('', registryCredential){
dockerImage.push("1.0")
}
}
}
}
}
}
✔️ 실행 결과
참고
실습 내용 정리해주셔서 감사합니다. CICD 파이프라인 구축 중인데 참고하기 좋은 자료인거 같아😁팔로우 하고 갑니다!!