포스트

docker란?

목차

docker란?

docker의 기본 개념

  • docker는 애플리케이션과 그 실행 환경을 하나의 패키지로 묶어 컨테이너라는 가상화 환경에서 실행할 수 있도록 하는 플랫폼입니다.
    기존 가상 머신과 달리 컨테이너는 운영 체제 커널을 공유하기 때문에 가볍고 빠르게 실행되며, 서버 자원을 효율적으로 활용할 수 있습니다.

  • 컨테이너는 애플리케이션 코드, 라이브러리, 설정 파일, 운영 체제 등을 포함하는 하나의 패키지로, 마치 앱처럼 쉽게 배포하고 실행할 수 있습니다.
    컨테이너는 서로 독립적인 환경에서 실행되기 때문에 서로 간섭하지 않고 안전하게 실행될 수 있으며, 동일한 운영 체제 버전을 사용하지 않아도 됩니다.

docker 이미지와 컨테이너

  • docker 이미지 : 컨테이너를 만들기 위한 템플릿 역할을 하는 파일입니다. 이미지에는 운영 체제, 애플리케이션 코드, 라이브러리, 설정 파일 등이 포함되어 있으며, 여러 컨테이너를 만들 수 있는 기본 정보를 제공합니다. 이미지는 읽기 전용으로 생성되며, 실제로 실행되는 것은 컨테이너입니다.

  • docker 컨테이너 : docker 이미지를 기반으로 실행되는 인스턴스입니다. 이미지에 포함된 모든 파일과 설정 정보를 복사하여 독립적인 실행 환경을 만들고, 애플리케이션을 실행합니다. 컨테이너는 실행 중에 수정될 수 있으며, 종료되면 삭제됩니다.


필자의 경우, 웹 애플리케이션을 개발할 때, Docker의 개념을 처음 알게 되었습니다. 코드가 담긴 이미지, Redis, DB 등을 이미지화 하여 사용하였고, 기본적으로 docker에서 제공하는 이미지 또한 많습니다.



docker 설치하기

설치환경은 ubuntu 22-04 입니다.

1
2
# ubuntu 패키지 최신 업데이트
$ sudo apt update
1
2
# 패키지 설치
$ sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
1
2
# docker의 공식 GPG 키 추가
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
1
2
# docker의 공식 apt 저장소 추가
echo "deb [signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
1
2
# 패키지 최신 업데이트
sudo apt-get update
1
2
# docker 설치
sudo apt-get install docker-ce docker-ce-cli containerd.io

docker가 잘 설치되었는지 확인하려면?

1
2
#docker 설치 확인
sudo docker --version

docker 기본 명령어

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 로그인
docker login -u name

# 이미지 빌드
docker build -t name/image_name .

# MacOS(M1)일 경우, platform 명시해줘야 함.
docker build --platform linux/amd64 -t name/image_name .

# 이미지를 dockerhub에 옮기기
docker push name/image_name

# dockerhub에 있는 이미지 사용하기
docker pull name/image_name

# 컨테이너 실행
docker run -d -p port:port image_name

# 컨테이너 목록 확인
docker ps

# 컨테이너 정지
docker stop container_name

# 컨테이너 삭제
docker rm container_name

# 이미지 삭제
docker rmi image_name

# 컨테이너 접속
docker exec -it <container_id> /bin/bash

# 컨테이너 로그 확인
docker logs <container_id>

위 명령어는 기본적인 예시이며, 상황에 따라 다양한 옵션을 추가하여 사용할 수 있습니다.
Docker 명령어에 대한 더 자세한 내용은 Docker 공식 문서를 참고하세요: Docker 명령어 자세히 알아보기


docker 사용법

필자의 경우, 로컬 환경에서 이미지를 빌드하여 AWS EC2상에서 사용하였으며, 다음은 그 과정이다.

1. dockerfile 작성 : 내 로컬 환경에서의 코드를 이미지화한다.

2. docker build & push명령어 실행 : dockerfile을 통해 자신의 이미지를 만들고, 도커 허브에 올립니다.

3. dockerhub- push to hub : Docker Desktop에서 이미지를 Local -> Hub로 이동시켜줍니다.

4. 원하는 위치에서 이미지 사용하기 : 다른 환경에서 내 이미지를 pull로 땡겨서 사용할 수 있습니다.



1. dockerfile 작성

Dockerfile은 이미지를 빌드하는 데 필요한 다양한 명령어가 제공됩니다.
주요 명령어를 정리해보자면, 다음과 같습니다

  • FROM : 기본 이미지를 지정합니다.

  • WORKDIR : 작업 디렉토리를 설정합니다.
  • COPY : 소스 경로의 파일이나 디렉토리를 대상 경로에 복사합니다.
  • RUN : 셸 명령어를 실행합니다.
  • ENV : 환경 변수를 설정합니다.
  • VOLUME : 컨테이너 내부 데이터를 영구적으로 저장할 볼륨을 정의합니다.
  • EXPOSE : 컨테이너가 실행될 때 노출할 포트를 지정합니다.
  • CMD : 컨테이너 실행 시 실행할 명령어를 지정합니다.


필자의 dockerfile - nest.js 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Node.js 버전을 기반으로 하는 도커 이미지 사용
FROM node:18.16.0-alpine AS build

# 작업 디렉토리 설정
WORKDIR /home/app

# 작업 디렉토리에 내용 복사
COPY package*.json ./

RUN npm ci --only=production && npm cache clean --force

# /dist 폴더를 이미지에 복사
COPY ./dist ./dist

# 애플리케이션 실행
CMD ["npm", "run", "start:prod"]

# 애플리케이션을 실행할 포트
EXPOSE 3000



2. docker build & push 명령어 실행

dockerfile을 모두 작성했다면, docker build 명령어를 통해 이미지를 만들겠습니다.Docker 기본 명령어
! 주의사항 - dockerfile이 있는 경로에서 실행해야 작동합니다!

필자의 개발환경은 MacOS(M1)이여서, –platform linux/amd64 를 추가해주었습니다.

  • docker build --platform linux/amd64 -t 2swo/test .


명령어를 입력하게 되면, 다음과 같이 Build가 시작됩니다. 어떤 이미지를 만드냐에 따라 시간이 달라집니다.

스크린샷 2024-03-20 오전 4 11 37

  • build가 전부 완료되었다면, 로컬 환경에서 DockerHub에 이미지를 올리기 위해 push 명령어를 사용해 보겠습니다.


스크린샷 2024-03-20 오전 4 24 36

  • 이로써 만든 docker image는, 자신의 DockerHub로 전송되었습니다. 이제 DockerHub를 열어서 방금 자신이 올린 이미지가 잘 들어갔는지 확인해 보겠습니다.



3. DockerHub - push to hub

Docker Desktop을 실행시켜 내 이미지가 잘 전달되었는지를 확인해 보겠습니다. 스크린샷 2024-03-20 오전 4 28 49 잘 들어와있는것을 확인하였으면, 이제 이미지의 Size 오른쪽 부분을 클릭하여, Push To Hub를 눌러 Hub로 옮겨주겠습니다.

4. 원하는 위치에서 이미지 사용하기

이제는 docker와 그걸 실행시킬 수 있는 환경만 있다면, 어디서든 자신의 이미지를 끌고 와 실행시킬 수 있습니다.

필자의 경우, AWS Ec2의 서버에서 Docker를 사용하였다.

  • pull 명령어로 DockerHub에 있는 이미지 땡겨오기 docker pull name/image_name
  • 이미지가 정확하게 받아졌는지 확인해주세요 docker images
  • 이미지가 정확하게 받아와졌다면? docker run -d -p port:port image_name
  • 실행결과 확인 docker ps

스크린샷 2024-03-20 오전 4 28 49



Docker의 장단점

이건 정말 개인적인 생각입니다..
Docker의 장점이라고 생각드는 것은 베포를 보다 쉽고 빠르게 할 수 있으며, 한 개의 서버에서도 컨테이너를 분리하면, 애플리케이션이 격리되어 서로 독립적인 환경에서 실행되는 것이라고 생각합니다.

반면 Docker의 단점이라고 생각드는 것은, 리눅스 운영체제에서 실행이 가능한 소프트웨어만 지원한다는 것, 서버 한 대에 여러 개의 컨테이너를 올리는 형태이여서 서버에 문제가 생기면 모든 컨테이너에 영향을 미치는 것이라고 생각합니다.

처음에 Docker를 접했을때는, exec 명령어로 컨테이너에 접근하려고 했는데 컨테이너가 실행 중일때만 들어갈 수 있다는 오류가 났었고, 오류의 정확한 원인을 찾기 위해서는 컨테이너 안을 뒤져봐야하는. 정말 멘탈이 많이 나가는 상황에 처해서 이틀을 머리를 쥐어짰던 기억도 있었습니다..

포스팅에 대한 피드백은 언제나 환영입니다!
필요한 정보나 궁금하신 것을 남기시면 빠른 시일 내로 답변드리겠습니다.


인기 태그