목차

  • Docker 1강
  • Docker 2강
  • Python-list 2일차

Docker 1강

1-2강

  1. CI/CD란?
    • 지속적인 서비스 제공(지속적이 통합)
    • 지속적인 배포
    • 단계: 코드 작성 -> 빌드 -> 테스트 -> 배포
  2. docker 사용 이유
    • Docker Container 내부에서 여러 소프트웨어를 설치해도 호스트 OS에는 영향이 없어요.
    • CI/CD에서 지속적인 통합(Continuous Integration) 과정의 테스트에서 Docker를 활용해요.
    • 어떤 서버에 올리더라도 같은 환경으로 구성된 컨테이너로 동작하기 때문에 표준화된 배포를 구성할 수

1-3강

  • 설치
    1. WSL2 설치 전
      • 시작 버튼 → 제어판 → 프로그램 및 기능 → Windows 기능 켜기/끄기 → Linux용 Windows 하위 시스템
    2. WSL2 설치
      • wsl --install
      • 저는 도움말암 나와서 wsl --list --online으로 설치가능 버젼을 보고 wsl --install Ubuntu-22.04으로 진행하였습니다.
      • wsl --update
      • dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
      • 재부팅
      • wsl --list --verbose 깔려있는 버젼 확인
      • wsl --status 현재 상태 확인
      • 버젼이 1이라면 2로 바꾸어 주어야한다.
        • wsl --set-version Ubuntu-22.04 2
      • cmd에 wsl이나 wsl -d Ubuntu-22.04를 입력해서 실행합니다.
    3. Ubuntu 22.04 에 최신 버전의 docker 설치
      • 유저 이름 설정 및 비밀번호 설정(비밀번호는 2번)
      • lsb_release -a 설치 확인
      • sudo apt-get update
      • sudo apt-get install ca-certificates curl gnupg
      • sudo install -m 0755 -d /etc/apt/keyrings
      • curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
      • sudo chmod a+r /etc/apt/keyrings/docker.gpg
    4. Docker 및 Docker Compose 버전 확인
    5. Windows 에 Docker Desktop 설치
    6. Windows Docker Desktop 설정
      • 우측 상단 톱니바퀴 → 왼쪽 Resources → WSL Integration → Apply&restart

1-5강

  • Container 실행 테스트
    • nginx 이미지 다운받기
    • docker image pull nginx:1.25.3-alpine # 이미지 다운받기
    • docker images # 확인하기
    • docker image history nginx:1.25.3-alpine # 이미지가 어떻게 만들어졌는지 확인
    • docker run -d -p 8001:80 --name webserver01 nginx:1.25.3-alpine # 실행 시키기
    • docker ps | grep webserver01 # 정상 작동 확인
    • docker port webserver01 # port가 어떻게 열려있는지 확인
    • curl localhost:8001 # 8001port 확인

1-6강

  • Docker Container 서비스를 위한 이미지는 Container 런타임에 필요한 바이너리, 라이브러리 및 설정 값 등을 포함하고, 변경되는 상태값을 보유하지 않고(stateless) 변하지 않음(Immutable, Read-Only)
  • 상태 저장 없음(Stateless): 애플리케이션과 관련된 모든 파일과 라이브러리를 포함하고 있기 때문에, 다른 환경에서도 동일한 애플리케이션을 실행 가능
  • 불변성(Immutable): 이미지가 한번 생성되면 변경할 수 없는 것을 의미
  • 도커 이미지는 필요한 파일만 포함하고 있기 때문에, 용량이 작으며, 이미지를 변경할 필요가 있을 경우에는 새로운 이미지를 생성 필요
  • hub.docker.com 에서 이미지를 제공받거나 해당 사이트로 이미지를 제공
  • Private Registry 서버를 통해 이미지를 제공받거나 제공 가능

1-7강

  • 프롬프트에서 로그인 docker login
  • 도커 앱에서도 가능
  • 도커 앱에서 컨테이너 정지및 이미지 삭제

1-8강

  • Container
    • docker = 붕어빵 틀
    • container = 붕어빵
  • Container 수동 생성
docker pull ubuntu:22.04
docker images

# docker create 은 실제 실행하지 않고 컨테이너 생성만
docker create –ti --name ubuntu2204test ubuntu:22.04
docker ps –a
CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS    PORTS     NAMES
2ccc1b2a1144   ubuntu:22.04   "/bin/bash"   4 seconds ago   Created             ubuntu2204test

docker start ubuntu2204test
Ubuntu2204test
docker attach ubuntu2204test

# docker run 은 create/start/attach 를 순차적으로 한 번에 실행하는 것과 같음 
docker run -ti --name=ubuntu2204test2 ubuntu:22.04 /bin/bash
root@57a1a1c759b6:/#

1-9강

  • 명령어 테스트
    • 파일 다운 (강의자료)
    • 홈 디렉토리로 이동 cd ~
    • 디렉토리 만들고 들어가기 mkdir nodejsapp
    • vi app.js -> 다운 받은 파일 내용 복붙 -> ESC -> :wq
    • vi Dockerfile -> 다운 받은 파일 내용 복붙 -> ESC -> :wq
    • docker buildx build -t node-test:1.0 . # 1.0 태그(내 마음대로)를 추가하여 node-test라는 이미지를 빌드
    • docker images | grep node-test # 빌드 완료한 이미지 보기
    • docker image history node-test:1.0 # 1.0으로 태그 추가한 이미지의 Dockerfile history
    • docker run -itd -p 6060:6060 --name=node-test -h node-test node-test:1.0
    • docker ps | grep node-test
    • curl http://localhost:6060
  • docker run 자주 사용하는 옵션
    • -d: detached mode; 백그라운드 모드
    • -p: 호스트와 컨테이너의 포트를 연결(포워딩)
    • -v: 호스트와 컨테이너의 디렉토리를 연결(마운트)
    • -e: 컨테이너 내에서 사용할 환경변수 설정
    • -name: 컨테이너 이름 설정
    • -rm: 프로세스 종료 시 컨테이너 자동 삭제
    • -ti: -i 와 -t 를 동시에 사용한 것으로 터미널 입력을 위한 옵션
  • docker top node-test # 실행 중인 container(프로세스) 조회
  • docker port node-test # 컨테이너에 매핑된 포트 조회
  • docker stats node-test --no-stream # 컨테이너 리소스 통계 출력 (1회)
  • docker stats node-test # 컨테이너 리소스 통계 출력 (스트림)
  • 실행 중인 로그 확인
    • docker logs node-test # 표준 출력(stdout), 표준에러(stderr) 출력
    • docker logs –f node-test # 로그를 계속 출력
    • docker info | grep -i log # 출력된 로그는 파일로 관리되기 때문에 HostOS 의 disk 를 사용
  • Container 내부 확인
    • docker inspect node-test
    • docker container inspect node-test
  • 명령어 모음
    • docker stats # 터미널1, 도커 상태 확인
    • docker events # 터미널2, 도커 프로세스 이벤트 확인
      • docker start node-test # 다시 시작
        • docker stop node-test # 터미널3, 컨테이너 종료
        • docker ps –a # 컨테이너 상태 확인
    • docker pause node-test # 일시중지
    • docker unpause node-test # 다시 시작
    • docker container ls -a # 컨테이너 정보 보기
    • docker container prune # 실행 중이 아닌 컨테이너 삭제
    • docker image prune # 실행 중이 아닌 이미지 삭제
    • docker image ls # 남아 있는 이미지 리스트 확인
    • docker system prune # 이미지, 컨테이너, 볼륨, 네트워크 등 모든 도커 리소스를 일괄적으로 삭제
  • docker exit 코드
    • 0
      • Docker Process가 수행해야 할 모든 Command 또는 Shell을 실행하고 정상 종료
    • 255
      • Docker Image에 정의된 EntryPoint 또는 CMD가 수행이 완료되었을 경우 발생
    • 125
      • Docker run 명령어의 실패로 실제 docker process가 기동되지 않음
    • 126
      • Docker Container 내부에서 Command를 실행하지 못할 경우 발생
    • 127
      • Docker Container 내부에서 Command를 발견하지 못하였을 경우 발생
    • 137
      • kill -9로 인해 종료 됨
    • 141
      • 잘못된 메모리 참조하여 종료 됨
    • 143
      • Linux Signal로 정상 종료 됨
    • 147
      • 터미널에서 입력된 정지 시그널로 종료 됨
    • 149
      • 자식 프로세스가 종료 되어 종료 됨

Docker 2강

2-1

  • CI(Continuous Integration)란?
    • 지속적인 통합 의미
    • 버그 수정, 코드 변경 등이 주기적으로 이루어지고 공유 및 피드백을 주면서 문제가 없을 시 merge되는 자동화 시스템
  • CD(Continuous Delivery/Continuous Deployment)란?
    • 지속적인 제공 의미(Continuous Delivery)
      • CI 이후의 자동화된 배포 준비 과정입니다.
      • 코드를 스테이징 환경에 배포하고, 사람이 최종적으로 프로덕션 배포를 승인하기 전 단계까지 자동화.
      • 프로덕션 환경으로 배포하기 전 단계에서 충분히 테스트된 상태를 유지.
    • 지속적인 배포 의미(Continuous Deployment)
      • Continuous Delivery의 확장으로, 코드 변경 사항이 자동으로 프로덕션 환경에 배포됩니다.
      • 모든 단계가 자동화되며, 사람이 개입하지 않고도 안정적으로 배포 가능.
  • 회사나 팀마다 자동화의 정도가 다르다.
  • 간단한 CI/CD 파이프라인 구성
    • 파이프라인은 코드가 개발에서 배포까지 거치는 모든 단계를 자동화.
    • 단계:
      1. 코드 커밋
      2. 빌드
      3. 테스트
      4. 배포
  • 도구 및 기술
    • CI 도구:
      • Jenkins
      • GitHub Actions
      • GitLab CI/CD
      • CircleCI
      • Travis CI
    • CD 도구:
      • ArgoCD
      • Spinnaker
      • AWS CodePipeline
    • 컨테이너 및 오케스트레이션:
      • Docker
      • Kubernetes
  • github Actions 이해하기
    • github Actions는 내장된 ci/cd도구
    • ci/cd를 구축할 필요 X, 무료
  • github Actions 사용하기
    • 레포지토리 .github/workflows 만들기
    • 필요 Actions 파일을 yaml형식으로 작성
    • 반드시 .github/workflows 안에 yaml파일이 있어야한다,
  • github Actions에서 CI 구성
# Actions 이름 github 페이지에서 볼 수 있다.
name: 'CI'

# Event Trigger 특정 액션 (Push, Pull_Request)등이 명시한 Branch에서 일어나면 동작을 수행한다.
on: 
    push:
        # 배열로 여러 브랜치를 넣을 수 있다.
        branches: [ develop, feature/* ]
    # github pull request 생성시
    pull_request:
        branches: 
            - develop # -를 쓴 여러 줄로 여러 브랜치를 명시하는 것도 가능

    # 실제 어떤 작업을 실행할지에 대한 명시
jobs:
  ci:
  # 스크립트 실행 환경 (OS)
  # 배열로 선언시 개수 만큼 반복해서 실행한다. ( 예제 : 1번 실행)
    runs-on: [ ubuntu-latest ] 

    # 실제 실행 스크립트
    steps: 
      # uses는 github actions에서 제공하는 플러그인을 실행.(git checkout 실행)
      - name: checkout
        uses: actions/checkout@v4

      # with은 plugin 파라미터 입니다. (java 11버전 셋업)
      - name: java setup
        uses: actions/setup-java@v2
        with:
          distribution: 'adopt' # See 'Supported distributions' for available options
          java-version: '17'

      # run은 사용자 지정 스크립트 실행
      - name: run unittest
        run: |
          ./gradlew clean test
  • github Actions에서 CD 구성
name: 'CD'

on: 
    push:
        branches: [ main ] # main브랜치에 push가 일어났을 때 jobs가 동작한다.
jobs:
  cd: # 셋팅 단계
    runs-on: [ ubuntu-latest ] 

    steps: 
      - name: checkout
        uses: actions/checkout@v4

      - name: java setup
        uses: actions/setup-java@v3
        with:
          distribution: 'adopt' # See 'Supported distributions' for available options
          java-version: '17'

      - name: run unittest # 테스트 단계
        run: |
          ./gradlew clean test
		  
      - name: deploy to heroku # 테스트 성공한 경우 배포
	      uses: akhileshns/heroku-deploy@v3.12.12
		    with:
          heroku_api_key: ${{secrets.HEROKU_API_KEY}}
          heroku_app_name: "sampleapp-github-actions" #Must be unique in Heroku
          heroku_email: "nbcdocker@proton.me"
  • GitHub Actions의 YAML 파일에는 워크플로우(Workflow)를 정의하며, 이 안에 이벤트(Event), 러너(Runner), 잡(Job), 스텝(Step), 그리고 액션(Action) 등이 계층적으로 정의한다.
    • Workflow: 전체 워크플로우 정의.
      • Github Repository의 .github/workflows 폴더 아래에 저장
    • Event: 트리거 조건.
      • push, pull request open, issue open, 특정 시간대 반복(cron) 등의 특정한 조건
    • Runner: 워크플로우 실행 환경.
      • Github Action Runner app이 설치된 VM(가상환경)
    • Job: 독립적인 작업 단위.
      • 여러 step의 모음을 의미
    • Step: 잡 안의 세부 실행 단계.
      • 실행 가능한 하나의 shell script 또는 action
    • Action: 재사용 가능한 작업 코드.
      • Job을 만들기 위해 Step들을 연결

2-2

  • VsCode에서 깃 프로젝트로 명시하기
    • 터미널에 git --version #다운 받은지 확인
    • 왼쪽 사이드바에서 소스 제어 아이콘(🔄)을 클릭.
    • "소스 제어" 패널에 프로젝트 정보보기 가능
  • Git 저장소를 VS Code에서 열기
    • 프로젝트 디렉토리 열기: File > Open Folder를 클릭하고 Git 프로젝트가 있는 디렉토리를 선택.
    • 디렉토리에 .git 폴더가 있다면, VS Code가 자동으로 Git 프로젝트로 인식
    • Git 프로젝트가 아닌 경우: 터미널에 git init
  • 새로운 Git 저장소 시작
    • 폴더 생성
    • git 저장소 초기화: 터미널에 git init
    • github연동: git remote add origin <repository_url>
    • git 파일 생성 #.gitignore파일에 환경설정 파일, 로그 파일
    • 파일 커밋
    • git push
  • 브랜치 만들기
    • git switch -c develop #develop브랜치 생성
    • git push -u origin develop #develop브랜치에 push
    • git switch -c feature/add-workflow #add-workflow 브랜치 생성
    • 수동으로 .github 파일 생성
    • 수동으로 wokeflows 파일 생성
    • 수동으로 yaml파일 만들기

Python-list 2일차

심화

문제 1

리스트 numbers = [1, 2, 3, 4, 5]가 있습니다. 이 리스트의 모든 요소를 제곱한 새로운 리스트 squared_numbers 출력하세요

numbers = [1,2,3,4,5]
num_list = []
for x in numbers:
    s_list = x**2
    num_list.append(s_list) 

print(num_list)

numbers = [1,2,3,4,5]
num_list = [x**2 for x in numbers]
print(num_list)

문제 2

리스트 numbers = [1, 2, 3, 4, 5, 6]에서 짝수만을 포함하는 새로운 리스트를 출력하세요

numbers = [1,2,3,4,5,6]
number = []
for x in numbers:
    if x % 2 == 0:
        number.append(x)
print(number)

numbers = [1,2,3,4,5,6]
number = [x for x in numbers if x%2==0]
print(number)

문제 3

2차원 리스트 matrix = [[1, 2], [3, 4], [5, 6]]에서 각 요소를 모두 더한 합계를 계산하세요.

matrix = [[1, 2], [3, 4], [5, 6]]
result = 0
for x in matrix:
    for num in x:
        result+=num
print(result)

matrix = [[1, 2], [3, 4], [5, 6]]
result = 0
for x in matrix:
    result += sum(x)
print(result)

matrix = [[1, 2], [3, 4], [5, 6]]
result = sum([item for row in matrix for item in row])
print(result)

문제 4 - set 함수 사용

다음 리스트에서 중복된 요소를 제거하고, 오름차순으로 정렬된 새로운 리스트를 만드세요: numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5]

numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5]
set_num = sorted(list(set(numbers)))
print(set_num)

numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5]
set_num = list(set(numbers))
set_num.sort()
print(set_num)

+ Recent posts