목차
- Docker란?
- 명령어
- docker로 프로젝트 배포 하기
Docker란?
Docker를 설명하기에 앞써 VM과 Container의 개념 차이를 알아보겠습니다.


VM(Virtual Machines)
VM은 호스트의 컴퓨터에 소프트웨어를 실행시키는 가상 시스템입니다.
Hypervisor라는 하드웨어는 가상 머신 모니터가 VM을 만들고 각 VM은 독립적인 OS를 가지면서 어플리케이션 들을 동작시킵니다.
하나의 컴퓨터 위에 여러 컴퓨터를 설치해서 사용할수 있다는 장점을 가지고 있지만, 웹서버 등과 같은 어플리케이션 하나만을 실행하기 위해 OS를 설치하는 건 굉장히 무거운 작업입니다.
이러한 VM의 단점을 개선하기 위해 나온 개념이 Container입니다.
Docker 등 서버 관련 공부 또는 작업 테스트때 VM을 꽤 유용하게 사용했습니다. 설치해서 사용해보는걸 추천드립니다.
Container
Container는 호스트의 컴퓨터에 다수의 어플리케이션 을 실행시키는데, 격리된 환경에서 각 어플리케이션들을 동작시킵니다. 어플리케이션 실행만 독립적인 환경에서 실행하는것이기 때문에 호스트 OS를 사용해서 비교적 가볍게 운용됩니다.
VM이 더 높은 격리성을 보이겠지만, Container는 image라는 요소를 이용해서 높은 이식성, 유연성 등의 장점으로 많이 사용되는 방법입니다.
Docker
Docker는 위에서 설명한 Container를 사용할 수 있게 해주는 프로그램입니다. Docker를 이용해 하나의 호스트 OS에서 다양한 서비스를 편리하고 빠르게 배포 및 관리할 수 있게 됩니다.
Docker 구성요소 및 프로세스

프로그램 소스코드 → Dockerfile → Docker image → Docker container
Docker는 Dockerfile을 이용해서 소스코드를 image로 변환해줍니다. image를 가지고 docker container를 생성해서 어플리케이션을 실행하는 과정을 거칩니다.
1. Dockerfile
도커 파일은 소스코드에 대한 이미지를 생성하는 정보가 담긴 레시피입니다.
docker build 명령어가 수행될때 docker는 Dockerfile을 이용해 필요한 파일, 라이브러리, 외부 의존성을 다운받고 이러한 행위 필요한 환경을 설정합니다. 그리고 실행에 필요한 동작(스크립트)를 통해 이미지를 만듭니다.
참고로 Docker이미지는 명령어 하나하나가 실행될 때마다 읽기 전용 레이어를 생성하여 쌓는 방식으로 만들어집니다.
Docker는 이미지를 빌드할 때 이전 빌드에서 사용했던 명령어와 정확히 동일한 명령어가 오면, 해당 레이어를 만들지 않고 기존의 캐시된 레이어를 재사용한다고 합니다.
- FROM
[용도]
이미지를 만들기 위한 기반 운영체제/환경을 지정합니다.
jar기반 이미지를 만드는 경우 jdk 이미지를, node 서버 이미지를 만드는 경우 node이미지로 설정합니다.
[예시]
FROM openjdk:17-jdk-slim (Java 애플리케이션용) - WORKDIR
[용도]
RUN, CMD, COPY 등의 명령이 실행될 기본 디렉터리를 설정합니다.
[예시]
WORKDIR /app - RUN
[용도]
이미지가 빌드되는 시점에 수행할 쉘 명령을 실행합니다. (소프웨어 설치, 환경 설정 등)
[예시]
RUN apt-get update && apt-get install -y git - EXPOSE
[용도]
호스트와 연결할 포트 번호
[예시]
EXPOSE 8080 (웹 서버 포트) - COPY
[용도]
로컬PC(Docker 호스트)의 파일이나 폴더를 이미지 내부로 복사합니다.
[예시]
COPY target/myapp.jar /app/myapp.jar - ENV
[용도]
환경 변수 설정, 애플리케이션이 실행될 때 필요한 환경 변수(DB정보, 설정 값 등)를 이미지 내부에 설정합니다.
[예시]
FROM alpine:latest
ENV APP_HOME=/usr/src/app
ENV PORT=8080
WORKDIR $APP_HOME //실행 경로의 변수로 사용가능.
CMD ["sh", "-c", "echo 'Server listening on port $PORT'"] //CMD 실행시 환경 변수 사용 가능 - USER
[용도]
사용자 변경, 컨테이너를 실행할 사용자를 지정하여 root 권한 대신 낮은 권한으로 실행되게 합니다.
[예시]
FROM nginx:latest
RUN echo "test"
USER appuser //RUN 이후 명령을 실행할 사용자를 'appuser'로 변경
CMD ["nginx", "-g", "daemon off;"] - ARG
[용도]
빌드 인자 설정, 이미지를 빌드할때만 사용되는 변수입니다.
docker build --build-arg KEY=VALUE 옵션으로 값을 전달받는 변수를 설정합니다.
[예시]
FROM alpine:latest
ARG APP_VERSION=latest
RUN echo"app version $APP_VERISON..." //RUN 명령어에서는 APP_VERSION변수를 사용하여 빌드합니다.
ENV FINAL_VERSION=$APP_VERSION //ARG로 정의된 변수는 ENV변수로 전달될 수 있습니다.
CMD ["sh", "-c", "echo 'Build Arg is not accessible here: $APP_VERSION'"] //ARG변수는 컨테이너 실행 시점에서는 접근할 수 없습니다. - CMD
[용도]
컨테이너가 시작될 때 기본적으로 실행할 명령어를 지정합니다.
[예시]
CMD ["java", "-jar", "myapp.jar"] - ENTRYPOINT
[용도]
컨테이너가 시작될 때 항상 실행되는 명령어를 지정합니다.
[예시]
ENTRYPOINT ["/usr/bin/java", "-jar"] - VOLUME
[용도]
디렉터리의 내용을 컨테이너에 저장하지 않고 호스트에 저장하도록 설정
데이터 볼륨을 호스트의 특정 디렉터리와 연결하려면 docker run 명령에서 -v 옵션을 사용해야합니다.
ex) -v /root/data:/data
[예시]
VOLUME /var/log/app
2. Docker image
도커 이미지는 컨테이너 실행에 필요한 서버 프로그램 + 소스코드 + 실행 파일 으로 구성된 압축 파일입니다.
docker images 명령시 아래와 같이 도커에서 가지고 있는 이미지 리스트를 확인하거나

docker image inspect 이미지명 명령시 image의 상세 정보를 확인 할 수 있습니다.

3. Docker container
도커 컨테이너는 docker image를 실행할수 있는 독립적인 환경입니다.
docker engine위에서 각각의 container들이 image를 실행할때 생성되며 호스트 os의 자원을 사용하여 독립적인 환경에서 각 애플리케이션들을 동작시킵니다.
docker run 명령을 통해 image를 실행하고 container가 생성됩니다.
4. Docker hub
도커 허브는 Docker에서 운영하는 Docker 이미지 저장소입니다.
별도의 설정없이 docker pull시 도커 허브에서 제공하는 이미지를 내려받게 됩니다.
도커 허브가 아닌 다른 외부 저장소에서 이미지를 내려 받고자 한다면
docker pull [ip:port]/[image명]:[태그] 로 외부 저장소에서 이미지를 받을 수 있습니다.
외부 저장소에 이미지를 push하고 싶은 경우에는 저장소 접속 허용 설정 후, docker에서 외부 저장소에 로그인을 하여 push 하면 됩니다.
보안적으로 신뢰할 수 없는 레지스트리에 대한 접속을 허용하는 설정
// /etc/docker/daemon.json
{
// "insecure-registries":["localhost:5000" ]
"insecure-registries":["[저장소 IP]:[저장소 PORT]" ]
}
docker에서 외부 저장소 로그인 후, 이미지 푸시
//1. 도커로 외부 저장소 로그인
docker login [저장소 IP]:[저장소 PORT]
//2. 이미지 푸시
docker push [저장소 IP]:[저장소 PORT]/.../[이미지 명]:[태그]
명령어
이미지 목록 보기
docker images
이미지 검색
docker images | grep [이미지 이름]
이미지 받기
docker pull [이미지명]:[태그]
이미지 삭제
docker rmi [이미지명]
컨테이너 목록 보기(실행중인 것만)
docker ps
컨테이너 목록 보기(전체)
docker ps -a
컨테이너 실행
docker run ([옵션]) [이미지 명]:[태그] ([명령어]) ([인자]) //() 생략가능
| 옵션 | |
| -d | 백그라운드로 실행, 해당 옵션없이 컨테이서 실행시 컨테이너에 빠져나오면서 컨테이너 종료 |
| -it | 컨테이너를 종료하지 않은채 터미널의 입력을 컨테이너로 전달. |
| --name | 컨테이너의 이름 부여 |
| -e | 컨테아너의 환경변수 설정, dockerfile의 ENV 설정도 덮어씌어짐 |
| -p | 호스트와 컨테이너의 포트를 연결 (포워딩) |
| -v | 컨테이너의 파일 시스템 특정 경로와 호스트 컴퓨터의 파일 시스템의 특정 경로를 마운트 |
| -w | 컨테이너 빌드의 실행 경로 설정, dockerfile의 WORKDIR 설정도 덮어씌워짐 |
| --rm | 컨테이너를 일회성으로 사용할때 사용, 컨테이너와 관련된 리소스까지 함께 제거 |
컨테이너 재시작
docker restart [컨테이너 명]
컨테이너 접근
docker exec -it [컨테이너명] /bin/bash
저는 주로 exec와 -it 옵션을 넣은 명령어를 사용해서 컨테이너에 접근합니다. 그래서 컨테이너를 나갔을때 컨테이너가 멈추지않고 유지되기 때문입니다.
참고로 컨테이너 접근시 주로 /bin/bash를 사용하는데 dockerfile에서 이미지를 구성하는 환경설정을 alpine과 같은 최소한으로 최적화한 버전을 사용하는 경우 /bin/sh으로 접근해야하는 경우가 있습니다.
Docker로 프로젝트 배포 하기
docker 설치 환경은 VM과 centos, locky linux를 사용했습니다.
VM설치와 리눅스 설치는 연결해둔 링크를 참고해주세요.
1. Docker 설치
centos에서 yum이나 dnf를 이용해서 install하려고 할때 SSL 인증서 오류가 발생하는 경우가 있습니다.

yum 명령어 실행시 SSL 이슈 해결을 참고해서 설정하시면 됩니다.

공식 문서에 centos를 사용할때는 dnf를 사용하는것을 추천해주었습니다.
아래 명령어를 통해 도커 사용에 필요한 저장소와 엔진을 설치하고 도커 엔진을 실행시킵니다.
// 1. 필수 도커 저장소 설치
$ sudo dnf -y install dnf-plugins-core
$ sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
// 2. 도커 엔진 설치
$ dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
// 3. 도커 엔진 실행
$ systemctl enable --now docker
2. Docker image pull
docker pull [이미지 명]:[태그]
도커 이미지는 일반적으로 docker hub에서 내려 받아옵니다.
이미지 이름과 태그는 docker hub 공식 홈페이지에서 확인할 수 있습니다.

가장 최신 버전인것같은 nginx의 1.29.3를 받아보겠습니다.

이미지를 받으면 docker.io에서 받아옵니다.

3. Docker container 실행
docker run 명령어를 통해 방금 받은 이미지를 8081포트로 포워딩하도록 실행시켜보겠습니다.
docker run --name my_nginx -p 8081:80 nginx:1.29.3


4. 개인 저장소에서 이미지 불러와 실행하기
만약 docker를 사용할때 폐쇄망이거나 개발 정책으로 인해 docker hub가 아닌 개인 저장소를 구성하여 거기서 이미지를 가져다 쓰는 경우가 있습니다.
저 같은 경우 폐쇄망이기 때문에 별다른 설정없이 이미지를 내려받을 경우 인증 오류가 발생하게 됩니다.

harbor라는 개인 저장소를 사용하고 있고, library/node 경로에 태그 번호 22인 node라는 도커 이미지 를 가지고 있습니다.

이럴때는 docker pull [ip : port]/[저장소 경로]/[이미지 명]:[태그] 명령어를 통해 연결되어있는 개인 저장소에서 이미지를 불러올 수 있습니다.

참고
https://sseozytank.tistory.com/85
[Linux] 뉴비를 위한 Docker 기초 개념 및 명령어, 설치부터 예제까지
Docker를 공부하면서 헷갈리거나, 어려웠던 부분을 열심히 이해해서 조금 더 쉽게 작성하려고 노력했다. 해당 글은 개념 및 실행 관련 예제가 많다보니, Docker를 만들어야하는 목적의 사람에겐 적
sseozytank.tistory.com
[Docker] Private 레지스트리 구축 및 사용 방법
기업이나 조직에서 민감한 이미지나 코드를 포함한 컨테이너 이미지를 저장할 필요가 있는데 이럴 때 Private 레지스트리가 필요하다. Private 레지스트리를 사용하면 내부에서 관리되고 안전한 환
cocococo.tistory.com
https://docs.docker.com/engine/install/centos/
CentOS
Learn how to install Docker Engine on CentOS. These instructions cover the different installation methods, how to uninstall, and next steps.
docs.docker.com
https://eyeballs.tistory.com/544
[CentOS] Curl error (60) SSL certificate problem 이슈 해결 방법
curl, yum install 등의 명령어 실행시 아래처럼 SSL 이슈가 나오는 경우 [MIRROR] pgdg-redhat-repo-latest.noarch.rpm: Curl error (60): Peer certificate cannot be authenticated with given CA certificates for https://download.postgresql.org/p
eyeballs.tistory.com
'develop > server' 카테고리의 다른 글
| [ERROR] GitLab pipeline pending (Job is stuck. Check runners.) (0) | 2025.11.09 |
|---|---|
| [Docker] 폐쇄망 React + Nginx 도커 이미지로 배포 (1) | 2025.11.07 |
| [GitLab] GitLab Runner 등록 (0) | 2025.11.06 |
| [Docker] 폐쇄망에서 프로젝트 구축하기 (0) | 2025.11.05 |
| [Gitlab] gitlab-runner 등록 (0) | 2025.10.22 |