docker, kubernates 유데미 강의 정리

yo·2020년 9월 16일
0
post-custom-banner

Why use Docker?

->Docker makes it really easy to install and run software without worruing about setup or dependencies

what is Docker?


docker Client itself doesn't actually do anything. Docker Server is 실제적으로 뭔가를 하는 툴.

명령어 docker version

도커 버전 확인.

docker run hello-world

우리가 도커 명령어를 치면, 먼저 Docker Client(CLI)가 명령을 받아 해석(?)비스무리한 작업을 거친 뒤, Docker Server에게 전달한다.(실질적인 작업을 하는 곳은 Docker Server)
docker run hello-world는 hello-world라는 이미지를 실행하라는 명령어다.
이 명령을 docker client가 docker server에게 전달하면,
서버는 이미지가 로컬에 있는 지 확인하기 위해 먼저 Image Cache를 확인한다.
지금 우리는 처음 도커를 실행하는 것이니, 당연히 Cache는 비었다.
이 경우, docker server는 리모트 repository인 docker hub에 가서 이미지를 다운받는다.
이제 이 이미지는 Image Cache에 저장 된다.

이 후, 이미지가 컨테이너화되며 실행되서 자기 할 일을 한다.
hello-world이미지의 경우 아래 글을 출력하는게 그 역할이다.

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:4cf9c47f86df71d48364001ede3a4fcd85ae80ce02ebad74156906caff5378bc
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

맨 처음 실행하면 위 글처럼 Unable to find image 라고 나온다. Image cache에 없다는 뜻이다.
이 이미지를 두 번째 실행하면 저 메세지는 더 이상 출력되지 않는다. Image cache에 있ㄱ ㅣ때문.



도커는 리눅스환경이다. 도커 설치하면 리눅스커널이 설치된다.
그럼 mac os나 windows에서 어떻게 돌아가는거지??
바로 아래 그럼과 같다.
도커 깔면 내 컴퓨터 시스템 위에 리눅스가 생기고, 그 안에서 도커가 일을 하게 된다.

Manipulating Containers with the Docker Client

docker run command의 상세내용


RUN: run은 이미지로부터 컨테이너를 만들고 실행시키는 명령어다.
docker run = docker create + dokcer start
docker run image_name 뒤에 어떤 커멘드를 치면, 디폴트 커맨드가 오버라이드 되면서 작동한다.
예를 들어 docker run busybox echo hi라 치면 실행 결과로 hi가 출력된다.
또, docker run busybox ls를 치면 아래 결과를 볼 수 있다. busybox이미지 안에 있는 파일들을 보여주는 것이다.
전제는 해당 명령어가 그 이미지 안에서 쓰이고 있어야 한다는 것이다.

Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
df8698476c65: Pull complete
Digest: sha256:d366a4665ab44f0648d7a00ae3fae139d55e32f9712c67accd604bb55df9d05a
Status: Downloaded newer image for busybox:latest
bin
dev
etc
home
proc
root
sys
tmp
usr
var

docker ps

현존하는 컨테이너 리스트를 보여주는 명령어.
docker ps --all은 여태까지 만들어졌던 모든 컨테이너들을 전부 다 보여주는 명령어.


container lifecycle

create상태
start상태

create했을 때 나오는 문자열은 컨테이너의 id다.

docker start -a container_id로 해당 컨테이너를 실행시킨다.

-a명령어는 실행 결과를 내 터미널에 출력해달라는(?) 명령어다.

1.docker run busybox echo hi there 가능
2.docker start container_id 가능
3.docker start -a container_id 가능
4.docker start -a container_id echo hi there 불가능
4의 경우는 컨테이너 두 개를 실행하라는 명령으로 받아들인다.

docker system prune

모든 멈춘 컨테이너 제거하고 이외에도 필요 없는(?)것들을 지워버리는 명령어.
특히 캐시를 지우기 때문에 모든 이미지를 새로 다운받아야 한다.(별로 큰 일은 아니라고 설명)

큰 단위에서 작업이 모두 끝났다면 이 명령으로 쓸데 없는 컨테이너들을 지워버리는 것이 좋다.

docker logs container_id

컨테이너를 실행하지 않으면서도 내용을 확인 할 수 있는 명령어.
디버깅 할 때 요긴하다. 컨테이너를 실행시키는 비용이 너무 클 때 이 명령어를 통해 쉽게 내용을 확인할 수 있다.

docker stop container_id / docker kill container_id

docker stop명령 이후 10초안에 stop되지 않으면, 자동으로 kill명령이 수행된다.
강사는 개인적으로 stop을 추천하고, 그게 안먹을 때 kill쓰는 것을 권함.

docker kill vs stop
stop attempts to trigger a graceful shutdown by sending the standard POSIX signal SIGTERM,
whereas kill just kills the process by default (but also allows to send any other signal)

참고
http://home.zany.kr:9003/board/bView.asp?bCode=13&aCode=14169

executing commands in Running Containers

예: docker exec -it 0948sjdslfk redis-cli

-it를 없이 명령어 치면 안먹는다.

the purpose of the IT Flag

도커는 리눅스 환경위에서 작동한다. 위 그림처럼 리눅스 환경 위에서 작동하는 프로세스에는 3가지 communication channels가 있다. STDIN, STDOUT, STDERR
각각 standard in, standard out, dtandard error를 의미한다.
standard in 은 into the process 할 때 쓰인다.

docker exec -it는 docker exec -i -t와 동일하다. 합쳐놓은 거다.
-i는 STDIN를 통해 소통하겠다는 뜻이다.
-t는 뭔가 부가적인 기능?? 이걸 안치면 화면에 nicely하게 출력값이 나오질 않는다. 치는게 좋음.

getting a command prompt in a container

sh커멘드를 통해 컨테이너 안으로 들어가 여러 명령어를 칠 수 있다.
디버깅에 아주 좋은 명령어다.

Building Custom Images Through Docker Server


docker file 분석하기

# Use an existing docker image as a base
FROM alpine

# Download and install a dependency
RUN apk add --update redis

# Tell the image what to do when it starts
#as a container
CMD ["redis-server"]

docker 가장 중요/기본인 instruction 3개

FROM: specify the image we want to use as base
RUN : execute some command while we are preparing our custom image
CMD : specify what should be executed when our image is used to start a new container

위 사진에서 왼쪽은 instruction, 오른쪽은 instruction의 argument들이다.

apk add --update redis는 도커 자체와는 아무 상관도 없는 명령어다.
apk는 아파치 어쩌구 하는 명령어다.
여하튼 정리하면, from은 베이스 이미지 정하는 것. 운영체제 없으면 아무것도 할 수 없듯이, base image가 없으면 뭘 할 수가 없다.

FROM, RUN, CMD명령어를 칠 때 일어나는 일들

위의 명령어를 칠 때 일어나는 일들은 아래 사진과 같다.



만약 위 명령어에 아래처럼 RUN apk add --update gcc명령어가 추가한 다음에 다시 build를 하면?
gcc전까진 캐쉬를 사용하다가, gcc부턴 다시 컨테이너를 만든다.
또, redis와 gcc의 순서를 바꾸어 다시 빌드하면, 캐시를 전혀 이용하지 못하고 새롭게 빌드하게 된다.
캐쉬를 사용하기 위해선 순서가 중요하다.


FROM alpine

RUN apk add --update redis
RUN apk add --update gcc

CMD ["redis-server"]

tagging an Image

COPY

  1. COPY ./ ./ 의 의미:
    왼쪽의 ./현재 로컬 working directory, 오른쪽의 ./는 도커 컨테이너의 working directory를 의미한다.
    즉, 현재 있는 디렉토리의 모든 파일을 도커 컨테이너 워킹 디렉토리에 복사하라는 명령어다.

  2. docker build .하면 컨테이너 이름이 랜덤으로 생성된다. 이 이름은 길고 복잡하므로,
    docker build -t hwanil/simpleweb .처럼 중간에 태그 이름을 지정해주면 좋다.

docker-compose

status code
0: we exited and everyting is OK
1,2,3,etc: we exited because something went wrong!

docker-compose ps: 현재 디렉토리에서 docker-compose파일을 찾은 뒤 해당 compose파일이 실행한 컨테이너들의 목록을 보여준다.

node 관련 명령어

npm run start: starts up development server. For development use only
npm run test: Runs tests associated with the project
npm run build: Builds a production version of the application

Dockerfile.dev

개발버전의 dockerfile은 위처럼 이름짓자.
근데 이경우 docker build .명령어가 안먹는데, Dockerfile로 인식하지 않기 때문이다.
따라서, docker build -f Dockerfile.dev .라는 명령어를 실행해서 위 파일을 빌드하자.

docker run -it -p 3000:3000 CONTAINER_ID

profile
Never stop asking why
post-custom-banner

0개의 댓글