Kubernetes study (1)

 

Introduction to Docker

GCP 설명

  • Google cloud Shell

    Shell 형태로 google cloud 를 관리.

  • gcloud

    command line tool 로써 pre-installed 되어있음. GCP 를 컨트롤하는 용도.

    • Commands

      • gcloud auth list

        active account names 출력

      • gcloud config list project

        project ID 출력

      • gcloud document : https://cloud.google.com/sdk/gcloud

시작

docket run hello-world

docker daemon은 hello-world image 를 서치한다.

로컬에 설치되어있지 ㅇ낳으면, public registry 인 Docker Hub 에서 pull한다.

docker images
sniperzkzl@cloudshell:~ (silken-forest-214415)$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              fce289e99eb9        10 days ago         1.84kB
docker ps
docker ps -a

-a 를 안붙이면 실행중인 docker 프로세스.

-a 를 붙이면 exited 된 프로세스 목록까지 보여줌.

Build

cat > Dockerfile<<EOF

# Use an official Node runtime as the parent image
# node version 6 의 base parent image 를 사용한다.
FROM node:6

# Set the working directory in the container to /app
# working dir 설정
WORKDIR /app

# Copy the current directory contents into the container at /app
ADD . /app

# Make the container's port 80 available to the outside world
# 80번 포트가 외부에서 접근할 수 있도록 설정,
EXPOSE 80

# Run app.js using node when the container launches
# node 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

# nodejs 간단한 서버 작성
docker build -t node-app:0.1 .

현재 디렉토리에 있는 Dockerfile 을 실행할것이다.

-t 옵션은 이미지에 name: tag 형식으로 넣어주기 위함이다.

Run

docker run -p 4000:80 --name my-app node-app:0.1

4000번 포트를 container의 80번 포트와 연결한다.

image 는 name은 node-app 이고, tage 는 0.1인것을 사용하고 name 은 my-app 이라고 명명한다.

만약 컨테이너가 background 에서 돌고있게 할려면, -d 옵션을 주면 된다.

해당 container 를 멈추기 위해서는 다음 명령어를 사용하면 된다.

docker stop my-app

삭제는 다음 명령어를 사용하면 된다.

docker rm my-app

container 가 실행중이라면, log 를 볼 수 있다.

docker logs [container-id]

신 버전을 새로 빌드할때, tag 의 값을 올려주기만 하면 같은 name 다른 버전의 빌드를 유지할 수 있다.

# 파일 일부 수정 후
docker build -t node-app:0.2 .
docker run -p 8080:80 --name my-app-2 -d node-app:0.2

Debug

log를 cat 같이 한번만 보여주는게 아니라, 지속적으로 해당 세션의 정보를 띄우게 할려면 -f 옵션을 붙이면 된다.

docker logs -f [container_id]

러닝중인 container 의 command line 의 세션을 가져와서 명령어를 실행시키고 싶을경우 다음 명령어를 사용하면 된다.

docker exec -it [container_id] bash

그럼 앞의 command lien 이

sniperzkzl@cloudshell:~ (silken-forest-214415)$
sniperzkzl@cloudshell:~ (silken-forest-214415)$ docker exec -it 87a bash
root@87a5ef1d7cfd:/app#

이렇게 변경되었다.

root@87a5ef1d7cfd:/app# ls
Dockerfile  app.js
root@87a5ef1d7cfd:/app# pwd
/app
root@87a5ef1d7cfd:/app# cd ..
root@87a5ef1d7cfd:/# ls
app  bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@87a5ef1d7cfd:/# cd
root@87a5ef1d7cfd:~# ls 
root@87a5ef1d7cfd:~# exit
exit
sniperzkzl@cloudshell:~ (silken-forest-214415)$ ls
README-cloudshell.txt  test
sniperzkzl@cloudshell:~ (silken-forest-214415)$ cd test/
sniperzkzl@cloudshell:~/test (silken-forest-214415)$ ls
app.js  Dockerfile
sniperzkzl@cloudshell:~/test (silken-forest-214415)$

working dir 였던 app dir 가 특별히 마운트되어있는 모습을 볼 수 있다.

container 의 metadata를 탐색하기 위해선 inspect 명령어를 사용한다.

docker inspect [container_id]

–format 옵션을 통해서 JSON 형식의 metatdata 속 특정 field 만 지정하여 볼 수도 있다.

sniperzkzl@cloudshell:~/test (silken-forest-214415)$ docker inspect --format='' 87a
172.18.0.2

Publish

Google container Registry 라는곳에 image 를 push 할수 있다.

gcloud config list project
docker tag node-app:0.2 gcr.io/[project-id]/node-app:0.2
gcloud docker -- push gcr.io/[project-id]/node-app:0.2

[hostname]/[project-id]/[image]:[tag] 형식으로 작성한 후, gcloud 로 push 하면된다.

docker stop $(docker ps -q)
docker rm $(docker ps -aq)
# 주의. 모든 container 를 중지하고 지우는 명령어