Docker

22.05.27

가로선 2022. 5. 27. 17:10

 

   목차   

 

1. cat 입력전환

2. Docker Container LifeCycle

3. 외부에서 컨테이너 내부에 밀어넣기

4. /etc/hosts 설정

 - 컨테이너 외부에서 설정

 - 컨테이너 내부에서 설정

 - 컨테이너 외부에서 내부설정

5. Docker Network Driver

 - 네트워크 카드 생성 및 변경

6. Docker가 방화벽 포트개방 없이 외부접속에서 되는 이유

7. 문제풀이


 

   cat 입력전환   

 

host.txt라는 파일 생성 후, 내용 생성

 

test.txt 파일을 host.txt 파일로부터 입력받아 출력화면을 보여준다

 

test1.txt라는 파일 생성

    - test1.txt 파일을 생성해서 입력을 받는데 END라는 문자열이 입력될 때까지

      기다렸다가 END라는 문자열이 입력이 되면 대기되었던 내용을 한꺼번에 출력

        - ctrl+d와 동일한 기능을 함

        - 스크립트 작성시에 필요(스크립트를 짤 때 ctrl+d를 표현할 방법이 x)

        - 실무에서는 END 보다는 EOF(End Of File)을 많이 사용

 

 

   Docker Container LifeCycle   

 

Docker Container LifeCycle Arcitecture 확인(출처 : https://kin3303.tistory.com/16)

    - Signal

        - kill : 작업중이던 것도 무조건 삭제
        - stop : 정상 종료 / 작업중인 것은 정상적으로 마무리
        - pause : 하던 작업도 멈춤

 

docker create를 통해 컨테이너 생성(시작 x)

    - 원래는 run으로 시작 및 실행을 동시에 하였지만, create다음 start의 순서가 FM

 

컨테이너가 생성된 것을 확인

 

docker start를 통해 컨테이너 시작

 

cat 입력 전환을 사용하여 WEB 서버 메인 페이지 출력값 변경

 

생성한 IP 및 포트를 통해 접속 확인

 

docker stop으로 실행중인 컨테이너 정지

    - stop을 사용하면 컨테이너가 가진 정보를 반납한다

        - pause는 반납 x

 

docker start를 통해 다시 컨테이너 재시작

 

docker rm에 f 옵션을 사용하여 실행중인 컨테이너 강제종료 가능

 

종료 FM 방법

    - stop으로 일단 실행중인 컨테이너를 멈춘 후. rm으로 삭제

 

 

   외부에서 컨테이너 내부에 밀어넣기   

 - 테스트를 위해 index_a.html, index_n.html 생성

    - 각각에 a(httpd), n(nginx) 메인 페이지 출력값 변경내용 작성

 

cp를 통해 컨테이너 안으로 들어가지 않아도 외부에서 컨테이너 쪽으로 밀어넣을 수 있다

    - index_a.html의 내용을 h1 컨테이너의 지정한 위치로 밀어넣겠다

        - /usr/local/apache2/htdocs/index.html : WEB 서버 메인페이지 출력값

 

설정 전과 달라진 것을 확인

 

cp를 통해 컨테이너 내부에 있는 내용도 외부로 가져올 수 있다

 

외부로 내용이 가져와 진 것을 확인

 

nginx의 메인 페이지 출력값 변경을 위해 작성한 index_n.html을 밀어넣는다

    - /usr/share/nginx/html/index.html : NGINX 메인페이지 출력값

 

설정 전 NGINX 메인페이지 모습

 

설정 후 바뀐 것을 확인

 

 

   /etc/hosts 설정   

 - /etc/hosts에 도메인을 등록하게 되면 DNS보다 먼저 IP를 읽어올 수 있다

 - 아이피    도메인    Alias 순으로 작성

    - 도메인, Alias 생략 가능

 

   컨테이너 외부에서 설정   

 

Docker2 서버를 실행 후, Docker2의 아이피 도메인 Alias 순으로 작성

    - Docker1, Docker2의 핑 테스트를 IP가 아닌 호스트 이름으로 하기 위함

 

Docker2에서 Docker1의 호스트 이름과 Alias로 핑 테스트 결과 확인

 

   컨테이너 내부에서 설정   

 

inspect을 통해 a1(alpine 컨테이너)의 id 확인

 

a1의 /etc/hosts에 등록되어있는 것을 확인

    - docker exec a1 cat /etc/hosts로 외부에서 확인 가능

 

a1 컨테이너 내부 접속

 

내부에서 a1의 /etc/hosts에 내용 추가

 

a2(alpine 컨테이너)에 접속

 

내부에서 마찬가지로 a2의 /etc/hosts에 내용 추가

 

설정한 호스트 이름으로 서로 핑테스트 확인

    - alpine에는 ping 명령어가 존재한다

 

   컨테이너 외부에서 내부설정   

 

외부에서 a.txt 생성

    - 컨테이너 내부의 /etc/hosts에 밀어넣을 파일 생성

 

cat을 사용하여 a3 컨테이너의 /etc/hosts에 a.txt 밀어넣기

 

cp를 사용하여 a3 컨테이너의 /etc/hosts에 a.txt 밀어넣기

    - 외부에서 내부 컨테이너에 밀어넣는 방법 2가지 전부 제대로 작동 x

 

컨테이너 생성 및 실행시 add-host 옵션을 사용하여 /etc/hosts에 내용 추가

 

작성한 각각의 호스트 이름으로 핑 테스트

 

   Docker Network Driver   

 

네트워크 드라이버 3가지

    - bridge : 하나의 Host-PC내에서 여러 컨테이너들이 서로 소통할 수 있도록 해준다

    - host : 컨테이너를 Host-PC와 동일한 네트워크에서 컨테이너를 돌리기 위해 사용

    - null : 네트워크 드라이버 할당 x

 

ip a를 통해 네트워크 카드 확인

    - 컨테이너를 생성하면 가상의 브릿지가 생성 컨테이너에 존재하는 실제 카드와

      브릿지의 포트와 연결 되어 외부와의 통신이 되도록 설정

        - 브릿지를 이용하여 컨테이너끼리도 통신이 가능해짐

 

생성한 컨테이너 1개를 삭제 후, 카드 1개가 삭제된 것을 확인

 

    네트워크 카드 생성 및 변경   

 

docker network create를 통해 네트워크 카드 생성

    - 네트워크 대역과 게이트웨이 설정 필수

    - babo라는 이름의 네트워크 카드(Bridge)가 생긴 것을 확인

 

네트워크 카드를 babo로 변경하여 a4 컨테이너 생성

    - net 옵션을 사용하여 네트워크 카드 변경 가능

 

생성 후 외부와 핑 테스트

 

상세 정보 확인을 통해 할당받은 IP확인

 

 

   Docker가 방화벽 포트개방 없이 외부접속에서 되는 이유   

 - Network Driver가 host인 경우에는 firewall-cmd public 존으로 처리가 됩니다.

    - 생성한 컨테이너들은 Network Driver가 자동적으로 Host가 된다

        - 따로 개방할 필요없이 자동적으로 개방이 되서 수동으로 설정할 필요가 x

 

 

   문제 풀이   

 - alpine으로 이름이 a5인 컨테이너를 생성 후,

   컨테이너 내부의 /etc/hosts를 수정해서 컨테이너 외부에서

   a1 컨테이너 이름으로 ping test를 수행하는 스크립트 작성

 

test.sh 라는 이름의 스크립트 파일 생성

    - 생성한 각각의 컨테이너 정보들을 /etc/hosts에 입력이 된 a5 컨테이너 생성

    - cat으로 a5의 /etc/hosts 정보 확인

    - 각각의 컨테이너로 핑 테스트시 w 옵션으로 카운트 제어

        - 제어하지 않으면 계속 a1의 핑 테스트만 진행하게 된다

 

/etc/hosts에 저장된 정보 확인

 

같은 네트워크 상인 a1, a2, a3과 핑 테스트가 되는 것을 확인

 

a4의 경우 다른 다른 브릿지로 생성했기 때문에 a5의 브릿지를 통해 통신이 되지 않는 것을 확인