2022-02-08 DevOps

ansunny1170·2022년 2월 8일
0

UVC BOOTCAMP.DevOps

목록 보기
2/4

# Docker


가상머신
Virtual Machine(VirtualBox)
컴퓨터 운영체제 위에 새로운 운영체제 설치 가능.


출처: 잡다한 IT 개발 이야기

## 본론


가상머신

가상머신(VM)은 컴퓨터 환경을 말 그대로 가상화하여 소프트웨어로 구현한 것이다.
위의 그림에서 볼 수 있듯이 VM은 서버, Host OS, Hypervisor 위에 올라가게 되고,
각 VM은 OS, 드라이버, 메모리 등 컴퓨터 환경이 구성되기 위해 필요한 요소들을 갖추게 된다.

VM을 사용하면 서버 한 대 안에서도 여러 개의 OS 환경을 구성할 수 있다는 장점이 있고,
그만큼 서버의 공간을 효율적으로 사용할 수 있게 된다.

컨테이너

VM에 비교했을 때 컨테이너는 한 층 더 애플리케이션 중심으로 설계되었다.
그림에서 볼 수 있 듯이 컨테이너는 별도의 OS나 드라이버 없이 Host OS를 공유하는 형태로 실행된다. VM이 서버를 여러 대로 사용할 수 있게 해주었다면, 컨테이너는 개별 애플리케이션을 위한 가상 공간을 할당해 준다.

컨테이너는 VM보다 작은 단위이고 내부에서 처리하는 일도 더 적기 때문에 보다 간단하고,
빠르고, 효율적으로 애플리케이션을 실행시킬 수 있다. 하지만 컨테이너를 사용하기 위해서는 하나의 OS만
사용해야 하기 때문에 여러 가지의 OS를 사용할 수 있게 해주는 VM보다는 용도가 제한될 수 있다.

### 컨테이너의 장점

1. 성능상의 이점 – OS를 새로 설치할 필요가 없으므로 성능 저하가 거의 없다.
2. 빠른 운영환경 구성 – 미리 사용자들이 만들어 둔 이미지를 다운받아 실행만 하면 해당 환경을 구축할 수 있다.
3. 관리의 용이 – 이미지 만을 관리 배포하면 되므로 운영환경의 관리가 용이하다.
4. 확장성 – 한번 만들어낸 이미지를 이용하여 여러 서버들에서 사용가능하다.

### 결론

정리하자면 다음과 같다.

가상머신컨테이너
하드웨어 수준의 가상화운영체제 가상화
리소스 사용량이 높음리소스 사용량이 적음
다양한 어플리케이션 실행가능동일 커널 기반의 서비스만 구성 가능
제한된 성능성능 제한 x
가상머신간 완전한 격리로 높은 보안성프로세스 수준의 격리로 비교적 낮은 보안성
  • 가상머신 기동 -> 게스트OS 기동 -> 미들웨어 기동
  • 컨테이너 기동 -> 미들웨어 기동 (게스트OS 기동이 없어 훨씬 빠르다!)

### 참고자료

https://food4ithought.com/2019/10/26/%EA%B0%80%EC%83%81%EB%A8%B8%EC%8B%A0virtual-machine-vs-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88container/
https://post.naver.com/viewer/postView.nhn?volumeNo=21385900&memberNo=2521903
https://dololak.tistory.com/350


### Container

  • 컨테이너 설치 과정
    docker run -dit --name centos cnetos

  • 컨테이너 실행
    docker exec -it centos bash

### Virtual machine

## Docker 설치 및 실행


완료


windows 버전이 1904이하이기 때문에 우선 hyper-v를 사용한다.(따로 설치 없이 그냥 사용)
차이는 좀더 느릴 뿐이다.

  • docker 버전 확인
  • 도커 시작하기
  • 도커 로그인

  • docker ps
    Exited(종료된 것을 말함)
    hello-world가 실행되고 종료 되었음
  • 쉘에 접근
    docker run -it ubuntu:18.04 bash
    root@..... 로 변경되었다.
  • 새로운 가상환경 실행 확인(컨테이너)
    ls 입력
  • 버전확인
    cat /etc/issue

docker container는 GUI가 없기 때문에 터미널로만 한다.

  • 탈출(나가보자)
    exit

  • docker ps/ docker ps -a

  • 도커 생성시 이름 안넣으면 자동으로 생성됨

    ubuntu:18.04를 삭제하고 이름을 직접 넣어 지어보자

    -d 태그를 붙이면 백그라운드에서 실행하겠다는 뜻

  • 접근

    확인후 나가기

exit하면 항상 날라간다.
컨테이너를 exit하더라도 꺼지지 않게 하려면 어떻게 할까?
docker start ubuntu-test
docker exec -it ununtu-test bash attach가 아닌 exec를 사용하여 접근
앞으로 exec를 사용하여 접근하자.

  • docker 실행된 상태로 나오기
    ctrl + p + q => exit
    docker exec -it ubuntu-test bash
    에서 -i 태그를 사용했기 때문에 ctrl + p + q로 나갈 수 있다. 이렇게 하면 컨테이너를 안끄고 나갈 수 있다.

초록색으로 표시되고 있다.
안꺼진 상태의 컨테이너다.

  • 화면 클리어 cls

  • docker ps로 실행되고 있는 것만 알 수 있다.
    docker ps -a는 실행중지 된 것도 표시한다.
    status 항목으로 확인 가능하다.

  • 컨테이너 이름이 아닌 ID로 접근하기
    FULL ID를 써도 되고, 3글자만 써도 됨

## docker로 git 사용


### 도커 우분투 컨테이너안에서 git 설치해보기

git을 입력하면 없기 때문에 not found가 나온다.

apt-get update를 하여 환경을 준비한다.

apt install -y git or apt-get -y git
git --version 버전확인

## sample로 만든 github 파일 clone하기


## 마구마구 테스트

windows cmd에서 했었던 git/github내용을 도커,컨테이너에서 양껏 해보자.

## 다른 버전으로 시작


컨테이너를 시작하려면 image가 필요하다.

컨테이너를 실행하기 위해 필요한 image파일이다.
image 기반으로 여러개 컨테이너 실행이 가능하다.


옆에 파랑색 글씨로 ubuntu:18.04가 있는데 이게 image이다.

ubuntu1~3를 실행시켜서 ls를 확인해 봤는데 ls가 모두 동일하다.
왜냐하면 동일한 image를 사용했기 때문에 동일하다.

ubuntu1에 test1.txt를 만들고 ubuntu2에서 ls를 확인해보면 test1.txt가 없다.
환경은 동일 환경을 사용했지만, 격리된 환경이기 때문에 분리되어 있음을 알 수 있다.


새로만든 ubuntu에는 git이 없는데.. 매번 새로 업데이트하고 설치해야 하나?
우리는 직접 image를 생성할 수 있다.

ubuntu:18.041이라는 태그는 없기 때문에 local에도 없고 원격에서도 찾을 수가 없다는 뜻이다.

20.04는 존재하여 다운이 가능하다.

docker 에 centos를 설치한다면..
버전 태그를 입력 안하면 default tag로 된다.

docker images로 보유중인 images 확인 가능하고 관리가 가능하다.

보유중인 image로 컨테이너가 생성되었는지 표시(IN USE)

IN USE상태에서는 image 삭제가 제한된다.

컨테이너를 삭제하고 image삭제가 가능하다.

### 도커 컨테이너 기본 명령어

도커 컨테이너 리스트 보기
docker ps
docker ps -a

도커 컨테이너 만들기
docker run -dit --name <컨테이너 이름> ubuntu:18.04

도커 컨테이너 접근하기
docker exec -it <컨테이너 이름 or ID> bash

도커 컨테이너 나가기 (-it 태그 있어야지 동작)
ctr + p + q

도커 컨테이너 중지하기
docker stop <컨테이너 이름>

도커 컨테이너 시작하기
docker start <컨테이너 이름>

## 컨테이너로 image만들기


docker commit <container명 ID> <새로만들 image명>

### 만든 image로 컨테이너 만들기

## 실습

컨테이너로 이미지 만들기
sample 이미지에 test2 tag를 추가하였다.

exec는 실행시키라는 명령어다.
docker exec -it ubuntu1-clone2 ls로 입력하면
바로 ls가 된다.

bash는 뭘까 검색해보자

### 컨테이너를 터미널에서 삭제하기

아래와 같이 rm 명령어로 삭제하려 했는데 에러가 발생한다.
컨테이너가 실행중이라 그렇다.
stop명령어로 멈춘후 삭제가 가능하다.

하지만 stop을 안하고도 -f 태그를 사용하면 강제로 삭제가 가능하다.

띄어쓰기를 사용하여 한번에 삭제 가능하다.

### docker hub ID를 사용하여 image commit하기

우선 사용안하는 image를 정리해주자

### push명령어 사용하여 docker hub에 올리기

## push한 image pull하기


docker pull ansunny1170/sample
무료판은 기본적으로 public 상태이기 때문에 접근이 가능하다.

pull한 image로 container만들기

### docker private

단 1개의 레포지토리는 private로 개설 가능하다.

docker logout 상태에서 pull이 안될 것이다.

## VS code사용하여 docker 하기(dockerfile로 image만들기)


docker build -t ansunny1170/sample:git .
여기서 .은 경로이다.

vs사용하여 github에서 git clone을 받자

docker build -t ansunny1170/sample:gitclone을 입력하여 git clone을 내려 받았다.
docker run -t --rm ansunny1170/sample:gitclone ls를 입력하여 제대로 clone되었는지 확인해본다.
sample-repo폴더가 있는걸 보니 제대로 된듯 하다.
-rm태그를 달았기 때문에 컨테이너가 한번 실행 후 삭제가된다.
아래 빨간 상자를 보면 docker ps -a에서 컨테이너가 안남아 있음을 알 수 있다.

-rm태그를 안사용 하면?
컨테이너가 실행 중이다.

## 실습


  1. 우분투 20.04 버전 컨테이너 만들어서, nginx 설치하고, 이미지로 만들어보기
    (이미지 이름<도커 허브 ID>:nginx-container)
  2. 1번 항목 도커파일로 작성하고, 이미지 만들어보기
    (이미지 이름<도커 허브 ID>:nginx-dockerfile)
  3. 1,2번에서 만든 이미지 도커 허브에 업로드하기(docker push<이미지이름>)

### 1번 문제

로그인하기

ubuntu20.04 image로 container 만들기
container 명: ubuntu2004-nginx

컨테이너에 접근하여 apt-get update하기

사용자 국적은 왜 궁굼해 하노.

nginx 버전확인하기
nginx -v

이미지로 만들기
image 명: nginx-container

### 2번문제

FROM ubuntu:20.04
RUN apt update
ENV TZ=Asia/Seoul
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN apt-get install -y nginx

-y는 yes or no를 선택시 사용하는 키워드

강사님방법
docker build -t ansunny1170/ubuntu:nginx-dockerfile .
docker imageㄴ
docker run -dit --name nginx ansunny1170/ubuntu:nginx-dockerfile
docker exec -it nginx service nginx status
get요청방식 과 비슷 docker exec -it nginx curl http://localhost

docker run -dit --name nginx1 -p 8080:80 ansunny1170/ubuntu:nginx-dockerfile
앞의 80은 local port
뒤의 80은 container의 port
-p태그는

만들때 8080:80으로 해야하는데 실수로 80:80으로 해서 주소창에 localhost:80으로 처야 진입 가능하다.

docker run -dit --name nginx2 -p 8080:80 ansunny1170/ubuntu:nginx-dockerfile

  • 정리
    -p <호스트>:<컨테이너>

docker run -dit --name nginx korjsh/ubuntu:nginx-dockerfile
docker exec -it nginx service nginx status
docker exec -it nginx curl http://localhost

ROM ubuntu:20.04
RUN apt update
RUN apt install -y nginx curl
CMD ["nginx", "-g", "daemon off;"]

## vs code에 docker설치


현재 사진순으로 보면 앞이 imgae명 뒤가 container명이다.

attach shell기능을보자

remote development expention 설치

Attach Visual Studio Code 항목이 생성됨

새로운 vs code창이 생성되는데 open folder하면 그림과 같이 container 환경에서 진행이 가능하다.

아래 그림의 경로의 html이 우리가 봤었던 화면이다.

구글에서 html free template을 다운받아 적용도 가능하다.

# collabee에 webhook연결



체크표시가 되어야 성공한것이다.

webhook 연결이 성공한 것을 알 수 있다.

내가 webhook 설정한 레포지토리에 변경점이 생기면 아래와 같이 변경사항이 전달된다.
아까 설정에서 send me everything을 선택했기 때문에 업로드/다운로드 모든 정보를 수발신 하게된다.

참고: 콜라비 webhook guide

# docker에 webhook 연결

은 한번 테스트 해볼까!
그런데 collabee에 docker webhook연결하면 딱히 나오는 내용이 없다.
콜라비의 문제로 보인다.

보통은 slack을 사용하여 webhook을 한다나?!

profile
공정 설비 개발/연구원에서 웹 서비스 개발자로 경력 이전하였습니다. Node.js 백엔드 기반 풀스택 개발자를 목표로 하고 있습니다.

0개의 댓글