2024년 12월 2일
전통적 인도 프로세스
전통적 인도 프로세스의 한계점
느린 피드백 주기
자동화 미비
핫픽스 위험성
개발문화 건정성 제한
해결책 : 지속적 인도 / 배포 방식
변경 내용이 단지 코드 한 줄이라고 할 때,
해결안 : 프로세스의 각 단계를 자동화
자동 배포 파이프 라인
지속적 통합(CI; Continuous Intergration)
개발팀에 1차적인 피드백 제공
인수 테스트(UAT; User Acceptance Test)
구성 관리 (Configuration Management)
CD (Continuous Delivery) 를 위한 기술적 전제 조건
컨테이너 가상화 및 클러스터 운용
소프트웨어 개발 파이프라인 자동화 서버
구성 관리 자동화
소프트웨어 버전 관리(SCM; Source Code Management)
그 외
컨테이너화
지속적 통합 파이프 라인 (CI Pipeline)
도커 공부하다 찾은 좋은 글 : https://zinirun.github.io/2020/08/15/how-to-use-docker/
가상화
가상화 컴퓨팅의 이점
시스템 측면
비즈니스 측면
우리의 관심
서버 가상화 기술의 진화
가상화 기술에서의 호스트 : 다른 시스템을 가상화하여 실행하는 컴퓨터
가상화 기술에서의 게스트 : 호스트 시스템 위에 가상화 되어 제공되는 (가상) 시스템
가상 기계(VM; Virtual Machine) 기반
컨테이너 (container) 기반
컨테이너 사용의 이점
도커(Docker)
널리 이용되고 있는 컨테이너 기반 가상화 플랫폼
도커를 이용한 소프트웨어 개발 / 배포
도커허브(Docker Hub)
도커의 구성 요소
도커 이미지
도커 컨테이너
이미지의 계층 구조
컨테이너와 이미지 관련 명령어 요약
docker run <이미지 이름>
docker start <컨테이너 이름>
docker ps, docker ps - a
docker images
docker stop <컨테이너 이름 / ID>
docker rm <컨테이너 이름 / ID>
docker rmi <이미지 이름/ ID>
도커 실행 및 이미지 생성 관련글 for macos : https://adjh54.tistory.com/350
mac os에서 httpd 이미지 받아서 apache 서버 띄우기
도커 이미지 받아오기
docker pull httpd
컨테이너 만들어 실행
docker run —name apachehhtp -p 8080:80 httpd
컨테이너 쉘 연결 → 컨테이너에서 작업 가능 (= 상태 변경 가능)
docker exec -it apachehhtp /bin/bash
기본 페이지 It works! →> new page 로 변경
grep DocumentRoot /usr/local/apache2/conf/httpd.conf
pwd (현재 위치 확인)
ls -l (파일 리스트 확인 → htdocs)
cd htdocs (htdocs 이동)
ls -l (파일 리스트 확인 → index.html)
cat index.html
// 파일 내용 확인
<html><body><h1>It works!</h1></body></html>
cat > index.html
// 파일 내용 수정
<html><body><h1>new page</h1></body></html>)
빠져나오기 : control + D
httpd-foreground (웹 서버 수동 실행)
바뀐거 확인
이미지 생성 자동화
// 형태
FROM [—platform=<platform>] <image> [AS <name>
RUN <command>
ENTRYPOINT [”executable”, “param1”, “param2”]
// Dockerfile 내에 아래내용을 적음
FROM httpd:latest
RUN echo "<html><body><h1>Docker build test</h1></body></html>" > /usr/local/apache2/htdocs/index.html
ENTRYPOINT /usr/local/httpd-foreground
docker build -t my_httpd:0.2 .
이미지를 레지스트리에 올리기
// 형태
<docker_hub_id> / <image name>
도커의 편리함(CI /CD 관점에서 생각해보기)
과제 실습
hello.py 파일 만들어서 아래 내용 적고 위에 실습한것처럼 빌드해서 이미지 만든 다음 레포지토리에 올리고 다시 런해서 컨테이너 실행
도커 환경 변수 이용
파일들 설정 후
hello.py
Dockerfile
docker build -t hello:0.2 .
hello:0.2 이미지생성됨
환경 변수에 다른 값 넣기
실행이 끝난 컨테이너의 자동 삭제
호스트의 포트와 컨테이너 포트를 연결
호스트의 외부로부터도 접속 가능하도록 설정하려면? : 호스트의 특정 포트를 특정 컨테이너의 특정 포트와 연결하는 방법이 필요함
컨테이너 이름 지정하기
도커 클린업
컨테이너 삭제
- docker rm <컨테이너>
이미지 삭제
- docker rmi <이미지>
컨테이너 전체 삭제
- docker container prune
이미지 전체 삭제
- docker image prune -a
컨테이너 안의 파일들에 접근하는 방법
실행하고 있는 컨테이너와 호스트 사이의 파일 복사
이미지 빌드할 때 호스트로부터 파일을 컨테이너에 추가
바인드 마운트
도커 볼륨
실습(실행하고 있는 컨테이너와 호스트 사이의 파일 복사)
niginix 이미지 생성 및 포트 연결, 쉘 연결해서 Index.html 파일 확인
docker run --rm -d -p 8080:80 --name my_nginix nginx:latest
docker exec -it my_nginix /bin/bash
ls -l /usr/share/nginx/html
cat /usr/share/nginx/html/index.html
파일 컨테이너 index.html 덮어쓰기(호스트의 파일을 컨테이너 파일로 덮어쓰기)
컨테이터 파일을 가져와서 호스트의 파일로 덮어쓰기
실습 (Dockerfile 내에 ADD 지시자를 이용해서 호스트가 제공하는 파일을 특정 위치에 둠)
ADD <호스트 내 source 파일의 경로> <컨테이너 내에 배치할 파일의 경로>
ADD ./index.html /usr/share/nginx/html/new.html
// Dockerfile
FROM nginx:latest
ADD ./index.html /usr/share/nginx/html/new.html
CMD ["nginx", "-g", "daemon off;"]
cat Dokerfile
docker build -t your_nginx .
docker run —rm -d -p 8888:80 —name my_nginx your_nginx
실습 (바인드 마운트)
호스트가 원하는 폴더에서 파일 만들고, 컨테이너에 폴더 파일 복사하기
실습 (볼륨 생성 명령어)
형태 : docker volume create <볼륨 이름>
docker volume create my-volume (볼륨 생성)
docker inspect my-volume (볼륨 보기)
docker run —rm -d -p 8888:80 -v my-volume:/usr/share/nginx/html —name my_nginx nginx:latest
볼륨의 내용 조회 (컨테이너 내부에 있는 파일들이 동기화 되어 있음) 및 파일 생성
바인드 마운트와는 다름 → 마운트 했을 때 이미 컨테이너에 해당 경로가 있었으면 호스트가 바인드 마운트 한걸 덮어써줘서 없어짐(컨테이너에 있던 것들 삭제됨) but 볼륨을 마운트 하면 컨테이너 내부에 이미 있었던 것들이 삭제되지 않음
docker exec -it my_nginx /bin/bash
cd /usr/share/nginx/html
cat > new.html
This file is created inside the container.
cat new.html → 잘 생성된 파일 확인
exit
sudo ls -l /var/lib/docker/volumes/my-voulme/_data -> 경로에 파일 없다고 뜸
*여기서 inspect한 볼륨의 위치에 생성된 파일을 확인할 수 없었는데, 맥은 VM 상에서 도커가 실행되기 때문에 경로가 다르다고 한다. (이 부분은 다시 참고해서 해봐야겠다.)
참조글 :
https://mycodings.fly.dev/blog/2024-04-06-docker-volume-usage-and-principles
https://toast1ng.tistory.com/4