[Server] EC2, Jenkins, Docker

애이용·2021년 5월 24일
0

DevOps

목록 보기
2/6

Docker 설치 관련 링크

Docker로 Jenkins 실행

Jenkins 실행 방법 1

$ 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를 명시

Jenkins 실행 방법 2

$ 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.ymldocker run 명령어와 같은 역할을 한다.
docker-compose의 경우 docker run 명령어에 사용될 옵션들을 파일 형태로 간단하게 관리할 수 있다는 장점이 있다.

docker-compose up -d 명령어를 통해 컨테이너를 실행한다.

Administrator password 확인

다음의 명령어를 입력하여 jenkins container의 로그 확인

$ docker logs -f jenkins-container
  • -f 옵션 : 계속해서 로그 조회
[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의 초기 비밀번호를 알 수 있다.

Error - 권한 오류

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 이름>

그 후 도커 명령 다시 실행

Jenkins 접속 및 초기 설정

ec2 ip 주소:8081 접속 Jenkins 화면이 나온다.
Install suggensted plugins를 눌러 다음으로 넘어간다.

User 정보 입력하기
Start

Error - 연결 관련

이때 연결이 되지 않는다면, 인바운드 규칙은 편집하면 된다.
8081 포트 추가!

profile
로그를 남기자 〰️

0개의 댓글