도커
Cgroup
-Control group : 시스템의 CPU 시간, 시스템 메모리, 네트워크 대역폭과 같은 자원을 제한하고 격리할 수 있는 커널 기능
Namesapce
스냅샷 형태로 이미지를 만드는 방법
- docker pull nginx : 도커 이미지를 다운로드 하는 명령어
- docker images : 로컬에 존재하는 모든 도커 이미지 보여주는 명령어
- docker run –-name nginx -p 8000:80 -d nginx : 이미지를 컨테이너화 해서 도커를 실행시키기(RUN명령을 하면 이미지 파일이 존재하지 않으면 다운로드를 알아서 해줌)
--name옵션 : 컨테이너 이름 지정
-p: 도커 포트와 내 PC포트 연결, 내 피시 8000,도커80(내 PC 8000포트에 도커 컨테이너 80포트를 포트 포워딩)
-d : detached mode (백그라운드로 실행하겠다)
nginx : 도커 이미지의 이름
- docker ps : nginx 도커 컨테이너가 잘 실행되고 있는지 확인
- docker exec -it nginx /bin/bash : 도커 컨테이너 내부 쉘이 실행되어 접근
ex) docker exec -it db bash : mysql 컨테이너의 내부 쉘에 실행되어 접근
- exec : 컨테이너 내부에 명령을 실행하도록 함
-i(interactive) 표준 입력을 활성화시키면 attach가 안 되어 있더라도 명령어 입력 가능.
-t(tty) 옵션을 사용하면 리눅스 쉘이 표시 됨.
리눅스 명령어(파일 찾기)
- find / -name index.html 2>/deb/null
find : 파일 찾는 명령어
/ : 루트 디렉토리 -name : 파일 이름 지정 옵션 2>dev/null : 에러 출력을 저기로 버림.
- docker cp nginx:/user/share/nginx/html/index.html index.html : 컨테이너 내의 index.html파일을 호스트 PC에 복사
docker cp index.html nginx:/usr/share/nginx/html/index.html : 수정한 index.html파일을 nginx 컨테이너에 복사해서 넣기
docker commit nginx mynginx : 컨테이너를 index.html 파일이 수정된 현재 상태의 이미지로 만들기.
docker rm [컨테이너 이름(NAMES)]: 삭제 명령어(실행되고 있는 컨테이너는 삭제되지 않음)
docker stop[컨테이너 이름]: 컨테이너 종료 명령어. docker ps로 확인하면 리스트에서 사라지고 웹브라우저에도 접속되지 않음. 하지만 컨테이너는 삭제되지 않았으며, 중지된 컨테이너는 원래 상태대로 실행이 가능함.
docker ps -a : 를 통해 중지된 컨테이너도 확인 가능
컨테이너 정지 후 삭제 가능!!
도커 시작 : docker run -d -p 80:80 docker/getting-started
도커 파일로 이미지를 만드는 방법 (= 이 방법은 배포할 파일 뭉치를 만드는 것과 같음)
도커 파일(Dockerfile)
Dockerfile 내에 입력해야 할 소스
FROM nginx
COPY index.html /usr/share/nginx/html/
- docker build -t mynginx2 . : 도커 파일을 이용하여 이미지를 만드는 명령어
(위에서 작성한 Dockerfile 파일이 현재 작업 디렉토리에 있어야 함)- docker run –name custom1 -p 8002:80 -d mynginx2 : 컨테이너 실행
- docker rmi [이미지 이름(REPOSITORY)] or docker rmi [이미지 아이디(IMAGE ID)]. : 도커 이미지 삭제 명령어
- sudo usermod -aG docker $USER : 일반 계정 유저도 도커 사용 가능
$USER : 현재 사용자에게 원한을 준다 ( 특정 사용자에게 권한을 부여하려면 $USER대신 사용자 아이디 넣기)
MySQL 컨테이너 구동
docker run --name db -e MYSQL_ROOT_PASSWORD=1234 -p 3306:3306 -d mysql:5.7.28
_5.7.28 : 태그 부분
TAG : 해당 이미지의 버저닝을 할 때 쓰는 것으로 이미지의 버전에 따라 태깅을 함.
ex. MySQL8버전을 사용하고 싶다면 명령어 부분을 MySQL:8.0으로 수정
태킹해서 도커 이미지를 분리할 경우, 사용하고 싶은 버전의 tag만 알면 이미지를 손쉽게 사용 가능. 도커 이미지로 배포할 경우 유용하게 사용됨
SpingBoot를 컨테이너화
개발자가 로컬 환경에서 개발하고 나서 Git에 푸시 하면 해당 소스를 테스트 서버로 배포해야 함.
(배포는 Jenkins로 하지만 수작업으로 한다 가정)
배포 서버에서 해당 프로젝트가 빌드 되었다고 가정하면 SpringBoot의 jar파일이 만들어짐. 그럼 이 jar파일을 포함하여 컨테이너를 실행해야 함
jar 파일 클론 후 해당 위치에서 Dockerfile생성 ( vi Dockerfile)
docker/target/docker-0.0.1-SNAPSHOT.jar이 있는 것 확인
Dockerfile 내용
- FROM openjdk:8-jdk-alpine
- ADD docker/target/docker-0.0.1-SNAPSHOT.jar app.jar
- ENTRYPOINT [“java”,”-Djava.security.egd=file:/dev/./urandom”,”-Dspring.profiles.
- active=dev”,”-jar”,”/app.jar”]
Jar 파일을 적절하게 수정해서 실습
- FROM <이미지> : base이미지 지정 (Dockerfile내의 최상단에 위치, Docker Hub와 같은 Docker repository에 올려놓은 잘 알려진 공개 이미지인 경우가 많음)
- ADD (COPY) : 호스트 컴퓨터에 있는 디렉터리나 파일을 Docker 이미지의 파일 시스템으로 복사하기 위해 사용됨. (ADD는 COPY의 강력한 버전)
!! 이거 agr1에 현재 경로 기준으로 .jar파일 입력해 주어야 함!!
- ENTRYPOINT : 이미지를 컨테이너로 띄울 때 항상 실행되야 하는 커맨드를 지정할 때 사용. Docker 이미지를 마치 하나의 실행 파일처럼 사용할 때 유용함 (컨테이너가 뜰 때 ENTRYPOINT 명령문으로 지정된 커맨드가 실행되고, 이 커맨드로 실행된 프로세스가 죽을 때, 컨테이너도 따라서 종료되기 때문)
SpringBoot이미지에서 read only 부분이 openjdk:8-jdk-alpine. read write 부분이 jar 파일로 배치될 부분
- Docker inspect : 참조한 이미지 확인
- Docker build -t springboot . : 도커 빌드로 이미지 생성
- Docker run –-name app1 -d –p 80:8080 springboot : 생성된 도커 이미지를 바탕으로 도커 컨테이너 명령어 실행
--> 34.134.162.253 (외부 IP주소) 입력하면 웹 브라우저 뜸- Docker logs app1 : 실행된 컨테이너에 대해 로그 볼 수 있음
- Docker logs [option] 컨테이너명
[option]
-f : 실행되는 로그를 계속해서 볼 수 있음
--tail 100 : 마지막 100라인을 볼 수 있음
(도커 모니터링 툴을 운영하고 있다면 직접 접속해서 명령을 실행하지 않아도 됨)
도커의 장점 : 하나의 인스턴스에 MySQL, Springboot 등과 같이 인스턴스 사양에 따라 여러 프로그램의 컨테이너를 손쉽게 설치할 수 있음.
배포 과정
Developer ---(빌드 요청)--> CI 서버 --> 테스트 서버
대표적인 CI 프로그램은 젠킨스
Docker cp app1:app.jar . : 파일 뭉치를 실행 중인 컨테이너에 복사하는 명령 실행.
docker restart app1 : 다시 실행
파일 뭉치 : app.jar / 실행 중인 컨테이너 : app1
CI와 도커 레지스트리를 이용한 테스트 배포
도커 레지스트리
- docker login : 도커 허브 사이트의 계정 정보를 이용하여 로그인
--> 로그인 상태가 되면 도커 허브 사이트에서 부여한 도커 레지스트리에 도커 이미지 저장 가능- docker tag springboot heohyeonjin/custom-nginx:springboot
docker tag 이미지명 도커허브아이디/이미지명:태그- docker push heohyeonjin/custom-nginx:태그명
: push 명령어를 이용하여 이미지를 도커 허브로 푸시
물리적으로 다른 위치에 있는 테스트 서버에 배포 방법
도커 레지스트리를 직접 만들고 사용하는 방법
- 도커 레지스트리 이미지 다운로드 : docker pull registry
- 도커 레지스트리 컨테이너 생성 : docker run -d –p 5000:5000 --restart=aways --name registry registry
- 도커 이미지 저장 : docker pull ubuntu
- 도커 이미지 태깅 : docker image tag ubuntu localhost:5000/ubuntu(커밋 느낌?)
이미지 리스트에서 태깅한 localhost:5000/ubuntu 확인 가능- 생성했던 컨테이너인 localhost:5000으로 이미지 푸시 : docker push localhost:5000/ubuntu
레지스트리도 도커 이미지를 바탕으로 컨테이너를 실행하여 만드는 것임.
도커 레지스트리 설치가 잘 되었는지 테스트하는 방법
: 로컬에서 도커 이미지 받아보기.
1. 구글 클라우드의 방화벽 규칙에서 5000번 허용
2. 로컬에서 클라우드에 있는 도커 레지스트리 다운로드
: docker pull 34.134.162.253:5000/ubuntu
클라우드 인스턴스에 설치된 레지스트리에서 이미지를 다운로드 받으려고 하니 에러가 남. 기본적으로 도커 레지스트리는 HTTPS로 통신가능해야 함.
(https://docs.docker.com/registry/insecure/에 자세히 설명)
3. Docker Engine에서 insecure-registries :[“34.134.162.253:5000”] 작성
4. 도커 서비스 재시작 : sudo systemctl restart docker
도커 허브와 프라이빗 레지스트리를 사용하여 도커 이미지를 저장할 수 있는 레지스트리의 구성 완료
이후 레지스트리를 사용하여 CI 서버에서 새로운 소스의 도커 이미지를 빌드 한 다음, 레지스트리에 푸시 하고 테스트 서버에서는 푸시 된 최신의 이미지를 다운로드 받아서 다시 컨테이너로 실행하면 도커 레지스트리를 이용한 배포 프로세스가 완성됨.
도커 레지스트리를 이용한 배포의 장점
네트워크의 종류
docker-compose
: 컨테이너를 실행하는 구문을 docker-compose.yml 이라는 파일에 모아 놓고 실행 구문을 직접 커맨드 라인에 실행시킬 필요 없이 docker-compose 실행 구문을 통해 실행할 수 있도록 하는 것.
(인프라를 코드화 할 수 있게 도와주는 도구)
--> 컨테이너를 실행하는 명령을 직접 실행하지 않고 docker-compose.yml이라는 파일에 저장하고 해당 파일을 실행하기 때문에 확장자가 yml이라는 코드 파일에 저장할 수 있음
Ansible(앤서블)
: docker를 적용할 때 docker-compose 이외에 사용했던 쉘스크립트를 코드화 해주는 툴
오케스트레이션 사용 시