Google Cloud Study Jam에서 진행하는 Docker & Kubernetes 학습 프로그램입니다.
모든 실습 환경은 Google Cloud Shell에서 진행됩니다.
Docker: Container 기반 오픈소스 가상화 플랫폼
Images: 컨테이너 실행에 필요한 파일과 설정값 등을 포함하는 것으로, 상태값을 가지지 않고 변하지 않습니다.
Container: 이미지를 실행한 상태이며 추가되거나 변하는 값은 컨테이너에 저장됩니다.
- 실습 순서 -
1. Docker 컨테이너 빌드, 실행, 디버깅
2. Docker Hub 및 Google Container Registry에서 이미지 가져오기
3. Docker 이미지를 Google Container Registry로 푸쉬하기
Qwiklabs 설정
사용중인 계정 확인
gcloud auth list
프로젝트 ID 목록 조회
gcloud config list project
Docker Hub에서 가져온 컨테이너 이미지를 확인합니다.
docker images
기본 포멧
docker images <옵션><repository:[tag]>
- 옵션 -
--all : 모든 이미지를 보여줍니다.
--filter : 입력 값에 따른 필터링된 결과를 보여줍니다.
---size : 컨테이너의 총 사용 용량을 보여줍니다.
--quiet : 컨테이너의 ID만 보여줍니다.
학습에 사용할 hello-world 이미지 컨테이너를 실행합니다.
dokcer run hello-world
명령어 : docker run 이미지
기본 포멧
docker run (<옵션>) <이미지> (<명령어>)(<인자>)
- 이미지- 이미지 ID 또는 repository:tag 를 사용할 수 있습니다.
- 옵션 -
-d : detached mode ( 백그라운드 모드 )
-p : 호스트와 컨테이너의 포트를 연결 ( 포워딩 )
-v : 호스트와 컨테이너의 디렉토리를 연결 ( 마운트 )
-e : 컨테이너 내에서 사용할 환경변수 설정
-name : 컨테이너 이름 설정 (컨테이너의 별칭을 정해주는 옵션)
-rm : 프로세스 종료시 컨테이너 자동 제거
-it : -i와 -t를 동시에 사용한 것으로 터미널 입력을 위한 옵션 (컨테이너를 종료하지 않고 터미널 입력 가능하도록 해주는 옵션)
-link : 컨테이너 연결( 컨테이너명:별칭 )
실행중인 컨테이너 목록 확인
docker ps
기본 포멧
docker ps <옵션>
확인 -a 옵션값을 주면 종료된 컨테이너까지 목록에 출력됩니다.
docker ps -a
빌드
* 빌드란?
- 소스 코드의 파일을 컴퓨터에서 실행할 수 있도록 독립적인 형태로 변환시키는 과정과 그 결과까지의 과정 ( 배포를 하기 위한 과정 )
빌드를 위한 test라는 디렉토리를 만들고 해당 디렉토리로 이동합니다.
mkdir test && cd test
이미지를 빌드하기 위해서는 Dockerfile을 실행시켜야 합니다.
따라서 위에서 만든 test라는 디렉토리에 Dockerfile을 생성해 줍니다.
Dockerfile 이란?
- DockerImage를 실행시키기 위한 스크립트(실행파일)
- Docker는 Dockerfile에 작성된 명령문을 차례대로 실행
* 반드시 파일명을 Dockerfile로 생성해야 합니다. *
Dockerfile 만들기
cat > Dockerfile <<EOF
cat 명령어
파일 생성 : cat > 파일명
cat <<EOF (직접 입력한 텍스트를 파일에 저장할 때 사용되는 키워드)
cat <<EOF > Dockerfile 의 형태로도 사용 가능
EOF : End Of File
EOT : End Of Text
이 키워드는 주로 저렇게 사용되지만 시작과 끝에 키워드만 맞춰준다면 어떤 명칭으로 사용해도 됩니다.
ex ) cat > Dockerfile <<HelloWorld (시작을 알림)
```
생성할 Dockerfile명 마지막에
.
.
HelloWorld 를 명시
```
명령어 실행 후 아래 내용을 추가하여 Dockerfile을 생성합니다.
# FROM: 베이스 이미지 선택 ( 어느 이미지를 사용할 것인지 선언 )
# 공식 노드 런타임을 상위 이미지로 사용
FROM node:6
# 컨테이너의 작업 디렉토리를 /app으로 설정
WORKDIR /app
# ADD: 빌드 명령 중간에 호스트의 파일 또는 폴더를 이미지에 가져오는 것
# 현재 디렉토리 내용을 /app에 있는 컨테이너에 복사
ADD . /app
# Apache가 기본적으로 80번 포트를 사용
# 컨테이너의 포트 80을 외부에 공개 ( Apache Server를 접근 가능 하도록 허용
EXPOSE 80
# CMD: 컨테이너를 생성, 실행할 때 실행할 명령어
# 컨테이너가 시작될 때 노드를 사용하여 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
이미지 빌드
docker build -t node-app:0.1 .
# - 주의사항 -
# 마지막에 . 의 경우는 현재 디렉토리를 의미합니다.
# 따라서 . 를 명시하지 않으면 경로를 못찾아갑니다.
기본 포멧
docker build <옵션> <Dockerfile 경로>
- 옵션 -
-t : name:tag 구문을 사용하여 이미지의 이름과 태그를 지정해주는 옵션
따라서 이름 -> node-app 태그 -> 0.1이 됩니다.
** 이미지를 빌드할 때 태그를 사용해주는 것이 좋습니다. ( 사용하지 않을 경우 기본 값으로 지정: latest) **
이미지 확인
docker images
빌드한 이미지 실행
docker run -p 4000:80 --name my-app node-app:0.1
명령어 : docker run 이미지
기본 포멧
docker run (<옵션>) <이미지> (<명령어>)(<인자>)
- 이미지- 이미지 ID 또는 repository:tag 를 사용할 수 있습니다.
- 옵션 -
-d : detached mode ( 백그라운드 모드 )
-p : 호스트와 컨테이너의 포트를 연결 ( 포워딩 )
-v : 호스트와 컨테이너의 디렉토리를 연결 ( 마운트 )
-e : 컨테이너 내에서 사용할 환경변수 설정
--name : 컨테이너 이름 설정 (컨테이너의 별칭을 정해주는 옵션)
-rm : 프로세스 종료시 컨테이너 자동 제거
-it : -i와 -t를 동시에 사용한 것으로 터미널 입력을 위한 옵션 (컨테이너를 종료하지 않고 터미널 입력 가능하도록 해주는 옵션)
-link : 컨테이너 연결( 컨테이너명:별칭 )
-p 4000:80
: 컨테이너의 포트 80번을 호스트의 포트 4000에 매핑
--name: my-app node-app:0.1
: node-app:0.1 의 이름을 my-app으로 지정
터미널에서 확인
curl http://localhost:4000
백그라운드 실행
실행된 터미넡을 중지시키고 컨테이너를 삭제 합니다.
docker stop my-app && docker rm my-app
-d 옵션을 주어 재시작을 하게 되면 터미널에 종속되지 않고 실행된 상태로 남아있게 됩니다.
docker run -p 4000:80 --name my-app -d node-app:0.1
구동중인 컨테이너 확인
docker ps
다른 이미지 빌드를 위해 app.js 수정
vim 편집 사용
vim app.js
vim 모드
- 입력모드 전환 -
a: 커서 위치 다음 칸부터 입력
i: 커서의 위치에 입력
o: 커서의 다음 행에 입력
s: 커서 위치의 한글자를 지우고 입력
- 저장 및 종료 -
:w 저장
:w file.txt file.txt라는 이름으로 저장
:w >> filet.t filet.txt파일에 덧붙여서 저장
:q vim 종료 ( 저장을 하지 않았을 경우 경고창 출력 )
:q! 경고창 무시하고 종료
:wq 종료
:wq! 강제 저장 후 종료
app.js 내부의 콘솔출력을 수정하였습니다.
바뀐 내용으로 새로 빌드 후 실행시켜 줍니다.
docker build -t node-app:0.2 .
4000번 포트는 위에서 사용중이니 이번엔 8080포트로 실행시켜 보겠습니다.
docker run -p 8080:80 --name my-app-2 -d node-app:0.2
2개의 컨테이너를 터미널에서 확인해보면 내용이 달라진걸 확인할 수 있습니다.
curl http://localhost:8080
curl http://localhost:4000
디버깅
컨테이너의 로그 확인
[container_id] -> 자신이 해당하는 container_id로 변경해서 입력
docker logs [container_id]
기본 포멧
docker logs <옵션> <container_id>
- 옵션 -
--tail [rows] : rows 만큼 마지막 로그 출력
--tail all : 전체 로그 출력
--details : 로그의 세부 정보까지 조회
--follow, 또는 -f : 컨테이너에서 새로운 출력이 발생되면 로그를 조회 ( 계속 로그를 조회합니다. )
-since : 특정 시간대 이후 또는 상대시간 이후의 로그를 볼 수 있다.
Bash 세션으로 전환하여 확인
# exec 옵션의 경우 실행중인 container에 다른 명령을 부여할 때 사용됩니다.
# 그렇기 때문에 실행중인 container에만 사용가능 합니다.
docker exec -it [container_id] bash
# inspect 명령어를 통하여 continer의 설정을 확인할 수 있습니다.
docker inspect [container_id]
Google Container Registry(GCR)로 이미지 올리기
호스팅 기본 포멧 : [hostname]/[project-id]/[image]:[tag]
프로젝트 ID 찾기
gcloud config list project
GCR에 호스팅을 하기위해서는 레지스트리 이름으로 태그를 지정해야합니다.
따라서 tag를 이름과 맞도록 변경해줍니다.
docker tag node-app:0.2 gcr.io/[project-id]/node-app:0.2
이미지 GCR로 푸쉬
docker push gcr.io/[project-id]/node-app:0.2
Google Cloud Console 에서 확인 - Container Registry
위에 올린 컨테이너를 사용하기 위해 새로운 환경을 만들기 위해 사용했던 모든 이미지를 지워줍니다.
모든 컨테이너 중지 및 삭제
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
# 사용했던 node v6 삭제
docker rmi node:6
docker rmi $(docker images -aq)
# 남아있는 이미지 확인
docker images
삭제 기본 포멧
# 특정 컨테이너 삭제
docker rm <컨테이너 ID or 이름>
# 특정 이미지 삭제
docker rmi <이미지 ID or 이름:태그>
# 인자를 붙여 전체 컨테이너 또는 전체 이미지를 삭제할 때
docker rmi $ (docker images -aq) 또는 docker rm $(docker ps -aq)
-aq 옵션의 경우 -a 와 -q의 옵션을 합친 것
-q 의 경우 Docker ID만 출력
-a 의 경우 중지된 컨테이너까지 전부 출력
GCR에 올려둔 컨테이너 이미지 가져오기
docker pull gcr.io/[project-id]/node-app:0.2
실행
docker run -p 4000:80 -d gcr.io/[project-id]/node-app:0.2
터미널에서 불러온 컨테이너 확인
'Learn > Google Cloud Study Jam' 카테고리의 다른 글
3. Managing Deployments Using Kubernetes Engine (0) | 2022.07.16 |
---|---|
2. Orchestrating the Cloud with Kubernetes (0) | 2022.07.08 |
1 - 2. Kubernetes Engine:Qwik Start (0) | 2022.07.01 |