

느린 인도 기간
개발 요구사항이 정의된 때로부터 제품 전달이 완료되기까지 긴 시간 소요
느린 패드백 주기
개발팀의 효율성 항상에 걸림돌로 작용
자동화 미비
릴리스 회수가 적으므로 필요 감소 -> 릴리스 기간 예측 어려워짐
핫픽스 위험성
긴급한 코드 변경에 대하여 충분한 테스트가 이루어질 수 없는 위험
개발문화 건전성 제한
팀 스트레스, 의사소통 부족, 책임의 분산, 낮은 업무 만족도,...
변경 내용이 단지 코드 한 줄이라고 할때,
해결안: 프로세스의 각 단계를 자동화
git을 활용한 SCM에서 논리적 연관성이 있는 변경사항을 묶어 잘게 자주 커밋하는 것과 유사

코드가 올바르게 빌드 및 통합되는지를 자동으로 확인
개발 팀에 1차적인 피드백 제공
인수 테스트(UAT; User Acceptance Test)
CD 파이프라인에 통합
구성 관리(Configuration Management)
CD 파이프라인에 통합
자동 빌드, 테스트, 패키징, 배포
신속한 파이프라인 실행
신속한 장애 복구
무중단 배포
트렁크 기반 개발
몇가지 의문점
- Q. 이렇게 많은 도구들의 사용을 익혀야하나?
- Yes - 도구와 환경을 올바르게 설정하는 것이 파이프라인 구축에 있어서 중요함
- Q. 그렇다면, 파이프 라인 구축에서 가장 중요한 것은 도구 사용법을 익히는 것?
- No - 더욱 중요한 것은 각 도구가 프로세스에서 담당하는 역할과 요구되는 조건을 이해하는 것
- Q. 여기서 소개되는 도구들이 필수인 것인가?
- NO - 같은 역할을 하는 도구들이 많이 존재, 환경에 맞는 도구를 유연하게 선택해야한다.
- Q. 그렇다면, 새 도구를 선택할 때마다 다 새로 익혀야하는 것인가?
- NO - 역할과 요구조건이 같은 도구들은 세부 사항에 차이가 있다고 하더라도 대부분 유사
컨테이너 가상화 및 클러스터 운영
소프트웨어 개발 파이프라인 자동화 서버
구성 관리 자동화
소프트웨어 버전 관리(SCM; Source Code Management)
그 외
응용 프로그램, 설정(configuration)파일, 라이브러리, 그리고 이들 사이의 의존성 관계를 한 군데에 묶어 관리
리포지토리에 코드 커밋이 발생할 때마다 빌드, 단위테스트, 정벅 분석등을 행함

Docker와 Jenkins를 결합하여 인수 테스트 환경을 만들고 테스트 수행

Docker Host 대신에 Kubernetes Cluster가 연결된 형태
다중 환경을 생성, 미러링하여 테스트 환경과 프로덕션 환경을 미러링

컴퓨팅 자원(리소스; resource)의 추상화를 일컫는 광범위한 용어
(딱딱하게)물리적 컴퓨팅 자원의 특징을 다른 시스템, 응용 프로그램, 최종 사용자들이 자원과 상호작용하는 방식으로부터 감추는기술
(부드럽게)컴퓨터 안에 또 다른, 즉 가상의 컴퓨터가 존재하도록 하는 기술
시스템 측면
비즈니스 측면
우리의 관심
가상 기계(VM; Virtual Machine)기반

컨테이너(container)기반
호스트: 다른 시스템을 가상화하여 실행하는 컴퓨터
게스트: 호스트 시스템 위에 가상화되어 제공되는 (가상)시스템

가상기계(VM; Virtual Machine)의 대체 또는 보완 방식으로 각광받고 있음
소프트웨어 개발 및 배포의 효율과 안정성을 향상시킴

널리 이용되고 있는 컨테이너 기반 가상화 플랫폼

도커 허브(Docker Hub)
컨테이너 이미지들에 대해 원격 저장, 유지관리, 공유, 권한 관리 등을 효율적으로 행할 수 있는 온라인 서비스 제공
-> 소프트웨어 개발/배포 프로세스의 효율성이 크게 증대
하려는 일
준비
Docker Desktop for linux
명령어
docker info


docker run hello-world


아래는 처음 실행할때 다음과 같이 처음에는 docker engin이 해당 hello-world:latest를 다운받는걸 볼 수 있다.

도커 이미지
도커 컨테이너

정리
- 도커 이미지를 이용해서 컨테이너를 만들어 실행할 수 있다.
- 도커 이미지는
- 계층 구조를 가지고 있음
- 컨테이너를 만드는 데 이용되는 거푸집으로서 상태를 저장하고 있지 않음
- 이미지 레지스트리를 통하여 네트워크를 통해 전송 가능
- 도커 컨테이너는
- 이미지를 이용하여 만들어진, 응용 소프트웨어를 실제로 실행하는 격리된 환경
- 도커 엔진에 의해서 관리되며 마치 컴퓨터 하나가 새로 생겨 정해진 일을 수행하는 것과 같은 모습을 보여준다.
docker run <이미지 이름>
docker ps, docker ps -a
docker images
docker stop <컨테이너 이름/ID>
docker rm <컨테이너 이름/ID>
docker rmi <이미지 이름/ID>
$> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cf3698b80c63 mariadb "docker-entrypoint.s…" 3 months ago Up 12 days 0.0.0.0:3306->3306/tcp mariadb
$> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3d27925c3872 httpd "httpd-foreground" 2 minutes ago Exited (0) About a minute ago keen_greider
90f2fd663341 nginx "/docker-entrypoint.…" 3 minutes ago Exited (0) 3 minutes ago busy_heyrovsky
7cc943949891 httpd "httpd-foreground" 9 minutes ago Exited (0) 7 minutes ago objective_lehmann
0feb45133c20 hello-world "/hello" 49 minutes ago Exited (0) 49 minutes ago keen_elion
2684eef6f3ee hello-world "/hello" 51 minutes ago Exited (0) 51 minutes ago thirsty_hoover
cf3698b80c63 mariadb "docker-entrypoint.s…" 3 months ago Up 12 days 0.0.0.0:3306->3306/tcp mariadb
$> docker rm 3d27925c3872
3d27925c3872
$> docker rm objective_lehmann
objective_lehmann
$> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
90f2fd663341 nginx "/docker-entrypoint.…" 5 minutes ago Exited (0) 4 minutes ago busy_heyrovsky
0feb45133c20 hello-world "/hello" 51 minutes ago Exited (0) 51 minutes ago keen_elion
2684eef6f3ee hello-world "/hello" 52 minutes ago Exited (0) 52 minutes ago thirsty_hoover
cf3698b80c63 mariadb "docker-entrypoint.s…" 3 months ago Up 12 days 0.0.0.0:3306->3306/tcp mariadb
$> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest a5cdc6683c84 3 weeks ago 198MB
alpine latest 8d591b0b7dea 2 months ago 8.17MB
httpd latest 3405bcd9d2a6 3 months ago 178MB
hello-world latest f1f77a0f96b7 3 months ago 5.2kB
vdb v1.7.3-fix.1 d4bdee73aa9c 5 months ago 244MB
mariadb latest d045ae11ce7e 5 months ago 443MB
ubuntu latest a2f229f811bf 21 months ago 69.2MB
$> docker rmi 3405bcd9d2a6
Untagged: httpd:latest
Untagged: httpd@sha256:c11efd67f6308f2c25965e4e9d13ded15e7c45c0367b95f619a16e03c6c1e2b1
Deleted: sha256:3405bcd9d2a6068536f9fd108e0d5684478896a26d25d875a2901448d453fea7
...
$> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest a5cdc6683c84 3 weeks ago 198MB
alpine latest 8d591b0b7dea 2 months ago 8.17MB
hello-world latest f1f77a0f96b7 3 months ago 5.2kB
vdb v1.7.3-fix.1 d4bdee73aa9c 5 months ago 244MB
mariadb latest d045ae11ce7e 5 months ago 443MB
ubuntu latest a2f229f811bf 21 months ago 69.2MB
상태를 깨끗이 하고
httpd 이미지를 가져다가 실행하되
이 상태로 실행되는 이미지를 작성
오류!
docker run httpd로172.17.0.2를 받았는데 무한로딩만 걸리고 나오는게 없다.
gpt>포트 포워딩을 걸어주기
docker run -d -p 8080:80 httpd
- p 호스트포트:컨테이너포트 옵션으로, 컨테이너의 80번 포트를 호스트의 8080번 포트에 연결합니다.
이후 브라우저에서 http://localhost:8080 으로 접속하면 Apache 기본 페이지가 뜹니다.- 이후 cmd에서 수동으로 실행하게되면 macOS에서 접근하기 어렵다고 한다.
Dockerfile
계층 구조를 이용하여 도커 이미지를 만드는 절차를 기술하는 파일(텍스트)
FROM [--platform=<platform>]<image>[AS<name>]
RUN <command>
ENTRYPOINT ["executable","param1","param2"]
이미지 빌드 명령어
docker build [OPTIONS]PATH|URL|-
도커의 편리함 (CI/CD 관점에서 생각해 보기)
남아있는 일들
과제
간단한 도커 응용 만들기 - 이미지 이름 (과 태그)는 hello:0.1
- 베이스 이미지:ubuntu:22.04
- 패키지 설치: python3(apt-get이용)
- 응용 스크립트 설치: hello.py
로컬 이미지 이용하여 컨테이너 만들고 실행
- docker run hello:0.1
import os
print("Hello World from %s!" %os.environ["NAMA"])
Dockerfile 내에 ENV 지시자를 이용하여 환경변수 내용 지정(FROM 보다 바로 뒤에)
ENV NAME Grepp
이미지 빌드(hello:0.2)하고 실행해서 결과 확인
docker run 명령에 -rm 옵션을 붙이면 실행 완료와 함께 컨테이너 삭제
tomcat이 실행되고 있는 컨테이너의 TCP/8080 포트를 호스트의 외부로부터도 접속 가능하도록(서비스를 실행했다고 가정해보자)설정하려면?
-> 호스트의 특정 포트를 특정 컨테이너의 특정 포트와 연결하는 방법이 필요
도커 컨테이너는 이름과 ID에 의하여 식별
명령어
컨테이너 삭제
이미지 삭제
컨테이너 전체 삭제
이미지 전체 삭제
이 강의에서 배우고 실습한 것들
실행하고 있는 컨테이너와 호스트 사이의 파일 복사
docker cp를 이용이미지 빌드할 때 호스트로부터 파일을 컨테이너에 추가
바인드 마운트
도커 볼륨
실습 준비
대체할 파일을 하나 준비
Dockerfile 내에 ADD 지시자를 이용해서 호스트가 제공하는 파일을 특정 위치에 둠
ADD <호스트 내 source 파일의 경로> <컨테이너 내에 배치할 파일의 경로>명령어
docker run -v <호스트 경로>:<컨테이너 경로> <이미지>
실습
볼륨 생성 명령어
다음 사항에 답변을 달아 보세요. 나는,
간단한 (아주 간단한) 웹 응용을 하나 만들어 서버를 도커 이미지로 구성해보세요.
이 과정에서, 코드 변경이 일어나면 어떤 일들이 자동으로 실행되어야 할지 생각해 봅시다.