티스토리 뷰
도커 이미지와 컨테이너
-
도커 이미지
- 컨테이너를 생성할 때 필요한 파일로 가상 머신의 iso와 유사
- 컨테이너를 생성, 실행할 때 읽기 전용으로 사용된다.
- 이미지의 이름은 [저장소(생략가능)]/[이미지이름]:[태그(생략시 latest)] 형태로 구성된다.
- 도커 컨테이너
- 도커 이미지로 생성했을 때 기존 파일시스템과 격리된 시스템 자원 및 네트워크를 사용하도록 생성된 공간.
- 컨테이너는 이미지를 읽기 전용으로 사용하되 이미지에서 변경된 사항은 컨테이너 계층에 저장한다.
- 하나의 같은 이미지로도 독립적인 여러 컨테이너를 생성할 수 있음.
도커 컨테이너 다루기
-
컨테이너 생성
- dokver -v : 도커 버전확인
- docker run -i -t( i: 상호입출력, t: tty bash 셸 사용 옵션, i,t는 동시에 사용해야만함 ) [이미지이름]
- docker run 명령어 시 해당 이미지가 로컬에 존재하지 않으면 자동으로 도커 중앙 이미지 저장소인 도커 허브에서 이미지를 다운로드 받은 후 컨테이너를 생성 후 해당 컨테이너 내부로 들어간다.
- (컨테이너 내부) root(사용자이름)hostname(무작위해쉬16진수)
- 내부적으로 [ PULL ] -> [ CREATE ] -> [START] -> [ ATTACH (-i, -t 옵션을 사용했을 시) ] 호출한다.
- (컨테이너 내부) exit 명령어 : 컨테이너 내부를 빠져나오면서 해당 컨테이너를 중지 시킨다.
- 컨테이너를 중지 시키지않고 빠져나오려면, Ctrl + P, Q 명령어로 셸에서만 빠져나오도록 한다.
- docker pull [이미지이름] : 도커허브에 있는 해당 이미지를 로컬 저장소에 내려 받는다.
- docker images: 도커 허브에 있는 이미지 목록을 출력한다.
- docker create --name [컨테이너 이름] [이미지 이름] : 컨테이너를 생성만 하고 싶을 시 사용한다.
- docker run과 다르게, [ PULL ] -> [ CREATE ] 만 내부적으로 호출된다.
- docker attach [컨테이너이름] : 해당 도커 내부로 들어가는 명령어.
- 컨테이너 목록 확인
- docker ps ( -a ) : 컨테이너 목록 조회
- ps명령어시 CONTAINER ID, IMAGE, COMMAND, CREATED, STATUS, PORTS, NAMES 등의 내용을 확인할 수 있다.
- PORTS : 컨테이너가 개방한 포트와 호스트에 연결한 포트를 나열한다.
- ps명령어시 CONTAINER ID, IMAGE, COMMAND, CREATED, STATUS, PORTS, NAMES 등의 내용을 확인할 수 있다.
- docker rename [원래 컨테이너 이름] [새로운 이름] : 컨테이너 이름 변경
- docker ps ( -a ) : 컨테이너 목록 조회
- 컨테이너를 외부에 노출
- 컨테이너는 가상머신과 마찬가지로 자동으로 가상 IP를 할당받는다.
- 도커는 컨테이너에 IP를 172.17.0.x 부터 순차적으로 할당한다.
- docker run -it -p [호스트IP : 컨테이너IP] : 지정한 컨테이너 ip를 지정한 호스트 ip로 연결한다.
- [호스트 IP의 지정한 포트로 접근 => 해당 포트는 지정한 컨테이너 포트로 포워딩 => 컨테이너 안 포트에 있는 서버에 접근] 하는 플로우로 진행된다.
- 컨테이너는 가상머신과 마찬가지로 자동으로 가상 IP를 할당받는다.
- 컨테이너 어플리케이션 구축
- 도커의 이미지 관리와 독립성을 유지하기 위하여 컨테이너 아넹는 하나의 어플리케이션을 띄우는게 도커의 원칙이므로 여러개의 어플리케이션을 띄우는 것은 좋지 않다.
- docker exec -it [이미지이름] [컨테이너 내부에서 수행할 명령어]
- ex) docer exec -i -t wordpressdb /bin/bash: wordpressdb 컨테이너 내부의 /bin/bash 프로그램을 상호 입출력이 가능하도록 실행하라
- /bin/bash 프로그램 내부의 echo 명령어를 통하여 -e 옵션으로 설정한 환경변수를 확인할 수 있다. echo #{환경변수이름}
- [하나의 컨테이너와 다른 컨테이너를 연결하여 배포하는 예제]
1. mysql 이미지를 이용하여 데이터베이스 컨테이너 생성
docker run -d \
-- name wordpressdb \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_DATABASE=wordpress \
mysql:5.7
=> -d 옵션 : 컨테이너를 백그라운드에서 동작하도록 설정(입출력 없는 상태로 컨테이너 실행)
2. 워드프레스 이미지를 이용하여 웹 컨테이너 생성(p옵션을 이용하여 80포트 호스트에 노출)
docker run -d \
-e WORDPRESS_DB_PASSWORD=password \
--name wordpress \
--link wordpressdb:mysql \
-p 80 \
wordpress
=> --link 옵션 : 내부 IP를 알 필요없도록 컨테이너의 별명을 설정하고 별명으로 접근 하도록 설정하는 옵션. (컨테이너끼리의 통신을 할 시 가장 쉬운 방법은 NAT에서 발급받은 내부 IP를 통하여 통신하는 것이다. 하지만, 도커엔진은 컨테이너가 실행될 때 마다 172.17.0.2,3,4 ... NAT IP를 재 할당해주기 때문에 매번 변경되는 IP로 접근하기는 어렵다.)
=> link 옵션 설정 후엔, 다른 컨테이너에서 wordpress 컨테이너를 mysql 이라는 이름으로 호출 할 수 있다.
=> ex) docker exec wordpress ping -c 2 mysql : wordpress 웹 컨테이너에서 wordpressdb에 mysql이라는 별명으로 통신하는 명령어