본문 바로가기

CI-CD/Docker

Docker- 명령어

설치

$ brew install --cask docker

버전 확인

$ docker -v // 도커 버전확인

컨테이너 실행하기

$ docker run -i -t ubuntu:22.04 //ubuntu 컨테이너 생성 및 컨테이너로 들어옴
$ docker run -i -t -d --name=myweb ubuntu  // -d 옵션을 통해서 백그라운드에서 실행
                                           // --name으로 container 이름을 지정

run 명령어를 사용할 때는 반드시 -i -t 명령어를 사용해야지 run 명령어를 정상적으로 사용할 수 있다.

 

run 명령어로 컨테이너를 실행하고 나면 root@375ad454f161:/# 처럼 사용자 명이 변경된다. 컨테이너에서 기본 사용자는 root이고 호스트 이름은 무작위 16진수 해시값이다.

그리고 이 해시값은 컨테이너의 고유한 ID의 앞 일부분으로 여기서는375ad454f161이 해당한다.

 

run 명령어는 pull, create, start 명령어를 일괄적으로 실행한 후 attatch가 가능한 컨테이너라면 컨테이너 내부로 들어간다.

 

 - 옵션

옵션 설명 예시
-i 상호입출력 -it
-t tty를 활성화해서 shell을 사용하도록 컨테이너를 설정  
-d detached mode. 컨테이너를 백그라운드에서 실행  
-p 호스트와 컨테이너의 포트를 포트포워딩. -p8000:80
-v 볼륨과 컨테이너 디렉토리를 마운트 -v volume
--name 컨테이너 이름을 명시 --name my_container
-rm 프로세스 종료시 컨테이너 자동 제거  
-link 컨테이너 연결. ip가 아닌 컨테이너 이름 기반 통신 가능  
--network 브릿지 네트워크에 연결 --network my_network

 

- 실행과 동시에 포트포워딩

$ docker run -itd --name=mynginx -p9000:80 nginx:latest
  • -p[host port#]:[container port#]: host의 포트번호와 컨테이너의 포트를 포트포워딩을 통해서 연결한다. 결론적으로 host의 포트로 들어온 트래픽을 컨테이너로 전달하게 된다.

nginx:latest 이미지를 run함과 동시에 호스트의 9000번 포트와 컨테이너의 80번 포트를 포트 포워딩 하는 예시이다.

 위의 예시에서는 포트포워딩을 통해서 호스트의 9000번 포트로 들어온 모든 트래픽이 컨테이너의 80번 포트로 연결된다. nginx 웹서버는 80번 포트에서 동작하므로 호스트의 9000번 포트를 통해 nginx 서버에 접근할 수 있게 된다.

 

주의점)

 참고로 하나의 포트에서는 하나의 프로세스만 실행이 가능하므로 위처럼 이미 호스트의 9000번 포트를 사용하고 있는 경우에 다른 프로세스를 또 다시 9000번 포트에서 실행시키려고 하면 conflict가 발생한다. 따라서 다른 컨테이너를 같은 호스트에서 사용하고 싶다면 9000번이 아닌 다른 포트 번호를 사용해야한다.

- docker run 명령어 실행 시 permission denied가 발생하는 경우

permission denied

docker run 명령어 실행시 permission denied가 발생하며 명령이 실행되지 않을 수 있다.

이 경우 해당 소켓을 사용하기 위한 권한이 부여되지 않았기 때문이다. 이 경우 docker 그룹에 유저를 추가함으로써 해당 문제를 해결할 수 있다.

$ sudo usermod –a –G docker $USER  // 현재 유저를 docker 그룹에 추가함

만일 그룹들을 확인하고 싶다면 아래 명령어를 사용해서 그룹 목록을 확인할 수 있다.

$ cat /etc/group  // 그룹 목록 확인하기

이런 식으로 그룹 목록이 표시된다. 이때 그룹이 docker:x:122:ubuntu와 같은 식으로 표현되는데,

  • docker: 그룹 이름
  • x: 그룹 비밀번호 (과거에는 x 대신 비밀번호가  저장되었으나 현재는 대부분 x로 표시되고 비밀번호는 /etc/gshadow 파일에 별도로 저장된다)
  • 122: 그룹 고요 식별번호, Group ID. 각 그룹은 고유한 Group ID를 갖는다.
  • ubuntu: 해당 그룹에 속한 사용자 이름. (나는 ubuntu라는 사용자 명으로 sudo usermod -a -G docker $USER 명령어를 사용해서 ubuntu라는 유저이름으로 docker에 속했다.)

컨테이너 빠져나오기

- exit

컨테이너에서 빠져나가기 위해선 exit 명령어로 호스트의 도커환경으로 돌아갈 수 있다.

root@375ad454f161:/# exit  // 컨테이너
exit
$   // 호스트

그런데 exit 명령어를 사용하게 되는 경우 컨테이너를 내부에서 빠져나오면서 동시에 컨테이너를 정지시킨다.

- Ctrl + P + Q

컨테이너를 종료하지 않고 단순히 컨테이너에서 빠져나오기만 하기위해선 Ctrl+P, Q를 사용한다.

도커 이미지 확인하기

$ docker images

REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
ubuntu       22.04     2b7cc08dcdbb   13 days ago   69.2MB
centos       7         c9a1fdca3387   2 years ago   301MB

내가 다운받은 image들을 확인할 수 있다.

컨테이너 목록확인

$ docker ps // 정지되지 않은 컨테이너 출력
$ docker ps -a // 모든 컨테이너 출력

ps 명령어를 통해서는 컨테이너 목록을 확인할 수 있다. 컨테이너의 상태는 STATUS 항목에서 확인할 수 있다.

$ docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED              STATUS                           PORTS     NAMES
28f3e5932dec   ubuntu:22.04   "/bin/bash"   About a minute ago   Up About a minute                          intelligent_greider
71350e8e42f6   centos:7       "/bin/bash"   About an hour ago    Exited (137) About an hour ago             nice_lederberg

ubuntu의 경우 Up ..으로 실행되고 있고, centos의 경우 Exited로 종료된 상태이다. 

  • CONTAINER ID : 컨테이너에 자동으로 할당되는 고유한 ID이다.
  • IMAGE :  해당 컨테이너의 이미지
  • COMMAND : 컨테이너가 시작될 때 실행될 명령어. ubuntu, centos에는 /bin/bash가 내장되어 있어 컨테이너가 시작될 때 /bin/bash 명령어가 실행되었으므로 상호 입출력이 가능한 셸환경의 사용이 가능하다.
  • CREATED : 컨테이너 생성 시점을 표시한다.
  • STATUS : Up ...은 현재 실행 중임을 나타내고, Exited ...은 종료되었음을 나타낸다.
  • PORTS : 포트번호
  • NAMES : 해당 컨테이너의 이름이다. 따로 생성시 명시하지 않는다면 자동으로 생성된다.

실행중인 컨테이너에 명령어 전달하기

# docker exec -i -t [컨테이너 ID | 컨테이너 이름] [커멘드]

현재 실행 중인 프로세스에서 새로운 프로세스를 실행하는 경우에 exec 명령어를 사용한다. 이 경우 터미널 세션을 연결하지 않고 새로운 명령을 실행하는 결과를 보여주기 때문에 exit을 해도 현재 컨테이너는 종료되지 않는다. 

(실행중인 프로세스 내부에서 새로운 프로세스를 실행함.)

ubuntu@ip-172-31-6-154:~$ docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED       STATUS       PORTS     NAMES
1f235f8a631b   ubuntu    "/bin/bash"   3 hours ago   Up 3 hours             nice_diffie
ubuntu@ip-172-31-6-154:~$ docker exec -i -t nice_diffie bash  //exec 명령 실행
root@1f235f8a631b:/#  // ubuntu 컨테이너 내부로 들어옴.

컨테이너 종료하기

$ docker stop [Container ID] // 현재 하고 있는 작업을 마무리하고 안전하게 컨테이너 종료
$ docker kill [Container ID] // 컨테이너 강제 종료

컨테이너를 종료하는 방법은 두가지가 있다. docker ps를 통해서 container id를 조회한 후 stop 혹은 kill 명령어로 컨테이너를 종료하면 된다. 이때 stop이 좀 더 안전한 방법이다. stop은 종료까지 좀 시간이 걸리지만 kill은 프로세스를 즉시 종료시켜 좀 더 빨리 종료된다.

컨테이너 삭제하기

$ docker rm [컨테이너명]
$ docker rm -f $(docker ps -qa) // 컨테이너 전체 삭제

컨테이너 이름 변경

$ docker rename [기존이름] [변경할 이름]

이미지 삭제하기

$ docker rmi [컨테이너 id]
$ docker rmi [컨테이너 id1],[컨테이너 id2], ...
$ docker rmi -f $(docker images -qa) # 이미지 전체 삭제

컨테이너 커밋 후 푸시

 - Commit

$ docker commit [컨테이너명 | 컨테이너 ID] [옵션] dockerhub계정명/이미지 이름:tag
$ docker commit myweb -m "this is commit message" ricecakessamanko/dockerpractice:latest 
// myweb 컨테이너를 dockerhub에 ricecakessamanko/dockerpractice라는 이름의 image로 올리기 위해 commit

커밋하여 docker 컨테이너를 이미지로 만든다. 도커 컨테이너의 현 상태를 백업하는 용도로도 사용할 수 있다.

 - Push

$ docker push [커밋한 이미지 이름] 
$ docker push ricecakessamanko/dockerpractice:latest

push 할 때, "denied: request access to the resource is denied" 에러가 발생시 "docker login"으로 로그인 진행 후 다시 push를 진행한다.

정보 확인하기

$ docker inspect [이미지|컨테이너|볼륨|네트워크]

Volume 관련 명령어

 - volume 생성

$ docker volume create [볼륨명]

 - volume 목록 확인

$ docker volume ls

 - volume 정보 확인

$ docker volume inspect [볼륨명]

 - volume 제거

$ docker volume rm [볼륨명]

 - 사용하지 않는 volume 제거

$ docker volume prune

 

'CI-CD > Docker' 카테고리의 다른 글

Docker- Docker Compose  (0) 2024.04.17
Docker- Docker file  (0) 2024.04.16
Docker- redis 실행  (0) 2024.04.14
Docker -컨테이너와 이미지  (0) 2024.03.12
Docker- 기본 개념 정리  (0) 2023.09.03