Introduction to Docker | GSP055 | Google Cloud Platform | 도커 소개
컨텐츠 정보
- 3,731 조회
- 0 추천
- 목록
본문
https://www.youtube.com/watch?v=udSkZsxD1_g
> 이 퀵랩은 Docker를 소개 합니다.
> 천천히 따라해 보세요
로그인 이후에 , 클라우드 쉘(Cloud Shell) 에서 실습을 할 수 있습니다.
## Hello World
docker를 실행 합니다.
```
docker run hello-world
```
docker image를 확인합니다.
```
docker images
```
> 이미지를 Docker Hub 공개 레지스트리에서 가져왔습니다. 이미지 ID는 SHA256 해시 형식입니다. 이 필드에서는 프로비저닝된 Docker 이미지를 지정합니다. Docker 데몬이 로컬에서 이미지를 찾을 수 없으면 기본적으로 공개 레지스트리에서 이미지를 검색합니다. 컨테이너를 다시 실행해 보겠습니다.
```
docker run hello-world
```
(output)
```bash
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
...
```
다음 명령어를 실행하여 실행 중인 컨테이너를 확인합니다.
```
docker ps
```
(output)
```bash
CONTAINER ID IMAGE COMMAND ... NAMES
6027ecba1c39 hello-world "/hello" ... elated_knuth
358d709b8341 hello-world "/hello" ... epic_lewin
```
## 빌드
```
mkdir test && cd test
```
아래의 명령어로 `Dockerfile`을 만듭니다.
```
cat > Dockerfile < 참고: Dockerfile 명령어 참조
> https://docs.docker.com/engine/reference/builder/#known-issues-run
### 노드 애플리케이션 생성
아래의 명령어를 실행 합니다.
```
cat > app.js < {
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 run -p 4000:80 --name my-app node-app:0.1
```
(output)
```bash
Server running at http://0.0.0.0:80/
```
새로운 터미널을 엽니다.
```
curl http://localhost:4000
// output
Hello World
```
초기 터미널이 실행되는 동안 컨테이너가 실행됩니다. 컨테이너를 터미널 세션에 종속시키지 않고 백그라운드에서 실행하려면 -d 플래그를 지정해야 합니다.
초기 터미널을 닫은 후 다음 명령어를 실행하여 컨테이너를 중단하고 삭제합니다.
```
docker stop my-app && docker rm my-app
```
### 백그라운드 실행 방법(컨테이너)
```
docker run -p 4000:80 --name my-app -d node-app:0.1
docker ps
// output
CONTAINER ID IMAGE COMMAND CREATED ... NAMES
xxxxxxxxxxxx node-app:0.1 "node app.js" 16 seconds ago ... my-app
```
### 컨테이너 로그 보기
```
docker logs [container_id]
```
텍스트 편집기로 app.js 를 편집합니다.
```
vi app.js
```
여기에서 `Hello World`를 다른 문자열로 바꿉니다.
vi 저장 후 나가기
`esc`키를 누른 뒤 `:wq`
### 명령어 결과
```
Step 1/5 : FROM node:6
---> 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
```
새 이미지 버전으로 다른 컨테이너를 실행합니다. 이때 호스트 포트를 80 대신 8080으로 매핑합니다. 호스트 포트 4000은 이미 사용 중이므로 사용할 수 없습니다.
```
docker run -p 8080:80 --name my-app-2 -d node-app:0.2
docker ps
// output
CONTAINER ID IMAGE COMMAND CREATED
xxxxxxxxxxxx node-app:0.2 "node app.js" 53 seconds ago ...
xxxxxxxxxxxx node-app:0.1 "node app.js" About an hour ago ...
```
### 컨테이너 TEST
```
curl http://localhost:8080
// output
Hello Thunder Cloud!
```
## 디버깅
### logs
```
docker logs -f [container_id]
```
### 실행중인 컨테이너로 들어가기
```
docker exec -it [container_id] bash
```
> `-it`: pseudo-tty를 할당하고 stdin을 열린 상태로 유지하여 컨테이너와 상호작용
### 메타데이터를 보기
```
docker inspect [container_id]
```
### Json 특정 필드 검사 (--format)
```
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' [container_id]
```
## 배포 (Publish)
### 0.2버전으로 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
```
**output**
```bash
The push refers to a repository [gcr.io/[project-id]/node-app]
057029400a4a: Pushed
342f14cb7e2b: Pushed
903087566d45: Pushed
99dac0782a63: Pushed
e6695624484e: Pushed
da59b99bbd3b: Pushed
5616a6292c16: Pushed
f3ed6cb59ab0: Pushed
654f45ecb7e3: Pushed
2c40c66f7667: Pushed
0.2: digest: sha256:25b8ebd7820515609517ec38dbca9086e1abef3750c0d2aff7f341407c743c46 size: 2419
```
### 모든 컨테이너를 중지하고 제거
```
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:lts
docker rmi $(docker images -aq) # remove remaining images
docker images
```
## Push한 이미지지 다운후 실행
```
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
```
# 축하합니다.
관련자료
-
링크
댓글 0
등록된 댓글이 없습니다.