주말내내 Docker 강의를 들었다.
요즘 aws 나 여러 아키텍쳐들을 하나씩 접해보고 있는데 뭔가 맥이 환경설정이 편한거 같기도.. 하고
계속 맥에 눈이간다 ..
각각의 application을 원하는 환경에서 실행하는 기술이 예전에는 없었나?
Virtual Machine과 docker의 차이
기존 가상화 기술(VMware, VirtualBox) 은 하이퍼바이저를 사용해서 여러개의 운영체재를 하나의 호스트에서 생성해 사용하는 방식
도커는 리눅스의 자체 기능인 chroot, namespace, cgroup기술을 사용해서 프로세스 단위의 격리 환경을 만들기 때문세 성능 손실이 거의 없습니다.
named volume이란 docker에서 유지되는 데이터를 관리해야 할 때 편리하게 이름으로 사용할 수 있게 만들어둔 volume 입니다
docker volume create memo
docker run -p 27017:27017 -v memo:/data/db mongo
volume -> container 연결하기
docker run -v {host_path}:{container_path} <docker_image>
docker run -v "$(pwd)/templates:/templates" -p 80:5000 wellshsdocker-memo:version2
ex)
version: "3.9"
services:
flask:
build:
context: .
volumes:
- ./templates:/templates
ports:
- "5000:5000"
mongo:
image: mongo:latest
volumes:
- mongo:/data/db/
ports:
- "27017:27017"
volumes:
mongo:
기존의 방식보다 compose 를 이용하면 간단하고 편하게 도커를 실행 할 수 있다.
docker-compose up -d
docker-compose down
위 명령어를 통해 container 를 띄우고 삭제 할 수 있다.
리소스 삭제하기
docker rm container_id
docker rmi image_id
docker network rm network_id
docker volume rm volume id
docker system prune
docker system prune -a 를 사용하면 전체 삭제
docker ps -a
컨테이너 확인
docker images
이미지 확인
docker network ls
network 확인
docker volume ls
volume 확인
ssh -i ~/.ssh/sparta-docker.pem ec2-user@{public_ip}
putty 를 통해서 키페어를 따로 작업해줘야 한다.
sudo yum update -y
sudo amazon-linux-extras install docker -y
docker 설치
sudo service docker start
서비스 실행
service docker status
docker 상태 확인
sudo usermod -a -G docker ec2-user
sudo 없이 docker 실행
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
Docker compose 설치하기
docker-compose.yaml 을 통해 compose 로 실행 할 수 있다
version: "3.9"
services:
flask:
image: wellshs/docker-memo:version2
ports:
- "80:5000"
mongo:
image: mongo:latest
volumes:
- mongo:/data/db/
ports:
- "27017:27017"
volumes:
mongo:
CI/CD란?
github action를 정의하는 기본 6가지 용어
Workflows
: 자동화 하려고 하는 과정들Events
: workflow를 trigger되는 행동들Jobs
: 동일한 runner에서 실행하려고하는 여러개의 step의 모임Steps
: job을 구성하는 한개의 커맨드로 action이거나 shell command로 구성됩니다.Actions
: 다른 곳에서 정의된 커맨드의 모음Runner
: Job이 실행되는 환경name: ci-pipeline
on:
push:
branches:
- main
jobs:
run-test-code:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
with:
python-version: "3.8"
- run: pip install -r requirements.dev.txt
- run: pytest
build-image:
needs: [run-test-code]
runs-on: ubuntu-latest
steps:
- name: Set up QEMU
uses: docker/setup-qemu-action@v1
-
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
-
name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
-
name: Build and push
id: docker_build
uses: docker/build-push-action@v2
with:
push: true
tags: ${{ secrets.DOCKERHUB_USERNAME }}/docker-memo:latest
-
name: Image digest
run: echo ${{ steps.docker_build.outputs.digest }}
FROM python:3.8-slim AS builder
ADD requirements.txt requirements.txt
RUN pip install -r requirements.txt
FROM python:3.8-slim-buster
COPY --from=builder /usr/local/lib/python3.8/site-packages/ /usr/local/lib/python3.8/site-packages/
ADD templates templates
ADD app.py .
ADD utils.py .
CMD ["python", "app.py"]
name: ci-cd-pipeline
on:
push:
branches:
- main
jobs:
run-test-code:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
with:
python-version: "3.8"
- run: pip install -r requirements.dev.txt
- run: pytest
build-image:
needs: run-test-code
runs-on: ubuntu-latest
steps:
-
name: Set up QEMU
uses: docker/setup-qemu-action@v1
-
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
-
name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
-
name: Build and push
id: docker_build
uses: docker/build-push-action@v2
with:
push: true
tags: ${{ secrets.DOCKERHUB_USERNAME }}/docker-memo:latest
-
name: Image digest
run: echo ${{ steps.docker_build.outputs.digest }}
cd-pipeline:
needs: build-image
name: continuos deploy
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: copy file via ssh password
uses: appleboy/scp-action@master
with:
host: ${{ secrets.HOST }}
username: ec2-user
key: ${{ secrets.PRIVATE_KEY }}
port: 22
source: "docker-compose.yaml"
target: "/home/ec2-user/"
- name: executing remote ssh commands using password
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ec2-user
key: ${{ secrets.PRIVATE_KEY }}
port: 22
script: "docker-compose pull && docker-compose up -d"
version: "3.9"
services:
flask:
image: wellshs/docker-memo:latest
ports:
- "80:5000"
mongo:
image: mongo:latest
volumes:
- mongo:/data/db/
ports:
- "27017:27017"
volumes:
mongo: