# Docker 명령어 정리

- Author: @baealex
- Published: 2020-01-03
- Updated: 2021-10-06
- Source: http://blex.me/@baealex/%EB%8F%84%EC%BB%A4docker-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%A0%95%EB%A6%AC
- Tags: 프로그래밍, 도커

---

![](https://static.blex.me/images/content/2020/5/31/baealex/22_qQI1jKBNIgGRWs5S4BG3.jpg)

## Docker

아직 도커를 잘 모르는 상태로 작성하였음을 감안해주시길 바라며 내용은 주기적으로 바뀌거나 추가됩니다. 또한 Ubuntu 20.04 LTS 기준으로 작성되었음을 안내드립니다. *설치를 제외한 모든 명령어를 동일하게 사용할 수 있습니다.

<br>

###### 설치

```bash
sudo apt-get install docker docker-compose
```

Docker 설치 후 아무런 작업이 안해줬다면 권한의 문제로 `sudo`를 지속적으로 붙여 사용해야 하는데 이 경우 아래 과정을 따라하면 된다.

```bash
sudo groupadd docker
sudo gpasswd -a $USER docker
``` 

script 등에서 `docker.sock`의 권한 문제가 여전히 발생한다면 아래 명령어를 입력하자.

```bash
newgrp docker
```

<br>

## Image

공유되는 이미지는 이곳에서(https://hub.docker.com/) 찾아 볼 수 있다.

<br>

###### 생성

아래는 `Python`을 실행하기 위한 이미지다. `requirements`에는 `Flask`가 포함되었다.

```md
# Directory Structure

- app
  - app.py
  - requirements.txt
- Dockerfile
```

```docker
# Dockerfile

FROM ubuntu:latest
COPY ./app /app
WORKDIR /app

RUN apt-get install -y python3-pip python3-dev
RUN pip3 install -r requirements.txt
ENTRYPOINT ["python3"]
CMD ["app.py"]
```

또는

```docker
# Dockerfile

FROM python:3.6
COPY ./app /app
WORKDIR /app

RUN pip install -r requirements.txt
ENTRYPOINT ["python"]
CMD ["app.py"]
```

이후 `Dockerfile`이 있는 디렉터리에서 다음 명령 실행

```bash
docker build -t <image-name> .
```

기본적으로 이미지를 빌드할 경우 캐시가 생성된다. 이는 추후 이미지 재빌드시 속도 향상에 기여하지만 의도하지 않은 문제를 일으킬 수 있다. 캐시로 인해 문제가 발생한 경우 `--no-cache` 옵션을 붙이자.

```bash
docker build -t <image-name> . --no-cache
```

**새롭게 알게된 것**

도커에 이미지를 새로 빌드할 때 마다 수 많은 패키지를 다시 설치해야 하는 문제가 있어서 상당한 불편함을 느꼈는데 이를 캐시로 해결할 수 있었다. 캐시는 `Dockerfile`에 변경사항이 '없는' 부분에 대해서 적용된다. 가령 위 명령어를 다시 보자.

```docker
# Dockerfile

FROM python:3.6 # 변경사항 없으므로 캐시
COPY ./app /app # 변경사항 있으면 캐시 해제
WORKDIR /app

RUN pip install -r requirements.txt # 캐시 풀려서 다시 설치해됨 ㅠ
ENTRYPOINT ["python"]
CMD ["app.py"]
```

위 로직을 아래와 같이 변경한다면?

```docker
# Dockerfile

FROM python:3.6 # 변경사항 없으므로 캐시
COPY ./app/requirements.txt /app/ # 변경사항 없으므로 캐시
WORKDIR /app

RUN pip install -r requirements.txt # 변경사항 없으므로 캐시

COPY ./app /app # 변경사항 있으면 캐시 해제
ENTRYPOINT ["python"]
CMD ["app.py"]
```

위처럼 변경하면 패키지 설치까지는 캐시가 적용되어 빠르게 소스코드만 이미지에 올릴 수 있게 된다.

<br>

###### 목록

```bash
docker images
```

<br>

###### 실행

```bash
docker run --name "test" <image-name>:latest /bin/bash

-it                   : 현재 터미널이나 콘솔에 결과를 출력
--rm                  : 실행 후 컨테이너 삭제
--name "<NAME>"       : 컨테이너 이름
ubuntu                : 이미지 이름
/bin/cal              : 컨테이너에서 실행하는 커맨드
-d                    : 백그라운드에서 실행
-p [Host]:[Container] : 호스트와 컨테이너 포트를 매핑
```

<br>

###### 삭제

해당 이미지로 실행중인 컨테이너가 있으면 컨테이너 삭제후 진행할 수 있음

```bash
docker rmi <image-name>
```

이미지 용량이 생각보다 빠르게 차올라서 당황했는데 아래 명령어로 모든 이미지를 정리할 수 있다.

```docker
docker stop `docker ps -a -q` # 모든 컨테이너 정지
docker rm -f `docker ps -a -q` # 모든 컨테이너 삭제
docker rmi `docker images -a -q` # 모든 이미지 삭제
```

`None` 이미지만 삭제하려는 경우

```docker
docker rmi $(docker images -f "dangling=true" -q)
```

<br>

## Container

###### 목록

아래 두 명령어는 같은 결과를 보여줌

```bash
docker container list
docker ps
```

<br>

###### 접속

```bash
docker exec -it <container-id> /bin/bash
```

<br>

###### 로그

```bash
docker logs <container-id>
```

<br>

###### 정지

```bash
docker stop <container-id>
```

<br>

## Compose

`Dockerfile`은 단순히 `image`를 빌드하기 위한 도구 `docker-compose.yml`는 다수의 이미지 빌드 및 실행을 관리하는 툴

<br>

###### 생성

허브에 있는 이미지로 컨테이너 만들때

```yml
# docker-compose.yml

version: '2.0'

services:
  python:
    image: python:3.8.1-buster
	restart: always
```

직접 생성한 Dockerfile로 컨테이너 만들때

```md
# Directory Structure

- python
  - Dockerfile
- docker-compose.yml
```

```yml
# docker-compose.yml

version: '2.0'

services:
  python:
    build:
	  context: ./python
	  dockerfile: ./Dockerfile
```

<br>

###### 빌드

`docker-compose.yml`이 있는 디렉터리에서 다음 명령어 실행

```
docker-compose build
```

<br>

###### 실행

```bash
docker-compose up -d
```

<br>

###### 정지

```bash
docker-compose stop
```

<br>

###### 삭제

```bash
docker-compose rm
```
