
이번 글에서는 Docker를 이용해 2가지의 간단한 실습에 대해 진행한 것을 포스팅할 예정이다.
이전글과 이어지니 안보신 분들을 읽고 오시는 것을 추천한다.
Docker 이해하기 - 3.Docker 설치 및 명령어
Docker 이해하기 - 3. Docker 설치 및 명령어
이번 글에서는 Docker 설치 방법과 간단한 Docker 명령어들에 대한 내용을 정리하려고 한다. 환경으로는 Ubuntu를 사용했다. 🐋 Docker 설치처음으로 Docker Engine을 설치하기 전에 Docker apt 저장소를 설
laewonjeong.tistory.com
1. 간단한 Node.js 서버를 Docker로 실행해보기
이 실습을 통해, Node.js 서버를 Docker 컨테이너 안에서 실행해보고 Docker의 기본적인 동작 과정을 알아보았다.
우선 다음과 같이 간단한 코드를 작성했다. 아래 코드는 HTTP 요청을 받아 응답을 반환하는 코드이다.
$ vi hello.js
const http = require('http');
const hostname = '0.0.0.0';
const port = '16800';
httpd = http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
res.end('Docker Practice\n');
});
httpd.listen(port, hostname, function(){
console.log('server start');
});
Dockerfile 작성
이제 이 파일(hello.js)을 컨테이너로 실행할 수 있는 이미지를 만들어야 한다.
이를 위해 다음과 같이 Dockerfile을 만들고 작성해주었다.
$ vi Dockerfile
FROM node
EXPOSE 16800
COPY hello.js .
CMD node hello.js
이 Dockerfile에 대해 설명해보면 다음과 같다.
FROM node
: 먼저 node를 기본 이미지로 지정한다.
→ node는 Node.js 애플리케이션을 Docker 컨테이너에서 실행할 수 있도록 제공되는 공식 이미지이다.

EXPOSE 16800
: 컨테이너가 외부와 통신할 포트를 16800으로 지정한다.
COPY hello.js .
: 현재 디렉토리에 있는 hello.js 파일을 컨테이너 안으로 복사한다.
CMD node hello.js
: 컨테이너가 시작 됐을 때, node hello.js 명령어를 사용하여 hello.js 애플리케이션을 실행한다.
이미지 빌드
Dockerfile 작성이 완료되었으면, 이를 이용해 이미지를 빌드 할 수 있다.
$ sudo docker build -t nodejs_practice:v1 .
-t 옵션을 사용해 이름:태그(nodejs_practice:v1) 형식을 설정하고, 현재 디렉토리를 빌드 컨텍스트로 지정한다.
빌드 컨텍스트는 Dockerfile에서 참조되는 파일을 포함하는 디렉토리이다.

빌드가 완료되었으면 아래 명령어를 통해 생성된 이미지를 확인할 수 있다.
$ sudo docker images

컨테이너 생성/실행
이미지가 생성되었으니 이 이미지를 컨테이너로 생성/실행할 수 있다.
$ sudo docker run -d -p 16800:16800 --name nodejs_container nodejs_practice:v1

- 이 명령어는 -d를 통해 컨테이너를 백그라운드에서 실행하도록 한다.
- -p 16800:16800을 통해 호스트 머신의 16800 포트를 컨테이너의 16800포트와 연결한다.
- --name을 통해 컨테이너 이름을 nodejs_container로 설정한다.
- 마지막에는 앞서 만들어놨던 이미지의 이름을 지정해 nodejs_practice:v1 이미지를 기반으로 컨테이너가 실행된다.
컨테이너가 잘 실행되고 있는지 확인하기 위해서는 다음과 같은 명령어를 사용한다.
$ sudo docker ps

포트와 컨테이너 이름이 잘 적용된 것을 확인할 수 있고, 정상적으로 수행되고 있음 또한 확인할 수 있다.
결과 확인

localhost:16800에 접속하여 애플리케이션이 정상적으로 작동하는 것을 확인할 수 있다.
컨테이너 중지, 삭제 및 이미지 삭제
실습한 컨테이너와 이미지를 삭제하는 실습도 진행했다.
먼저, docker ps 명령어를 통해 중지할 CONTAINER ID 또는 CONTAINER NAME을 확인한다.
$ sudo docker ps

docker stop 명령어를 통해 컨테이너를 중지한다.
$ sudo docker stop [CONTAINER ID] or [NAMES]

위 명령어는 실행중인 컨테이너를 중지 시킨 것이지, 삭제한 것이 아니다.
따라서, 완전히 중지하고 삭제하고 싶으면 docker stop 명령어 후, docker rm 명령어를 통해 삭제 시켜주어야 한다.
$ sudo docker rm [CONTAINER ID] or [NAMES]

다음으로 docker images 명령어를 통해 삭제할 이미지의 IMAGE ID를 확인한다.
$ sudo docker images

docker rmi 명령어를 통해 이미지를 삭제한다.
$ sudo docker rmi [IMAGE ID]

2. Golang 코드 Docker로 실행하기
실습을 하나만 하기 아쉬워서 간단하게 하나 더 진행했다.

위 그림은 진행한 실습의 흐름을 보여준다.
Go 언어를 사용한 코드를 Dockerfile을 통해 Docker Image로 만들고 이를 컨테이너로 실행하는 간단한 실습이다.
사실 위에 실습에서 Node.js가 Go 언어로 바뀐 것 뿐이다.
먼저 다음과 같이 Go언어로 코드를 작성했다. 단순히 Hello World를 출력하는 코드이다.
$ vi hello.go
package main
import "fmt"
func main(){
fmt.Println("Hello World!")
}
Dockerfile 생성
$ vi Dockerfile
FROM golang
COPY hello.go .
RUN go build hello.go
CMD ./hello
- 이 Dockerfile은 golang이라는 베이스 이미지를 사용하면서,
- COPY를 통해 hello.go 파일을 컨테이너의 작업 디렉토리(.)로 복사한다.
- RUN을 통해 이미지 생성 중 hello.go 파일을 빌드하여 실행 파일을 생성하고,
- CMD를 통해 컨테이너가 시작되면 ./hello 실행 파일을 기본 명령으로 실행하는 이미지를 생성한다.
이미지 빌드
docker build 명령어를 통해 이미지를 빌드한다.
$ sudo docker build -t go_practice:v1 .

docker images 명령어를 통해 빌드된 이미지를 확인한다.
$ sudo docker images

컨테이너 생성/실행
docker run 명령어를 사용하여 빌드된 이미지를 통해 컨테이너를 생성/실행한다.
$ sudo docker run go_practice:v1

Hello World! 문구가 정상적으로 출력되는 것을 확인할 수 있다.
이 이미지는 Hello World!를 출력하고 끝이기 때문에 컨테이너가 계속 실행되지 않는다.
docker ps 명령어로 이를 확인해보면
$ sudo docker ps -a

상태가 Exited로 나오는 것을 확인할 수 있다.
로컬에서 Go언어로 작성된 코드 빌드하기
$ go build hello.go

로컬에서 hello.go 파일을 빌드하려고 하면 go라는 명령어를 찾을 수 없다고 표시된다.
이는 로컬에 Go언어를 사용할 수 있는 환경이 설치되어 있지 않기 때문이다.
하지만, 앞서 go_practice:v1이라는 이미지를 만들고 이를 컨테이너로 실행했을 때는 결과가 잘 나오는 것을 확인했다.
이는 golang이라는 베이스 이미지를 사용하여, 컨테이너가 생성될 때 컨테이너 안에 Go 언어를 사용할 수 있는 환경들이 구성되어 있기 때문이다.
따라서, 로컬 환경에 Go를 설치하지 않아도 컨테이너 내부에서는 Go 프로그램을 실행할 수 있다.
즉, 어떠한 환경에서든 Go 환경이 구성이 되어 있지 않아도 Docker만 설치 되어 있다면 이를 실행할 수 있다는 뜻이다.
Docker는 개발자가 서로 다른 운영 체제나 환경을 사용하더라도, 동일한 이미지를 사용하면 일관된 실행 결과를 보장할 수 있다는 장점이 있다.
마무리
이번 글에서는 2가지의 간단한 실습을 진행한 것에 대해 포스팅하였다.
이를 통해, Docker 기본적인 사용법뿐만 아니라, 동작 과정에 대해서도 이해할 수 있었고, 실제 Docker를 적용했을 때 얻을 수 있는 이점들을 이해할 수 있었다.
다음 글에서는 DockerHub에 대해 포스팅할 예정이고, 나아가 Kubernetes에 대한 내용도 포스팅도 할 예정이다.
'Docker 및 Kubernetes > Docker' 카테고리의 다른 글
[Docker] 5. Docker Hub란 (0) | 2025.01.21 |
---|---|
[Docker] 3. Docker 설치 및 명령어 (1) | 2024.11.19 |
[Docker] 2. Docker란? (0) | 2024.11.15 |
[Docker] 1. 가상화(Virtualization) (1) | 2024.11.13 |