아래 튜토리얼은 도커/쿠바네티스를 활용한 컨테이너
개발 실전 입문 책을 바탕으로 작성 한 내용입니다:)
도커 설치하기
- 우분투는 apt 패키지 관리자를 사용, 먼저 패키지 목록 업데이트
$ sudo apt update -y
- 도커CE는 몇가지 패키지에 의존하므로, 아래 4가지 패키지를 설치한다
$ sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
- 도커 패키지 저장소를 apt에 등록한다.
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
- 다시 한 번 apt 패키지 목록을 업데이트
$ sudo apt update -y
- 도커CE를 설치한다
$ sudo apt install -y docker-ce
- 도커를 시작한다
$ sudo systemctl start docker
- 도커 상태 확인
$ sudo systemctl status docker
- 도커 버전 확인
$ docker version
도커 이미지 생성 및 빌드하기
테스트 파일 생성
테스트해볼 수 있는 http 데모 파일 생성
Dockerfile 생성
- FROM : 도커 이미지의 바탕이 될 베이스 이미지 지정, 이미지 빌드 시 여기에 지정된 이미지를 내려받는다
- RUN : 도커 이미지 실행 시 컨테이너 안에서 실행할 명령 정의
- 이미지를 빌드할 때 실행, 애플리케이션 업데이트 및 배치에 실행 - COPY : 도커가 동작 중인 호스트의 파일이나 디렉터리를 도커 컨테이너 안으로 복사
- CMD : 도커 컨테이너를 실행할 때 컨테이너 안에서 실행할 프로세스 지정 / 명령을 공백으로 나눠서 실행
더보기< CMD 작성 방법 >
- CMD ["실행 파일", "인자1", "인자2"] : 실행파일에 인자를 전달한다. 사용 권장
- CMD 명령 인자1 인자2 : 명령과 인자를 지정한다. 셀에서 실행되므로 셀에 정의된 변수를 참조 가능
- CMD ["인자1", "인자2"] : ENTRYPOINT에 지정된 명령에 사용할 인자를 전달한다 - ENTRYPOINT : 컨테이너의 명령 실행 방식 조정 / 이곳에 지정된 값이 기본 프로세스 지정
- 이곳에 'python'이라는 인자를 지정하면 명령어 입력 시 python 이후의 명령만 인자로 넘기면 된다 - LABEL : 이미지를 만든 사람의 이름을 적을 수 있다.
- ENV : 도커 컨테이너 안에서 사용할 수 있는 환경변수 지정
- APG : 이미지를 빌드할 때 정보를 함께 넣기 위해 사용 / 이미지 빌드할 때만 사용할 수 있는 일시적 환경 변수
< RUN vs CMD >
- RUN은 이미지를 빌드할 때 실행 / 애플리케이션 업데이트 및 배치에 실행하는 명령
- CMD는 컨테이너를 시작할 때 한번 실행 / 애플리케이션 자체를 실행하는 명령
도커 이미지 빌드하기
$ docker image bulid -t 이미지명[:태그명] Dockerfile경로
- '-t'옵션으로 이미지명과 태그 명 지정
- ex) test/sy:latest 여기서 test는 이미지명, sy는 사용자 이름(이미지 명의 충돌을 피하기 위해), latest는 태그명
- 현재 작업 디렉터리에 Dockerfile이 있다면 마지막 인자를 . 로 주면 된다
생성된 도커 이미지 확인하기
- 아래 명령어를 사용하면 현재 만들어진 도커 이미지를 확인 할 수있다.
$ docker images ls
도커 컨테이너 실행
$ docker container run 이미지명:태그명
- 포어그라운드에서 동작
$ docker container run -d 이미지명:태그명
- 명령에 '-d' 옵션을 추가하여 백그라운드로 컨테이너 실행
- 출력되는 문자열은 도커 컨테이너의 ID / ID는 컨테이너를 실행할 때 부여되는 유일 식별자
$ docker ps -a / $ docker container ls
- 실행 중인 도커 컨테이너의 목록을 확인하는 명령어
< 도커의 축약 명령>
- docker run = docker container run
- docker pull = docker container pull
도커의 포트 포워딩
- 도커의 포트 포워딩이란, 호스트 머신의 포트를 컨테이너 포트와 연결해 컨테이너 밖에서 온 통신을 컨테이너 포트로 전달!
- 이 기능으로 컨테이너 포트를 외부에서도 사용 가능하다
- "-p" 옵션으로 포트 포워딩 지정 가능 : -p [호스트 포트] : [컨테이너 포트]
$ docker container run -d -p 9000:8080 [이미지이름]:[태그명]
$ docker container run -d -p 8080 [이미지이름]:[태그명]
- 호스트 포트를 생략하면, 빈 포트가 자동으로 할당된다.
- 할당된 포트는 docker container ls를 통해 port에서 확인할 수 있다.
도커 이미지 다루기
도커 이미지란?
- 도커 컨테이너를 만들기 위한 템플릿
- 도커 이미지는 운영 체체로 구성된 파일 시스템, 의존 라이브러리, 실행 환경의 설정 정보를 포함하는 아카이브
- Dockerfile은 이미지를 구성하는 순서를 기술한 코드
도커 이미지 관련 명령어
$ docker image --help
$ docker image build -t 이미지명[:태그명] Dockerfile_경로
- 여기서 '-t' 옵션은 위에서 말했던 것과 같이 이미지명과 태그명을 붙이는 것
- 이미지를 생성하려면 반드시 Dockerfile이 필요하다.
- Dockerfile이라는 이름이 아닌 다른 파일 명이라면 '-f' 옵션을 사용하고 그 뒤에 다른 파일 이름을 적어줘야 한다
$ docker search 검색키워드
- 도커 이미지 검색 (도커 허브에 등록된 레파지토리를 검색)
- 검색 결과는 STARS 순으로 출력
- 공식 레포지토리의 네임스페이스는 일률적으로 library이다(생략되어있음)
$ docker image pull 레파지토리명[:태그명]
- 도커 레파지토리에서 도커 이미지를 내려받을 때
$ docker image ls
- 현재 호스트 운영 체제에 저장된 도커 이미지의 목록
$ docker image tag 기반이미지명[:태그] 새이미지명[:태그]
- 이미지에 새로운 태그를 붙일 때 (식별을 위함)
도커 컨테이너 다루기
도커 컨테이너란?
- 도커 컨테이너는 가상 환경이다
- 파일 시스템과 애플리케이션이 함께 담겨있는 박스
도커 컨테이너의 생애주기
- 도커 컨테이너는 실행 중, 정지, 파기 3가지 상태를 갖는다.
- 처음에 docker container run 명령으로 컨테이너를 최초 실행한 시점이 실행 중인 상태
- 각 컨테이너는 같은 이미지로 생성해도 별개의 상태를 갖는다
<실행 중>
- 도커 이미지 기반으로 컨테이너가 생성하면 Dockerfile에 포함된 CMD 및 ENTRYPOINT에 정의된 애플리케이션이 실행
- HTTP 요청을 받는 서버 애플리케이션이면 오류로 인해 종료되지 않는 한 계속 실행 중 상태가 지속
- 명령이 실행되고 바로 끝나는 명령행 도구의 컨테이너는 실행 중 상태가 길게 유지되지 않는다
- 실행이 끝나면 정지 상태
<정지 상태>
- 컨테이너를 사용자가 명시적으로 정지하거나, 컨테이너에서 실행된 애플리케이션이 종료된 경우는 컨테이너가 자동으로 정지된 상태가 된다
- 컨테이너를 정지시키면 가상 환경으로서 더 이상 동작하지 않지만, 디스크에 컨테이너가 종료된 시점의 상태가 저장돼 남는다.
- 정지시킨 컨테이너는 다시 실행 가능
<파기 상태>
- 정지 상태의 컨테이너는 파기하지 않는 이상 디스크에 남아있다.
- 불필요한 컨테이너는 디스크 용량 때문에 완전히 삭제하는 것이 좋다
- 한번 파기된 컨테이너는 다시 실행할 수 없다.
도커 컨테이너 관련 명령어
$ docker container run [옵션] 이미지명[:태그명] [명령] [명령인자]
- 컨테이너를 백그라운드에서 실행할 때 : '-d'
- 호스트 포트와 컨테이너 포트 간 포트 포워딩 : '-p'
- 명령 인자를 전달하면 Dockerfile에서 정의했던 CMD를 오버라이드 할 수 있다 : '-it' (셀에 들어감)
$ docker container run --name [컨테이너명] [이미지명]:[태그]
- 컨테이너에 이름 붙이는 옵션
- 이름을 붙인 컨테이너는 개발용으로는 자주 사용되지만, 운영 환경에서는 사용되지 않는다.
<도커 명령에서 자주 사용하는 옵션>
-i : 컨테이너를 실행할 때 컨테이너 쪽 표준 입력과의 연결을 유지 / 셀에 들어가서 명령을 실행할 수 있다
-t : 옵션은 유사 터미널 기능을 활성화한다 / -i 가 없으면 유사 터미널을 실행해도 입력 불가
-it : 보통은 이렇게 둘이 붙여서 사용한다
--rm : 컨테이너를 종료할 때 파기하도록 하는 옵션 / 한번 실행 후 더 이상 유지할 필요가 없는 명령행 도구
-v : 호스트와 컨테이너 간에 디렉터리나 파일 공유하기 위해 사용하는 옵션
$ docker container ls
- 현재 실행 중인 컨테이너의 목록이 출력
- CONTAINER ID : 컨테이너를 식별하기 위한 유일 식별자
- IMAGE : 컨테이너를 만드는 데 사용된 도커 이미지
- COMMAND : 컨테이너에서 실행되는 애플리케이션 프로세스
- CREATED : 컨테이너 생성 후 경과된 시간
- STATUS : Up(실행 중), Exited(종료) 등 컨테이너의 실행 상태
- PORTS : 호스트 포트와 컨테이너 포트의 연결 관계(포트 포워딩)
- NAMES : 컨테이너의 이름
$ docker container ls -q
- 컨테이너 ID만 추출하기
$ docker container ls --filter "필터명=값"
- 특정 조건을 만족하는 컨테이너 목록을 확인할 때
- 컨테이너명이 일치하는 목록은 name 필터
- 컨테이너를 생성한 이미지를 기준으로 할 때는 ancestor 필터
$ docker container ls -a
- 이미 종료된 컨테이너를 포함한 컨테이너의 목록을 확인할 수 있다.
$ docker container stop [컨테이너 ID 또는 컨테이너 명]
- 컨테이너 정지하기
$ docker container restart [컨테이너 ID 또는 컨테이너 명]
- 파기하지 않은 정지 상태 컨테이너는 docker container restart로 재시작
$ docker container rm [컨테이너 ID 또는 컨테이너 명]
- 컨테이너 삭제하기 / 완전히 파기하기
- 현재 실행 중인 컨테이너 삭제 시 -f 옵션 사용
docker container run --rm
- 컨테이너가 정지할 때 함께 삭제하기 옵션
$ docker container log [컨테이너 ID 또는 컨테이너 명]
- 현재 실행 중인 특정 도커 컨테이너의 표준 출력 내용을 확인할 수 있다.
- 새로 출력되는 출력내용을 계속 보고 싶을 때는 -f 옵션
$ docker container exec [옵션] [컨테이너 ID 또는 컨테이너 명] [실행할 명령]
- 현재 실행 중인 컨테이너에서 원하는 명령을 실행할 수 있다.
$ docker container cp [옵션] 컨테이너 ID 또는 컨테이너 명:원본파일 대상파일
- 컨테이너 안에서 호스트로 복사할 때
$ docker container cp [옵션] 호스트_원본파일 컨테이너_명:대상파일
- 호스트에서 컨테이너로 파일을 복사할 때
운영과 관리를 위한 명령어
$ docker container prune
- 실행 중이 아닌 모든 컨테이너를 삭제
$ docker image prune
$ docker rmi $(docker images -q)
- 태그가 붙지 않은 모든 이미지를 삭제한다
$ docker system prune
- 사용하지 않는 도커 이미지 및 컨테이너, 볼륨, 네트워크 등 모든 도커 리소스를 일괄적으로 삭제
$ docker container stats [옵션] [대상컨테이너]
- 시스템 리소스 사용 현황을 컨테이너 단위로 확인하고 싶을 때
'Docker & Kubernetes > Docker' 카테고리의 다른 글
[Docker-Compose] 도커 컴포즈 설치 및 사용 (2) | 2020.02.13 |
---|---|
[Trouble Shooting] 도커 사용시 문제 발생 및 해결 (1) | 2020.02.09 |
[Docker] 도커로 딥러닝 환경 구축하기 (0) | 2019.10.15 |
[Docker] 도커허브에 이미지 배포하기 (0) | 2019.10.14 |