CICD/Docker

[Docker]docker hub + docker compose + docker volume Jenkins:lts public image로 컨테이너 띄워 접속하기

서병렬 2023. 11. 22. 08:51

 

 

 

도커 설치하기

 

https://get.docker.com/ 여기에 들어가서 아래에 있는 명령어 부분 그대로 한줄씩 입력하면 설치된다.

To install the latest stable versions of Docker CLI, Docker Engine, and their
# dependencies:
#
# 1. download the script
#
#   $ curl -fsSL <https://get.docker.com> -o install-docker.sh
#
# 2. verify the script's content
#
#   $ cat install-docker.sh
#
# 3. run the script with --dry-run to verify the steps it executes
#
#   $ sh install-docker.sh --dry-run
#
# 4. run the script either as root, or using sudo to perform the installation.
#
#   $ sudo sh install-docker.sh
#
# Command-line options

잘 설치되었는지는 아래 명령어로 확인할 수 있다.

 

docker 설치 확인

docker -v
docker ps

 

 

error : docker ps permission denied

 

만약 docker ps를 실행했는데 결과가 아래와 같다면,

username@ubunut22:~$ docker ps
permission denied while trying to connect to the Docker daemon socket at 
unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/json: 
dial unix /var/run/docker.sock: connect: permission denied

현재 username user가 docker group에 포함되지 않은 상황이다.

 

아래 명령어로 docker group에 유저를 추가한다.

$ sudo usermod -aG docker {username}

 

만약에 docker 라는 이름의 group이 없다고하면 group을 생성해줘야한다.

$ sudo groupadd docker

 

docker단에선 내 username의 user가 권한이 있는지 아직 모르기 때문에 재부팅, 로그아웃 로그인, 혹은 아래 명령어로 변경한 설정을 반영할 수 있음

$ newgrp docker

 

참고로 정상적인 docker ps 명령의 출력은 아래 사진과 같아야한다.

 

 

 

도커 허브로 public repo pull 하여 컨테이너를 띄워 로컬 환경에서 접속해보기

 

도커 허브를 먼저 가입합니다.

아래는 가입 후 docker hub를 테스트해볼 수 있는 예제가 있는 링크

 

https://ghqls0210.tistory.com/246

 

docker - httpd image 테스트

https://hub.docker.com/_/httpd Httpd - Official Image | Docker Hub We and third parties use cookies or similar technologies ("Cookies") as described below to collect and process personal data, such as your IP address or browser information. You can learn m

ghqls0210.tistory.com

 

위 내용을 똑같이 진행하되, 설정이 다른 부분이 있어 정리합니다.

위 블로그의 내용은 로컬 환경에서 도커를 설치해 컨테이너를 띄워 로컬에 접속하는 상황, 따라서 아래의 두 가지가 다릅니다.

  1. 특별히 ip를 지정할 것 없이 localhost(127.0.0.1) 로 접속함,
  2. 접속을 수행하고자 하는 ip를 접속할 vm에서 허용하는 과정이 불필요함

 

우리의 경우는

  1. ec2 instance의 public ip로 접속해야 vm에 접근할 수 있음,
  2. 접속을 수행하고자 하는 나의 local pc ip와 접속할 포트를(블로그에서 8080) 허용해줘야함

 

1번의 경우 아래 사진과같은 화면 하단에서 확인이 가능하고

 

 

현재 내 ec2 instance에 적용된 보안 그룹의 인바운드 규칙에서 내 ip의 8080포트의 접속을 허용해야 하므로,

 

사진 왼쪽의 네트워크 및 보안 -> 보안 그룹 탭에서 현재 접속하고자하는 ec2 instance에 적용되고있는 보안 그룹을 클릭 하고,

 

 

 

위의 사진 오른쪽에 있는 인바운드 규칙 편집을 눌러, 원하는 포트에 내 ip를 입력하여 저장한다.

이후로는 아무 브라우저에서 내ip:포트번호 로 접속 가능

 

 

 

도커 허브 간략한 사용법

 

위에서 docker hub로 pull and run 하는 과정을 진행해봤다면, docker hub의 사용법에 대하여 간단하게 알아보자

 

아래 예제 코드의 내용이 위에서 진행한 예제와 같지 않으니 위에서 진행한 public httpd image를 pull and run 했던 것을 바탕으로 아래의 예제 코드에서 변경되어야 할 부분을 캐치해서 진행해보시면 됩니다.

 

 

 

수행된 명령 및 출력 정리

 

이미 docker pull, docker run으로 어디선가 도커 이미지를 pull해오고, run 명령으로 컨테이너를 띄운 상태라고 가정하겠습니다.

1. docker ps : 현재 띄워진 컨테이너 확인 명령

Image : 이미지 이름, Names : 컨테이너 이름

2. docker stop {컨테이너 이름 or 컨테이너 Id} : 현재 띄워진 컨테이너 중 해당하는 컨테이너를 멈춤

3. docker ps : 방금 컨테이너를 하나 종료했으므로 실행중인 컨테이너에 표시 x

4. docker ps -a : 종료된 컨테이너를 조회

5. docker commit {컨테이너 이름 or 컨테이너 Id} {push할 repo(dockerhub 이름 / Image이름:태그} : 아까 종료한 컨테이너를 docker hub local repo에 commit한다.

6. docker push {push할 repo(dockerhub 이름 / Image이름:태그} : commit한 도커 이미지를 docker hub 원격 repo에 push

 

 

commit 명령과 push 명령간 헷갈릴 수 있는 부분 정리

현재 수행되고 있는 컨테이너를 stop한 후, 아래 명령어를 수행할 때

docker commit {컨테이너 이름} {내dockerhub이름/이미지 이름:태그}
docker push {내dockerhub이름}/{이미지이름 = 리포지터리 이름}:{태그(버전)}

위 명령어를 실행해야하는데, commit and push 할 때 github와 달리 repository 앞에 내 dockerhub 이름이 붙는다.

 

이미지 이름은 {dockerhubname}/{imagename}:{tag} 로!

 

애초에 commit 할 때 이미지 이름을 저렇게 지정해야 docker push 명령어가 듣는다.

이후에 빌드 된 image들을 확인할 수 있는 명령어를 입력한 아래 사진을 보면 좀 더 이해할 수 있는데, 깃허브처럼 repository 이름과 로컬에서의 내 프로젝트 이름을 따로 지정하고 연결해서 push and pull 하는 개념이 아니라,

깃허브와 비교하면, {내계정/도커Image이름} 자체가 repository 역할이 된다. 따라서 Docker Hub에서 repository를 만들었다면, 해당 repository의 이름으로 도커 Image 이름을 지어줘야한다.

 

참고로 docker images 라는 명령으로 docker hub와 연결된 docker image들을 조회하면,

애초에 image name 이라는 column 조차 없고 그 자리에 REPOSITORY가 있다.

 

 

 

[주의] 아래 docker 기본 사용법 정리 내용은 따라하지마시고 참고만 해주세요 이후 수행할 작업인 docker hub public jenkins:lts repo를 pull 한 후에는 build 수행 없이 run할 수 있습니다. 혼동이 올 수 있으니 아래EC2 가상 램 메모리 확보 목차부터 봐주세요

[주의] 아래 docker 기본 사용법 정리 내용은 따라하지마시고 참고만 해주세요 이후 수행할 작업인 docker hub public jenkins:lts repo를 pull 한 후에는 build 수행 없이 run할 수 있습니다. 혼동이 올 수 있으니 아래EC2 가상 램 메모리 확보 목차부터 봐주세요

 

 

docker 기본 사용법 정리

[예제 아님] docker build

docker build --force-rm -t byeongryeol/hanghaeeats:1.0 .

 

옵션을 하나하나 풀이!

  1. docker build
  2. —force-rm : 중간중간 생성되는 임시 컨테이너 제거 (build 실패시 모든 컨테이너 제거 && build 성공시 임시 컨테이너 제거)
  3. -t : 생성될 이미지의 이름을 설정하기 위해(이 옵션이 없으면 16진수 이름이된다. docker hub에 push하고싶다면 필수인 조건)
  4. byeongryeol/hanghaeeats:1.0 . : 도커허브이름/이미지이름 : 태그(버전)
  5. . : Dockerfile의 경로 (현재는 Dockerfile이 있는 디렉토리에서 명령어를 실행하므로 .이다.)

 

이미지가 잘 생성되었는지는 아래 명령어로 확인한다.

docker images

(hello-world는 docker hub 설치 확인용이라서 무시하셔도됩니다.)

 

[예제 아님]  docker hub에 push

 

docker push (내dockerhub이름)/hanghaeeats:1.0

만약에 아까 빌드할때 build 옵션중 -t와 함께 이미지 이름을 {내dockerhub이름}/{프로젝트 이름}:1.0 과같이 지정하지 않았다면, 이름을 변경하면 된다.

 

[예제 아님] image 이름 변경하기 (tag 명령어)

docker tag {기존 이미지 이름} (dockerhub 이름)/hanghaeeats:1.0

이후 원한다면 서버에 접속할 수 있는지 확인해 볼 수 있다.

 

docker hub에 run하고자하는 image가 push되어있다고 가정하고,

vm에서 포트가 열려 있다고 가정하고, (현재 80)

 

[예제 아님] docker run

docker run -it -d -p 80:8080/tcp --name {container name} {dockerhubname}/{repository}:{tag}
  1. -it : 터미널 입력 활성화하여 컨테이너로 전달하기 위함
  2. -d : container를 백그라운드로 실행 한다.
  3. -p 80:8080/tcp : vm환경으로 80포트로 접근한다면 container에 8080으로 port fowarding해줌
  4. —name {container name} : container 이름 지정
  5. {dockerhubname}/{repository}:{tag} : 내 리포지터리에서 tag에 해당하는 버전의 이미지를 pull 해서 run 하겠다.

vm의 public ip로 local에서 접속해보면 서버에 접속할 수 있다.

 

 

 

 

EC2 가상 램 메모리 확보

 

jenkins plugin 설치 및 빌드 과정에 내 vm이 힘들어하기때문에 가상 메모리를 활성화해주자.

 

아래 명령어로 2G 만큼의 공간 확보 (스왑파일 생성)

**sudo fallocate -l 2G /swapfile**

 

스왑 파일은 루트 계정만 읽고 쓸 수 있어야 한다.

sudo chmod 600 /swapfile

 

스왑 영역 설정

sudo mkswap /swapfile

 

스왑 영역 활성화(swap on)

sudo swapon /swapfile

 

재부팅 시에도 스왑영역활성화가 되길 원한다면

/etc/fstab파일에 다음을 추가 해주어야 한다.

/swapfile swap swap defaults 0 0

 

 

 

Jenkins lts container pull하여 설치하기

 

Docker, Docker Hub의 아주 간단한 사용법에 대해서 알아봤으니, 이제 Jenkins에서 제공하는 public image를 pull 해서 열어볼 겁니다.

 

아래 명령으로 public repo pull

docker pull jenkins/jenkins:lts

 

container 실행

sudo docker run -d -p 8081:8080 -v /jenkins:/var/jenkins_home --name jenkins -u root jenkins/jenkins:lts

 

옵션 설명

-d : 컨테이너를 데몬으로 실행

-p 8081:8080 : 컨테이너 외부(vm 호스트 장치)와 컨테이너 내부 포트 포워딩

-v /jenkins:/var/jenkins_home : 컨테이너 외부 vm 디렉토리와 컨테이너 내부 디렉토리 도커 볼륨 마운트

—name jenkins : 컨테이너 이름 지정

-u root : 컨테이너를 실행할 계정은 root로 지정

참고로 도커 볼륨 마운트를 지정하지 않으면, docker 로 띄운 container를 종료하기만 하면 모든 설정들이 초기화된다.(이미지에는 pull 해온 이후 변경된 파일에 대해서 다시 docker hub repo에 push한다고 해서 저장되지 않는다.)

 

 

docker hub 내 repository에 jenkins container 이미지화한 후 push

 

이렇게 하기만 하면 정상 실행되고 프로젝트 CI/CD 구축 등에는 문제가 없지만, 아무래도 docker hub Jenkins 소유의 repository에 종속된 느낌이 드니까 docker 허브 간략한 사용법 목차 부분을 따라하여 docker hub의 나의 repository에 push 하겠습니다.

 

 

현재까지 한 작업을 요악하면,

 

아래 명령어로 docker hub에 있는 public repository jenkins/jenkins의 lts version을 사용하기 위해 tag를 lts로 지정하여 image를 pull 해왔었다.

docker pull jenkins/jenkins:lts

 

docker run 수행시 옵션으로 docker volume을 mount했기에 컨테이너를 종료하고 다시 띄워도 내 jenkins 설정은 내 vm에 그대로 남아있다.

 

이 설정들이 그대로 vm에 남아있기만 한다면, 언제든 dockhub에서 jenkins image를 pull해와서 docker run 하기만 하면 유지한 설정 그대로 jenkins를 다시 구동할 수 있다.

 

먼저 이 jenkins container image를 push할 내 docker hub repository를 생성해준다.

 

현재 실행중인 container의 이름은 jenkins-sbl이다.

 

현재 컨테이너의 변경사항을 반영하기 위해 commit 하고싶다면, 먼저 컨테이너를 stop해야한다.

docker stop jenkins-sbl
docker commit jenkins-sbl byeongryeol/{내 repository 이름}:1.0

 

이후 아래 명령어로 image가 잘 생성된 것을 확인한 후

docker images

 

아래 명령어로 push해줌

docker push byeongryeol/{repository 이름}:cidone

 

 

[선택사항] docker-compose 활용하여 실행

도커 볼륨이 잘 마운트되었는지 컨테이너를 죽였다가 띄웠다가 하다 보니 docker run 명령어 치기가 귀찮아서 docker-compose를 활용했습니다.

 

아래 명령어로 설치

 sudo apt install docker-compose

 

docker run을 실행할 경로에  docker-compose.yml  이름으로 아래 내용 작성 (디렉토리는 vm의 ubuntu 계정 home directory 추천)

 

version: "3"
services:
  jenkins:
    image: jenkins/jenkins:lts
    user: root
    volumes:
      - ./jenkins:/var/jenkins_home
    ports:
      - 8081:8080
		container_name: jenkins

 

옵션 설명 volumes : 내 vm 의 /jenkins 경로에 컨테이너의 /var/jenkins_home 경로에 있는 모든 것들을 저장하겠다.

docker-compose.yml이 있는 디렉토리에서 아래 명령어 실행하여 compose 파일을 활용하여 container 실행

sudo docker-compose up -d

이 상태에서 vm에 8081포트로 접속하면(당연히 인바운드 규칙 수정까지) Jenkins 초기화면을 볼 수 있다!