본문 바로가기
IT Study/Docker

[Docker] Docker 설치부터 이미지 만들기 ~ 컨테이너 실행

by 하람 Haram 2026. 2. 13.
728x90

도커 설치하기

먼저 도커를 설치해줘야 한다

https://www.docker.com/

 

Docker: Accelerated Container Application Development

Docker is a platform designed to help developers build, share, and run container applications. We handle the tedious setup, so you can focus on the code.

www.docker.com

위에 링크에서 본인에게 맞는 OS를 다운로드 받고

아래의 명령 프롬포트에서 다음 cmd를 쳐주면

docker

이런식으로 command 똑바로 치라고 하는 창이 나오면 정상 다운로드 된것이다

 

도커 이미지 불러오기

MySQL 실행해보기

도커는 이미 사람들이 컨테이너 레지스토리에 라이브러리(이미지)를 올려놨기 때문에

이거를 가져오기만 하면 된다 (Github에서 git clone 하는 거랑 비슷)

docker pull [이미지 이름]:[태그]

 예시로 mysql을 가져오면 (버전 8.0.22)

docker pull mysql:8.0.22

하면 다음과 같은 화면이 나온다

이게 끝나면 mysql 8버전의 이미지를 다운로드 받았다

다운 받은 이미지 확인

docker images
 

이미지는 이미지일 뿐이고 실행되는 것이 아니다

그러면 어떻게 실행을 할까

​다운받은 이미지 실행 (컨테이너 만들기)

다운받은 이미지를 실행하기 위해서는 "Container"를 만든 다음

Docker Container를 실행 시켜야 한다

 

이미지 = 탬플릿

Container를 실행하기 위한 명령어

docker run [이미지 이름]:[태그]

예시 코드를 보면

docker run --name mysql_tutorial -e MYSQL_ROOT_PASSWORD=1234 -d -p 3306:3306 mysql:8.0.22

--name [컨테이너 이름] : 컨테이너 이름을 지정해주는 명령어(지정하지 않으면 랜덤으로 생성)

-e : 컨테이너 내에서 사용될 환경 변수를 정의 (environment의 약자) -> 사용하는 이미지에 따라 다름

        - MySQL인 경우 root 계정의 비밀번호가 필요해서 설정한 것임

-d : 백그라운드 모드 (컨테이너를 백그라운드 형태로 실행 demon mode)

         - 이 설정을 하지 않으면, 실행 중인 셀 위에서 컨테이너가 실행(컨테이너 나가면 실행 종료) -> nohup와 비슷

-p : 포트를 지정(port) : 로컬 호스트 포트:컨테이너 포트

         로컬 포트 3306으로 접근하면 컨테이너 포트 3306으로 연결되도록 설정

         로컬 호스트 : 우리의 컴퓨터 / 컨테이너 : 컨테이너 이미지 내부

         (mysql은 기본적으로 3306 포트를 통해 통신)

         -> 어느 경로로 접근했을 때 컨테이너를 띄워줄 것인가

         (이거 연결 안해주면 로컬 포트 3306에 연결을 해도 컨테이너까지 닿지 않음)

mysql:8.0.22 : mysql 이미지를 가져오겠다

위에 꺼를 실행하면

음.. 이게 실행된 건지 알 수가 없다

참고로 실행을 멈추고 싶으면

docker stop [컨테이너 이름(혹은 ID)]

근데 Stop이 안 먹는다?? 비추하지만 방법이 있긴하다

docker kill [컨테이너 이름(혹은 ID)]

 

실행 중인 컨테이너 확인

컨테이너가 실행 중인지 확인하려면 (특히 demon 모드는 보이지도 않음)

docker ps

 

을 치면

와 같이 mysql_tutorial이 실행되고 있음을 알 수 있다

아니 그러면 작동을 안하고 있는 컨테이너는???

docker ps -a

로 확인할 수 있다

근데 OK.. 실행되고 있는 건 알겠는데 어떻게 접근을 하는데

 

컨테이너에 접근하기

컨테이너에 접근하기 위해서는 아래의 명령어를 실행하면 된다

(Compute Engine에서 SSH와 접속하는 것과 유사)

docker exec -it [컨테이너 이름(혹은 ID)] /bin/bash

exec : execute

-it : -i (interactive) + -t(tty)

        -i : 상호작용 모드 : 표준 입력(stdin)을 활성화하여 터미널로 부터 입력을 받을 수 있게 해줌

         -t : tty : TTY(가상 터미널)을 활성화 -> 터미널에서 실행 되는 것처럼 보이기 위해 가상 터미널을 할당

/bin/bash : 컨테이너 내에서 Bash 쉘을 실행

         (컨테이너에 Bash가 설치되어 있지 않다면 /bin/sh 와 같이 다른 쉟을 실행 할 수 있다)

         즉, 컨테이너 내부에서 실행할 프로그램(쉘)을 지정하는 부분

 

이론은 이렇지만 그냥 구문 같이 외우는 게 편하다

 

이렇게 하거나

근데 쳐보면 알다시피 ID로 접근하는 건 매우 빡센 일이기 때문에 컨테이너 이름을 지정하는 게 좋다

나올때는

Ctrl + D 를 하거나

exit

 

을 치면 나가진다

 

컨테이너에 내부에서 MySQL 실행해보기

그러면 여기서 뽀짝뽀작 MySQL을 실행해본다

실행은 아래의 command를 친 다음

mysql -u root -p

 

아까 설정한 password를 입력하면 아래와 같이

MySQL 쉘 화면이 보인다

 

 

컨테이너 삭제하기

자 이제 MySQL 실습을 다했으니 용량 잡아먹기 전에 컨테이너를 삭제해 보자

컨테이너를 삭제하는 명령어는

docker rm [컨테이너 이름(혹은 ID)]

한번 해보자

엥 에러가 나오는데요??

docker rm [컨테이너 이름(혹은 ID)] 은 "멈춘 컨테이너"만 삭제할 수 있다

그러면 굳이 굳이 귀찮게 docker stop [컨테이너 이름(혹은 ID)]를 해야 하냐!

그건 아니고

docker rm [컨테이너 이름(혹은 ID)] -f

로 실행 중인 컨테이너도 삭제할 수 있다 -> 근데 꺼도 되는지 확인하고 stop한 다음 삭제하도록 하자...

(특이한 건 rm -f 가 아니라 rm ~~~ -f 이다)

 

 

파일 공유하기(Volume Mount)

Docker Container 내부는 특별한 설정이 없으면 컨테이너를 삭제할 때 파일이 살아짐

(Container에 있다고 해서 Host에 있는 것이 아님)

이렇게 Host와 Container의 폴더가 공유되게끔 하는 것이 Volume Mount 이고

-v 옵션을 통해 사용 가능하다(-p(port)와 사용법이 유사)

-v [Host_Folder이름]:[Container_Folder이름]

이렇게만 하면 어떻게 사용할지 감이 안잡히는 데

주로 docker run을 할 때 사용한다

예시코드

docker run -it -p 8888:8888 -v /Users/AppData/tmp_data:/home/tmdwhd/workspace

 

 

실습하기 : Docker Image를 만들기

실습에 앞써서 가상환경을 사용하여서 실습을 진행해보자

FastAPI APP을 실행하는 서버 만들어 보기

 

다양한 가상환경들이 있지만

https://aisj.tistory.com/191

 

가상환경 만들기 총정리 본 (pipenv virtualenv conda venv)

아무리 찾아도 가상환경 잘 정리해논 블로그 없어서 답답해서 직접 만든 포스팅 파이썬 버전 / 위치 확인내가 내 노트북의 파이썬 버전이랑 경로를 모른다!아래의 코드로 확인 가능하다# 버전 py

aisj.tistory.com

 

별도의 다운로드가 필요없는 venv를 이용해서 만들어 보자

python -m venv .test_venv

그리고 나면 다음과 같은 디렉토리가 생기는데

여기 안에 있는 activate를 실행시켜서 가상환경을 실행 시키자

source ./test_venv/Scripts/activate

그리고 가상환경에 잘 들어와 있나 확인하고

pip list

하라는 걸 실행해 주자

먼저 Fast API를 실행하는 이미지를 만드는 것이기 때문에

FastAPI 라이브러리를 설치해주자

pip install "fastapi[all]"

 

잘 깔렸는지 확인해보면

pip freeze

설치한 라이브러리를 모두 보여줌

근데 이러면 의존성 라이브러리도 다 보여주기 때문에

아래의 커멘드

pip list -not-required --format-freeze

를 통해 보면 의존성에 따라 설치된 라이브러리는 보여주지 않는다

 

그 다음 기본적인 Fast API 코드를 만들자

from fastapi import FastAPI
import uvicorn

app = FastAPI()


@app.get("/hello")
def hello():
    return {
        "message": "world!"
    }


if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

from fastapi import FastAPI

import uvicorn

app = FastAPI()

FastAPI 객체 하나를 만들고

 

@app.get("/hello")

hello로 접근을 하면

def hello():

"message": "world!"

메세지로 World를 전달

if __name__ == "__main__":

uvicorn.run(app, host="0.0.0.0", port=8000)

그 다음 uvicorn을 실행 시킴

그 다음 pip로 설치한 라이브러리를 모두 requirements.txt에 저장

-> 도커 이미지에서 이 라이브러리를 가지고 있어야 하기 때문에

pip freeze > requirements.txt

 

그리고 대부분 도커 이미지는 비 공식적으로 Dockerfile 이라는 이름을 사용한다

(다른 이름도 사용가능하지만 통상적으로)

그 Dockerfile에 아래와 같이 만들자 (Docker Image를 빌드하기 위한 정보가 담김)

FROM python:3.8.7-slim-buster

COPY . /app
WORKDIR /app
ENV PYTHONPATH=/app
ENV PYTHONUNBUFFERED=1

RUN pip install pip==21.2.4 && \
    pip install -r requirements.txt

CMD ["python", "main.py"]

 

  • FROM "이미지 이름:태그"
    • 이미지 빌드에 사용할 베이스 이미지를 지정 (이미 만들어진 이미지)
    • ex) 위에 python:3.8.7-slim-buster 는 이미 Dockerhub에 존재
  • COPY "로컬 디렉토리" "컨테이너 내 디렉토리"
    • 컨네이너는 자체적인 파일 시스템과 디렉토리를 가짐
      • COPY 명령어를 통해 로컬 디렉토리는 컨테이너 내부 디렉토리로 복사
    • ex) COPY . /app
      • 현재 폴더에 있는 것들을 모두 컨테이너 내부에 /app 내부로 복사 하겠다
  • WORKDIR "컨테이너 내 디렉토리"
    • Dockerfile의 RUN, CMD, ENTRYPOINT 등의 명령어를 실행할 컨테이너 경로를 지정
      • 약간 커멘트 창에 cd my_dir 등으로 접근해서 명령어 치는 것과 유사
    • ex) WORKDIR /app
      • 이 커멘드 뒤에 등장하는 RUN, CMD는 컨테이너 내부의 /app에서 실행
  • ENV "환경변수 이름=값"
    • 컨테이너 내 환경변수를 지정
    • Python 애플리케이션의 경우 통상적으로 아래의 두 개는 써줌
      • ENV PYTHONPATH=/app
      • ENV PYTHONBUFFERED=1
  • RUN "실행할 리눅스 명령어"
    • 컨네이너 내에서 리눅스 명령어를 실행
여러 개를 하고 싶을 때는 && \ 를 사용해서 연결함
RUN pip install pip==21.2.4 && \
    pip install -r requirements.txt
    • 위에 같이 연결하는 이유는 RUN 같은 것은 하나의 레이어 인데 이 layer가 많아지면 이미지 Build하는 시간이 늘어남..
      • ENV PYTHONBUFFERED=1

  • CMD ["실행할 명령어", "인자"]
    • docker run으로 컨테이너를 만들 때 실행할 명령어
    • CMD는 띄어쓰기를 하지 않음
    • ex) CMD["python", "main.py"]
      • python main.py

 

이 외에도

  • EXPOSE : 컨테이너 외부에 노출할 포트 지정
  • ENTRYPOINT : 이미지를 컨테이너로 띄울 때 항상 실행하는 커맨드

가 있다

 

 

자 이제 Docker 이미지 만들 준비 끝냈으니깐 만들어 보자 (Build 해보자)

 

Docker Image Build

docker build "Dockerfile이 위치한 경로"
docker build "Dockerfile이 위치한 경로" -t "이미지 이름:태그"

태그는 미 지정시 "latest"로 채워진다

ex) 현재 경로에 Dockerfile이란 이름으로 있다면

docker build . -t my_fastapi

이름을 다른거 my_docker 이런 걸로 했다면

docker build ./my_docker -t my_fastapi

이렇게 빌드 되는 걸 볼 수 있다

이거 다 끝나면

docker images

를 통해 방금 빌드한 이미지를 확인 할 수 있고

이미지를 실행 시키면

 

docker run "이미지 이름:태그"
docker run "my_fastapi:latest"

태그가 latest 인 경우 생략 가능하다

근데 위에서 port를 8000으로 지정 했으니깐 로컬이랑 연결해주고

docker run -p 8000:8000 "my_fastapi:latest"

 

https://docs.docker.com/engine/reference/run/

 

Running containers

Running and configuring containers with the Docker CLI

docs.docker.com

 

 

정상적으로 작동하는 지 확인하기 위해서 다른 cmd 창을 열어서

curl localhost:8000/hello

 

 

 

Docker Cuda Image 가져오기

기본 서버에 있는 Image 들을 확인

docker images

 

내가 원하는 것은 ubuntu20.04 기준의 cuda 11.8이다

근데 실제 torch 사이트 들어가 보니 우분투 버전은 그리 중요한거 같지 않기는 하다

그래도 이미지 다운 부터 해보자

https://hub.docker.com/r/nvidia/cuda/tags?page=10&page_size=&name=11&ordering=

 

docker pull 명령어로 이미지를 가져와 주자

이렇게 두개가 있는데 runtime으로 진행

그 이유는 아래의 포스팅에서 확인할 수 있는데

https://velog.io/@codeinsights/ML-Docker-%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-GPU-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

 

[ML] Docker 환경에서 GPU 사용하기

Summary ✌ NVIDIA Container Toolkit 설치 Dockerfile 구성 (a.k.a dockerhub) 2.1 Torch 기반 NVIDIA Container Toolkit NVIDIA-Container Toolkit 이란? NVIDIA C

velog.io

 

참고로, 선택을 할 때 보면 base, runtime, devel 세종류가 있습니다.
base < runtime < devel 순으로 제공하는 lib 들이 많고, 그만큼 크기도 점점 커집니다.
왠만하면 base나 runtime을 사용하시면 됩니다.

 

그 다음 제대로 들어 왔는지 확인하고

그리고 나서 이미지를 실행해주면

docker run --name virtual_display -p 8080:80 nvidia/cuda:11.8.0-runtime-ubuntu20.04

nvidia Driver 가 없다고 한다

그냥 이미지를 실행시켜보아도

docker run -it nvidia/cuda:11.8.0-cudnn8-devel-ubuntu22.04 /bin/bash

없다고 나온다.

이는 Docker를 실행할 때 GPU를 연결해 줘야하는데

https://blog.naver.com/haramzone/223530260308

 

Docker에서 Nvidia GPU 할당하는 방법

AI엔지니어들이 Docker를 사용하면 GPU 부터 사용하려고 하는데 도커 컨테이너에 접속하여서 막상 아...

blog.naver.com

에서 --gpus 옵션으로 해결

그럼 정리를 해보면

--gpus -> -it 순으로 들어가야 한다

docker run --gpus '"device=0"' \
  -it --name virtual_display \
  -p 8080:80 \
   nvidia/cuda:11.8.0-cudnn8-devel-ubuntu22.04

여기서 exit을 하고 다시 시작하고 싶으면

docker container restart [container id]

 

자 실행해보면 완전히 초기 우분투가 설치되었다는 것을 느낀다

sudo도 안 먹히는 모습

bash: sudo: command not found 해결법

apt-get update && \
      apt-get -y install sudo

를 하면 sudo 명령어는 얻어진다

그리고 기본적인 기능을 위해 아래의 명령어 수행(필수 구성요서 다운로드)

apt-get install -y software-properties-common

그 다음에 python 3.8 버전을 다운로드

apt-get install -y python3.8 python3-pip

그리고 기본라이브러리를 설치 (안해도 되긴 합니다)

apt-get install -y libpython3.8-dev

그리고 나서 "python3"를 입력하면 아래와 같이

정상 작동된다.

 

참고로 Python이 어디에 설치되었는지 궁금하면

which python3

여기까지 한 다음 컨테이너 내부에서 놀면 되는데 우리는 도커로 묶어야하기 때문에

Dockerfile을 작성해주면

FROM nvidia/cuda:11.8.0-runtime-ubuntu20.04

RUN apt-get update && apt-get -y install sudo
#RUN apt-cache madison python3-pip

RUN apt-get install -y software-properties-common
RUN add-apt-repository ppa:deadsnakes/ppa
RUN apt-get install -y python3.8 python3-pip
RUN apt-get install -y libpython3.8-dev

# Update symlink to point to latest
RUN rm /usr/bin/python3 && ln -s /usr/bin/python3.8 /usr/bin/python3

# Print version
RUN python3 --version
RUN pip3 --version

# upgrade
RUN python3 -m pip install --upgrade pip

ENV NVIDIA_VISIBLE_DEVICES=0

그 다음에 CLI 환경으로 노는게 불편하니(https://89douner.tistory.com/123)

 

6-3. VS code에 Docker 연동하기! (with Jupyter notebook)

안녕하세요~ 이번글에서는 VS code에 Docker를 연동시키는 방법에 대해서 알아보도록 할거에요~ 보통 개발을 하실때 IDE (Integrated Development Environment; 통합개발환경)을 이용하실텐데요. 많은 분들이 Py

89douner.tistory.com

 

extension을 다운로드 받고 (Remote SSH)와 다른 거임

그 다음 Control + P 를 누르고

다음을 눌러주면

이렇게 Dev Container 항목에 Remote view 처럼 사용이 가능하다

이렇게 들어올 수 있다

이제 기존에 만들었던 걸 옮겨야 하는데

컨테이너 안에 있는 home 디렉토리로 옮기자

컨테이너 -> 로컬

docker cp [컨테이너 이름]:[컨테이너 경로] [로컬 디렉토리 경로]

로컬 -> 컨테이너

docker cp [로컬 디렉토리 경로] [컨테이너 이름]:[컨테이너 경로]

 

 

docker cp ./New_Virtual_Display_Task.zip virtual_display:/home

 

이런 식으로 옮길 수 있다

추가로 압축 풀고 해제 하는 명령어는

# 압축하기
zip [파일명.zip] [폴더명]

#압축풀기
sudo apt-get install unzip
unzip [파일명.zip]

 

 

 

 

 

Error Shooting

mysql을 가져올 때 (버전 8.0.22)

docker pull mysql:8.0.22

 

하면 다음과 같은 Error 가 나온다 하면

error during connect: Post "http://%2F%2F.%2Fpipe%2FdockerDesktopLinuxEngine/v1.45/images/create?fromImage=mysql&tag=8.0.22": open //./pipe/dockerDesktopLinuxEngine: The system cannot find the file specified.

생각보다 단순하게 해결할 수 있는데

이 Docker Desktop을 실행해주면 된다

이거 무서워서 Accept 안했을 확률 100%

(본인은 Google 계정으로 회원가입까지 함)

 

starting the docker engine... docker engine is the underlying technology that runs containers
무한 루프

 

https://firework-ham.tistory.com/63

 

[Docker] Troubleshooting - "Docker is starting" 만 표시 될때 확인 해볼 것.

회사에서 도커를 설치했는데 "Docker is starting"만 표시되고 실행이 되지 않는 현상을 발견했습니다. 로컬에서 도커를 정상 실행하기 위해 어떤 문제가 있을지 생각해보면서 문제 해결을 해보았습

firework-ham.tistory.com

 

뭐 이런 식으로 해결방안들이 있는데

본인은 재부팅하고 프로그램 다시 켜니깐 돌아간다

error: could not install packages due to an oserror: [winerror 5] 액세스가 거부되었습니다

 

https://computer-science-student.tistory.com/683

 

vscode(visual studio code) 항상 관리자 권한으로 실행

vscode 항상 관리자 권한으로 실행 vscode에서 간혹 작업을 하기 위해 관리자 권한으로 실행해야 하는 경우가 있다. 오른쪽 마우스 클릭 후 관리자 권한으로 실행하는 방법말고 항상 관리자 권한으

computer-science-student.tistory.com

그냥 관리자 권한으로 실행해버리기

https://coolenjoy.net/bbs/37/247261

 

사용자 계정 컨트롤(UAC) 특정 파일만 예외 > 팁 강좌 | 쿨엔조이

사용자 계정 컨트롤(UAC)을 켜 놓지만 자주 사용하는 프로그램은 UAC에 예외를 적용하는 방법입니다.이 방법은 관리자 권한으로 실행이 필요한 프로그램을 실행할때 사용자 계정 컨트롤 관련해서

coolenjoy.net

그런 다음에 아래 코드 두개 돌림

python -m ensurepip --upgrade
python -m pip install --upgrade pip

그리고 나서 pip install 해주면 정상동작한다

 

 

 

permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Head "http://%2Fvar%2Frun%2Fdocker.sock/_ping": dial unix /var/run/docker.sock: connect: permission denied​

기본에 있는 도커 이미지가 뭐가 있는지 확인하고자

docker images

했더니 나왔던 오류

 

이건
https://thxxyj.tistory.com/42

 

docker, docker-compose 설치 후 Permission denied

docker, docker-compose 설치 방법은 아래 글 참고 docker, docker-compose 설치 on Ubuntu 1. docker 설치하기 https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository 1. 패키지 설치 sudo apt-get update sudo apt-get instal

thxxyj.tistory.com

이걸 참고해서 해결

먼저

docker 그룹에 user를 추가

sudo usermod -aG docker [user명]
cat /etc/group|grep docker

했을 때 결과가 아래와 같이 나오면 성공

본인은 그래도 해결이 되질 않음

sudo chmod 666 /var/run/docker.sock

socket에 권한을 주었더니 정상적으로 해결

 

 

 

728x90