🤷🏻‍♀️ 사전 준비

  1. Docker 설치
  2. Docker Hub https://hub.docker.com/ 에서 계정을 생성합니다.

작업의 순서

작업의 순서는 다음과 같습니다.

  1. Dockerfile 생성
  2. 이미지 생성
  3. Docker Hub에 이미지 업로드
  4. 실행할 서버에 이미지 다운로드
  5. Docker 컨테이너 생성
  6. Docker 컨테이너 실행

🤷🏻‍♀️ Docker 이미지 생성

Dockerfile 생성

DockerFile .NET Core 애플리케이션 버전 (예시)

FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
WORKDIR /src
COPY ["amsomad.csproj", "./"]
RUN dotnet restore "./amsomad.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "amsomad.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "amsomad.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "amsomad.dll"]

DockerFile .NET Core 애플리케이션 Windows 버전(예시)

FROM mcr.microsoft.com/dotnet/aspnet:7.0-windowsservercore-ltsc2019 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:7.0-windowsservercore-ltsc2019 AS build
WORKDIR /src
COPY ["amsomad.csproj", "./"]
RUN dotnet restore "./amsomad.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "amsomad.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "amsomad.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "amsomad.dll"]

Docker Build

docker build -t [이미지 이름]:[태그] [Dockerfile 경로]

ex) docker build -t amsomad:latest .

Docker 이미지 확인

이미지 목록 확인

docker images ls

이미지 상세 정보 확인

docker images inspect [이미지 이름]:[태그]

ex) docker images inspect amsomad:latest

Docker 이미지 삭제

docker images rm [이미지 이름]:[태그]

ex) docker images rm amsomad:latest

Docker 이미지 태그 변경

docker images tag [이미지 이름]:[태그] [새로운 태그]

ex) docker images tag amsomad:latest amsomad:1.0.0

Docker 컨테이너 생성

Docker 컨테이너 생성

docker run -d -p [호스트 포트]:[컨테이너 포트] --name [컨테이너 이름] [이미지 이름]:[태그]

ex) docker run -d -p 80:80 --name amsomad amsomad:latest

Docker 컨테이너 목록 확인

docker ps -a

Docker 컨테이너 상세 정보 확인

docker ps inspect [컨테이너 이름]

ex) docker ps inspect amsomad

Docker 컨테이너 삭제

docker ps rm [컨테이너 이름]

ex) docker ps rm amsomad

Docker 컨테이너 시작

docker ps start [컨테이너 이름]

ex) docker ps start amsomad

Docker 컨테이너 중지

docker ps stop [컨테이너 이름]

ex) docker ps stop amsomad

Docker 컨테이너 재시작

docker ps restart [컨테이너 이름]

ex) docker ps restart amsomad

🤷🏻‍♀️ Docker hub 업로드

docker login

docker login

ex) docker login -u amsomad -p 1234
혹은 
docker login -> ID 입력 -> PW 입력

Docker hub 저장소 생성

docker hub 에서 이미지를 업로드할 저장소 만든다.
(이미지를 업로드할 저장소를 만들지 않으면 에러가 발생한다.)
에러 메시지 “denied: requested access to the resource is denied”

docker tag [이미지 이름]:[태그] [Docker Hub 계정 이름]/[저장소 이름]:[태그]

ex) docker tag amsomad:latest amsomad/amsomad:latest

이미지를 Docker Hub에 업로드한다.

docker push [Docker Hub 계정 이름]/[저장소 이름]:[태그]

ex) docker push amsomad/amsomad:latest

🤷🏻‍♀️ Docker hub 다운로드

  1. 로그인을 하지 않으면 다운로드가 안된다.
  2. 사전작업으로 Docker hub에 이미지를 업로드해야한다.
    ex) 다른 서버 혹은 PC에서 실행을 할 경우 등등

Docker hub 저장소에서 이미지 다운로드

docker pull [Docker Hub 계정 이름]/[저장소 이름]:[태그]

ex) docker pull amsomad/amsomad:latest

🤷🏻‍♀️ Docker Run 실행

Docker Run 실행

docker run -d -p [호스트 포트]:[컨테이너 포트] --name [컨테이너 이름] [Docker Hub 계정 이름]/[저장소 이름]:[태그]

ex) docker run -d -p 80:80 --name amsomad amsomad/amsomad:latest

# -d : 백그라운드로 실행
# -p : 호스트 포트와 컨테이너 포트를 연결

# docker images를 다운받았다면 이미지 이름과 태그를 입력하면 된다.
# ex) images repository - amsomad/grpcservice:latest 인경우
docker run -d -p 80:80 --name amsomad amsomad/grpcservice:latest

만약 Port가 80이 아닌 다른 포트

docker run -d -p [호스트 포트]:[컨테이너 포트] --name [컨테이너 이름] [Docker Hub 계정 이름]/[저장소 이름]:[태그]

ex) docker run -d -p 7015:7015 --name amsomad amsomad/amsomad:latest

Port가 2개인 경우

docker run -d -p [호스트 포트]:[컨테이너 포트] -p [호스트 포트]:[컨테이너 포트] --name [컨테이너 이름] [Docker Hub 계정 이름]/[저장소 이름]:[태그]

ex) docker run -d -p 7015:7015 -p 7016:7016 --name amsomad amsomad/amsomad:latest

Port가 80이 아닌 다른 포트(ex 7015, 7016)를 사용하고 싶다면
Dockerfile에 EXPOSE 7015, EXPOSE 7016를 추가해준다.
그리고 Docker Run 실행시에 -p 7015:7015, -p 7016:7016를 추가해준다.

Docker Run 실행시 환경변수 추가

docker run -d -p [호스트 포트]:[컨테이너 포트] --name [컨테이너 이름] -e [환경변수 이름]=[환경변수 ] [Docker Hub 계정 이름]/[저장소 이름]:[태그]

ex) docker run -d -p 80:80 --name amsomad -e NODE_ENV=production amsomad/amsomad:latest

Docker Run 실행시 볼륨 추가

docker run -d -p [호스트 포트]:[컨테이너 포트] --name [컨테이너 이름] -v [호스트 볼륨]:[컨테이너 볼륨] [Docker Hub 계정 이름]/[저장소 이름]:[태그]

ex) docker run -d -p 80:80 --name amsomad -v /home/amsomad/amsomad:/home/amsomad/amsomad amsomad/amsomad:latest

Docker Run 실행시 볼륨 추가(읽기 전용, 볼륨이 없으면 생성, 볼륨의 소유권을 호스트와 동일하게)

docker run -d -p [호스트 포트]:[컨테이너 포트] --name [컨테이너 이름] -v [호스트 볼륨]:[컨테이너 볼륨]:ro [Docker Hub 계정 이름]/[저장소 이름]:[태그]

ex) docker run -d -p 80:80 --name amsomad -v /home/amsomad/amsomad:/home/amsomad/amsomad:ro amsomad/amsomad:latest

Docker Run Https

docker run -d -p [호스트 포트]:[컨테이너 포트] --name [컨테이너 이름] -v [호스트 볼륨]:[컨테이너 볼륨] [Docker Hub 계정 이름]/[저장소 이름]:[태그]

ex) docker run -d -p 443:443 --name amsomad -v /home/amsomad/amsomad:/home/amsomad/amsomad amsomad/amsomad:latest

만약에 Program.cs와 같은 위치에 server.pem이 있을경우
Dockerfile에 COPY server.pem /home/amsomad/amsomad/server.pem를 추가해준다.
그리고 Docker Run 실행시에 -v /home/amsomad/amsomad/server.pem:/home/amsomad/amsomad/server.pem를 추가해준다.

🤷🏻‍♀️ Docker 환경변수에 대해서

Dockerfile에 ENV [환경변수 이름]=[환경변수 값]을 추가해준다.
Docker Run 실행시에 -e [환경변수 이름]=[환경변수 값]을 추가해준다.

ex) 패스워드를 환경변수로 설정하고 싶다면
Dockerfile에 ENV DB_PASSWORD=1234를 추가해준다.

ex) Database URL을 환경변수로 설정하고 싶다면
Dockerfile에 ENV DB_URL=mongodb://localhost:27017/amsomad를 추가해준다.

Db별 환경변수 설정

docker run -d -p [호스트 포트]:[컨테이너 포트] --name [컨테이너 이름] -e [환경변수 이름]=[환경변수 ] [Docker Hub 계정 이름]/[저장소 이름]:[태그]

ex) Database 환경변수 설정(mongodb)
docker run -d -p 80:80 --name amsomad -e DB_URL=mongodb://localhost:27017/amsomad amsomad/amsomad:latest

ex) Database 환경변수 설정(mysql)
docker run -d -p 80:80 --name amsomad -e DB_URL=mysql://localhost:3306/amsomad amsomad/amsomad:latest

ex) Database 환경변수 설정(postgresql)
docker run -d -p 80:80 --name amsomad -e DB_URL=postgresql://localhost:5432/amsomad amsomad/amsomad:latest

ex) Database 환경변수 설정(mssql)
docker run -d -p 80:80 --name amsomad -e DB_URL=mssql://localhost:1433/amsomad amsomad/amsomad:latest

ex) Database 환경변수 설정(redis)
docker run -d -p 80:80 --name amsomad -e DB_URL=redis://localhost:6379/amsomad amsomad/amsomad:latest

ex) Database 환경변수 설정(oracle)
docker run -d -p 80:80 --name amsomad -e DB_URL=oracle://localhost:1521/amsomad amsomad/amsomad:latest

ex) Database 환경변수 설정(sqlite)
docker run -d -p 80:80 --name amsomad -e DB_URL=sqlite://localhost:3306/amsomad amsomad/amsomad:latest

Dockerfile에 환경변수 추가

FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
WORKDIR /src
COPY ["amsomad.csproj", "./"]
RUN dotnet restore "./amsomad.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "amsomad.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "amsomad.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .

환경변수 추가
ENV DB_URL="your_db_url_here"
DB_USERNAME="your_db_username_here"
DB_PASSWORD="your_db_password_here"

ENTRYPOINT ["dotnet", "amsomad.dll"]

Docker Run 실행시 환경변수 추가

port는 7015, 7016을 사용하고 있다.

docker run -d -p 7015:7015 -p 7016:7016 --name amsomad -e DB_URL="your_db_url_here" -e DB_USERNAME="your_db_username_here" -e DB_PASSWORD="your_db_password_here" amsomad/amsomad:latest

🤷🏻‍♀️ Docker 실행 상태 조회

docker ps

🤷🏻‍♀️ Docker 실행 중인 컨테이너 종료

docker stop [컨테이너 이름]

🤷🏻‍♀️ Docker 컨테이너 삭제

docker rm [컨테이너 이름]


Note: 만들고나니 내것이 아니었다.

Leave a comment