gcloud auth list
gcloud config list project
hello world
컨테이너 실행docker run hello-world
컨테이너 이름 지정 가능
docker run --name [container-name] hello-world
docker images
docker ps
docker ps -a
mkdir test && cd test
cat > Dockerfile <<EOF
# 공식 노드 런타임을 상위 이미지로 사용합니다.
FROM node:6
# 컨테이너의 작업 디렉토리를 /app으로 설정합니다.
WORKDIR /app
# 현재 디렉토리 내용을 /app에 있는 컨테이너에 복사합니다.
ADD . /app
# 컨테이너의 포트 80을 외부에 공개합니다.
EXPOSE 80
# 컨테이너가 시작될 때 노드를 사용하여 app.js를 실행합니다.
CMD ["node", "app.js"]
EOF
cat > app.js <<EOF
const http = require('http');
const hostname = '0.0.0.0';
const port = 80;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World\n');
});
server.listen(port, hostname, () => {
console.log('Server running at http://%s:%s/', hostname, port);
});
process.on('SIGINT', function() {
console.log('Caught interrupt signal and will exit');
process.exit();
});
EOF
Dockerfile이 있는 디렉토리에서 실행해야 함
docker build -t node-app:0.1 .
-t
: name:tag
구문을 사용하여 이미지의 이름(node-app)과 태그(0.1) 지정
- 도커 이미지를 빌드할 때 태그 지정하는 것이 좋음. 그렇지 않으면 기본값인 latest
로 지정되서 최신 이미지와 기존 이미지 구분이 어려워짐
docker run -p 4000:80 --name my-app node-app:0.1
--name
: 컨테이너 이름 지정
-p
: 도커가 컨테이너의 포트 80에 호스트의 포트 4000을 매핑하도록 지시하는 플래그
- 포트 매핑이 없으면 localhost에서 컨테이너 접속 불가
-d
: 컨테이너를 터미널 세션에서 종속시키지 않고 백그라운드에서 컨테이너 실행
docker run -p 4000:80 --name my-app -d node-app:0.1
docker ps
curl http://localhost:4000
docker stop my-app && docker rm my-app
컨테이너 ID 전체 작성할 필요 X (ex. 17bcaca6f -> 17b)
docker logs [container_id]
컨테이너가 실행 중일 때 로그 결과를 확인하려면 -f
옵션 사용
docker logs -f [container_id]
app.js
편집 후 새 이미지 빌드, 0.2
로 태그 지정docker build -t node-app:0.2 .
docker run -p 8080:80 --name my-app-2 -d node-app:0.2
docker ps
docker exec -it [container_id] bash
-it
: pseudo-tty(teletypewriter) 할당, stdin(standard input)을 열린 상태로 유지하여 컨테이너와 상호작용할 수 있도록 하는 플래그
exit
docker inspect [container_id]
--format
을 사용하여 반환된 JSON의 특정 필드 검사 가능
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' [container_id]
docker tag node-app:0.2 [hostname]/[project-id]/[image]:[tag]
docker push [hostname]/[project-id]/[image]:[tag]
# 컨테이너 중지 및 제거
docker stop $(docker ps -q)
docker rm $(docker ps -aq)
하위 이미지 제거 후 노드 이미지 제거
docker rmi node-app:0.2 gcr.io/[project-id]/node-app node-app:0.1
docker rmi node:6
docker rmi $(docker images -aq) # remove remaining images
docker images
docker pull gcr.io/[project-id]/node-app:0.2
docker run -p 4000:80 -d gcr.io/[project-id]/node-app:0.2
curl http://localhost:4000