0x0102
KDT - 컨테이너를 CLI에서 디테일하게 관리하기 2 본문
8. 컨테이너 내부 구조 inspect로 확인하기
$ docker container inspect 컨테이너명
inspect 명령어를 쓸 때 image가 타겟인지 container가 타겟인지 명시
9. cp 명령어로 컨테이너 내부로 호스트 파일 복사해서 넘기기
$ docker cp 호스트의파일명 컨테이너명:경로와파일명
호스트 파일을 컨테이너로 보내기
$ docker restart 컨테이너명
재시작해서 갱신되었는지 여부 확인
역으로 컨테이너 내부의 파일을 호스트로 가져오는법
$ docker cp 컨테이너명:경로와파일명 호스트에서받을파일명
파라미터의 순서만 바꾸어주기
ex) nginx의 reverse proxy 구성에 대해
$ docker cp nginx서버명:/etc/nginx/nginx.conf 호스트의경로/nginx.conf
형식으로 conf 파일을 뽑아서 가져오고
$ docker cp nginx.conf 컨테이너명:/etc/nginx/nginx.conf
리버스 프록시 구성을 마치고나서 다시 돌려보내고
$ docker restart nginx컨테이너명
지정
10. 도커 이벤트 활용해 컨테이너 상태 확인해보기
$ docker events
새 터미널에서 이벤트 명령
내부에 $CADIVISOR_HEALTHCHECK_URL 확인
이를 통해 지속적으로 컨테이너 정보나 메트릭에 대한 통신을 하고 있다는것을 알 수 있다.
nodeapp에 지속적으로 요청을 넣는 반복문을 ctrl + c로 중지시키고
$ docker stop nodeapp
nodapp 컨테이너 중지
이벤트에서 container kill 명령어 확인 후
$ docker start nodeapp
다시 start로 기동하면 도커 이벤트가 이를 감지 후 출력하는 것 또한 확인 가능
$ docker pause nodeapp
pause 상태에서는 while문으로 curl을 보내도 무반응임을 알 수 있다.
$ docker unpause nodeapp
unpause로 해제
$ docker events --until time(시|분|초)
특정 시간을 정해 그 시간까지 감시
$ docker events --since date1 date2
특정 날짜에 감시
$ docker events --filter “key=value”
특정 이벤트만 집중 감시
11. docker에서의 kill 사용
$ docker exec -it nodeapp sh
알파인 리눅스이므로 bash사용이 불가능하기 때문에 nodeapp 쉘로 진입
# cat /etc/os-release
리눅스 버전 확인
세번째 터미널을 켜서
**`$ docker kill nodeapp`**
수행 후 이벤트 확인
결과: nodeapp이 끊어지면서 알파인 리눅스가 동시에 중지되기 때문에 2번 터미널에서도 host1으로 환원됨
이후 3번 터미널에서 ps -a 조회시 exited(0이 아닌 번호) 상태
+) 도커의 kill은 컨테이너를 죽이지만 리눅스의 kill로 죽이는 케이스는 컨테이너의 완전 종료로 간주하지 않으므로 세션이 끊어지지 않음
12. attach 와 exec
attach 모드 : 컨테이너와 지속적인 통신을 하고 싶을 때 기동
$ docker run -d --name=attach-con ubuntu:22.04 /usr/bin/top -b
/usr/bin/top -b 명령어를 수행하는 컨테이너가 detach모드로 열리기 때문에 top -b를 백그라운드에서 수행
$ docker attach attach-con
해당 컨테이너 내부에서 attach 모드로 돌려서 조회하는 명령어
exec 모드 : execute모드. 실행중인 컨테이너에 추가 명령 실행
$ docker run -itd --name=exec-con alpine sh
alpine 리눅스의 셸을 여는 명령을 내리면 detach 상태이기 때문에 상호작용 창은 나오지 않지만 sh는 켜진 상태가 됨
$ docker exec -d exec-con touch /tmp/exec_test
명령어를 해당 sh에 detach 모드로 전달
상호작용 모드로 전환되지는 않지만 touch 명령어는 정상적으로 수행됨
즉, attach는 해당 컨테이너의 로그 등을 조회할 때 사용하고
exec는 실질적 작업 명령을 수행할 때 사용
13. docker diff로 변동사항 확인하기
$ docker diff noderun
A, C, D 3가지 변동내역 확인
A 는 파일 혹은 디렉터리의 추가
D는 파일 혹은 디렉터리의 삭제
C는 파일 혹은 디렉터리의 변경
**`$ docker exec -it nodeapp sh`**
확인을 위해 해당 명령어 실행
**`# adduser newuser`**
아이디 추가 후 diff로 조회하면 변경 내역 확인 가능
14. docker commit으로 도커파일 없이 변경된 이미지 생성
이전까지 dockerfile로 이미지를 생성했다면 docker commit을 이용하면 컨테이너를 다시 이미지로 돌릴 수도 있다.
app.js의 콘솔내역을 살짝 바꿔주면 컨테이너 내부에 변경점이 생긴다.
이를 이미지로 환원하기 위해
**`$ docker commit nodeapp nodeapp:1.1`**
기존 컨테이너명 → 갱신할 이미지이름:태그
파일 갱신 후 컨테이너를 띄우고 curl로 변경내역을 확인해보자.
15. docker export를 활용한 이미지 파일화, import를 활용한 마운트
export는 save와 유사하지만 layer 내용을 나누지 않고 하나의 레이어로 통합한다.
$ docker export nodeapp > nodeapp.tar
노드앱에 대한 tar 추출
$ tar tvf nodeapp.tar
tar 정보 확인. 하나의 파일 시스템으로 가져와졌는지 추가 확인
$ sudo scp nodepapp.tar host2번:/home/유저명
해당 파일을 다른 가상머신으로 이동
다른os$ cat nodeapp.tar | docker import - nodeapp:태그명
import로 마운트
$ docker run -itd --name=newnodeapp -p 9999:5678 nodeapp:1.2
이미지 확인을 위해 run을 사용하면 에러가 발생하는데
이는 export가 단순 파일시스템만 모사했기 때문에 실행 명령에 대한 내용이 없어 발생한다.
따라서 cmd를 추가하자.
$ docker import --change ‘CMD [”node”, “/app/app.js”]’ nodeapp.tar nodeapp:1.2
cmd를 추가하면 실행이 성공적으로 되는 것을 확인할 수 있다.
+) 영구적인 cmd 반영된 이미지 갱신 방법
$ cat nodeapp.tar | docker import - nodeapp:1.3
import
$ vi Dockerfile_noderun1.3
dockerfile 생성
FROM nodeapp:1.3
CMD ["node", "/app/app.js"]
추가 후 저장
$ docker build -t nodeapp:1.3 -f Dockerfile_noderun1.3 .
새로 빌드
'Study > System Engineer' 카테고리의 다른 글
1차 프로젝트 실습 (0) | 2024.02.21 |
---|---|
도커 네트워크 기초 (1) | 2024.02.06 |
KDT - 컨테이너를 CLI에서 디테일하게 관리하기 (0) | 2024.02.02 |
KDT - 도커 레지스트리 구축해보기 (0) | 2024.02.01 |
KDT - 도커 이미지 구조 이해 및 업로드 (0) | 2024.01.29 |