Docker는 커널 컨테이너화 기능(kernel containerization features)을 application 관리 및 배포에 도움이 되는 워크플로우 또는 도구와 결합하여 제공한다.
- Docker를 사용하면 개발 환경을 통일할 수 있어 배포, 테스트, 개발에 편의성을 더해준다.
GOAL
- Docker container 를 빌드, 실행 그리고 디버깅하는 방법
- Docker Hub 또는 Google Artifact Registry에서 Docker image를 가져오는 방법
- Google Artifact Registry에 Docker image를 올리는 방법
참고 : 퀵랩 시작 시 제공되는 정보
docker run hello-world
docker images
"""
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 19 months ago 13.3kB
"""
docker run hello-world
를 재실행하면 이번에는 local에서 image를 가져와 컨테이너를 실행한다. docker ps
""" 실행이 완료되어 아무것도 없음
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
"""
docker ps -a
"""
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f4932e3c2d78 hello-world "/hello" 7 minutes ago Exited (0) 7 minutes ago modest_mahavira
"""
간단한 node application 을 만들어보자.
mkdir test && cd test
cat > Dockerfile <<EOF
# Use an official Node runtime as the partner image
FROM node:lts
# Set the working directory in the container to /app
WORKDIR /app
# Copy the current directory contents into the container at /app
ADD . /app
# Make the container's port 80 available to the outside word
EXPORT 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
-t
는 tag의 의미docker build -t node-app:0.1 .
docker images
--name
: container의 이름 명명-p
: port mappingdocker run -p 4000:80 --name my-app node-app:0.1
-d
: terminal session에 묶이지 않고 background에서 실행됨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
container_id는 유일하게 식별 가능한 만큼만 써줘도 됨
docker logs [container_id]
docker run -p 8080:80 --name my-app2 -d node-app:0.2
docker logs -f [container_id]
docker exec -it [container_id]
docker inspect [container_id]
"""
[
{
"Id": "f6df156042305f843ca34e0c538520938651d2c12585a984ffce18655d2a7df9",
"Created": "2023-04-21T03:51:02.91146187Z",
"Path": "docker-entrypoint.sh",
"Args": [
"node",
"app.js"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 2404,
"ExitCode": 0,
"Error": "",
"StartedAt": "2023-04-21T03:51:03.327357031Z",
"FinishedAt": "0001-01-01T00:00:00Z"
"""
--format
을 이용하여 특정 정보 추출하기 docker inspect --foramt='{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' [container_id]
"""
192.168.9.3
"""
Google Artifact Registry
에 올려보자.
- Artifact Registry 에 의해 호스팅된 private registry 에 이미지를 올리기 위해서는 image tag에 registry name을 포함해야 한다.
<regional-repository>-docker.pkg.dev/my-project/my-repo/my-image.
gcloud를 이 저장소의 위치와 연결된 Aritifact Registry 도메인의 사용자 인증 정보 도우미로 구성
gcloud auth configure-docker us-central1-docker.pkg.dev
export PROJECT_ID = $(gcloud config get-value project)
cd ~/test
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 iamges
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
구글 퀵랩 Kubernetes in Google Cloud를 학습하고 정리한 내용입니다.