받은 GCP Username, Password, GCP Project ID를 이용해 Google Console 열기
계정 이름 목록을 표시
gcloud auth list
프로젝트 ID 목록을 표시
gcloud config list project
docker run hello-world
Docker 데몬이 hello-world 이미지를 검색했으나 로컬에서 이미지를 찾지 못했고, Docker Hub라는 공개 레지스트리에서 이미지를 가져오고, 가져온 이미지에서 컨테이너를 생성하고, 컨테이너를 실행
docker images
docker ps
실행 종료했기 때문에 hello-world는 결과창에 나오지 않는다.
docker ps -a
test
라는 이름의 폴더를 만들고 이 폴더로 전환mkdir test && cd test
Dockerfile
만들기cat > Dockerfile <<EOF
# 상위 이미지 지정
FROM node:lts
# 컨테이너의 현재 작업 디렉터리 설정
WORKDIR /app
# 현재 디렉터리의 콘텐츠("."로 표시)를 컨테이너에 추가
ADD . /app
# 컨테이너의 포트를 공개하여 해당 포트에서의 연결을 허용
EXPOSE 80
# Run app.js using node when the container launches
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
docker build -t node-app:0.1 .
-t
는 name:tag
문법을 사용하여 이미지의 이름과 태그를 지정docker images
docker run -p 4000:80 --name my-app node-app:0.1
+
아이콘을 클릭) 서버를 테스트curl http://localhost:4000
docker stop my-app && docker rm my-app
docker run -p 4000:80 --name my-app -d node-app:0.1
docker ps
-d : 백그라운드에서 시작, demon을 의미
docker ps
의 출력된 결과에서 컨테이너가 실행 중임을 확인할 수 있다. docker logs [container_id]
를 실행하면 로그를 볼 수 있다.docker logs [container_id]
애플리케이션 수정
cd test
app.js
를 편집하고 'Hello World'를 다른 문자열로 변경....
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Welcome to Cloud\n');
});
....
0.2
로 태그를 지정docker build -t node-app:0.2 .
명령어 결과
Step 1/5 : FROM node:lts
---> 67ed1f028e71
Step 2/5 : WORKDIR /app
---> Using cache
---> a39c2d73c807
Step 3/5 : ADD . /app
---> a7087887091f
Removing intermediate container 99bc0526ebb0
Step 4/5 : EXPOSE 80
---> Running in 7882a1e84596
---> 80f5220880d9
Removing intermediate container 7882a1e84596
Step 5/5 : CMD node app.js
---> Running in f2646b475210
---> 5c3edbac6421
Removing intermediate container f2646b475210
Successfully built 5c3edbac6421
Successfully tagged node-app:0.2
2단계에서 기존 캐시 레이어를 사용하고 있음을 확인 가능
3단계 이후부터는 app.js
를 변경했기 때문에 레이어가 수정
docker run -p 8080:80 --name my-app-2 -d node-app:0.2
docker ps
curl http://localhost:8080
Welcome to Cloud
curl http://localhost:4000
Hello World
docker logs -f [container_id]
컨테이너가 실행중이면 -f 옵션 사용
docker exec -it [container_id] bash
-it : pseudo-tty를 할당하고 stdin을 열린 상태로 유지하여 컨테이너와 상호작용
root@xxxxxxxxxxxx:/app#
exit
docker inspect [container_id]
--format
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' [container_id]
이미지를 Google Artifact Registry로 푸시한다. 그런 다음 모든 컨테이너와 이미지를 삭제하여 새로운 환경을 시뮬레이션하고 컨테이너를 가져와서 실행한다. 이를 통해 Docker 컨테이너의 이식성을 확인한다.
탐색 메뉴의 CI/CD에서 Artifact Registry > 저장소로 이동합니다.
저장소 만들기를 클릭합니다.
저장소 이름으로 my-repository를 지정합니다.
형식으로 Docker를 선택합니다.
위치 유형에서 리전을 선택한 후 us-central1 (Iowa) 위치를 선택합니다.
만들기를 클릭합니다.
이미지를 푸시하거나 가져오려면 먼저 Docker가 Artifact Registry에 대한 요청을 인증하는 데 Google Cloud CLI를 사용하도록 구성
gcloud auth configure-docker us-central1-docker.pkg.dev
Y 입력
컨테이너를 Artifact Registry로 푸시하기
export PROJECT_ID=$(gcloud config get-value project)
cd ~/test
node-app:0.2
에 태그를 지정docker build -t us-central1-docker.pkg.dev/$PROJECT_ID/my-repository/node-app:0.2 .
docker images
docker push us-central1-docker.pkg.dev/$PROJECT_ID/my-repository/node-app:0.2
이미지 테스트하기
docker stop $(docker ps -q)
docker rm $(docker ps -aq)
docker rmi us-central1-docker.pkg.dev/$PROJECT_ID/my-repository/node-app:0.2
docker rmi node:lts
docker rmi -f $(docker images -aq) # remove remaining images
docker images
docker pull us-central1-docker.pkg.dev/$PROJECT_ID/my-repository/node-app:0.2
docker run -p 4000:80 -d us-central1-docker.pkg.dev/$PROJECT_ID/my-repository/node-app:0.2
curl http://localhost:4000