Docker

22.05.26

가로선 2022. 5. 26. 16:45

 

   목차   

 

1. 메트릭값 변경

2. TTY & PTS

3. Foreground & Background

4. Docker

 - 이미지 정리

 - 컨테이너 정리

 - Docker 이미지 사용 및 컨테이너 생성, 삭제, 접속

 - attach 접속, exec 사용

 - 웹 서버 메인페이지 변경

 - 컨테이너 세부정보 확인 및 통신확인

 - 컨테이너 한꺼번에 삭제

5. Process

6. 문제풀이 1, 2


 

   메트릭값 변경   

 - 먼저 읽어들일 경로를 설정하기 위해 사용

 - 메트릭값이 낮을 수록 우선순위가 높다

 - VMware 세팅을 할 때 VMnet8(NAT) 카드에 게이트웨이를 넣어줘 버리면

   실제 PC에서는 무엇이 우선순위인지 몰라 혼란을 겪게 된다 이럴 때 사용하게 된다

  (실제  PC와 VMware의 VMnet8까지 사이에 가상의 스위치가 있다고 생각하자)

 

ncpa.cpl에서 ip설정 부분에서 아래 고급을 눌러보면 설정이 가능

 

자동으로 설정된 메트릭값 확인

 

수동으로 설정한 메트릭값 확인

 

 

   TTY & PTS   

 - TTY(Telnet Type writer) : 콘솔접속(마우스, 키보드, 모니터를 가지고 접속)
 - PTS(Press The Type ) : 원격 접속

 

접속자 확인 명령어인 w를 통해 접속자 확인

    - Xshell을 통한 원격접속, VMware에서 직접 콘솔접속 2개가 보이는 것을 확인

 

리눅스의 다중접속 기능을 이용하여 콘솔접속 여러개 생성

    - ALT+F'번호'를 이용하여 다중접속이 가능하다

        - 총 6개까지 지원이 된다

 

다중 원격접속 확인

 

 

   Foreground & Background   

 - Foreground : 쉘을 점유하고 있어 다른 명령어 x
    - 인터럽트가 가능(ctrl+c로 종료 가능)
 - Background : ls 명령어 같은 것들이 먹음(눈에는 보이지만)
    - ctrl+c로 종료 x
    - jobs로 작업번호확인
    - fg %'작업번호'(foreground로 변환 후, ctrl+c로 종료)

 

&를 사용하여 핑테스트를 백그라운드로 진행

    - CTRL+C가 먹히지 않는 것을 확인

 

jobs 명령어를 통해 작업번호 확인

 

작업번호를 통해 foreground로 변경 후, CTRL+C로 종료

 

 

   Docker   

 

   이미지 정리   

 - 서비스들의 환경설정, 라이브러리를 포함하고 있다

 - 운영체제는 포함하고 있지 않다

    - Docker 자체의 운영체제를 사용하기 때문에 굉장히 가볍다

 

   컨테이너 정리   

 - 실제 컨테이너선은 규격화되어있다

    - 도커의 컨테이너도 규격화되어있기 때문에 좋다
 - 가상화, 클라우드, 컨테이너 태어난 이유는 Application 실행이다
 - migration의 목적은 옮기는 곳에서 Application이 잘 돌아가게 하기 위함
    - 대규모, 소규모의 차이일뿐

 - 컨테이너 하나에는 꼭 하나의 프로세스만 실행!

    - 하나의 역할만 하기를 원한다

    - 편법이 존재하나 FM대로 하자

 

   Docker 이미지 사용 및 컨테이너 생성, 삭제, 접속   

 

테스트용으로 좋은 정말 작은 리눅스인 알파인을 pull 시켜 image를 가져온다

 

docker images로 확인

 

alpine 이미지 실행시켜 컨테이너 접속

    - it(interative terminal) 옵션 : 쉘 적용하는 이미지에 사용

    - d(daemon) 옵션 : 서비스를 실행하는 이미지에 사용

        - 두 개 구분을 잘해야한다

 

yum, nano 같은 명령어들 사용불가

 

쉘 접속한 것을 exit로 빠져나오게 되면 비정상적으로 종료가 되어 Exited 상태가 된다

 

이름이나 컨테이너 아이디로 삭제 가능

 

쉘을 사용하는 alpine을 d옵션만 주어 컨테이너를 생성하게 되면 오류 발생

    - 원래의 컨테이너 실행 순서는 create로 컨테이너 생성 후, start로 실행이다

        - 번거롭기 때문에 많이들 run을 사용

    - 삭제 후, 다시 정상적으로 컨테이너 실행

 

정상적으로 실행되는 것을 확인

    - 쉘이 실행되었을 때, 접속 종료는 CTRL+p+q를 사용하여 정상 종료시킨다

    - exit 사용때와는 달리 문제없이 컨테이너가 실행되는 것을 볼 수 있다

 

attach를 통해 생성한 컨테이너에 다시 접속 가능(쉘을 사용하는 컨테이너만 가능)

    - 루트 디렉터리에 생성된 디렉터리 확인

 

외부에서 디렉터리 확인

    - 컨테이너 안의 디렉터리와 외부의 디렉터리가 다른 것을 확인

 

httpd 서비스를 실행하는 컨테이너 생성

    - p 옵션을 사용하여 Port Forwarding 진행

        - 80(Host에서 접속 포트):80(내부 컨테이너 포트)

 

생성한 서비스에 접속 확인

 

   attach 접속, exec 사용   

 

쉘을 제공하지 않는 httpd에 attach로 접속

    - 쉘을 제공하지 않기 때문에 attach로 접속하면 상태가 Exited로 변하는 것을 볼 수 있다

 

새로운 컨테이너 h2 생성(httpd 서비스 실행)

    - 굳이 쉘로 접속하고 싶다면 exec 명령어를 사용하여 bash 쉘을 가져다 붙이면 된다

    - 이렇게 한 PC에서 여러개의 웹 서버를 생성할 수 있다는 것이 매우 큰 장점이다

        - 전에 배운 프록시까지 사용하여 여러개의 웹 서버에 뿌려준다면

           어마어마한 부하분산의 장점까지 가져갈 수 있다

 

   웹 서버 메인페이지 변경   

 

생성한 서비스 접속화면에 It works!가 나오는 이유 확인

 

늘 사용하던 vi 편집기가 사용이 되지 않는다

 

cat 리디렉션을 통해 출력 내용 변경

 

생성한 8080포트로 접속하여 바꾼 내용으로 출력되는 것을 확인

 

httpd는 쉘을 제공하지 않는 서비스이기 때문에 exit로 종료하여도 컨테이너 동작에 문제가 발생하지 않는 것을 확인

 

   컨테이너 세부정보 확인 및 통신확인   

 

컨테이너 세부정보 확인

    - inspect 명령어를 통해 컨테이너들의 세부정보를 확인할 수 있다

 

아래쪽에서 볼 수 있는 컨테이너의 할당받은 IP 확인(h1)

    - 따로 지정해주는 것이 아닌 Docker 자체내에서 DHCP로 할당을 받는다

 

컨테이너의 할당받은 IP 확인(h2)

 

exec를 통해 여러가지 명령어도 사용이 가능하다

    - 여기서 보여주는 위치는 /usr/shell/apache 이다

 

웹 서버에 bash 쉘을 추가해서 핑테스트 진행

    - 웹 서버내에서는 ping 명령어가 존재하지 않으므로 ping 테스트가 불가

    - alpine 서비스를 사용하는 컨테이너를 생성하여 테스트 진행

        - 컨테이너간 통신이 되는지를 확인하기 위함

 

alpine 이미지를 사용하여 a1, a2라는 이름의 컨테이너 생성

    - itd 옵션을 모두 합쳐서 사용하면 무조건 실행은 되지만 접속은 바로 되지 않는다

        - 각각의 접속 명령어를 통해 접속해줘야 한다

 

a1의 ip 확인

 

a2의 ip 확인

 

상대방 컨테이너에 ping 테스트를 통해 통신이 되는 것을 확인

 

   컨테이너 한꺼번에 삭제   

 

docker ps -aq를 사용하면 Container ID가 전부 출력된다

 

 

   Process   

 - Process : App이 실행되어 Memory에 로드된 상태
    - APP는 실행 전까지는 HDD에 저장
    - APP는 실행하면 memory로 로드
    - 이런 이유는 둘의 속도차이 때문이다(둘의 속도차이는 약 1000배)

 

ps -aux로 프로세스 번호 확인

    - a : 터미널에 종속되지 않은 모든 프로세스 정보 출력

    - u : 특정 사용자의 프로세스 정보 출력(지정하지 않으면 현재 사용자로)

    - x : 모든 사용자의 프로세스 정보 출력

 

kill 명령어를 통해 프로세스를 죽일 수 있다

 

해당 프로세스 번호를 kill 명령어로 죽인 후 메세지 확인

 

19를 이용하여 멈출 수도 있는 것을 확인

 

핑 테스트가 멈춰진 것을 확인

 

멈춰진 프로세스 다시 실행

    - 단순히 멈춘 것이므로 프로세스 넘버가 바뀌지는 않는다

 

다시 시작되는 것을 확인

 

ps -ef를 통해 자식(PID)과 부모(PPID)의 프로세스 넘버 모두 알 수 있다

    - 부모를 죽여도 자식이 죽어야함
        - 만약 자식이 살아있으면 좀비 
        - top 명령어들 통해 확인(q로 종료)

 

윈도우의 작업 관리자와 같은 역할을 하는 top 명령어 사용

    - 만약 부모를 죽였는데 자식이 죽지 않았다면 zombie에 카운트가 되는 것

 

 

   문제풀이 - 1   

 - 새롭게 httpd(아파치) 컨테이너를 생성하여 웹 접속 메인 페이지에 출력되는 내용 변경

 

httpd 컨테이너 생성(h1, h2, h3)

    - 포트포워딩 포트는 같으면 안된다

 

총 3개의 httpd 컨테이너 생성하여 내용 수정

 

생성한 포트로 접속하여 출력되는 내용 확인

 

생성한 포트로 접속하여 출력되는 내용 확인

 

 

   문제풀이 - 2   

 - 상대방의 SSH에 접속하여 프로세스 죽여보기

 - SSH 포트 60022, 60122로 변경하여 총 3개를 만든다

 

/etc/ssh/sshd_config에서 포트번호 변경

 

/etc/ssh/sshd_config에서 포트번호 변경

 

상대방이 접속을 하기위해 포트포워딩 설정

 

접속자 확인 명령어인 w를 통해 상대방이 원격접속(PTS) 된 것을 확인

 

접속자 확인 명령어인 w를 통해 상대방이 원격접속(PTS) 된 것을 확인

 

접속자 확인 명령어인 w를 통해 상대방이 원격접속(PTS) 된 것을 확인

    - 테스트를 위해 설정 후, Google로 핑테스트를 백그라운드에서 진행

 

상대방이 kill 명령어를 통해 프로세스 죽이기

 

죽여진 것을 확인

 

다시 핑테스트 진행 후에 상대방이 핑 테스트 프로세스 멈춰보기

 

멈춰진 것을 확인

 

핑 테스트 프로세스 다시 시작

 

다시 시작되는 것을 확인

'Docker' 카테고리의 다른 글

22.06.01  (0) 2022.06.01
22.05.31  (0) 2022.05.31
22.05.30  (0) 2022.05.30
22.05.27  (0) 2022.05.27
22.05.19  (0) 2022.05.19