도커 설치하기
먼저 도커를 설치해줘야 한다
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을 실행하는 서버 만들어 보기
다양한 가상환경들이 있지만
가상환경 만들기 총정리 본 (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에서 실행
- Dockerfile의 RUN, CMD, ENTRYPOINT 등의 명령어를 실행할 컨테이너 경로를 지정
- 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
- 위에 같이 연결하는 이유는 RUN 같은 것은 하나의 레이어 인데 이 layer가 많아지면 이미지 Build하는 시간이 늘어남..
- 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 사이트 들어가 보니 우분투 버전은 그리 중요한거 같지 않기는 하다
그래도 이미지 다운 부터 해보자


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

이렇게 두개가 있는데 runtime으로 진행
그 이유는 아래의 포스팅에서 확인할 수 있는데
[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]
자 실행해보면 완전히 초기 우분투가 설치되었다는 것을 느낀다

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에 권한을 주었더니 정상적으로 해결
'IT Study > Docker' 카테고리의 다른 글
| [Docker] 현업에 사용하는 문법 총 정리 (0) | 2026.03.13 |
|---|---|
| [Docker] 로컬과 컨테이너 마운트 시키기 (Volume) (0) | 2026.02.25 |