본문 바로가기

책/도커, 쿠버네티스를 활용한 컨테이너 개발 실전 입문

도커 컨테이너 배포

컨테이너로 애플리케이션 실행하기

도커 이미지 : 도커 컨테이너를 구성하는 파일 시스템과 실행할 애플리케이션 설정을 하나로 합친 것으로, 컨테이너를 생성하는 템플릿 역할을 한다

도커 컨테이너 : 도커 이미지를 기반으로 생성되며, 파일 시스템과 애플리케이션이 구체화 되어 실행되는 상태


도커 이미지와 도커 컨테이너

$ docker image pull <컨테이너 이름 혹은 아이디>

 - <컨테이너 이름 혹은 아이디> 에 해당하는 도커 이미지를 받아온다

$ docker container run <옵션> <컨테이너 이름 혹은 아이디>

 - 내려 받은 이미지를 실행

$ docker container stop <컨테이너 이름 혹은 아이디>

 - 실행 중인 컨테이너를 정지


간단한 애플리케이션과 도커 이미지 만들기

Dockerfile

FROM golang:1.9

 - 도커 이미지의 바탕이 될 베이스 이미지를 지정

 - FROM에서 받아오는 도커 이미지는 도커 허브라는 레지스트리에 공개된 것이다

RUN mkdir /echo

 - 도커 이미지를 실행할 때 컨테이너 안에서 실행할 명령을 정의

COPY main.go /echo

 - 도커가 동작 중인 호스트 머신의 파일이나 디렉터리를 도커 컨테이너 안으로 복사

CMD ["go", "run", "/echo/main.go"]

 - 도커 컨테이너를 실행할 때 컨테이너 안에서 실행할 프로세스를 지정


도커 이미지 빌드하기

$ docker image build -t 이미지명[:태그명] <Dockerfile의 경로>

 - 태그명 생략시 latest 가 붙음

$ docker image build -f Dockerfile-test -t <Dockerfile의 경로>

 - docker image build 명령은 기본으로 Dockerfile이라는 이름으로 된 파일을 찾는데, 그 외 파일명을 사용하려면 -f 옵션을 사용해야 한다

$ docker image build --pull=true -t <Dockerfile의 경로>

 - 레지스트리에서 받아온 도커 이미지는 일부러 삭제하지 않는 한 호스트 운영체제에 저장 되고 재사용되는데, --pull 옵션을 사용하면 매번 베이스 이미지를 새로 받아온다


기타 인스트럭션

ENTRYPOINT : CMD의 인자가 ENTRYPOINT에서 실행하는 파일에 인자로 주어짐

ENTRYPOINT ["go"] 

CMD[""]

$ docker container run ch02/golang:latest version

go version go1.10.3 linux/amd64 

LABEL : 이미지를 만든 사람의 이름 등을 적을 수 있음

ENV : 도커 컨테이너 안에서 사용할 수 있는 환경변수를 지정

ARG : 이미지를 빌드할 때 정보를 함께 넣기 위해 사용


도커 컨테이너 실행

$ docker container run -d <컨테이너 이름 혹은 아이디> 

 - 컨테이너를 백그라운드로 실행

 - -d 옵션을 붙여 컨테이너를 실행하면 표준 출력에 해시값처럼 보이는 문자열이 출력되는데 이 문자열이 도커 컨테이너의 ID이다

$ docker container run -d -p 9000(호스트 포트):8080(컨테이너 포트) <컨테이너 이름 혹은 아이디> 

 - 포트 포워딩 : 호스트 포트 9000을 컨테이너 포트 8080에 연결

 - 호스트 포트를 생략하면 에페메랄 포트로 자동 할당되고, 어떤 포트가 할당됐는지는 docker container ls 출력 결과에서 확인 할 수 있다


도커 이미지 다루기

도커 이미지

 - 도커 컨테이너를 만들기 위한 템플릿

 - 운영 체제로 구성된 파일 시스템은 물론, 컨테이너 위에서 실행하기 위한 애플리케이션이나 그 의존 라이브러리, 도구에 어떤 프로세스를 실행할지 등의 실행 환경의설정 정보까지 포함하는 아카이브


docker search - 이미지 검색

도커 허브

 - 도커 이미지 레지스트리

 - 깃허브처럼 리포지토리를 만들어 도커 이미지를 관리

 - 모든 이미지의 기반이 되는 운영 체제 리포지토리, 언어 런타임이나 유명 미들웨어 이미지 등이 관리되는 수많은 리포지토리가 있음

$ docker search [options] <검색 키워드>

 - 도커 허브에 등록 된 리포지토리를 검색할 수 있음


docker image pull - 이미지 내려받기

$ docker image pull [options] 리포지토리명[:태그]

 - 인자로 지정한 리포지토리명과 태그는 도커 허브에 존재해야 함


docker image ls - 보유한 도커 이미지 목록 보기

$ docker image ls [options] [리포지토리명[:태그]]

 - 현재 호스트 운영 체제에 저장된 도커 이미지의 목록을 보여줌


docker image tag - 이미지에 태그 붙이기

$ docker image tag 기반이미지명[:태그] 새이미지명[:태그]

 - 이미지 ID에 태그명을 별명으로 붙이는 것


docker image push - 이미지를 외부에 공개하기

$ docker image push [options] 리포지토리명[:태그]

 - 현재 저장된 도커 이미지를 도커 허브 등의 레지스트리에 등록하기 위해 사용


도커 컨테이너의 생애주기

실행 중

 - docker container run 명령의 인자로 지정된 도커 이미지를 기반으로 컨테이너가 생성되면 이 이미지를 생성했던 Dockerfile에 포함된 CMD 및 ENTRYPOINT 인스트럭션에 정의된 애플리케이션이 실행된다

정지

 - 실행 중 상태에 있는 컨테이너를 사용자가 명시적으로 정지하거나 컨테이너에서 실행된 애플리케이션이 종료된 경우

 - 컨테이너를 정지 시키면 디스크에 컨테이너가 종료된 시점의 상태가 저장되어 남으므로 정지시킨 컨테이너를 다시 실행할 수 있다

파기

 - 정지 상태의 컨테이너는 명시적으로 파기하지 않는 이상 디스크에 그대로 남아 있다

 - 컨테이너를 자주 생성하고 정지해야 하는 상황에서는 디스크를 차지하는 용량이 점점 늘어나므로 불필요한 컨테이너를 완전히 삭제하는 것이 바람직하다


docker container run - 컨테이너 생성 및 실행

$ docker container run [options] 이미지명[:태그] [명령] [명령인자...]

$ docker container run [options] 이미지ID [명령] [명령인자...]

 - 도커 이미지로부터 컨테이너를 생성하고 실행

 - 자주 쓰는 옵션 

   - -i : 컨테이너를 실행할 때 컨테이너 쪽 표준 입력과의 연결을 그대로 유지

   - -t : 유사 터미널 기능을 활성화(-i 옵션과 함께 -it 형태로 사용)

   - --rm : 컨테이너를 종료할 때 컨테이너를 파기

   - -v : 호스트와 컨테이너 간에 디렉터리나 파일을 공유하기 위해 사용


docker container ls - 도커 컨테이너 목록 보기

$ docker container ls [options]

 - 실행 중이거나 종료된 컨테이너의 목록을 보여줌


docker container stop - 컨테이너 정지하기

$ docker container stop 컨테이너ID(컨테이너명)

 - 실행 중인 컨테이너를 종료


docker container restart - 컨테이너 재시작하기

$ docker container restart 컨테이너ID(컨테이너명)

 - 파기하지 않은 정지 상태 컨테이너를 재시작


docker container rm - 컨테이너 파기하기

$ docker container rm 컨테이너ID(컨테이너명)

 - 정지시킨 컨테이너를 파기

 - 실행 중인 컨테이너를 삭제하려면 -f 옵션을 사용


docker container logs - 표준 출력 연결하기

$ docker container logs [options] 컨테이너ID(컨테이너명)

 - 현재 실행 중인 특정 도커 컨테이너의 표준 출력 내용을 확인


docker container exec - 실행 중인 컨테이너에서 명령 실행하기

$ docker container exec [options] 컨테이너ID(컨테이너명) <컨테이너에서 실행할 명령>

 - 실행 중인 컨테이너에서 원하는 명령을 실행


docker container cp - 파일 복사하기

$ docker container cp [options] 컨테이너ID(컨테이너명):원본 파일 대상파일

$ docker container cp [options] <호스트 원본파일> 컨테이너ID(컨테이너명) 대상파일

 - 컨테이너끼리 혹은 컨테이너와 호스트 간에 파일을 복사


운영과 관리를 위한 명령

prune - 컨테이너 및 이미지 파기

$ docker container prune [options]

 - 필요 없는 이미지나 컨테이너를 일괄 삭제

$ docker image prune [options]

 - 태그가 붙지 않은 모든 이미지를 삭제

$ docker system prune

 - 사용하지 않는 도커 이미지 및 컨테이너, 볼륨, 네트워크 등 모든 도커 리소스를 일괄적으로 삭제


docker container stats - 사용 현황 확인하기

$ docker container stats [options] [대상 컨테이너ID ... ]

 - 시스템 리소스 사용 현황을 컨테이너 단위로 확인(유닉스 계열 운영 체제의 top 명령과 같은 역할)


docker-compose 명령으로 컨테이너 실행하기

docker-compose.yml

version: "3"

 - docker-compose.yml 파일의 내용을 해석하는 데 필요한 문법 버전

services:

echo:

 - 컨테이너 이름

image: example/echo:latest

 - 도커 이미지. image 대신 build: .(Dockerfile이 위치한 상대 경로) 를 지정할 수 있음

ports:

-9000:8080

 - 포트 포워딩 설정


docker-compose up [options]

 - docker-compose.yml 파일에 정의된 모든 컨테이너를 실행

 - --build 옵션을 사용하면 컨테이너가 실행될 때 이미지를 강제로 다시 빌드하게 함

docker-compose down

 - docker-compose.yml 파일에 정의된 모든 컨테이너를 정지


컴포즈로 여러 컨테이너 실행하기

version: "3"

services:

master:

container_name: master

image: jenkinsci/jenkins:2.142-slim

ports:

-8080:8080

volumes:

 - 호스트와 컨테이너 사이에 파일을 공유(복사가 아님)

- ./jenkins_home:/var/jenkins_home

links:

- slave01

slave01:

container_name: slave01

image: jenkinsci/ssh-slave

environment:

- JENKINS_SLAVE_SSH_PUBKEY=ssh-rsa ....................