다음 공식문서의 명령어를 따른다.
https://docs.docker.com/engine/install/ubuntu/
Update the apt package index and install packages to allow apt to use a repository over HTTPS:
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
Add Docker’s official GPG key:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
sudo apt install docker.io
명령어로 설치해야 오류가 발생하기 않는다.
docker -v
Docker version 20.10.7, build 20.10.7-0ubuntu5~18.04.3
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.24/images/json: dial unix /var/run/docker.sock: connect: permission denied
위와 같은 에러가 발생한다.
이유는 무엇인가?
도커를 root
가 아닌 ubuntu
유저로 실행했기 때문이다.
따라서 해당 유저를 docker group
에 추가해주면 해결된다.
명령어는 이것을 참고 : https://stackoverflow.com/questions/48957195/how-to-fix-docker-got-permission-denied-issue
docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:97a379f4f88575512824f3b352bc03cd75e239179eea0fecc38e597b2209f49a
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.
docker pull nginx
docker images
docker container run --name webserver -d -p 80:80 nginx
webserver 라는 이름으로 nginx 이미지를 컨테이너화하여 실행하며
-d 옵션을 통해 detach, 즉 백그라운드로 실행한다.
-p 옵션을 통해 HTTP 80번 포트에 대한 액세스를 허가한다.
docker pull jenkins/jenkins
여기서 잠깐!
Jenkins 의 기본 실행포트는 8080이다. 톰캣을 기반으로 하기 때문이다.
이 기본포트를 바꿔주는것은 만약 도커로 설치하지 않고 직접 설치했다면 젠킨스 설정파일로 가서 바꿔주면 된다. 하지만 도커로 빌드한 경우에는 어떻게 하면 기본포트르르 변경할지 이렇다할 방법은 찾지 못했다.
다만 톰캣 서버에 스프링이 연결되던 젠킨스가 연결되던 톰캣 컨테이너는 하나의 톰캣 컨테이너니까 두 호스트로부터 연결되어도 괜찮지않나 생각한다.
그래서 호스트 포트만 8083으로 바꾸어 실행시켰다.
뒤의 50000 포트는 슬레이브 포트라 하여 앞 포트 충돌문제가 발생하면 저 포트로 연결된다고 한다.
mkdir jenkins_home
추가로 권한도 부여한다. 컨테이너 내부에서 sudo 를 사용할 수 없기 때문이다.
sudo chown -R 1000:1000 $PWD/jenkins_home/
sudo chmod +x /var/run/docker.sock
docker run --name jenkins -d --restart always -p 8083:8080 -p 50000:50000 -e TZ=Asia/Seoul -v $PWD/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker jenkins/jenkins
jenkins/jenkins 라는 이미지를 jenkins라는 이름의 컨테이너로 실행
호스트 포트는 8083, 컨테이너 포트는 8080
--restart always: 컨테이너가 종료되면 재시작
-d 옵션을 통해 백그라운드로 실행
-e 옵션을 통해 jenkins 내의 timezone 을 설정하였다.
-v 옵션을 통해 $PWD/jenkins_home 디렉토리와 container volume의 /var/jenkins_home 디렉토리를 매핑하였다. -v 옵션을 사용하지 않으면 내부에서 사용한 정보가 유지되지 않으므로 필수로 설정해야한다.
workspace 는 따라서 /ubuntu/home/jenkins_home 이 되었다.
Jenkins image 를 가져와서 컨테이너를 실행한다.
Jenkins 에서 도커 이미지를 빌드하기 위해 호스트와 컨테이너의 볼륨을 묶어주었다.
그리고 도커 또한 컨테이너 안에서 실행하려면 권한이 필요하므로 chmod를 사용해서 접근할수 있게 만들었다.
This will store the jenkins data in /your/home on the host. Ensure that /your/home is accessible by the jenkins user in container (jenkins user - uid 1000) or use -u some_other_user parameter with docker run.
공홈과 다음 블로그를 참고:
https://hub.docker.com/_/jenkins?tab=description
https://sinawi.tistory.com/370
cf.
Docker Engine은 Host OS의 /var/run/docker.sock 아래에 마운트 된 Unix 소켓을 사용한다.
docker.sock은 도커 컨테이너 내부에서 데몬과 상호 작용을 할 수 있게 해주는 Unix 소켓이다.
sudo ufw enable
sudo ufw allow 22 (소름....)
sudo ufw allow 80
sudo ufw allow 8083
sudo ufw allow 50000
sudo ufw reload
sudo ufw status
/var/jenkins_home/secrets/initialAdminPassword
성공!