카테고리 없음

[SERVER] - DOCKER commander

Kim David 2024. 9. 11. 19:24

이전에 docker registry에서 직접 container을 다운로드 받아서 실행시켜본다고 했습니다!

( 저는 mac 사용중이라 터미널을 사용하여서 ssh 접속을 설정하여 진행하도록 하겠습니다. )

 

우선 밑에는 docker의 명령어들입니다.

 

docker 명령어 

-  이미지 관리 명령어
docker search : 이미지 검색

docker pull : 이미지 다운로드

docker images : 이미지 목록보기

docekr history : 이미지 히스토리 보기

docker inspect : 이미지 세부 정보 보기 ( 뒤에 이미지 이름을 넣게되면 그것에 대한 세부정보를 보여줍니다. )

 docker rmi : 도커 이미지 삭제

 

- 컨테이너 관리 명령어

docker create : 컨테이너 생성

docker start : 컨테이너 실행

docker stop : 컨테이너 종료

docker kill : 컨테이너 강제종료

docker rm : 컨테이너 삭제

docker run : 컨테이너 실행

docker ps :컨테이너 목록 보기

docker inspect : 컨테이너 세부 정보 확인 ( 뒤에 컨테이너 이름을 넣게되면 그것에 대한 세부정보를 보여줍니다. )

 

- 동작중인 컨테이너 관리 명령어

docker exec [컨테이너_이름] : 컨테이너 내부 명령어 실행

docker top [컨테이너_이름] : 컨테이너 프로세스 목록 보기

docker logs [컨테이너_이름] : 컨테이너 로그보기

docker cp filename [컨테이너_이름]:/[파일이름] : 컨테이너 내부 파일 복사

docker diff [컨테이너_이름] : 컨테이너 내부 파일 변경 이력 확인

 

- 컨테이너 저장소 관리 ( 컨테이너 이미지를 배포하는 용도로 사용됩니다. )

docker build : 이미지 빌드

docker tag : 이미지 태그 설정

docker login : registry 로그인

docker logout : registry 로그아웃

docker save : 이미지를 아카이브 파일로 저장

docker load : 아카이브 파일을 이미지로 로드 

docker export : 이미지 내보내기

docker import : 이미지 가져오기

 

우선 컨테이너를 다운로드 하기 전 docker 명령어를 통하여 컨테이너를 검색해보겠습니다.

docker 공식문서에는 docker search를 이용하여 이미지를 찾는다고 나와있습니다. 

( 이때 docker hub에 올라와있는 container만 검색이되고 다른 aws gallery같은 곳에 올라와있는 것은 검색이 안됩니다. )

 

우선 busybox와 nginx 웹서버 컨테이너를 다운받아서 실행하도록 하겠습니다.

 

 

보시면 특이하게 busybox앞에 슬래시와 이름이 있는 컨테이너를 보실 수 있는데 찾아보니 개인이 만든 컨테이너라고 합니다.

docker hub에 가보시면 offical option에 해당되는 것들은 안전하니 그것을 다운로드 받아 주시면 될 것 같습니다.

( 개인이 업로드한 컨테이너는 안에 무엇이 들어있을지 모르니 위험할 수도 있습니다. )

 

전에 수많은 레이어들이 overlay되면서 유니언 파일 시스템으로써 하나처럼 보여지는데 이때 overlay에 그 정보가 담깁니다.

우선 overlay안에 뭐가 들어있는지 확인해보면 아무것도 없는게 보여집니다.

( 기본 데이터라 layer가 없습니다. )

 

다음으로 컨테이너를 다운받아줍니다.

( busybox는 layer가 하나라는 것을 알 수 있습니다. )

 

이번엔 overlay를 확인해주면 busybox( 레이어가 1개 = 해시값이 1개 )가 정상적으로 다운로드 되었으므로 busybox layer가 하나 있는 것이 확인됩니다. ( 하지만 이때 overlay 안에 항목들을 검색해서 볼때 해시값으로 어떤게 어떤 컨테이너인지는 판별이 불가합니다. )

 

다운로드 받은 항목을 확인해보면 busybox가 있는 것을 확인 할 수 있습니다. 

( 다운로드시에는 뒤에 특정 버전을 명시 안해주면 무조건 latest인 버전을 다운로드 받게 됩니다. )

 

 

다음으로는 nginx( 1.22, 1.25, latest 버전 ) 3개를 다운로드 받아보겠습니다.

 

1.22 버전은 레이어가 총 6개로 구성이 되었습니다.

그럼 아까 busybox의 레이어와 합치면 총 7개의 레이어가 있으므로 overlay항목에서 확인이 가능합니다.

 

1.25 버전과 latest 버전도 동일하게 다운로드 받아줍니다.

 

 

아까 터미널에서는 docker hub에 있는 컨테이너들만 검색이 된다고 했습니다.

하지만 aws gallery에 있는 컨테이너들도 다운로드 받을 수 있습니다.

( 검색은 직업 aws gallery에 들어가셔서 검색해주어야 하는 것 같습니다. )

 

 

apache 항목을 다운로드 받으려면 해당 항목의 다운로드 url을 복사하여 터미널에서 다운로드 받아줍니다.

 

다운로드 받은 항목들을 조회해보면 아까 다운받은 항목들이 다 있는것을 확인할 수 있습니다.

 

다운로드 받은 컨테이너의 세부정보를 보고싶다면 아까 있었던 inspect를 사용하여 확인이 가능합니다.

( 세부 정보들은 json 형태로 나와주게 됩니다. )

 

다음으로는 안쓰는 컨테이너들을 삭제해 주겠습니다

현재 nginx 1.22, 1.25, busybox, apache를 삭제해주도록 하겠습니다.

 

 

그리고 nginx의 history를 보게되면 맨 아래에 메모리를 차지하고있는 것이 base image가 들어가있는 곳입니다 ( 이것이 바로 컨테이너 이미지가 들어가있는 곳입니다. )

보시면 아래에서 위로 동작되도록 만들어졌다고 알 수 있습니다. ( bash 로 실행되고 > 레이블을 집어넣고, 환경 변수를 집어넣고 등등 마지막으로 컨테이너가 러닝될때 저런 애플리케이션이 동작되도록 만들어졌습니다. )

즉, history는 이 컨테이너가 어떻게 만들어졌는지 무슨일을 하는지 대략적으로 알 수 있습니다.

 

컨테이너 괸리, 조작

 

만약 컨테이너를 create 하게되면 컨테이너 레이어가 생성되어서 만약 이걸 실행시킨다면 격리된 공간에서 프로세스로 동작하게됩니다.

 

컨테이너를 create하게 되면 컨테이너 레이어가 만들어지고 ( 기존 컨테이너 image + rw를 지원해주는 컨테이너 레이어 )

그리고 이것을 실행하게되면 호스트입장에서는 격리된 공간에서 하나의 프로세스로 동작을 해주게됩니다.

그리고 동작을 하다가 중지를 하게 되면, 그 프로세스가 stop이 되고, 컨테이너를 삭제하게되면 컨테이너 layer가 삭제되게 됩니다. (컨테이너 image는 삭제되지않습니다. )

 

그럼 실제로 rw 레이어가 하나 더 생기는지 nginx를 create해서 확인해보겠습니다.

T2 터미널을 하나 더 띄워 줍니다.

그리고 overlay에 들어가서 layer의 갯수를 확인해주면 7개인 것을 확인해줄 수 있습니다. ( 이게 image layer )

 

그럼 이제 기존 터미널로 돌아가서 web이라는 이름으로 nignx:latest 컨테이너를 실행 해줄 것입니다.

 

 

레이어가 하나가 만들어 진 것을 볼 수 있습니다. 그럼 컨테이너 레이어가 만들어졌다는 소리인데

확인해보면 기존 7개에서 한개가 더 만들어져서 8개가 된것을 볼 수 있습니다.

( 새로만들어진 레이어만 read write레이어 이며, 다른 레이어들은 모두 readOnly입니다. )

 

현재까지 컨테이너를 만들어주었는데 그럼 docker ps -a 명령어를 통하여 모든 컨테이너 리스트를 출력해보도록 하겠습니다. 

( docker ps 는 현재 동작되고있는 컨테이너를 출력하는 것 )

 

 

그럼 아까 지정해줬던 이름이 web이니 docker start web을 통하여 도커 컨테이너를 실행시켜주도록 하겠습니다. (컨테이너 id를 써도 무방합니다. )

 

 

컨테이너들은 자기들마다 ip 주소를 가지고 있습니다.

 

이것을 확인해주기위해

inspect를 통하여 동작중인 컨테이너 이름을 통해 세부 정보를 봐줍니다.

 

그럼 동작중인 컨테이너의 세부정보중 ip 주소를 확인할 수 있습니다.

 

 

그럼 해당 주소에 접속을 해주게되면 이렇게 nginx를 사용해줘서 고맙다는 웹사이트를 볼 수 있습니다.

 

그리고 실행중이던 컨테이너를 stop을 통해 중지시켜주면 컨테이너를 중지되고, 컨테이너 레이어를 create한 시점과 동일해지게 됩니다.

 

당연히 사이트도 접속이 안되고 동작중이지도않고, 컨테이너 리스트를 확인해보면 정상적으로 나가졌다는(0 : 숫자 0이면 정상적으로 종료되었다는 의미입니다. ) 상태가 뜨게됩니다.

 

마지막으로 컨테이너를 삭제 해줍니다.

그러면 아까 말씀드렸던것같이, 컨테이너 이미지들을 남아있고 아까 create 시 생성되었던 컨테이너 레이어만 사라졌다는 것을 볼 수 있습니다. ( 데이터들도 컨테이너 레이어가 삭제될때 다 삭제되므로 컨테이너 데이터는 임시적인 성향을 가지고 있다고 볼 수 있습니다. )

 

 

다른 방법으로 컨테이너 실행

 

docker run 명령어는 컨테이너를 다운로드받는 pull, 컨테이너 만드는 create, 컨테이너를 실행하는 start 명령이 다 합쳐져 있습니다.

(서비스 데몬을 실행할땐 꼭 -d 명령어를 붙혀서 실행시켜주어야합니다. )

 

명령어들을 통해 잘 돌아가고있는걸 확인할 수 있습니다.

 

컨테이너 안에 shell 명령어를 통해서 컨테이너 내부로 들어가보기

 

docker exec <option> container_name

저희는 web이라는 컨테이너 내부에서 /bin/bash라는 명령어를 실행시켜주고싶기에

docker exec -it web /bin/bash  ( 쉘 명령어를 넣어줄땐 반드시 -it 처럼 i와 t옵션을 넣어주어야 합니다. -i -t 해도됩니다. )

 

이렇게 컨테이너 내부로 들어와줍니다.

 

 

hostname과 ip 주소도 확인이 가능합니다.

 

추가적으로 컨테이너 실행시 세부 정보에 ip 주소가 나온다했는데 해당 주소로 들어가면 nginx 관련 html 이 실행되었습니다.

해당 파일은 사용자가 직접 저장한 경로에 있으므로 해당 파일을 확인해보도록 하겠습니다.

 

echo 명령어를 통해 수정해보도록 하겠습니다.

 

exit로 나가줍니다.

 

 

그럼 이제 david server라는 문자가 있는 index.html 파일을 만들어서 그것을

컨테이너 내부로 복사해서 접어넣어보도록 하겠습니다.

잘 나오는것을 볼 수 있습니다.

 

컨테이너 내부에 로그들도 볼 수 있습니다.

 

변경된 파일 목록들도 볼 수 있습니다.

 

c: 체인지된것, a: add된것

 

근데 여기서 실행중인 컨테이너를 종료해주기위해 rm 명령어로 종료를 하려했는데 에러메세지가 뜹니다.

실행되고있는 컨테이너를 rm 을 못하기에 stop먼저 시켜주고 rm 명령어를 해주어야합니다.

그럼 삭제되었으니 컨테이너 레이어도 사라지고 아까 수정했던 파일들도 다 사라집니다.

(아까 말했듯이 컨테이너 데이터는 임시적입니다. )

 

busybox를 docker run 해줍니다 foreground 실행

 

안에서 ls /bin 명령어를 통해 여러 명령어들이 확인이 가능하고 exit를 통해 나가줍니다

(컨테이너를 멈추는것 )

 

 

그럼 정상적으로 종료가 되었는게 보이고 rm을 통해 컨테이너를 삭제해주겠습니다.