Docker

Docker CLI

ImJaeOne 2025. 5. 30. 15:57

dockerhub은 이미지를 저장 혹은 다운로드 할 수 있는 저장소이다.

원하는 이미지를 dockerhub에서 다운 받아 보자.

이미지는 nginx로 진행하겠다. nginx를 검색하면 tag를 확인할 수 있는데, 이는 버전이라고 보면 된다.

이미지

이미지 다운로드

$ docker pull nginx:stable-alpine3.19-perl

위와 같이 "이미지명":"tag명"으로 특정 버전의 이미지를 다운 받을 수 있다.

tag명을 명시하지 않을 경우 자동으로 latest 버전으로 다운 받아진다.

이미지 조회

$ docker image ls

이미지 삭제

$ docker image rm 016d

위와 같이 image id를 통해 삭제할 수 있다. image id의 전부를 입력하지 않고 일부만 입력해도 삭제 가능하다.

컨테이너를 실행시키고 있지 않더라도 컨테이너가 해당 이미지를 사용하고 있을 경우 삭제가 불가능하다.

이럴 경우 rm -f를 통해 강제로 삭제시킬 수 있다.

이미지 전체 삭제(컨테이너에서 미사용 중인 모든 이미지)

$ docker image rm $(docker images -q)

하나의 이미지만 삭제하는 명령어와 같이 컨테이너에서 사용 중인 모든 이미지를 지우려면 rm -f로 명령어를 실행시키면 된다.

컨테이너

컨테이너 생성

$ docker create nginx

컨테이너 실행

$ docker start 21a

위와 같이 container id의 일부를 통해 컨테이너를 실행할 수 있다.

기존 created였던 status가 up으로 변경된 것을 확인할 수 있다.

 

그렇다면 컨테이너를 생성하기 위해선 내 로컬 환경에 이미지가 존재해야할까?

내 로컬에 없는 mysql로 컨테이너를 생성해보자.

$ docker create mysql

docker에서 로컬 환경에 mysql이라는 이미지가 없다는 것을 확인하면 자동으로 최신 버전의 이미지를 다운 받은 후 컨테이너를 생성한다.

실행 중인 컨테이너 조회

$ docker ps

모든 컨테이너 조회

$ docker ps -a

하지만 현업에서 컨테이너를 생성하고 실행하는 명령어를 각각 칠 경우는 드물다.

이 두가지의 동작을 합친 명령어가 있다.

$ docker run nginx

이미지가 없다면 다운부터 컨테이너 생성, 실행까지 한 번에 실행시켜주는 명령어다.

 

이제 컨테이너를 백그라운드에서 실행시켜보자.

넘어가기 전 포그라운드(foreground)백그라운드(background)의 차이를 짚고 넘어가자.

foreground: 내가 실행시킨 프로그램의 내용이 화면에서 실행되고 출력되는 상태

위는 docker run nginx 명령어를 실행시킨 결과이다.

보다시피 foreground 상태에서는 다른 프로그램을 조작할 수 없다.

대신 실시간으로 프로그램이 어떻게 실행되고, 어떤 로그들이 출력되는지 실시간으로 확인할 수 있다.

background: 내가 실행시킨 프로그램이 컴퓨터 내부적으로 실행되는 상태

foreground와 다르게 컴퓨터 내부적으로 실행되고 있기 때문에 다른 명령어를 추가로 입력하거나, 새로운 프로그램을 조작할 수 있다.

컨테이너를 백그라운드에서 실행

$ docker run -d nginx

컨테이너를 실행시키고 있지만 다른 행동이 가능한 것을 확인할 수 있다.

컨테이너 네이밍 후 실행

$ docker run -d --name my-web-server nginx

그럼 해당 컨테이너가 실행되고 있는지 localhost:80을 통해 알아보자.

브라우저에 캐싱된 값으로 컨테이너가 실행될 수 있으니 시크릿 탭을 이용해 실행해보는 것을 추천

왜 브라우저에서 확인할 수 없을까?

컨테이너는 독립적인 환경이다. 따라서 이 컨테이너는 직접적으로 호스트의 포트에 노출되지 않는다.

따라서 호스트의 포트에 컨테이너의 포트를 매핑하는 작업이 필요하다.

$ docker run -d -p 4000:80 nginx

호스트의 4000번 포트에 컨테이너의 80번 포트를 매핑하고 실행한 명령어이다.

 

여기서 의문점....

$ docker run -d -p 80:80 nginx

이전 docker 전체 흐름 느껴보기 강의에서 호스트의 80번 포트에 컨테이너의 80번 포트를 매핑하여 실행한 경우가 있었는데, 하나의 포트에 2개의 서비스가 할당되는 것이 가능한가...?

"도커 내부에서 제공하는 80번 포트와 내 로컬의 80번 포트를 매핑했을 뿐"

컨테이너 안은 독립적인 가상 환경이기 때문에 80번 포트를 중복해서 사용할 수 있다.

하지만 호스트 컴퓨터의 포트는 중복되면 안된다.

 

다음으로 그럼 백그라운드에서 실행되는 컨테이너는 로그를 확인할 수 없을까?

백그라운드에서 실행된 컨테이너 로그 확인

$ docker logs 3400

로그 일부 확인

$ docker logs --tail 3400

로그 실시간 확인(이전 로그 포함)

$ docker logs -f 3400

해당 포트로 접속한 로그가 실시간으로 출력되는 것을 확인할 수 있다.

로그 실시간 확인(현재부터)

$ docker logs --tail 0 -f 3400

중지된 컨테이너 모두 제거

$ docker rm $(docker ps -qa)

 

이제 컨테이너 내부에 접속하고 파일을 열어보자.

컨테이너 내부 접속

$ docker exec -it 72d2

내부에 접속해 해당 파일까지 확인할 수 있다.