목차
- Docker 1강
- Docker 2강
- Python-list 2일차
Docker 1강
1-2강
- CI/CD란?
- 지속적인 서비스 제공(지속적이 통합)
- 지속적인 배포
- 단계: 코드 작성 -> 빌드 -> 테스트 -> 배포
- docker 사용 이유
- Docker Container 내부에서 여러 소프트웨어를 설치해도 호스트 OS에는 영향이 없어요.
- CI/CD에서 지속적인 통합(Continuous Integration) 과정의 테스트에서 Docker를 활용해요.
- 어떤 서버에 올리더라도 같은 환경으로 구성된 컨테이너로 동작하기 때문에 표준화된 배포를 구성할 수
1-3강
- 설치
- WSL2 설치 전
- 시작 버튼 → 제어판 → 프로그램 및 기능 → Windows 기능 켜기/끄기 → Linux용 Windows 하위 시스템
- 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를 입력해서 실행합니다.
- 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
- Docker 및 Docker Compose 버전 확인
- Windows 에 Docker Desktop 설치
- 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
- 141
- 143
- 147
- 149
Docker 2강
2-1
- CI(Continuous Integration)란?
- 지속적인 통합 의미
- 버그 수정, 코드 변경 등이 주기적으로 이루어지고 공유 및 피드백을 주면서 문제가 없을 시 merge되는 자동화 시스템
- CD(Continuous Delivery/Continuous Deployment)란?
- 지속적인 제공 의미(Continuous Delivery)
- CI 이후의 자동화된 배포 준비 과정입니다.
- 코드를 스테이징 환경에 배포하고, 사람이 최종적으로 프로덕션 배포를 승인하기 전 단계까지 자동화.
- 프로덕션 환경으로 배포하기 전 단계에서 충분히 테스트된 상태를 유지.
- 지속적인 배포 의미(Continuous Deployment)
- Continuous Delivery의 확장으로, 코드 변경 사항이 자동으로 프로덕션 환경에 배포됩니다.
- 모든 단계가 자동화되며, 사람이 개입하지 않고도 안정적으로 배포 가능.
- 회사나 팀마다 자동화의 정도가 다르다.
- 간단한 CI/CD 파이프라인 구성
- 파이프라인은 코드가 개발에서 배포까지 거치는 모든 단계를 자동화.
- 단계:
- 코드 커밋
- 빌드
- 테스트
- 배포
- 도구 및 기술
- CI 도구:
- Jenkins
- GitHub Actions
- GitLab CI/CD
- CircleCI
- Travis CI
- CD 도구:
- ArgoCD
- Spinnaker
- AWS CodePipeline
- 컨테이너 및 오케스트레이션:
- 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
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: 잡 안의 세부 실행 단계.
- 실행 가능한 하나의 shell script 또는 action
- Action: 재사용 가능한 작업 코드.
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)