현재 프로젝트 진행 기간이지만 Docker, 도커 강의가 주어진 상태이다.
도커 강의가 주어진 지금 해당 강의 내용을 공부하면서 정리를 하게 되었는데, 오늘은 팀원분들과 상의 하에 도커 강의를 수강하는 것으로 진행하게 되었다.
우선적으로 Docker에 대해 알아보자.
(현재 Docker 강의를 수강하는 과정에서 잦은 오류가 발생하여 원활하게 따라가지 못하는 상황이기에 용어 및 명령어만 정리해둔 상태입니다.)
Docker, 도커
- 컨테이너(container) 기반의 가상화 플랫폼
- 독립된 환경을 이용하여 하드웨어를 효율적으로 관리 및 활용하는 기술
- Registry → Image → Container

Window의 cmd 환경을 이용하여 다음과 같이 Docker Desktop 화면에 적혀 있는 코드를 입력해주면 간단한 애플리케이션을 실행할 수 있다.
> docker run -d -p 80:80 docker/getting-started
도커의 기본 문법으로는 위와 같이 docker run로 시작할 수 있다.
해당 명령어는 docker image를 이용하여 container를 실행하는 명령어이기에 도커의 기본 문법은 다음과 같은 형태로 이루어진다.
> docker run [options] [image_name] [command]
이때 들어가는 옵션들 중 간단하게 사용되는 옵션으로는 -p와 -d가 있다.
-p 옵션은 '-p [host_port]:[container_port]'와 같은 형태로 적어주는데, 해당 명령어는 host_port와 container_port를 연결해주는 옵션이다.
-d 옵션을 사용하면 실행한 docker container를 백그라운드로 실행할 수 있게 해 준다.
이외에도 다음 명령어를 입력하면 사용 가능한 옵션들을 볼 수 있다.
> docker run --help

도커 컨테이너를 생성한 뒤 생성된 도커 컨테이너의 상태를 확인하고 싶다면 다음과 같은 명령어를 입력해주면 된다.
도커 컨테이너 상태 확인하기
> docker ps
만약 실행되고 있는 도커 컨테이너를 종료하고 싶다면 stop/kill 명령어를 사용하면 된다.
프로세스 종료
> docker stop [container_id 또는 container_name]
프로세스 강제 종료
> docker kill [container_id 또는 container_name]
이러한 상태로 종료된 컨테이너를 다시 시작하고 싶다면 restart 명령어를 사용해준다.
도커 컨테이너 다시 시작하기
> docker restart [container_id 또는 container_name]
도커 컨테이너를 시작할 때 docker run을 사용하여 실행을 했었다.
이때, 자신이 사용하고 싶은 도커 컨테이너가 이미 실행되어 있을 때 명령어를 실행하고 싶다면 exec 명령어를 사용하여 옵션과 커맨드를 입력한 뒤 사용해줄 수 있다.
실행 중인 도커 컨테이너에서 명령어 실행하기
> docker exec [options] [container_id 또는 container_name] [command]
이렇게 도커 컨테이너에 대해 사용을 마친 뒤 사용 여부가 없어진 도커 컨테이너를 삭제하고 싶다면 rm 명령어를 사용하여 해당 컨테이너를 삭제할 수 있다.
도커 컨테이너 삭제하기
> docker rm [container_id]
더 많은 명령어가 궁금하다면 참고할 수 있는 도커 명령어 레퍼런스를 링크로 남겨두겠다.
도커 명령어 레퍼런스 : https://docs.docker.com/engine/reference/commandline/cli/
Use the Docker command line
docs.docker.com
앞서 도커 컨테이너에 관련된 내용을 배워보았다.
이제 도커 이미지에 관한 것을 알아보도록 하자.
Docker Image, 도커 이미지는 보통 Dockerfile이라는 이름을 가진 파일 내에서 다음 명령어들과 같이 사용된다.
Dockerfile
1. FROM : base 이미지 지정, 보통 Dockerfile의 가장 최상단에 위치한다.
2. ADD : 호스트 머신에 있는 파일/폴더를 특정 위치에 저장한다.
3. RUN : 명령 쉘(Shell)과 같이 커맨드를 실행하기 위해 사용한다, Docker에서는 보통 특정 소프트웨어를 설치하기 위해 많이 사용된다.
4. CMD : 이미지 실행 시 어떤 것이 기본으로 실행될 것인지 정의한다.
FROM [image]:[tag]
ADD [file/folder] [path]
RUN [command]
CMD [command]

이외에도 많이 쓰이는 명령어로는 WORKDIR, ENTRYPOINT, EXPOSE, COPY, ENV, ARG 등이 존재한다.
도커 이미지를 빌드(build) 하기 위해서는 다음 명령어를 사용하여 빌드를 해주면 된다.
Docker Image build
> docker build [options] [path]
여기서 더 많은 build 옵션에 대해 확인하고 싶다면 앞서 진행한 컨테이너 실행 옵션 명령어를 확인할 때처럼 --help를 이용하여 더 많은 옵션을 확인할 수 있다.
더 많은 build 옵션 확인하기
> docker build --help

도커 이미지를 빌드하고 난 뒤 생성된 이미지들의 목록들을 확인하고 싶다면 다음 명령어를 적어줘서 확인을 해볼 수 있다.
Docker Image 목록 확인하기
> docker images
이제 해당 애플리케이션을 공유하는 것을 알아보도록 하자.
들어가기 전에 우리는 코드를 적고 Git을 사용하여 Github Repository에 올린 뒤 다른 사람들과 공유하는 것을 진행해보았다.
도커도 코드들과 마찬가지로 Github Repository와 같은 공간이 존재하는데, 이것을 Docker Hub이라고 부른다.
Docker Hub : docker를 만든 곳에서 관리하는 docker registry, 공식 이미지가 있는 곳이며 Github와 유사하다.
Docker Registry : 이미지를 저장하고 분배하기 위한 저장소, Git Repository와 유사하다.
Docker Hub 링크 : https://hub.docker.com/
Docker Hub Container Image Library | App Containerization
We and third parties use cookies or similar technologies ("Cookies") as described below to collect and process personal data, such as your IP address or browser information. You can learn more about how this site uses Cookies by reading our privacy policy
hub.docker.com
해당 사이트에서 회원가입을 하면 Docker Hub을 이용할 수 있게 된다.
Docker Hub에 로그인하기 위해서는 다음 명령어를 적어주면 로그인을 할 수 있게 된다.
Docker Hub 로그인하기
> docker login
이후 나오는 로그인 정보(username, password)를 치면 로그인을 할 수 있다.
Docker Hub에 로그인을 하게 되면 Github와 마찬가지로 push, pull 등의 명령어들을 입력하면서 사용을 할 수 있게 된다.
Docker Hub에 이미지 push
> docker push [dockerhub_id]/[image_name]:[tag]
> 예) docker push j1nu2/python:3.9
Docker Hub에 이미지 pull
> docker pull [dockerhub_id]/[image_name]:[tag]
> 예) docker pull j1nu2/python:3.9
Docker Hub에 이미지들을 push 하고 pull 하는 명령어를 적어보았다.
이제 만들어진 도커 이미지들을 실행하고 삭제하는 명령어들을 알아보자.
Docker Image 실행하기
> docker run -p [host_port]:[container_port] [dockerhub_id]/[image_name]:[tag]
> 예) docker run -p 80:5000 j1nu2/python:3.9
Docker Image 삭제하기
> docker rmi [dockerhub_id]/[image_name]:[tag]
> docker rmi j1nu2/python:3.9
만약 Docker Hub ID로 로그인하지 않았다면 [dockerhub_id] 부분을 적어주지 않아도 된다.
Docker에서 MongoDB를 연동하여 데이터를 관리하는 것을 알아보도록 하자.
MongoDB를 사용하기 위해 Robo 3T라는 툴을 사용하여 MongoDB를 확인하고 관리하기로 하였다.
Robo 3T Download Link : https://robomongo.org/
Robo 3T | Free, open-source MongoDB GUI (formerly Robomongo)
Read by Dmitry Schetnikovich
robomongo.org
Robo 3T를 설치한 뒤 Docker에서 MongoDB를 백그라운드 실행해보자.
백그라운드 실행을 위한 명령어는 다음과 같이 적어주면 된다.
Docker MongoDB 백그라운드 실행하기
> docker run -p 27017:27017 -d mongo
만약 해당 컨테이너 네임을 직접 설정해주고 싶다면 docker run -p 27017:27017 --name [name] ~ 을 사용하여 이름을 정해주면 된다.
그리고 해당 명령어에서 사용된 포트 번호 27017은 MongoDB에서 기본적으로 사용하는 포트 번호이다.
이때 추가적인 설정 없이 실행을 종료하거나 해당 정보들이 삭제된다면 MongoDB 내에 들어간 데이터들도 없어지는 것을 볼 수 있다.
여기서 DB 데이터를 유지하고 싶다면 named volume이라는 것을 사용하여 이름으로 관리가 가능해지도록 설정을 해줄 수 있다.
docker volume 생성하기
> docker volume create [volume_name]
생성된 docker volume 목록 확인하기
> docker volume ls
확인하고 싶은 docker volume의 상세 정보 확인하기
> docker volume inspect [volume_name]
이제 생성된 docker volume을 MongoDB에 연결해보도록 하자.
생성한 docker volume을 MongoDB에 연결하기
> docker run -p [host_port]:[container_port] -v [volume_name]:[path] mongo
> 예) docker run -p 27017:27017 -v mongodb:/data/db mongo
docker volume을 사용하면 코드가 수정될 때마다 직접 container 및 image 설정해야 하는 불편함이 생길 수 있다.
이때 원하는 volume을 docker container에 연결하는 방법으로 bind mount를 사용하면 불편함을 줄일 수 있다.
bind mount 사용하기
> docker run -v [host_port]:[container_port]
보통은 개발을 할 때 volume을 사용하여 개발하는 것을 권장하지만, 컨테이너화 된 로컬 개발 환경에서 개발을 진행할 경우에는 bind mount를 사용하는 것이 관리하기에 더 용이하다는 장점이 있다.
Docker를 사용하여 개발을 진행할 때 container가 늘어나게 되는 상황이 발생한다.
이때 Docker에 다수의 container를 연결하고자 할 때 Docker Network를 사용하여 다수의 container를 연결할 수 있다.
Docker Network 생성하기
> docker network create [network_name]
Docker Network에 연결하여 container 실행하기
> docker run -p [host_port]:[container_port] --network [network_name] --network-alias [connection_db] [alias_name]
network-alias 설정을 DB에 연결을 한 뒤 정해준 alias_name을 사용하여 해당 network를 연결할 수 있다.
container에서 다른 container를 호출하여 사용하고 싶다면 network-alias를 통해 확인을 할 수 있다.
network-alias를 통해 확인하기
> docker run -it --network [network_name] [image]
> dig [network_name]
dig 명령어를 통해 network-alias 연결이 된 것을 확인할 수 있다.
Docker를 계속 이용하다 보면 container가 늘어나게 되고 그로 인해 리소스 사용량이 증가하는 것을 볼 수 있는데, Docker Container를 실행할 때 Memory와 CPU를 제한하여 실행을 시킬 수 있다.
Memory 제한하기
> docker run -i -m [memory_size] [image]:[tag]
> 예) docker run -i -m 10m python:3.9
CPU 제한하기
> docker run -i --cpus=[cpu_percentage] [image]:[tag]
> 예) docker run -i --cpus=0.5 python:3.9
→ CPU 제한 기본값으로는 1(100%)을 할당하고 있다.
사용하고 있는 리소스 확인하기
> docker stats
기존에는 docker build/run 커맨드를 사용하여 생성 및 실행을 진행하였다.
여기서 docker-compose를 사용하여 여러 애플리케이션을 편리하게 실행하는 방법이 존재하는데, yaml 파일을 사용하여 필요한 옵션들을 설정하고 container를 실행할 수 있다.
만약 yaml 파일 이름을 docker-compose.yaml으로 만들어주면 docker-compose 사용 시 기본으로 해당 파일을 사용하게 된다.
yaml 파일 내에서 적어주는 옵션들은 다음 예시와 같이 사용된다.
<docker-compose.yaml>
version: "3.9"
services:
flask:
build:
context: .
ports:
- "5000:5000":
해당 docker-compose.yaml 파일을 사용하여 설정을 해준 뒤 container를 띄우거나 삭제하고 싶다면 다음과 같은 명령어를 사용하면 된다.
container 띄우기
> docker-compose up
container 삭제하기
> docker-compose down
docker-compose는 다수의 애플리케이션을 지원하기 위해 만든 것이기 때문에 하나의 yaml 파일에 설정을 해서 network를 사용할 수 있는 장점이 있다.
이제 docker-compose를 이용하여 DB가 있는 애플리케이션을 실행해보고자 한다.
MongoDB를 이용하여 옵션 설정을 해주었다.
<docker-compose.yaml>
version: "3.9"
services:
flask:
build:
context: .
ports:
- "5000:5000:
mongo:
image: mongo:latest
ports:
- "27017:27017"
이제 docker-compose를 이용하여 volume으로 유지되는 애플리케이션을 실행해보도록 하자.
docker-compose는 기본적으로 bind mount와 named volume 모두를 지원해주기 때문에 yaml 파일에 설정만 해주면 바로 사용이 가능해지게 된다.
<docker-compose.yaml>
version: "3.9"
services:
flask:
build:
context: .
volumes:
- ./templates:/templates
ports:
- "5000:5000:
mongo:
image: mongo:latest
volumes:
- mongo:/data/db/
ports:
- "27017:27017"
volumes:
mongo:
-
오늘은 Docker에 대해 공부하는 시간을 가졌다.
마지막 프로젝트 기간에 주어진 강의이기 때문에 프로젝트에 도움이 될 것 같아서 공부하게 되었다.
공부하는 과정에서 다소 아쉽다고 생각되는 것은 잦은 오류 발생으로 인해서 진도를 나가기가 힘들었다는 점이 있었다.
일단은 일부 내용만 정리해두었고 추후에 나머지 내용들을 정리해보면서 공부할 예정이다.
:D
'TIL 및 WIL > TIL (Today I Learned)' 카테고리의 다른 글
| [TIL] 2022.07.13 (MLT API 구현, My Little Trip(3)) (0) | 2022.07.13 |
|---|---|
| [TIL] 2022.07.12 (Docker, 도커(2)) (0) | 2022.07.12 |
| [TIL] 2022.07.08 (내일배움캠프 마지막 프로젝트, My Little Trip(2)) (0) | 2022.07.08 |
| [TIL] 2022.07.07 (내일배움캠프 마지막 프로젝트, My Little Trip(1)) (0) | 2022.07.07 |
| [TIL] 2022.07.06 (DRF 유화 제작 프로젝트, My Little Shoes(끝)) (0) | 2022.07.06 |