현재 jenkins에서 docker build -t 를 실행할 시 docker를 찾을 수 없다고 한다.
(여러 사람들에게 물어본 결과...) host docker.sock과 연결되어 있지 않은 상태다.
client가 요청한 후, /usr/bin/docker
가 /var/run/docker.sock
유닉스 소켓을 사용해 docker daemon
에게 명령어를 전달 하지 않은 상태다. (내 생각으로는 docker에서 jenkins image를 생성한 후, container 호스트 운영체제의 커널을 공유하면서 격리된 컴퓨팅 자원을 제공하는 가상화 기술에 docker가 적용되지 않은 상황이다. 적용되지 않은 곳을 호출하고 있다.)
Docker socket 파일 위치 : /var/run/docker.sock
안에 있다.
docker 기본 개념에서 확인 가능 을 보면 docker socket이 무엇인지 알 수 있다.
✔️ 현재 해결 방안
jenkins를 docker 이미지로 구동하면 jenkins 컨테이너에서 host의 docker를 사용하여 빌드를 해야한다.
host의 docker 소켓을 컨테이너와 공유한다. 이렇게 할시, 컨테이너가 host의 docker 데몬을 사용하여 이미지 빌드, 컨테이너 실행을 할 수 있다.
=> jenkins 컨테이너에 접속하여 필요한 docker-ce 를 설치하거나 이 과정을 정의한 Dockerfile을 직접 만드는 방법들 있다. (Dockerfile : docker-ce를 설치하거나 과정을 정의한 것)
✔️ Jenkins 컨테이너에 직접 docker-ce 설치
🔍 시작하기 전
jenkins 이미지를 통해 컨테이너를 실행한다. (docker run -p)
이제 jenkins가 구동이되면 해당 jenkins 컨테이너의 shell에 접속한다.
docker exec -it -u root ubuntu_jenkins_1 bash
💡 참고
docker container
에(shell) 접속할 때,docker exec 명령어
를 사용한다. (container 내부 접속)
jenkins shell
에 접속한 상태, apt 명령어 실행을 위해 root에 접속했다.
공식 docker apt repository 구성 및 docker ce 바이너리 설치하는 명령어를 입력해주면 된다.
apt-get update && \
apt-get -y install apt-transport-https \
ca-certificates \
curl \
gnupg2 \
software-properties-common && \
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg > /tmp/dkey; apt-key add /tmp/dkey && \
add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
$(lsb_release -cs) \
stable" && \
apt-get update && \
apt-get -y install docker-ce
추가적으로 docker jenkins에서 host docker 접근권한을 부여해줘야 한다.
groupadd -f docker
usermod -aG docker jenkins
chown root:docker /var/run/docker.sock
그런데 만약, chown root:docker /var/run/docker.sock
을 실행했을 때, 해당 파일 및 디렉터리를 찾을 수 없다는 결과가 나왔을 때는 서비스를 실행하지 않아서 생기는 문제이다.
docker를 실행시킨 후, 해당 명령어를 입력하면 된다.
💡 참고
docker ubuntu에서 sudo 명령어를 찾지 못했을 때apt-get update && \ apt-get -y install sudo
를 통해 설치해주면 된다.
jenkins에서 docker-ce를 설치 후,
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
의 오류를 만나게 되었다.
unix:///var/run/docker.sock
에 있는 docker daemon에 연결할 수 없으므로 docker daemon이 돌고있는지 물어보고 있다.참고 자료 에 의하면, 위 해석한 내용에 따르면 docker daemon
은 docker.sock
에서 돌고 있다는 뜻이다.
✔️ dockerd
dockerd
는 컨테이너들을 관리하는 백그라운드 프로세스라는 뜻이다.dockerd
를 실행하기 위해서는 터미널에서 dockerd
를 입력하면 된다.docker ps
와 같은 커멘드를 실행하면 잘 돌아간다.unix:///var/run/docker.sock
와 dockerd
의 관계는 무엇일까?
✔️ dockerd와 socket의 관계
unix:///var/run/docker.sock
: unix
컴퓨터와 통신을 하기 위한 소켓의 위치unix
도메인 소켓이 연결되어 있다.
✔️ 해결 방안
Docker daemon
을 돌려주기만 하면 된다.dockerd
를 매번 실행하기는 번거러우니 아래 두 line을 docker 설치 이후 입력하면 된다!systemctl start docker : docker를 daemon으로 실행하라는 명령어, `dockerd`와 같지만 로그없이 실행
systemctl enable docker : 컴퓨터가 새로 시작하거나 부팅시 자동으로 docker daemon을 실행하라는 명령어
위를 통해 docker.sock
연결한 후, 실행했더니 또 다른 오류가 발생했다.
sudo service docker start 를 통해 docker를 실행시켰지만, 곧 바로 상태를 보니 failed라는 결과를 받게 되었다.
왜 이와 같은 결과가 나온건지 알아봐야 한다.
✔️ 질문
참고