Docker 기본

ekgns0508·2024년 1월 18일

Docker

목록 보기
1/5

목차

  1. 도커 이미지 삭제하기
  2. 도커 컨테이너 실행하기
  3. 포트 포워딩
  4. 도커 이미지 한번에 삭제하기
  5. -dit옵션과 attach 명령어
  6. exec -it
  7. volume
  8. docker commit 이미지 굽기와 docker hub 업로드

도커 이미지 삭제하기

Docker Hub 사이트에서 Ubuntu를 검색한후 Docker Official Image 마크가 붙어 있는 이미지로 들어간다.

오른쪽 위에 해당 도커 이미지를 다운받을 수 있는 명령어를 제공한다.

터미널에 복사한 명령어를 붙여넣고 실행하면 도커 이미지를 다운받는다. docker images 명령어를 통해 다운받은 도커 이미지가 목록에 있는지 확인해보자.

원하는 도커 이미지의 원하는 버전을 다운받아보자. Tags 탭에 들어가서 원하는 버전을 검색하면 해당 버전을 다운받을 수 있는 명령어를 제공해준다. 똑같이 복사 후 터미널에 입력해 다운받아준다. 마찬가지로 docker images 명령어를 통해 이미지가 성공적으로 다운됬는지 확인한다.

현재 도커 이미지 목록에는 똑같은 이름(ubuntu)의 이미지가 다른 버전으로 하나씩 존재할 것이다. 이제 다운받은 이미지들을 삭제해보자.

이미지를 삭제하는 명령어는 docker rmi {이미지명} 이다. 하지만 현재 같은 이름의 이미지가 2개가 존재하므로 원하는 이미지를 삭제하기 위해서는 이미지명 대신 image id를 입력해준다.

docker images 를 통해 삭제가 완료됬는지 확인한다.


❓ 도커 이미지를 실행한적 있는 경우

도커 이미지를 컨테이너로 실행한적이 있고 docker rmi 명령어를 통해 삭제를 시도할경우 아래와 같은 문구를 맞이할 것이다.

이는 도커 이미지가 컨테이너로 실행중이기 때문에 중지를 시킨 후 삭제를 시도해야 한다. docker ps 를 통해 실행중인 도커 컨테이너 목록을 확인한 후 삭제하려는 이미지의 컨테이너를 중지시킨다.

docker stop {컨테이너 번호} 명령어를 통해 중지시키고 docker rmi 명령어를 통해 이미지를 다시한번 삭제해보자.

아마 똑같은 에러가 나올 것이다. 도커 컨테이너는 실행중지를 시키더라도 중지된 컨테이너 프로세스가 메모리를 할당하고 있기 때문에 삭제가 안되는 것이다.

이번에는 docker ps -a 명령어를 사용해서 모든 프로세스를 찾아보자. 아까 실행중지시킨 도커 컨테이너가 리스트에 포함되어 있다. 해당 프로세스를 docker rm {컨테이너 아이디} 를 통해 삭제시키자.

이후에 도커 이미지 삭제를 시도해보면 정상적으로 삭제가 된다.


명령어 정리

# 도커 이미지 목록
$ docker images

# 도커 이미지 삭제
$ docker rmi {image id 혹은 이미지 이름}

# 실행중인 도커 컨테이너 목록
$ docker ps

# 모든 도커 컨테이너 목록 (중지된 컨테이너 포함)
$ docker ps -a

# 도커 컨테이너 중지
$ docker stop {컨테이너 아이디}

# 도커 컨테이너 삭제
$ docker rm {컨테이너 아이디}

컨테이너 실행하기

다운로드 받은 이미지들을 컨테이너로 실행시켜보자. 이미지는 tomcat을 다운받아 사용하였다.

# tomcat 컨테이너 포그라운드로 실행 
$ docker run tomcat

# 실행중인 컨테이너 목록
$ docker ps

docker run {이미지} 를 통해 이미지를 컨테이너로 실행시켜본다. docker ps 명령어를 통해 실행중인 프로세스를 확인해보면 8080 포트로 Tomcat 서버가 실행중인것을 볼 수 있다. 하지만 localhost:8080 으로 접속을 해보면 접속이 불가능하다.

이는 현재 내 로컬 pc의 8080 포트로 접속을 시도하고 도커로 실행시킨 톰캣 서버로 접속을 시도한 것이 아니기 때문이다.

때문에 톰캣 서버로 포트 포워딩을 해야 접속할 수 있다.

# 백그라운드 실행
$ docker run -d tomcat

docker run 명령어로 톰캣을 실행했다면 포그라운드로 실행되므로 사용하고 있는 터미널에서 다른 작업이 불가능하다.

-d 옵션을 사용하면 백그라운드로 실행시킬 수 있다.

포트 포워딩

로컬호스트의 8080포트로 원하는 서버를 가동하고 싶다면 포트 포워딩을 해줘야 한다. httpd, Nginx 서버를 이용해서 포트 포워딩을 시도해보자.

(1) httpd 서버 포트 포워딩

먼저 도커 허브에서 httpd 이미지를 다운받고 톰캣서버가 실행중이라면 중지 시켜준다.

$ docker run -d -p 8080:80 httpd

위 명령어는 로컬호스트의 8080 포트를 httpd가 설치된 컨테이너의 80 포트로 포워딩 시켜 백그라운드로 실행한다는 뜻이다.

이제 localhost:8080 로 접속해보면 컨테이너의 80포트로 접속을 시도하므로 동작하는 것을 확인할 수 있다.



(2) Nginx 서버 포트포워딩

$ docker run -d -p 8081:80 nginx

이번에는 Nginx 이미지를 다운받지 않고 바로 위 명령어를 실행시켜본다.

만약에 이미지가 설치되어 있지 않다면 Nginx 이미지를 다운받고 실행까지 시켜준다. 로컬호스트의 8081 포트를 컨테이너의 80 포트로 포트 포워딩 시켜준다.

localhost:8081로 접속해보면 마찬가지로 정상적으로 실행된것을 볼 수 있다.

이미지가 없을 때 run 명령어를 수행하면 이미지 다운로드도 같이 수행한다는 사실도 함께 알아볼 수 있다.

도커 이미지 한번에 삭제하기

도커 이미지를 삭제하기 위해서 많은 명령어들을 사용해왔다.

  1. docker stop {컨테이너 아이디} : 실행중인 컨테이너 중지
  2. docker rm {컨테이너 아이디} : 종료된 컨테이너 삭제
  3. docker rmi {이미지 아이디 혹은 이미지 명} : 이미지 삭제

모든 이미지를 삭제하고 싶을 때 이 명령어들을 매 이미지 마다 수행하기에는 시간도 오래걸리고 복잡하다.

# 실행중인 컨테이너 아이디만 보기
docker ps -q

# 모든 컨테이너 아이디만 보기
docker ps -a -q

# 1. 모든 실행중인 컨테이너 중지
docker stop $(docker ps -q)

# 2. 모든 컨테이너 삭제
docker rm $(docker ps -a -q)

# 3. 모든 이미지 강제 삭제
docker rmi -f $(docker images -q)

컨테이너를 조회할 때 -q 옵션을 사용해서 컨테이너의 아이디만을 추출해올 수 있다.

이를 이용해서 docker stop, docker rm, docker rmi -f 명령어 뒤에 -q 옵션으로 조회한 내용을 전달해 모든 컨테이너 중지, 삭제 및 이미지들을 삭제할 수 있다.

-dit 옵션과 attach 명령어

httpd나 Nginx 서버 같은 경우에는 실행시키면 계속 실행이 되는 데몬 프로세스이지만 우분투같은 os 컨테이너는 실행하자마자 중단된다.

docker run -d --name myubuntu ubuntu 명령어를 통해 (이미지를 다운받지 않은 상태) ubuntu를 다운받고 --name 옵션을 이용해 ‘myubuntu’라는 이름의 컨테이너로 실행시켜보자.

docker ps를 통해 실행중인지 살펴보면 정작 myubuntu라는 이름의 ubuntu 도커 컨테이너는 목록에 보이지 않는다. docker ps -a 를 통해 살펴보면 종료된 컨테이너로 뜨게 된다.

만약 우분투 컨테이너를 계속 실행되게끔 하고 싶다면 docker run -dit --name myubuntu ubuntu 명령어를 사용하면 된다.

  • -d 옵션 : 백그라운드로 실행
  • -i 옵션 : 컨테이너와 상호작용할 수 있는 대화형 모드로 실행한다.
  • -t 옵션 : 터미널을 할당한다.

터미널을 할당해줬으니 우분투 컨테이너에 터미널을 이용해서 접근이 가능해졌다.

docker attach {도커 컨테이너 아이디} 로 우분투 서버에 터미널로 접속할 수 있다.


exec -it

우분투 컨테이너는 attach 명령어로 터미널에 접근할 수 있다.

하지만 httpd, nginx 같은 서버는 attach 명령어로 접근하지 못한다. 이런 웹 서버 컨테이너는 exec 명령어로 터미널에 접근할 수 있다.


$ docker run -dit -p 8080:80 --name httpd-server httpd

$ docker exec -it {containerId} bash

위와 같이 서버를 실행시키고 exec -it 명령어로 bash 터미널에 접근할 수 있다.


volume

httpd 서버에 접속을 하면 화면에 It Works! 라는 문구로 정상적으로 접속이 됬음을 확인시켜준다.

이 문구를 바꾸고 싶다고 가정해보자. 이 화면을 보여주는 파일은 /usr/local/apache2/htdocs 경로에 index.html 파일로 존재한다.

하지만 해당 경로에 접근해서 sudo vi index.html, vi index.html 명령어를 통해 수정을 시도해봐도 작동하지 않는다.

다른방법을 한번 써보자.


$ docker run -d -p 8080:80 -v {내가 연결할 로컬 경로}:{htdocs 경로} httpd

이렇게 -v 옵션을 통해서 내 로컬 pc의 경로와 httpd의 경로를 연결할 수 있다.

내가 지정한 로컬 경로에 index.html 파일을 생성하고 디자인한 후 다시 8080포트로 접속해보면 반영이 되있다.

만약 내 로컬 경로에 다른 파일들도 생성한다면 /usr/local/apache2/htdocs 경로에도 똑같은 파일이 생기게 된다. (일종의 링크 개념이라고 생각하면 된다.)


docker commit 이미지 굽기와 docker hub 업로드

docker 이미지를 굽고 본인 도커 허브의 저장소에 업로드하는 방법을 알아본다.

1. 도커허브에 저장소 생성하기

도커 허브에 회원가입을 한 상태라면 create repository를 통해서 본인 계정의 저장소를 생성할 수 있다.

여기서는 vim-ubuntu 라는 이름의 저장소를 생성했다.


2. 도커 이미지 굽기

  1. ubuntu 컨테이너를 생성 후 터미널로 접속 (attach 명령어)
  2. sudo apt update
  3. sudo apt install vim
  4. sudo mkdir ubuntu 후 경로 이동
  5. sudo vi hello 후 원하는 문자열 입력

위 과정을 통해 내 우분투 서버에 vim을 설치하고 hello라는 파일을 생성했다. (도커 허브에 올리고 다운받았을 때 똑같이 구성되어있는지 확인하기 위함이다.)


$ docker commit {container id} {docker hub 아이디}/{저장소 이름}:{태그}

docker commit 명령어를 통해 내 도커 허브 저장소에 이 컨테이너를 푸시하기 위해 도커 이미지를 구울 수 있다.


$ docker push {image명}

docker push 명령어를 통해 방금 구운 도커 이미지를 내 저장소에 푸시(업로드)한다.


3. 도커 허브 저장소에 업로드한 내 이미지 다운받기

이제 내 도커 허브를 확인해보면 방금 푸시한 이미지가 생긴다.


$ docker pull {이미지명}

평소에 이미지를 다운받은 것과 같이 docker pull 명령어를 통해 내가 올린 저장소의 이미지를 다운받고 우분투 컨테이너를 실행시킬 수 있다.


메타코딩 유튜브의 Docker 강의를 듣고 요약한 내용입니다. (강의 적극 추천)

0개의 댓글