컨테이너로 애플리케이션 실행하기
도커 이미지 : 도커 컨테이너를 구성하는 파일 시스템과 실행할 애플리케이션 설정을 하나로 합친 것으로, 컨테이너를 생성하는 템플릿 역할을 한다
도커 컨테이너 : 도커 이미지를 기반으로 생성되며, 파일 시스템과 애플리케이션이 구체화 되어 실행되는 상태
도커 이미지와 도커 컨테이너
$ 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 --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 ....................
'책 > 도커, 쿠버네티스를 활용한 컨테이너 개발 실전 입문' 카테고리의 다른 글
컨테이너 실전 구축 및 배포 (0) | 2020.07.23 |
---|---|
도커의 기초 (0) | 2020.07.09 |