Docker의 기본적인 용어 정리
Updated:
Docker의 기본적인 용어 정리
공부한 링크 : https://www.notion.so/b67ed727aea4467cbc3226bb0c8e8336
해당 유튜브 동영상도 있으니 추천드립니다!
도커가 무엇인지 어떠한 장점이 있는지 등에 대한 내용은 위의 링크를 참고하시길 바랍니다! 저는 이번에 docker의 기본적인 명령어를 정리해보도록 하겠습니다.
Docker의 기본적인 flow
흐름은 git과 유사하다는 생각이 들었습니다. 그래도 개념적인 면에서 다르니 같은 것이라 생각하시면 안 됩니다.
도커는 Registry라는 저장소에 있는 이미지(only read만 할 수 있는 설명서?)를 받아 내가 만든 컨테이너에서 동작시키는 것이라고 저는 이해했습니다!
Registry는 docker hub라는 사이트가 대표적인 것 같아요. offical도 있고 일반 사용자가 올린 image들도 있습니다. 이 registry에서 image를 받아오는 것을 pull이라고 해요. 명령어는 아래와 같습니다.
sudo docker pull image_name
pull한 이미지를 삭제하려면 아래의 명령어를 사용합니다. remove image를 줄여 rmi라고 합니다. 만약 container가 떠있어서 이미지가 삭제되지 않는 경우 -f
를 뒤에 추가하면 삭제가 가능합니다.
sudo docker rmi image_name
sudo docker rmi image_name -f
내가 지금 무슨 이미지들이 있는지 확인하는 명령어는 아래와 같습니다.
sudo docker images
이제 컨테이너를 만들어야겠죠. 방법은 2가지가 있습니다. run 명령어와 create, start 명령어입니다. 무슨 차이가 있느냐? run은 컨테이너를 만들고(create) 실행(start)하는 것을 동시에 수행합니다. 만약에 이미지를 pull하지 않은 상태라면 image pull, container create, container start를 수행합니다. 한번에 수행해주니 간편하다는 장점이 있지만 만약 이미 container를 만든 상태라면 해당 container가 아닌 새로운 container를 만들게 됩니다. 즉 명령어를 사용할 때마다 container를 만들게 되는 것이죠. 그래서 처음에만 run을 사용합니다. run을 사용하는 명령어는 아래와 같습니다. -d
는 background 실행, -p
는 port forwarding이라는 의미입니다.
sudo docker run -d -p 80:8080 --name container_name image_name
80에 접속했을 때 해당 image의 8080으로 접속한다는 의마, 컨테이너의 이름을 따로 설정할거면 –name container_name을 위와 같이 추가로 넣으시면 됩니다. 그 뒤에 image_name을 적어줍니다. container를 시작하기 위해서는 위에 말씀드린 start 명령어를 사용하시면 됩니다. 이미 존재하고 사용했다가 껐던 container는 restart로도 사용이 가능합니다.
sudo docker start container_name
sudo docker restart container_name
컨테이너가 잘 있는지 확인하는 명령어는 아래와 같습니다. -a
를 붙이면 모든 container를 확인하고 붙이지 않으면 열려있는 컨테이너를 확인할 수 있습니다. -q
를 추가로 작성하신다면 id만 나오게 됩니다.
sudo docker ps -a
현재 돌아가는 container를 끄기 위해서는 stop
명령어를 사용합니다. 이때 이미지의 이름이 아닌 컨테이너의 이름을 적어야 하는 것을 주의해주세요. 만약 모든 container를 끄고 싶다면 위에 언급한 id를 출력하는 명령어를 container_name 대신에 넣어주면 됩니다.
sudo docker stop container_name
sudo docker stop 'docker ps -a -q'
container를 삭제하기 위해서는 무조건 stop
상태여야합니다. stop하지 않으면 삭제가 안됩니다.. 삭제 명령어는 remove의 rm 입니다. stop
과 마찬가지로 모든 container를 삭제할 때도 마찬가지입니다.
sudo docker rm container_name
sudo docker rm 'docker ps -a -q'
Docker 이미지 레이어 및 추가적인 명령어
sudo docker info
명령어를 통해 docker의 Dir를 확인할 수 있습니다. 해당 Dir로 들어가서 ls (폴더 확인)을 치면 여러가지 폴더들을 확인할 수 있습니다.
cd /var/lib/docker
<- docker Dir 예시입니다.
ls
builder builderkit containers image network overlay2 등등
위와같이 ls
를 입력하면 내가 받은 image는 image 폴더 안에, 만든 container는 containers 안에, image 안의 실질적인 정보들은 overlay2에 있습니다. 레이어가 무엇인지 모르신다면 위의 링크를 참고하시길 바랍니다!
image에 대한 size를 알려주는 명령어 : du -sh image
overlay2에 대한 size를 알려주는 명령어 : du -sh overlay2
containers에 대한 size를 알려주는 명령어 : du -sh containers
image의 내용을 확인하는 명령어 : sudo docker inspect image_name
이미지의 내용을 확인해보면 image의 id, 만든어진 시간, hostname, exposedports, 환경변수(Env), Cmd(어떠한 옵션을 줘서 실행할지), RootFS(파일시스템을 구성해주는 부분) 등이 있습니다. 참고로 여기서 해당 이미지가 어떠한 포트번호를 열고 있는지도 알 수 있습니다. 따라서 image를 pull한 이후 inspect 명령어를 통해 exposedports의 포트번호를 확인하고 run을 하면 명령어 내 -p xxxx:8000
에서 xxxx값을 알 수 있게 됩니다.
cd ./overlay2에 들어가보면 layerdb, imagedb 가 있습니다.
ls -R imagedb
를 쳐서 안의 내용을 확인해보면 정보들을 확인할 수 있습니다. layerdb
도 마찬가지입니다.
image 안에는 imagedb, layerdb가 있는데 imagedb는 layerdb에 대한 정보를 가지고 있고 layerdb는 overlay2에 대한 정보를 가지고 있습니다. 좀 복잡하네요..;; 또한 overlay2에 들어가면 변경된 정보가 들어가있는데 변경된 정보는 overlay2의 l 에 저장되어있습니다. 우리가 run이나 create를 하게 되면 이를 바탕으로 container를 만들어준다고 합니다!
레이어를 과하게 많이 받으면 데이터가 실제로 커지는 부분은 overlay2입니다! 위의 내용들은 단순히 이런식으로 동작을 하는 구나 정도로만 이해하셔도 될 것 같습니다.
유용한 명령어
컨테이너 내부가 어떻게 생겼는지 확인하는 명령어는 아래와 같습니다. it
는 input terminal을 열어달라는 의미입니다.
sudo docker exec -it container_name /bin/bash
위와 같이 경로를 설정하면 이 도커에 접속이 가능합니다. 접속을 하면 호스트의 이름이 바뀌는 것을 확인할 수 있습니다. container의 id가 그대로 들어간 것을 확인할 수 있습니다. 해당 container를 삭제하기 전까진 사용할 수 있습니다.
컨테이너의 log 확인하는 명령어는 아래와 같습니다. 여기의 log는 stdout이나 stderr가 보통 출력이 되는 것들이 보여집니다. program이 실행될 때 출력되는 부분들이 출력됩니다.
sudo docker logs container_name
호스트 및 컨테이너간의 파일복사가 가능합니다. 명령어는 아래와 같습니다. 컨테이너<->로컬 시스템간의 이동이 가능합니다. 앞에서 뒤로 복사한다는 의미입니다.
sudo docker cp <path> <to container>:<path>
sudo docker cp <from container>:<path> <path>
sudo docker cp <from container>:<path> <to container>:<path>
임시로 컨테이너 생성하는 방법은 –rm을 추가하면 container를 내리면 바로 삭제됩니다.
sudo docker run -d -p 80:8080 --rm --name container_name image_name
Leave a comment