달리는 두딘

[Docker] Docker Next.js 프로젝트 배포 본문

끄적

[Docker] Docker Next.js 프로젝트 배포

디두딘 2024. 2. 1. 01:05

 

 

바야흐로 .. 작년 4월


혼자 토이프로젝트로 Next.js를 이용해 개인 블로그를 준비하고 있었는데,

너무 바쁜 나머지 내팽개쳐버린 프로젝트가 있었다.
 
일단 이 프로젝트를 이미지 파일로 만들어서 컨테이너에 띄우는 게 목표!

 

가보자고

 

 


 

DockerFile 구성

FROM node:14-slim

WORKDIR /usr/src/app

COPY package.json .
# COPY yarn.lock .

RUN yarn

COPY . .

EXPOSE 3000

CMD ["yarn", "dev"]

 

.dockerignore 설정

// .dockerignore
node_modules
.next


이미지 파일 생성

docker build -t doodin_blog .


빌드 완!

 

 

이미지 파일 목록을 보면 정상적으로 생성이 됐다.

 


오우 2.4GB..
오늘은 일단 띄워보는 것이 목표니까
크기 줄이는 건 나중에 해보자

찾아보니 도커파일만 잘 만들어도
크기를 확 줄일 수 있다고 한다!

Docker Desktop에서 이미지 파일 목록으로도 확인 가능

 

 
자 이제 그럼 이 이미지 파일을
컨테이너에 띄워보기!!

컨테이너 생성

docker run -dp 3000:3000 doodin_blog .

 --name 옵션을 사용해서 컨테이너에 이름을 부여해주면 해당 이름으로 컨테이너를 식별 가능하다고 함

일단 난 그냥 해봄

 

 

 

Docker Desktop에서 보면 serene_feistel라는 이름으로 컨테이너 생성이 완료됐고, 현재 run 상태인 것도 확인 가능하다.

 

잘 구동중~~

 

Docker Desktop에서 로그도 확인 가능하다.

{
	"Id": "f4f5624060122fdf559ba645edb10783f864108a234651b2eaf0f9b8c5a4b03e",
	"Created": "2024-01-31T15:12:18.157660271Z",
	"Path": "docker-entrypoint.sh",
	"Args": [
		"yarn",
		"dev"
	],
	"State": {
		"Status": "running",
		"Running": true,
		"Paused": false,
		"Restarting": false,
		"OOMKilled": false,
		"Dead": false,
		"Pid": 1281,
		"ExitCode": 0,
		"Error": "",
		"StartedAt": "2024-01-31T15:12:18.59166914Z",
		"FinishedAt": "0001-01-01T00:00:00Z"
	},
	"Image": "sha256:da6358c8aa74d89eff6418f76a8b590c26d9f8cad9ba7fda87d41acdbf80e3ae",
	"ResolvConfPath": "/var/lib/docker/containers/f4f5624060122fdf559ba645edb10783f864108a234651b2eaf0f9b8c5a4b03e/resolv.conf",
	"HostnamePath": "/var/lib/docker/containers/f4f5624060122fdf559ba645edb10783f864108a234651b2eaf0f9b8c5a4b03e/hostname",
	"HostsPath": "/var/lib/docker/containers/f4f5624060122fdf559ba645edb10783f864108a234651b2eaf0f9b8c5a4b03e/hosts",
	"LogPath": "/var/lib/docker/containers/f4f5624060122fdf559ba645edb10783f864108a234651b2eaf0f9b8c5a4b03e/f4f5624060122fdf559ba645edb10783f864108a234651b2eaf0f9b8c5a4b03e-json.log",
	"Name": "/serene_feistel",
	"RestartCount": 0,
	"Driver": "overlay2",
	"Platform": "linux",
	"MountLabel": "",
	"ProcessLabel": "",
	"AppArmorProfile": "",
	"ExecIDs": [
		"68429ebcb28e52cb8ca5e94a8b52ac11e2066828bb214a22f62ba7d5b5ec0fe3"
	],
	"HostConfig": {
		"Binds": null,
		"ContainerIDFile": "",
		"LogConfig": {
			"Type": "json-file",
			"Config": {}
		},
		"NetworkMode": "default",
		"PortBindings": {
			"3000/tcp": [
				{
					"HostIp": "",
					"HostPort": "3000"
				}
			]
		},
		"RestartPolicy": {
			"Name": "no",
			"MaximumRetryCount": 0
		},
		"AutoRemove": false,
		"VolumeDriver": "",
		"VolumesFrom": null,
		"ConsoleSize": [
			32,
			215
		],
		"CapAdd": null,
		"CapDrop": null,
		"CgroupnsMode": "host",
		"Dns": [],
		"DnsOptions": [],
		"DnsSearch": [],
		"ExtraHosts": null,
		"GroupAdd": null,
		"IpcMode": "private",
		"Cgroup": "",
		"Links": null,
		"OomScoreAdj": 0,
		"PidMode": "",
		"Privileged": false,
		"PublishAllPorts": false,
		"ReadonlyRootfs": false,
		"SecurityOpt": null,
		"UTSMode": "",
		"UsernsMode": "",
		"ShmSize": 67108864,
		"Runtime": "runc",
		"Isolation": "",
		"CpuShares": 0,
		"Memory": 0,
		"NanoCpus": 0,
		"CgroupParent": "",
		"BlkioWeight": 0,
		"BlkioWeightDevice": [],
		"BlkioDeviceReadBps": [],
		"BlkioDeviceWriteBps": [],
		"BlkioDeviceReadIOps": [],
		"BlkioDeviceWriteIOps": [],
		"CpuPeriod": 0,
		"CpuQuota": 0,
		"CpuRealtimePeriod": 0,
		"CpuRealtimeRuntime": 0,
		"CpusetCpus": "",
		"CpusetMems": "",
		"Devices": [],
		"DeviceCgroupRules": null,
		"DeviceRequests": null,
		"MemoryReservation": 0,
		"MemorySwap": 0,
		"MemorySwappiness": null,
		"OomKillDisable": false,
		"PidsLimit": null,
		"Ulimits": null,
		"CpuCount": 0,
		"CpuPercent": 0,
		"IOMaximumIOps": 0,
		"IOMaximumBandwidth": 0,
		"MaskedPaths": [
			"/proc/asound",
			"/proc/acpi",
			"/proc/kcore",
			"/proc/keys",
			"/proc/latency_stats",
			"/proc/timer_list",
			"/proc/timer_stats",
			"/proc/sched_debug",
			"/proc/scsi",
			"/sys/firmware",
			"/sys/devices/virtual/powercap"
		],
		"ReadonlyPaths": [
			"/proc/bus",
			"/proc/fs",
			"/proc/irq",
			"/proc/sys",
			"/proc/sysrq-trigger"
		]
	},
	"GraphDriver": {
		"Data": {
			"LowerDir": "/var/lib/docker/overlay2/31aacf2ac1ef5992213b7a212b7d81aebb95d4f1378bc6882304541c4ed275b2-init/diff:/var/lib/docker/overlay2/nqbpeeuzdyiwjdz395gp7hd64/diff:/var/lib/docker/overlay2/u70tm9tiit6xnfbtrqoucyqr6/diff:/var/lib/docker/overlay2/ddvg4m0buebkaba857s10gbjw/diff:/var/lib/docker/overlay2/hgpn5qzdliybi0yo7n45yqeos/diff:/var/lib/docker/overlay2/5f097528529822b911c6e87cdca215464735692e628f24747190023304b86d91/diff:/var/lib/docker/overlay2/25ffb545c1693ea85926acf7cc28fdf8486866f513f9da0e65d59f56e782a017/diff:/var/lib/docker/overlay2/bb4b82298881dba892d65e9ebca1e9caa265095bf4a00a280c21a8380dd2a4a8/diff:/var/lib/docker/overlay2/34875b8074c0ab031c611807e943fcfe1312e21b22ba63148115547418011de4/diff:/var/lib/docker/overlay2/52a615f27325e1a0c9cdd8adf0d731fde6eb7b99c8f991b6ee9fb26d4be7a764/diff",
			"MergedDir": "/var/lib/docker/overlay2/31aacf2ac1ef5992213b7a212b7d81aebb95d4f1378bc6882304541c4ed275b2/merged",
			"UpperDir": "/var/lib/docker/overlay2/31aacf2ac1ef5992213b7a212b7d81aebb95d4f1378bc6882304541c4ed275b2/diff",
			"WorkDir": "/var/lib/docker/overlay2/31aacf2ac1ef5992213b7a212b7d81aebb95d4f1378bc6882304541c4ed275b2/work"
		},
		"Name": "overlay2"
	},
	"Mounts": [],
	"Config": {
		"Hostname": "f4f562406012",
		"Domainname": "",
		"User": "",
		"AttachStdin": false,
		"AttachStdout": false,
		"AttachStderr": false,
		"ExposedPorts": {
			"3000/tcp": {}
		},
		"Tty": false,
		"OpenStdin": false,
		"StdinOnce": false,
		"Env": [
			"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
			"NODE_VERSION=14.21.3",
			"YARN_VERSION=1.22.19"
		],
		"Cmd": [
			"yarn",
			"dev"
		],
		"Image": "doodin_blog",
		"Volumes": null,
		"WorkingDir": "/usr/src/app",
		"Entrypoint": [
			"docker-entrypoint.sh"
		],
		"OnBuild": null,
		"Labels": {}
	},
	"NetworkSettings": {
		"Bridge": "",
		"SandboxID": "eab129b5f639d2dce115ebd9a18601e748faeaccf557b1f06390bff8a8f6c6dd",
		"HairpinMode": false,
		"LinkLocalIPv6Address": "",
		"LinkLocalIPv6PrefixLen": 0,
		"Ports": {
			"3000/tcp": [
				{
					"HostIp": "0.0.0.0",
					"HostPort": "3000"
				}
			]
		},
		"SandboxKey": "/var/run/docker/netns/eab129b5f639",
		"SecondaryIPAddresses": null,
		"SecondaryIPv6Addresses": null,
		"EndpointID": "174bbc564d6581104d0084d06cf750280e58dab35ea1a141ee3c165c3b041de5",
		"Gateway": "172.17.0.1",
		"GlobalIPv6Address": "",
		"GlobalIPv6PrefixLen": 0,
		"IPAddress": "172.17.0.2",
		"IPPrefixLen": 16,
		"IPv6Gateway": "",
		"MacAddress": "02:42:ac:11:00:02",
		"Networks": {
			"bridge": {
				"IPAMConfig": null,
				"Links": null,
				"Aliases": null,
				"MacAddress": "02:42:ac:11:00:02",
				"NetworkID": "03607c78977124599b313bc5bd3b0d05ad1d1595b2e31ab597381b6eb22ad0fd",
				"EndpointID": "174bbc564d6581104d0084d06cf750280e58dab35ea1a141ee3c165c3b041de5",
				"Gateway": "172.17.0.1",
				"IPAddress": "172.17.0.2",
				"IPPrefixLen": 16,
				"IPv6Gateway": "",
				"GlobalIPv6Address": "",
				"GlobalIPv6PrefixLen": 0,
				"DriverOpts": null
			}
		}
	}
}

Docker Inspect

 

DockerFile에 설정한 경로에 내 프로젝트가 구성되어 있는 것이 확인 가능함

DockerFile에 EXPOSE 3000으로 했기 때문에 http://localhost:3000/ 으로 접속해봄

 
내 프로젝트다!!!!!! 박수~!!! 야호

이럴줄 알았으면 더 열심히 만들어놓을걸 싶네요

문제는 누군가 이 이미지 파일을 받는다면
주기적으로 supabase 활성화를 해야한다는 것 ..
안 하면 비활성화 되어버려서 에러가 날 것임다 ㅜ

도커에 한 걸음 다가 간 듯 합니다!
왜 다들 도커도커 하는지 알 거 같네요...........

이 이미지 파일을 push해서 docker hub로 올리고

다른 사람들이 이미지 파일을 pull 한다면 제 프로젝트를 확인하는 것이 가능할 것 같네욧!

 

너무 뜻 깊고 재밌었습니다! 꾸우벅