[Docker] 명령어 (컨테이너, 이미지, Dockerfile, Compose )
Docker Hub
Docker Hub Container Image Library | App Containerization
Increase your reach and adoption on Docker Hub With a Docker Verified Publisher subscription, you'll increase trust, boost discoverability, get exclusive data insights, and much more.
hub.docker.com
[컨테이너 명령어]
- 컨테이너 생성
이미지가 로컬 PC에 있는지 확인 후 없다면 DockerHub에서 이미지를 다운로드하여 컨테이너 생성 ( 실행 x )
docker create [이미지 이름]
- 컨테이너 실행
docker start [컨테이너 아이디]
- 컨테이너 포그라운드 상태로 실행
포그라운드란 내가 실행시킨 프로그램의 내용이 화면에서 실행되고 출력되는 상태
하지만 실행시킨 프로그램을 실시간으로 출력(로그 등) 해야 하기 때문에 다른 명령어가 동작하지 않음
docker run [이미지 이름]
- 컨테이너 백그라운드 상태로 실행
-d 명령어를 사용하면 백그라운드 상태 적용
백그라운드란 내가 실행시킨 프로그램이 컴퓨터 내부적으로 실행되는 상태를 의미
어떻게 실행되는지 알 수 없음. 하지만 다른 명령어를 추가할 수 있음.
docker run -d [이미지 이름]
- 컨테이너에 이름을 직접 작성하여 생성 및 실행
docker run -d --name [붙이고싶은 컨테이너 이름] [실제 컨테이너이름]
- 호스트 컴퓨터와 포트 맵핑 후 실행
컨테이너는 호스트 컴퓨터 안에 미니 컴퓨터 이기 때문에 네트워크와 디스크가 독립적이다.
그렇기 때문에 호스트 컴퓨터에서 컨테이너에 접근하기 위해서는 포트 연결을 해줘야 한다.
docker run -d -p [호스트 포트]:[컨테이너 포트] [이미지 이름]
- 실행되고 있는 컨테이너 조회
docker ps
- 컨테이너 전체 조회
docker ps -a
- 컨테이너 중지
docker stop [컨테이너아이디] [...] [...]
- 컨테이너 강제 중지
docker kill [컨테이너 아이디]
- 중지된 컨테이너 삭제
중지되어 있는 특정 컨테이너 아이디를 나열하면 여러 개 삭제 가능
docker rm [컨테이너아이디] [...] [...]
- 중지와 동시에 삭제
docker rm -f [컨테이너 아이디]
- 중지된 모든 컨테이너 삭제
docker rm $(docker ps -qa)
- 컨테이너 Log 확인
백그라운드상태로 켜진 컨테이너는 로그가 실시간으로 출력되지 않는다 이를 확인하기 위한 명령어
docker log [컨테이너 아이디]
- 컨테이너 Log 중 개수 제한
docker logs --tail 10 [컨테이너 아이디]
- 컨테이너 Log 실시간 출력
docker logs -f [컨테이너 아이디]
- 컨테이너 Log 기존 거 제외하고 실시간 출력
docker logs --tail 0 -f [컨테이너 아이디]
- 실행 중인 컨테이너 내부 접속
docker exec -it [컨테이너 아이디] bash
- 도커 볼륨 설정
호스트의 디렉터리 절대 경로에 디렉터리가 이미 존재할 경우 호스트의 디렉터리가 컨테이너의 디렉터리를 덮어씌운다.
- 이미 존재하는 디렉터리가 비어있지 않으면 예를 들어 MySQL 컨테이너가 부팅에 실패할 수 있습니다.
예를 들어, MySQL 데이터베이스 전용 파일이 아닌 이상한 파일이 있으면 문제가 생깁니다. - 그래서 MySQL 볼륨을 마운트 할 때는 아예 비어있거나, MySQL이 만든 공식 데이터 파일만 있어야 합니다.
호스트 디렉터리 절대경로에 디렉터리가 존재하지 않을 경우 호스트의 디렉터리 절대 경로에 디렉터리를 새로 만들고 컨테이너의 디렉터리에 있는 파일을 호스트 디렉터리로 복사한다.
호스트 디렉토리 있음 | 존재하는 파일 유지, 컨테이너에 그대로 반영 |
호스트 디렉토리 없음 | 디렉토리 자동 생성, 이후 데이터 저장 |
docker run -v [/호스트 절대경로/]:[/컨테이너 절대경로/] [이미지명]:[태그명]
[이미지 명령어]
- 특정 이미지 버전 다운로드
docker pull [이미지이름:tag name]
- 이미지 조회
docker image ls
- 특정 이미지 삭제
삭제하고자 하는 이미지를 컨테이너에서 사용하지 않아야 삭제 가능
docker image rm imageid
- 중단된 컨테이너 안에 특정 이미지 강제 삭제
-f 명령어를 사용하면 중지된 컨테이너 안에 이미지 삭제
docker image rm -f [image id]
- 컨테이너에서 사용하지 않는 전체 이미지 삭제
docker image rm $(docker images -q)
- 중단된 컨테이너에서 사용하지 않는 전체 이미지 삭제
docker image rm -f $(docker images -q)
[DockerFile 명령어]
- docker build ( 도커 파일 빌드 )
도커 파일을 실행시켜 이미지로 빌드
docker build | Docker 이미지를 "빌드(build)"하겠다는 명령어입니다. |
-t [이미지 이름] | 빌드 결과로 만들어질 이미지에 태그(tag)를 붙이는 옵션입니다. |
. | 현재 디렉토리(.)를 빌드 컨텍스트로 사용합니다. 즉, 현재 폴더에 있는 Dockerfile과 파일들을 사용해서 이미지를 만듭니다. |
docker build -t [원하는 이미지 이름:TAG명] .
- FROM
베이스 이미지를 생성하는 역할로 Docker 컨테이너를 특정 초기 이미지(베이스 이미지) 기반으로 추가적인 세팅을 할 수 있다.
예를 들어 미니 컴퓨터 환경을 구축할 때 기본적으로 어떤 프로그램이 깔려있으면 좋겠는지 선택하는 옵션이다. ex) node js, .net 6 등
FROM [이미지명:태그명]
tip - 컨테이너는 자신이 실행할게 없으면 바로 종료된다. 이럴 경우를 방지하기 위해 아래와 같이 DockerFile에 작성해서 빌드하면 바로 꺼지지 않는다. (디버깅용)
ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]
- COPY
호스트 컴퓨터에 있는 파일을 복사해서 컨테이너로 전달.
예를 들어 도커 이미지안에 소스코드나 여러 텍스트 문서 등을 함께 포함할 수 있다.
- 파일COPY - /파일 명
- 폴더COPY - /폴더 명/
COPY [호스트 컴퓨터에 있는 복사할 파일 경로] [/컨테이너에서 저장할 파일 위치/]
#예시
COPY ./ ./ #전체 복사
COPY . . #전체 복사2
- ENTRYPOINT (컨테이너시점)
이미지를 기반으로 컨테이너를 실행할 때 어떤 명령을 실행할지 정의한다. 즉 컨테이너가 생성되고 최초로 실행할 때 수행되는 명령어
ENTRYPOINT [명령문...]
#예시
ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]
- RUN (이미지시점)
이미지 생성 과정(빌드하는 시점)에서 명령어를 실행시켜야 할 때 사용, 보통 리눅스 명령어일 가능성이 높다.
주로 패키지 설치, 디렉터리 생성, 파일 복사 등 이미지를 구성하는 작업.
RUN [명령문]
# 예시
RUN npm install
[RUN VS ENTRYPOINT]
RUN은 이미지 생성과정 에서 필요한 명령어를 실행시킬 때 사용.
ENTRYPOINT는 생성된 이미지를 기반으로 컨테이너를 생성한 직후에 명령어를 실행
- WORKDIR ( 작업 디렉터리 지정 )
해당 명령어를 사용하면 디렉터리가 전환된다. 전환된 이후 모든 RUN, CMD, ENTRYPOINT, COPY, ADD 명령어는 해당 디렉터리를 기준으로 실행된다. 작업 디렉터리를 지정하는 이유는 컨테이너도 하나의 미니 컴퓨터이기 때문에 컨테이너 내부의 폴더를 깔끔하게 관리하기 위해서 Dockerfile를 통해 생성된 파일들을 지정한 디렉터리 한 곳에서 관리하여 유지보수가 쉽게 할 수 있다. 해당 명령어를 사용하지 않으면 기존 파일들과 뒤섞여 유지보수에 어려움이 있따.
WORKDIR [작업 디렉토리로 사용할 절대 경로]
#예시
WORKDIR /usr/src/app
- EXPOSE ( 호스트 컴퓨터와 포트 맵핑에 컨테이너 사용 포트 문서화 )
EXPORT는 컨테이너 내부에서 어떤 포트에 프로그램이 실행되는 지를 문서화하는 역할만 한다.
컨테이너는 docker -p 8080:8080... 와 같은 명령어를 사용해서 호스트 컴퓨터와 포트 맵핑을 하게 된다. 이때 다른 사용자들이 외부에서 포트번호를 알기 쉽게 미리 작성할 수 있다.
EXPOSE [포트번호]
#예시
EXPOSE 3000
[Docker Compose 명령어]
여러 개의 Docker 컨테이너들을 하나의 서비스로 정의하고 구성해 하나의 묶음으로 관리할 수 있게 도와주는 툴이다.
여러개의 컨테이너를 관리하는데 용이하다.
복잡한 명령어로 실행시키던 컨테이너 명령어를 간소화시킬 수 있다. 예를 들어 mysql을 갖는 컨테이너를 생성하기 위해서는 docker run -e MYSQL_ROOT_PASSWORD=password -p 3306:3306 -v /user 이런 식으로 만들어야 하며 만들 때마다 사용하는 건 상당히 복잡하다. 이런 복잡한 명령어를 하나의 파일을 사용하여 관리할 수 있다.
예시
# python처럼 들여쓰기 문법사용
services: # 컨테이너 집합을 서비스라고 부름
my-web-server: # 서비스 붙이고 싶은 이름
container_name: web-server # 컨테이너 이름
image: nginx # 이미지
ports:
- 80:80 # 맵핑 포트트
- docker compose up ( 컴포즈파일 실행 )
도커 컴포즈 파일을 실행하는 명령어
#포그라운드 실행
docker compose up
#백그라운드 실행
docker compose up -d
- docker compose ps ( 실행중인 컴포즈 서비스 확인 )
현재 실행중인 도커 컴포즈 서비스 확인
docker compose ps
- docker compose down ( 컴포즈 중지 및 삭제 )
docker compose로 실행된 컨테이너들을 중지시키고 삭제한다.
docker compose down