본문 바로가기

Docker & Kubernetes/Docker

[Docker] Ubuntu 18.04 도커 시작하기

반응형

아래 튜토리얼은 도커/쿠바네티스를 활용한 컨테이너

개발 실전 입문 책을 바탕으로 작성 한 내용입니다:)

 

 

 

 

docker 시작하기

 

 

도커 설치하기

- 우분투는 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 --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 [옵션] [대상컨테이너]

- 시스템 리소스 사용 현황을 컨테이너 단위로 확인하고 싶을 때

반응형