개념 | 역할 |
---|---|
도커 이미지 | - 도커 컨테이너를 구성하는 파일 시스템 + 실행할 애플리케이션 설정 - 컨테이너를 생성하는 템플릿 역할 |
도커 컨테이너 | - 도커 이미지를 기반으로 생성 - 파일 시스템과 애플리케이션이 구체화돼 실행되는 상태 |
docker image pull
: 도커 이미지 받아오기docker container run -d example/echo:latest
: 백그라운드로 컨테이너 실행docker container stop $(docker container ls --filter "ancestor=example/echo" -q)
docker container ls --filter
옵션으로 실행 중인 컨테이너 중 조건을 만족하는 것만을 출력-q
: 컨테이너 ID만 출력하게 하는 옵션-p [호스트 포트]:[컨테이너 포트]
: 포트 포워딩 지정(호스트 포트 생략가능)포트 포워딩
호스트 머신의 포트를 컨테이너 포트와 연결해 컨테이너 밖에서 온 통신을 컨테이너 포트로 전달하는 역할을 담당하는 것. 이 기능 덕분에 컨테이너 포트를 컨테이너 외부에서도 이용할 수 있다.
도커 이미지
- 도커 컨테이너를 만들기 위한 템플릿
- 우분투 같은 운영 체제로 구성된 파일 시스템, 컨테이너 위에서 실행하기 위한 애플리케이션/의존 라이브러리, 도구에 어떤 프로세스를 실행할지 등의 실행 환경의 설정 정보까지 포함하는 아카이브
도커 이미지를 빌드한다
= 컨테이너의 템플릿 역할을 하는 이미지를 만드는 과정
docker image build -t 이미지명[:태그명] Dockerfile의_경로
: 이미지명과 태그명 붙임(필수)
(현재 작업 디렉터리에 있다면 -> docker image build -t example/echo:latest .
)
docker image build -f Dockerfile-test -t example/echo:latest .
: 특정 이름으로 된 Dockerfile을 사용할 경우
(기본적으로는 Dockerfile이라는 이름의 Dockerfile을 찾음)
docker image build --pull=true -t example/echo:latest .
: 매번 베이스 이미지를 강제로 새로 받아옴 (이미지 빌드시, 확실하게 최신 베이스 이미지를 사용하고 싶을 경우 사용)
도커 허브에 등록된 repository 검색 : docker search [options] 검색_키워드
docker search --limit 5 mysql
: 최대 검색 건수 제한
공식 repository 이름의 네임스페이스 생략 가능, 일률적으로 library로 칭함
docker image pull [options] 레포지토리명[:태그명]
현재 호스트 운영 체제(도커 데몬이 동작하는 호스트 환경)에 저장된 도커 이미지의 목록 보여줌
docker image ls [options] [레포지토리[:태그]]
도커 이미지의 특정 버전에 태그를 붙일 때 사용
IMAGE ID
: 도커 이미지의 버전 넘버 역할
(도커 이미지는 빌드할 때마다 그 내용의 해시값을 IMAGE ID
로 삼기 때문에 내용이 바뀌면 IMAGE ID
도 새 값이 부여된다. )
latest태그
: 항상 최신 이미지를 가리키는 태그 (git의 master브랜치와 같은 의미)
docker image tag 기반이미지명[:태그] 새이미지명[:태그]
docker image push [options] 레포지토리명[:태그]
현재 저장된 도커 이미지를 도커 허브 등의 레지스트리에 등록하기 위해 사용
도커 허브는 자신 혹은 소속 기관이 소유한 레포지토리에만 이미지를 등록할 수 있음
(ex. docker image tag example/echo:latest stormcattest/echo:latest
)
docker image push stormcattest/echo:latest
run
명령으로 Dockerfile에 포함된 CMD 및 ENTRYPOINT 인스트럭션에 정의된 애플리케이션이 실행될 때. HTTP 요청을 받는 서버 애플리케이션이면 오류로 인해 종료되지 않는 한 실행 중 상태가 지속되므로 실행 기간이 길지만, 이에 비해 명령이 바로 실행되고 끝나는 명령행 도구 등의 컨테이너는 실행 중 상태가 길게 유지되지 않는다.docker container run [options] 이미지명[:태그] [명령] [명령인자...]
docker container [options] 이미지ID [명령] [명령인자...]
-it
: CMD 인스트럭션 오버라이드 가능docker container run --name [컨테이너명] [이미지명]:[태그]
-i
: 컨테이너를 실행할 때 컨테이너 쪽 표준 입력과의 연결을 그대로 유지해 컨테이너 쪽 셸에 들어가 명령을 실행할 수 있다.-t
: 유사 터미널 기능 활성화--rm
: 컨테이너를 종료할 때 컨테이너를 파기하도록 하는 옵션-v
: 호스트와 컨테이너 간에 디렉터리나 파일을 공유하기 위해 사용하는 옵션docker container ls [options]
항목 | 내용 |
---|---|
CONTAINER ID | 컨테이너를 식별하기 위한 유일 식별자 |
IMAGE | 컨테이너를 만드는 데 사용된 도커 이미지 |
COMMAND | 컨테이너에서 실행되는 애플리케이션 프로세스 |
CREATED | 컨테이너 생성 후 경과된 시간 |
STATUS | Up(실행중), Exited(종료) 등 컨테이너의 실행 상태 |
PORTS | 호스트 포트와 컨테이너 포트의 연결 관계(포트 포워딩) |
NAMES | 컨테이너의 이름 |
docker contaainer ls -q
: 컨테이너 ID(축약형)만 추출
docker container ls --filter "필터명=값
: 특정 조건을 만족하는 컨테이너의 목록 필터링
docker container ls --filter "name=echo1"
: 이름 = 컨테이너명docker container ls --filter "ancestor=example/echo"
: 생성 이미지 기준docker container ls -a
: 종료된 컨테이너 포함한 컨테이너 목록
docker container stop 컨테이너ID_또는_컨테이너명
docker container restart 컨테이너ID_또는_컨테이너명
docker container rm 컨테이너ID_또는_컨테이너명
docker connntainer rm -f ~
: 현재 실행 중인 컨테이너 삭제docker container logs [options] 컨테이너ID_또는_컨테이너명
dockdr container exec [options] 컨테이너ID_또는_컨테이너명 컨테이너에서_실행할_명령
: 컨테이너 내부의 상태를 확인하거나 디버깅하는 용도로 사용
docker container cp [options] 컨테이너ID_또는_컨테이너명:원본파일 대상파일
docker container cp [options] 호스트_원본파일 컨테이너ID_또는_컨테이너명:대상파일
컨테이너와 호스트 간에 파일을 복사하기 위한 명령
docker container prune [options]
: 정지된 모든 컨테이너 삭제
docker image prune [options]
: 태그가 붙지 않은(dangling) 모든 이미지 삭제
docker system prune
: 사용하지 않는 도커 이미지 및 컨테이너, 볼륨, 네트워크 등 모든 도커 리소스를 일괄적으로 삭제하고 싶을 때
docker container [options][대상_컨테이너ID...]
: 시스템 리소스 사용 현황을 컨테이너 단위로 확인
yaml 포맷으로 기술된 설정 파일로, 여러 컨테이너의 실행을 한 번에 관리할 수 있게 해준다.
docker-compose up -d
: yml 파일의 정의에 따라 여러 컨테이너 한꺼번에 시작
docker-compose down
: yml 파일에 정의된 모든 컨테이너가 정지 혹은 삭제됨
docker-compose up -d --build
: 이미 이미지를 빌드한 적이 있는 컴포즈의 경우 빌드를 생략하고 컨테이너가 실행되지만, --build
옵션을 사용할 경우 도커 이미지를 강제로 다시 빌드 (이미지가 자주 수정되는 경우 사용하는 것이 좋다)
docker-compose up
http://localhost:[포트 포워딩한 호스트 포트번호]
)docker-compose.yml
파일 : 슬레이브 컨테이너 추가JENKINS_SLAVE_SSH_PUBKEY
: 마스터의 SSH 공개키links
요소 : 마스터 컨테이너가 슬레이브 컨테이너로 통신할 수 있게 설정version: "3"
services:
master:
container_name: master
image: jenkinsci/jenkins:2.142-slim
ports:
- 8080:8080
volumes:
- ./jenkins_home:/var/jenkins_home # 호스트와 컨테이너 사이에 파일을 "공유"할 수 있는 메커니즘(복사X)
links: # SSH 접속 대상 설정
- slave01
slave01:
container_name: slave01
image: jenkinsci/ssh-slave
environment: # SSH 접속 허용 설정
-JENKINS_SLAVE_SSH_PUBKEY=ssh-rsa AAAAB3NzaC1... # 마스터 SSH 공개키
# 호스트 파일 시스템의 ./jenkins_home/.ssh/id_rsa.pub 내용 복붙