$ docker run -d --restart always --name jenkins \
-p 8081:8080 -v $PWD/jenkins_home:/var/jenkins_home jenkins/jenkins
(jenkin/jenkins 이미지가 없다면 자동으로 받아온다.)
✔️ -d : docker container를 detach mode(백그라운드)로부터 실행
✔️ --restart always : docker container가 종료된 경우 항상 재시작
✔️ --name jenkins : docker container의 이름을 jenkins로 설정
✔️ -p 8080:8080 : docker host와 docker container 내부의 포트를 매핑
- 기본 문법 : -p [DOCKER_HOST_PORT]:[DOCKER_CONTAINER_PORT]
- 이 경우 데스크탑의 8080 포트와 jenkins container 내부의 8080 포트를 매핑
- 이후, 자신의 데스크탑으로 들어오는 8080 포트에 대한 요청은 모두 jenkins container로 forwarding된다.
- docker host port(: 기호의 앞 부분)는 당연히 8080 이외의 자신이 원하는 포트를 써도 무방.
- 예시 > -p xxxxx:8080
- : 기호의 뒷 부분은 docker container 내부에서 사용되기로 지정된 포트이므로, 변경하지 말아야 한다.
✔️ -v $PWD/jenkins_home:/var/jenkins_home : docker host와 docker container 내부의 디렉토리를 매핑
- 기본 문법 : -v [DOCKER_HOST_DIR]:[DOCKER_CONTAINER_DIR]
- -p 옵션과 유사하게, 데스크탑의 특정 디렉토리(이 경우, $PWD/jenkins_home)와 container 내부의 디렉토리를 매핑
- -v 옵션을 사용하지 않는다면 container의 특성 상 내부에서 사용한 정보가 유지되지 않는다.
- 예를 들어, jenkins 내부에서 작업한 정보는 container가 한 번이라도 재실행된다면 사라지게 된다. 이를 방지하기 위해 -v 옵션을 필수로 사용한다.
- -p 옵션과 마찬가지로 : 기호 앞 부분은 자신이 원하는 디렉토리를 지정해줄 수 있다.
✔️ jenkins : docker run 명령어에 사용할 docker image를 명시
$ mkdir jenkins-dockerfile // 이 폴더 밑에 Dockerfile 만든다.
Jenkins 최신 이미지를 받아오는 Dockerfile
FROM jenkins/jenkins:lts
USER root
RUN apt-get update &&\
apt-get upgrade -y &&\
apt-get install -y openssh-client
version: '3.1'
services:
jenkins:
restart: always
container_name: jenkins-container // docker container 이름
image: jenkins/jenkins // docker hub에서 받아온 image 이름
ports:
- "8081:8080" // Host 포트 번호:8080 (뒷번호는 변경 X - docker container 내부에서 사용되기로 지정된 포트)
volumes:
- "$PWD/jenkins_home:/var/jenkins_home"
위의 docker-compose.yml
은 docker run
명령어와 같은 역할을 한다.
docker-compose
의 경우 docker run
명령어에 사용될 옵션들을 파일 형태로 간단하게 관리할 수 있다는 장점이 있다.
docker-compose up -d
명령어를 통해 컨테이너를 실행한다.
다음의 명령어를 입력하여 jenkins container의 로그 확인
$ docker logs -f jenkins-container
[ec2-user@ip-172-31-33-165 jenkins_home]$ docker logs jenkins-container
Running from: /usr/share/jenkins/jenkins.war
webroot: EnvVars.masterEnvVars.get("JENKINS_HOME")
2021-05-23 14:22:36.745+0000 [id=1] INFO org.eclipse.jetty.util.log.Log#initialized: Logging initialized @1028ms to org.eclipse.jetty.util.log.JavaUtilLog
.
.
.
2021-05-23 14:22:49.168+0000 [id=27] INFO jenkins.install.SetupWizard#init:
*************************************************************
*************************************************************
*************************************************************
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:
[패스워드]
This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
*************************************************************
*************************************************************
*************************************************************
Jenkins의 초기 비밀번호를 알 수 있다.
docker logs jenkins-container
명령어를 실행할 때
Can not write to /var/jenkins_home/copy_reference_file.log.
Wrong volume permissions?
touch: cannot touch '/var/jenkins_home/copy_reference_file.log':
Permission denied
... 반복
해당 이미지를 이용해서, docker volume을 사용하면서
컨테이너를 생성하고자 할 때 권한 오류로 인해서 컨테이너가 실행이 되지 않는다.
볼륨으로 사용할 디렉토리를 먼저 생성하고
sudo chown 1000 <볼륨으로 사용할 디렉터리> // 여기서는 jenkins_home
해당 디렉토리의 권한을 변경해준다음 (강제적으로 1000의 UID에 권한 부여)
기존 생성된 docker 컨테이너는 삭제해준다.
sudo docker stop <컨테이너ID 혹은 이름> && sudo docker rm <컨테이너ID or 이름>
그 후 도커 명령 다시 실행
ec2 ip 주소:8081 접속 Jenkins 화면이 나온다.
Install suggensted plugins를 눌러 다음으로 넘어간다.
User 정보 입력하기
Start
이때 연결이 되지 않는다면, 인바운드 규칙은 편집하면 된다.
8081 포트 추가!