Docker 컨테이너 배포

JB·2021년 12월 27일
1

Virtualization

목록 보기
2/2


이번 시간에는 도커를 이용하여 애플리케이션을 실행, 배포하는 방법에 대해 알아보자.

우선 Docker의 이미지와 컨테이너 개념에 대해 간략하게 알아보자

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

도커 이미지

컨테이너를 구성하는 파일 시스템과 실행할 애플리케이션 설정을 하나로 합친 것이다.
컨테이너를 생성하는 템플릿 역할을 하며, 이미지 파일로 여러개의 도커 컨테이너를 생성할 수 있다.

도커 컨테이너

도커 이미지를 기반으로 생성되며, 파일 시스템과 애플리케이션이 구체화(instaniate)된 상태이다.


위 그림에서 Dockerfile은 도커 이미지를 빌드할 때 사용하는 파일이다.
Dockerfile에선 도커 이미지의 바탕이 될 베이스 이미지를 지정하거나(FROM),
어떠한 명령을 수행할지(CMD) 등의 명령어 셋을 입력하여 이미지를 빌드한다.
실제 어떠한 명령이 있는지는 아래 reference를 참고하면 된다.
Dockerfile reference

이 중에서 기억해야할 점은 CMD 명령은 빌드 단계에서 실행되지 않고, 컨테이너화 하였을 때 실행되는 명령어 라는 점이다.
나머지 모든 명령어는 빌드 단계에서 진행이 되어 끝나게 된다고 보면 된다.

도커 컨테이너 생명주기

도커 컨테이너는 아래 3가지 중 한개의 상태를 가진다
(그림에는 5가지로 나타나있지만, Created, Deleted는 크게 의미가 없기 때문에)

  • 실행 중(Running)
    Dockerfile에 정의된 CMD, ENTRYPOINT 명령어를 통해 정의된 애플리케이션이 실행되고 있는 상태.
    생성 단계에서 문제없이 컨테이너가 실행이 되었다면, '실행 중' 상태일 것이다.
  • 정지(Paused)
    '실행 중' 상태에 있는 컨테이너를 사용자가 정지하거나 컨테이너에서 실행된 애플리케이션이 정상/오류 관계없이 종료된 경우, 정지 상태가 된다.
    '정지' 상태의 컨테이너는 컨테이너로서 작동 중은 아니지만, 디스크에 컨테이너의 상태가 남아있어 다시 시작할 수 있다.
  • 파기(Stopped)
    '정지' 상태의 컨테이너는 명시적으로 파기하지 않는 이상 디스크에 그대로 남아 있게된다. 컨테이너를 자주 생성하고 정지하면 디스크를 차지하는 용량이 점점 늘어나므로, 불필요한 정지 컨테이너는 주기적으로 파기해주는 것이 좋다.

이미지 빌드하기

Dockerfile과 빌드할 파일 준비가 끝났다면, 이미지를 빌드해보자.
이미지를 빌드할 때는 docker image build 명령을 사용한다.

docker image build -t 이미지명[:태그명] Dockerfile_경로

-t 옵션으로 이미지명과 태그명을 지정한다.
태그명은 생략이 가능하지만, 생략할 경우 latest가 자동으로 부여된다.
-t 옵션 자체를 생략할 수도 있지만, 항상 사용해야한다고 알고 있자.
옵션 없이도 빌드 자체는 가능하지만 이미지명에 해시값이 배정되기 때문에, 나중에 사용하기 굉장히 힘들다.

docker image build -t example/jb:latest .

빌드를 실행하면 베이스 이미지를 내려받거나 RUN, COPY 등의 명령이 단계적으로 실행된다.

-f 옵션

기본적으로 docker image buildDockerfile 이라는 이름의 Dockerfile을 찾아 빌드를 실행한다.
하지만 -f 옵션을 주게 되면 Dockerfile 이 아니더라도 다른 파일로 도커 이미지를 빌드할 수

docker image build -f Dockerfile-test

--pull 옵션

도커는 Dockerfile의 FROM 인스트럭션을 통해 베이스 이미지를 받은 후 그 위에 작업을 진행하게 되는데,
빌드할 때 마다 매번 베이스 이미지를 도커 허브(온라인 도커 레지스트리)를 통해 다운로드 받게 되면,
빌드 속도가 느리기 때문에 도커는 이러한 이미지들을 캐시 형태로 레지스트리에 저장해두게 된다.
이러한 레지스트리 이미지들은 일부러 삭제하지 않는 한 호스트 운영체제에 계속 저장된다.
그러므로 이미지를 빌드할 때 매번 새 이미지를 받아오지 않는다.
강제로 이미지를 새로 받아와서 작업을 하고 싶을 때는 --pull 옵션을 이용해서 새로 받아온다.

이미지 확인하기

docker image ls


해당 명령어를 통해 REPOSITORY, TAG, IMAGE ID, CREATED, SIZE 값을 확인 할 수 있다.
여기서 빌드한 이미지의 REPO와 TAG 정보가 보인다면 성공적으로 빌드된 것이다.

컨테이너 실행하기

이제 빌드된 이미지로 컨테이너를 실행해보자.

docker container run -d 이미지명:태그명

백그라운드 실행

-d 옵션은 해당 컨테이너를 백그라운드에서 작업하도록 지시하는 명령어이다.
명령어를 실행하면 해시값이 반환되는데, 이는 도커의 컨테이너 ID이다.
컨테이너 ID는 컨테이너를 실행할 때 부여되는 유일 식별자이며, 컨테이너를 조작할때 이용된다.
이 컨테이너 ID는 docker container ls 명령어로도 확인할 수 있다.

컨테이너 포트포워딩

HTTP 요청을 받는 애플리케이션의 경우 호스트의 포트를 할당해 컨테이너 내부 포트와 연결을 시켜줘야한다.
따라서 포트포워딩이 필요한데, 이럴 때는 아래와 같은 명령어를 사용하면 지정 포트로 포트포워딩을 실시할 수 있다.

docker container run -d -p [호스트포트:]컨테이너포트 이미지명:태그명
docker container run -d -p 9000:8080 example/jb:latest

호스트의 임의 포트를 할당해 포트포워딩하고 싶다면 호스트포트: 부분을 생략하면 된다.

명령 인자

docker container run에 명령과 명령 인자를 전달하면, Dockerfile에서 정의한 CMD 명령어를 오버라이드하고 이미지에서 명령을 실행할 수 있다.
예를 들어, 특정 컨테이너에서 원하는 쉘을 실행하거나, 컨테이너를 Running 상태로 유지시키지 않고 파일의 내용을 확인할 수 있다.

docker container run [options] 이미지명[:태그] [명령] [명령 인자]
docker container run -it alpine:3.7 #
docker container run -it alpine:3.7 uname -a

컨테이너에 이름 붙이기

docker container run --name [컨테이너명] [이미지명][:태그]
docker container run -t -d --name daniel-jung example/jb:latest

자주 사용되는 옵션

-i : 컨테이너 쪽 표준 입력과의 연결을 그대로 유지
-t : 유사 터미널 기능 제공 (주로 -it로 사용)
--rm: 컨테이너 종료 시 컨테이너 자동 파기
-v: 호스트와 컨테이너 간 디렉토리 공유

도커 허브 이미지 검색

docker search [options] 검색_키워드
docker search --limit 5 mysql

도커 허브의 다른 사용자들이 올려놓은 도커 이미지를 검색할 수 있다.
검색 결과는 star 순으로 내림차순 정렬되어 출력되며,
공식 레포지토리의 네임스페이스는 생략이 되어 출력된다.
(공식 레포의 네임스페이스는 항상 library이다)

이미지 내려받기

이미지를 검색했으면 내려받아 사용할 수 있어야한다.

docker image pull [options] 레포지토리명[:태그명]
docker image pull jenkins:lateset

인자로 지정한 레포와 태그는 도커 허브에 존재하는 것이어야 내려받기가 가능하다.

보유한 이미지 목록 보기

docker image ls

이미지에 태그 붙이기

docker image tag 기반이미지[:태그] 새이미지명[:태그]
docker image tag example/jb:latest example/jb:0.1.3

태그는 특정한 이미지를 쉽게 참조할 수 있도록 붙인 별명에 지나지 않는다. 도커 이미지는 빌드할 때마다 다시 생성되는데, 그 내용의 해시값을 이미지 ID로 삼기 떄문에 내용이 바뀌면 이미지 ID도 새 값이 부여된다.
따라서 도커 이미지의 태그는 어떤 특정 이미지 ID를 갖는 도커 이미지를 쉽게 식별하는 것을 목적으로 한다.

이미지를 공개하기

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

현재 저장된 도커 이미지를 도커 허브 등의 레지스트리에 등록하기 위해 사용한다.
도커 허브를 예로 들면, 도커 허브에서는 네임스페이스 = 도커 허브 ID로 바꿔서 이미지를 push해야한다.
공개된 이미지는 누구나 이용할 수 있으므로, 패스워드나 보안키 등을 포함하지 않도록 주의한다.

도커 컨테이너 목록 보기

컨테이너 ID만 추출하기

docker container ls -q 

컨테이너 목록 필터링하기

docker container ls --filter "name=jb"
docker container ls --filter "ancestor=example/jb"

종료된 컨테이너 목록 보기

docker container ls -a

컨테이너 정지

docker container stop 컨테이너_ID_또는_컨테이너명

정지된 컨테이너는 언제든지 다시 재시작 할 수 있다.

컨테이너 재시작하기

docker container restart 컨테이너_ID_또는_컨테이너명

컨테이너 삭제하기

docker container rm 컨테이너_ID_또는_컨테이너명

표준 출력 연결하기

docker container logs [options] 컨테이너_ID_또는_컨테이너명

실행 중인 컨테이너에서 명령 실행하기

docker container exec [options] (컨테이너_ID_또는_컨테이너명) (컨테이너에서 실행할 명령)
docker container exec -it jb sh

파일 복사하기

docker container cp [options] 컨테이너_ID_또는_컨테이너명:원본파일 대상파일 // 컨테이너 -> 호스트
docker container cp [options] 호스트_원본파일 컨테이너_ID_또는_컨테이너명:대상파일 // 호스트 -> 컨테이너

호스트와 컨테이너 간의 파일 교환이 필요한 경우 이용

profile
평범한 월급쟁이 개발자

0개의 댓글