AWS의 Amazon Linux는 Red Hat 계열의 배포판이기 때문에 yum 패키지 관리자를 사용
리눅스 패키지 관리자 업데이트
→ sudo yum update
도커 설치하기 위한 의존성 패키지 설치
→ sudo yum install yum-utils
Docker 공식 지원 저장소가 시스템에 추가되고 Docker 엔진이 설치됩니다
→ sudo amazon-linux-extras install docker
해당 명령어는 Amazon Linux 2를 사용하는 Amazon EC2 인스턴스
를 사용해야 가능한 명령어입니다.
sudo: amazon-linux-extras: command not found
오류가 발생하면 인스턴스가 Amazon Linux 2 AMI
로 실행되지 않은 것입니다.cat /etc/system-release
를 명령어를 사용해서Amazon Linux 2
를 사용하는지 확인해보세요!다른 운영체제의 경우 Docker 참고를 하시면 도움이 되실 것 같습니다 !
Amazon Linux 2023 AMI Docker 설치
리눅스 패키지 관리자 업데이트 (다시)
→ sudo yum update
AWS 리눅스 환경에서는 별도의 저장소 추가와 GPG 키 추가 과정이 필요하지 않다.
도커 서비스 시작
→ sudo service docker start
(선택 사항) 시스템이 재부팅될 때마다 Docker 데몬이 시작되도록 하려면 다음 명령을 실행
sudo systemctl enable docker
sudo를 사용하지 않고도 Docker 명령을 실행할 수 있도록 docker 그룹에 ec2-user를 추가
→ sudo usermod -a -G docker ec2-user
설치 확인
→ sudo docker run hello-world
[ec2-user@ip-~]$ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
719385e32844: Pull complete
Digest: sha256:c79d06dfdfd3d3eb04cafd0dc2bacab0992ebc243e083cabe208bac4dd7759e0
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
※ 참고 → 메모리 부족
젠킨스를 사용하면서 메모리 사용량을 조회해 보니 컨테이너 실행만으로 600MB의 메모리를 사용하고 빌드 시 1GB 가까이 메모리를 사용합니다. 저는 아주 간단한 프로젝트를 빌드 했지만 프로젝트의 규모가 커질수록 메모리 사용량은 늘어날 것으로 보입니다.이 점 서버 구성할 때 참고하세요! (AWS에서 프리 티어 플랜을 사용할 경우 작동이 원활하지 않을 수 있습니다.)
도커 허브에서 젠킨스 이미지 다운로드
→ docker pull jenkins/jenkins:lts
다운로드된 이미지 확인
→ docker images
[ec2-user@ip-~]$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
jenkins/jenkins lts 6adc6425cd34 2 weeks ago 476MB → 이 부분
hello-world latest 9c7a54a9a43c 7 months ago 13.3kB
jenkins 이미지 실행
docker run -d -p 8081:8080 -p 50000:50000 -v /home/jenkins:/var/jenkins_home -v /usr/bin/docker:/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock -u root jenkins/jenkins:lts
사용된 옵션
-d
-p
-v
-u
-d
: 컨테이너를 백그라운드에서 실행하는 옵션입니다.
-p
: 호스트의 포트와 컨테이너의 포트를 연결하는 옵션입니다.
-p [호스트 포트번호]:[컨테이너 포트번호]
-p 8081:8080
: 호스트서버의 8081포트와 컨테이너의 8080포트를 연결
-v
: 호스트의 디렉토리와 컨테이너 디렉토리를 볼륨으로 매핑합니다.
쉽게 말해서 서로 지정된 디렉토리를 공유한다는 뜻입니다.
-u
: 컨테이너의 실행 사용자를 지정합니다.
run
- 이미지를 기반으로 컨테이너를 실행시킵니다. 위에서는 jenkins/jenkins:lts 이미지를 실행
-p 50000:50000
젠킨스 마스터 노드
는 빌드 에이전트와통신할 때 JNLP(Java Network Launch Protocol)을 사용
.
JNLP통신은TCP/IP기반
으로 이뤄지고, 기본적으로50000번 포트
- 컨테이너는 기본적으로 격리된 환경에서 실행되기 때문에, 젠킨스 마스터 노드와 빌드 에이전트가 통신하려면 같은 컨테이너에 있더라도 호스트 서버를 통해 통신하게 됩니다.
- 통신관계를 간단하게 표현하면 (빌드에이전트 ↔ 호스트서버 ↔ 마스터노드)
-v /home/jenkins:/var/jenkins_home
젠킨스 컨테이너의 설정을 호스트 서버와 공유
함으로써,
컨테이너가 삭제되는 경우에도 설정을 유지
할수 있게 해줍니다.
호스트 디렉토리
(/home/jenkins)와,컨테이너 디렉토리
(/var/jenkins_home)를연결
합니다
연결한다는 의미는
호스트의 /home/jenkins에 test.txt파일을 추가
하면
컨테이너의 /var/jenkins_home경로에도 test.txt파일이 추가
된다는 의미입니다. 반대로도 동일
-v /usr/bin/docker:/usr/bin/docker:
- 호스트의 /usr/bin/docker 파일을 컨테이너의 /usr/bin/docker 파일에 바인딩합니다.
→ 호스트에서 실행 중인 Docker 실행 파일을 컨테이너 내에서 사용할 수 있습니다.
- Jenkins 컨테이너 내에서 호스트 서버의 Docker 실행 파일을 활용하여 빌드 및 배포 작업을 수행 가능합니다.
-v /var/run/docker.sock:/var/run/docker.sock
- 호스트의 Docker 소켓을 컨테이너의 Docker 소켓에 매핑합니다.
- 컨테이너 내부에서 호스트의 Docker 데몬과 통신하여 Docker 명령을 실행하거나 빌드 및 배포 작업을 수행할 수 있습니다.
이러한 구성은
컨테이너 내부에서 호스트 서버의 도커를 사용
하는DooD(Docker out of Docker)
입니다.
컨테이너 내부에 도커를 설치
해서 사용하는 방식인DinD(Docker in Docker)
도 있습니다.
-u root jenkins/jenkins:lts
- 호스트 서버의 디렉토리를 공유하기때문에 권한 문제가 있을수있어 root사용자로 실행
젠킨스 실행 확인
→ sudo docker ps
[ec2-user@ip-~]$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
03685d6d4025 jenkins/jenkins:lts "/usr/bin/tini -- /u…" 35 seconds ago Up 33 seconds 0.0.0.0:50000->50000/tcp, :::50000->50000/tcp, 0.0.0.0:8081->8080/tcp, :::8081->8080/tcp unruffled_bassi
→ http://{서버ip or 도메인}:8081
해당 화면으로 알려주는 경로 /var/jenkins_home/secrets/initialAdminPassword
로 접근해서 임시비밀번호를 조회할 수 있으나, 해당 방법은 컨테이너에 접속해서 해당 경로로 찾아가야되는 번거로움이 있습니다.
아래 방법으로 간편하게 조회할 수 있습니다.
→ docker logs [젠킨스 컨테이너ID]
일반적으로 Jenkins 초기 설정 비밀번호는 /var/jenkins_home/secrets/initialAdminPassword
파일에 저장되어 있지만, 컨테이너 로그를 통해도 얻을 수 있습니다. 해당 방법을 통해 번거로움 없이 빠르게 초기 비밀번호를 확인할 수 있습니다.
왼쪽 파란색을 클릭한다.
설정 유지는 위에서 설명했지만 다시 한번 적어놓았습니다 !
-v /home/jenkins:/var/jenkins_home
젠킨스 컨테이너의 설정을 호스트 서버와 공유
함으로써,
컨테이너가 삭제되는 경우에도 설정을 유지
할수 있게 해줍니다.
해당 아이피는 변경되어서 그냥 첨부했습니다 : >
경로 설정은 초기 값 그대로 두시면 됩니다 !
끝.
참고 자료
amazon docker 설치