[Docker] 공식 튜토리얼로 배우는 도커 강의 2편

Yungsang Hwang·2022년 7월 15일
0

docker

목록 보기
1/2

공식 튜토리얼로 배우는 도커 강의 2편

도커 1강 intro

  • 목차
    1. 둘러보기
    2. 컨테이너와 이미지란?
    3. 샘플 어플리케이션 받아보기
    4. 샘플 어플리케이션 이미지화하여 컨테이너에서 돌리기 업데이트
    5. 어플리케이션 업데이트 하기
    6. 컨테이너 삭제하고 다시 시작하기
    7. 어플리케이션 공유하기
    8. 공유한 어플리케이션을 Play with Docker에서 실행해보기
    9. DB를 유지하기 위한 볼륨

도커 2강 컨테이너란

  • 컨테이너란?
    • Kernel 위에 컨테이너들이 있음
  • Kernel = 내컴퓨터 안에 여러개의 컴퓨터가 있다 라고 생각하면 좋다 (분리해서 사용한다!)

  • 네트워크프로세스도 분리해서 사용할 수 있음

  • 컨테이너는호스트의 포트컨테이너 포트로 연결된다

  • Virtual Machines이란
    • OS위에 Hypervisor로 위에 새로운 OS를 설치해서 사용하는 것
  • Docker Containers
    • 하나의 OS안에서 환경을 분리해서 사용

도커 3강 이미지란

  • 이미지란?
    • 컨테이너를 실행하기 위한 순간을 이미지화 한 파일 = Docker Image
    • image file = iso 라고 생각하면 좋다(파일을 이미지화! 찰칵!) AWS Snapshots이 유사한 시스템

  • 이미지 파일의 장점
    • 컨테이너를 구성하기 위한 환경 설정, 프로세스들이 다 저장되어있음
    • 이미지 하나를 이용하여 여러 개 컨테이너를 실행시킬 수 있는 것이 큰 장점
    • 서버 컴퓨터는 용량이 제한되어 있기에 어마어마한 트래픽을 감당 할 수 없음. (ex: 수강신청 등 트래픽이 몰리는 상황) 여러 서버 컴퓨터를 열어주어야 하는 상황이 왔을 때 이미지를 활용한 컨테이너를 띄우면서 순간적으로 처리 영역을 확장 시킬 수 있음
    • 컨테이너란 이미지의 인스턴스라고 생각할 수 있음

  • 컨테이너를 통해 명령했을때 이미지가 존재하지 않다면 Registry를 통해 이미지를 가져오기도 함
    • Registry?
      • 깃허브와 같은 역할을 함 (이미지를 가지고 와서 복잡한 설정없이 바로 실행이 가능하게 해줌)

  • 하기 명령어에 -d는 백그라운드에서도 실행이 되게 하는 코드이며, -p 는 포트를 지정하기 위해 사용한다
    • 해석)도커를 실행 할건데 백그라운드에서도 실행되게 하고, 포트는 80번 포트를 80번과 연결하겠다, 실행할 이미지는 docker/getting-started 다!
docker run -d -p 80:80 docker/getting-started

도커 4강 Dockfile 작성하기

  • Dockerfile을 생성 .txt와 같은 확장자 쓰지 않음
  • VSCode Extension에서 Docker를 설치
  • Dockerfile에 작성할 내용
    • 내용이 어렵다면 일단 머리에 때려 넣기
# Dockfile

# 실행할 엔진/버전/경량화 버전
From node:12-alpine

# Adding build tools to make yarn install work on Apple sill
RUN apk add --no-cache python2 g++ make
WORKDIR / app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
# 본인의 Dockerfile이 있는위치로 이동
docker build -t getting-started .

도커 5강 만든 이미지를 컨테이너 실행해보기

  • 3000번 포트로 가면 어플리케이션 실행되고 있음(포트 80번은 디폴트)
docker run -dp 3000:3000 getting-started

도커 6강 이미지와 컨테이너 업데이트 하기

  • 업데이트 수정 해보기
    • src > static > js > app.js 에서 placeholder / button 한글로 변경해보기!
# js / app.js

<Form onSubmit={submitNewItem}>
            <InputGroup className="mb-3">
                <Form.Control
                    value={newItem}
                    onChange={e => setNewItem(e.target.value)}
                    type="text"
                    placeholder="새로운 아이템"
                    aria-describedby="basic-addon1"
                />
                <InputGroup.Append>
                    <Button
                        type="submit"
                        variant="success"
                        disabled={!newItem.length}
                        className={submitting ? 'disabled' : ''}
                    >
                        {submitting ? 'Adding...' : '아이템 추가'}
                    </Button>
                </InputGroup.Append>
            </InputGroup>
        </Form>
  • 업데이트는 실시간으로 반영되지 않음 현재는 이전의 도커 이미지로 실행 되고 있는 상태이기 때문에, 적용을 하기 위해선 다시 도커 빌드로 새로운 이미지를 생성해줘야 함
# 본인의 Dockerfile이 있는위치로 이동후
docker build -t getting-started .
  • -t 명령어로 이름을 붙여주는데, 기존에 존재하던 같은 태그의 이름을 붙일 경우, 기존 태그가 달려있던 이미지의 이름이 이 된다!
# 도커 정보 확인
docker ps
# 컨테이너를 멈추고 삭제까지하는 명령어
docker rm -f {컨테이너 id}
# 다시 컨테이너 런
docker run -dp 3000:3000 getting-started
  • 실행중인 포트 찾기
# window 
netstat -ano | findstr "{포트번호}"
# Linux
netstat -pntl | grep {포트번호}
# mac
lsof -i :{포트번호}

도커 7강 docker hub에 이미지 푸쉬하기

  • git이 github가 있다면, docker는 docker hub가 있다.
  • docker hub에 저장한 이미지를 푸시하고 원격으로 저장하기

Docker Hub Container Image Library | App Containerization

  • 이미지를 도커 허브에 원격으로 올리기위해 도커 허브에서 레포지토리를 만든다
  • 생성할 때는 PUBLIC으로 만들자
# 도커 허브로 푸시하는 쉘 명령어
docker push {아이디}/{이미지이름:tagname(버전)}
  • 도커 이미지에는 {아이디}/ 로 시작하는 이미지 네임은 없기 때문에 이미지가 존재하지 않는다는 오류가 발생한다!
  • 똑같이 이미지 이름을 맞춰주기 위해 태그를 작성하는 명령어를 사용한다
docker tag getting-started 유저네임/getting-started
  • 기존 이름의 이미지 또한 docker ps 로 존재한다는걸 확인할 수 있다!
  • docker image ls 를 통해 이미지의 존재 여부를 볼 수 있다
  • tag는 미입력 시 default 값으로 latest 가 붙는다.
docker login -u {유저네임}
# 입력 시 비밀번호 입력란이 나옴
# 도커 허브로 푸시하는 쉘 명령어
# 처음에는 오류가 발생했기 때문에 다시 푸시해준다
docker push {아이디}/{이미지이름:tagname(버전)}

도커 8강 새로운 환경에서 컨테이너 실행하기

Play with Docker

  • Play with Docker 사이트 이용하기
    • ADD NEW INSTANCE 로 가상의 환경을 만들어준다

      # window
      docker run -dp 3000:3000 {아이디}/{이미지이름}getting-started
  • Mac os M1을 쓰는 사람들은 하기의 설정을 해줘야 함
    • platform이 amd64인 이미지를 만들어 주는 것

      # mac os (M1)
      docker build --platform=linux/amd64 -t {아이디}/{이미지이름}getting-started:amd64 .
  • M1 Push
    docker push {아이디}/{이미지이름}:amd64

도커 9강 컨테이너와 이미지 지우기

  • 저장된 컨테이너 지우기(docker 프로그램으로도 지울 수 있다.)
# 실행중인 컨테이너 멈추기
docker stop {container id} or {image name}
# 컨테이너 삭제
docker rm {container id} or {image name}
# 강제로 실행 종료하고 컨테이너 지우기
docker rm -f {container id} or {image name}
  • 도커 이미지 지우기
# 생성되어있는 도커 이미지 확인하기
docker image ls
# 도커 이미지 삭제하기
docker rmi {image id} or {image name:tagname(버전)}
  • 동일한 아이디로 존재하는 이미지가 삭제되지 않는다면
    • 태그(버전이 있다면 버전이름까지)를 직접 적어 삭제한다

도커 10강 컨테이너들의 파일시스템 분리

  • 컨테이너는 시스템에 메모리를 할당받음
  • 하나의 이미지에서 나온 컨테이너라 하더라도 각각의 독립적으로 존재하기때문에 서로 접근할 수 없음
  • echo 명령어를 활용하여 string값을 데이터에 저장할 수 있음
docker run -d ubuntu bash -c "echo 'hello world' > data.txt && tail -f /dev/null"
  • tail부분은 프로세스가 끝나도 컨테이너가 꺼지지 않도록 하기 위해 붙여줌
  • Docker Dashboard에서 컨테이너 옆 open in terminal 버튼 클릭
ls
# 데이터 확인 명령어
cat /{데이터명}data.txt
# -i 는 상호교류를 하겠다 -t 는 터미널
docker run -it ubuntu
# ls 로 확인해보면 txt파일 없음 여기엔 
exit
docker ps
# 다시 확인해보면 처음 실행한 컨테이너만 남아있음 위에서 실행한 건 바로 없어짐
  1. ubuntu라는 도커에서 즉시 사용할 수 있는 이미지를 컨테이너로 run
    • 그런데 data.txt를 곁들인
  2. 실행해보니 data.txt가 들어있음
  3. 곁들이지 않은 ubuntu를 run -it 로 실행
  4. 실행해보니 여기에는 data.txt가 들어있지 않음
  • 즉, 바로 실행 가능한 ubuntu 라는 이미지를 예시로 실행해보니
    • 같은 이미지더라도 다른 작업을 해서 실행한 컨테이너라면
    • 그 결과가 다르다!
    • 하나의 이미지에서 생성한 컨테이너들은 독립적이며
    • 서로의 파일에 접근권한이 없다
# 처음 실행했던 컨테이너도 삭제
docker rm -f {container id}

# ps 로 확인해보면 아무것도 없음
# 이제 프로세시와 저장공간이 분리된 걸 확인했으니 볼륨을 이용해보좌

도커 11강 볼륨을 이용해서 데이터 유지하기

  • Docker Dashboard에서 컨테이너 옆 open in terminal 버튼 클릭
# 저장되는 db 위치 확인

ls
#상위 폴더 접근
cd ..
#etc 확인
ls
cd etc
# todos 확인
ls
cd todos
# todo.db가 있는걸 확인
ls
  • 볼륨 만들기
docker volume create {volume name}
  • 볼륨을 etc/todos 폴더에 저장되도록 마운트 해줌
docker run -dp 3000:3000 -v {volume name}:/etc/todos {image name}
  • 3000번 포트로 접속해서 디비를 쌓아본 후 다시 3001번 포트로 연결해보아도 디비가 살아있는것을 확인할 수 있음
docker run -dp 3001:3000 -v {volume name}:/etc/todos {image name}
profile
하루종일 몽상가

0개의 댓글