효습
Docker 기본 개념 - 2일차 본문
Docker Network
- 도커를 이용하면 웹 서버가 컨테이너에 설치됨
- 이 컨테이너가 설치된 운영체제를 도커 호스트라고 함
- 하나의 도커 호스트에는 여러개의 컨테이너가 만들어질 수 있음
- 컨테이너와 호스트 모두 독립적인 실행환경이기때문에 각자의 독립적인 포트와 파일시스템을 가지고 있음
- 호스트와 컨테이너가 연결이 되어있지 않는 상태에서 웹 브라우저로 웹서버로 접속을 하면? -> 접속이 안됨
- 그럼 어떻게 하면 되냐? 호스트의 80번 포트와 컨테이너의 80번 포트를 연결해주면 됨
- 컨테이너를 실행하는 명령어를 아래로 바꿈
- 앞의 80은 호스트의 포트이고 뒤에 80은 컨테이너의 포트임
- 이렇게 연결된 포트로 신호를 전달하는 것을 port forwarding이라고 함
// docker run httpd 에서
docker run -p 80:80 httpd
The Container Lifecycle
네트워크 드라이브
- bridge : 기본 네트워크 드라이버, 동일한 도커 호스트에서 컨테이너 간의 통신을 도와줌
- host: : 호스트의 네트워크를 직접 사용
- overlay: 서로 다른 도커 호스트의 컨테이너 간 통신을 도와줌
- none: 네트워크를 사용하지 않는 컨테이너
네트워크와 연결된 컨테이너를 확인할 수 있음
docker network inspect bridge
도커 이미지를 도커 허브에 올리기
- 이미지 태그 설정
- [Docker Hub 사용자명]/이미지명:[태그명]
- 태그 방법
- build시: docker build -t [이미지명]
- build후 : docker image tag [이미지명]
도커 컴포즈란?
- 도커 컨테이너를 일괄적으로 정의하고 제어하는 도구
- 설정 파일을 도커 CLI로 번역하는 역할
- 여러 개의 컨테이너의 옵션과 환경을 정의한 파일을 읽어 컨테이너를 순차적으로 생성하는 방식으로 동작한다
도커 컴포즈 파일 구성
- Version(Optional)
- Services(Required)
- Networks
- Volumns
- Configs
- Secrets
version 정의
yaml 파일 포맷의 버전을 나타낸다. 도커 컴포즈 버전마다 사용하는 yaml 포맷 버전이 있으므로 도커 컴포즈 버전은 도커 엔진 버전에 의존성이 있으므로 가능하면 최신 버전을 사용하는 것이 좋다.
services 정의
서비스는 도커 컴포즈로 생성할 컨테이너 옵션을 정의한다. 각 서비스는 컨테이너로 구현되며, 하나의 프로젝트로서 도커 컴포즈에 의해 관리된다. 서비스의 이름은 services의 하위 항목으로 정의하고, 컨테이너의 옵션은 서비스 이름의 하위 항목을 정의한다.
services:
container_1:
image: ...
container_2:
image: ...
services : 생성될 컨테이너들을 묶어놓은 단위, 서비스 항목 아래에는 각 컨테이너에 적용될 생성 옵션을 지정한다.
image: 서비스의 컨테이너를 생설할 때 쓰일 이미지의 이름을 설정한다. 이미지 이름 포맷은 docker run과 같으며 만일 이미지가 도커에 존재하지 않으면 도커 허브에서 자동으로 내려받는다.
links : docker run 명령어의 --link와 같으며, 다른 서비스에 서비스명만으로 접근할 수 있도록 설정한다. [SERVICE:ALIAS] 형식을 사용하면 서비스에 별칭으로도 접근할 수 있다.
environment : docker run 명령어의 --env, -e 옵션과 동일하다. 서비스의 컨테이너 내부에서 사용할 환경변수를 지정하며, 딕셔너라나 배열 형태로 사용할 수 있다.
command: 컨테이너가 실행될 때, 수행할 명령어를 설정하며, docker run 명령어의 마지막에 붙는 커맨드와 같음, Dockerfile의 RUN과 같음 배열 형태로도 사용할 수 있음
depends_on: 특정 컨테이너에 대한 의존 관계를 나타내며, 이 항목에 명시된 컨테이너가 먼저 생성되고 실행된다. 서비스의 이름으로만 접근할 수 있음
특정 서비스의 컨테이너만 생성하되 의존성이 없는 컨테이너를 생성하려면 --no-deps 옵션을 사용하면 됨
$ docker-compose up --no-deps web
ports : docker run 명령어의 -p와 같으며 서비스의 컨테이너를 개방할 포트를 설정한다. 그러나 단일 호스트 환경에서는 80:80과 같이 호스트의 특정 포트를 서비스의 컨테이너에 연결하면 docker-compose scale 명령어로 서비스의 컨테이너의 수를 늘릴 수 없습니다.
services:
app:
image: wordpress:latest
ports:
- "8000:80"
build : build 항목에 정의된 도커 파일에서 이미지를 빌드해 서비스의 컨테이너를 생성하도록 설정한다. build 항목에서는 도커 파일에 사용될 컨텍스트나 도커 파일의 이름, 도커 파일의 사용될 인자 값을 설정할 수 있다.
extends : 다른 yml 파일이나 현재 yaml 파일에서 서비스의 속성을 상속 받도록 설정한다.
네트워크 정의
driver : 도커 컴포즈는 생성된 컨테이너를 위해 기본적으로 bridge 타입의 네트워크를 생성한다. 그러나 yaml 파일에서 driver 항목을 정의해 서비스의 컨테이너가 bridge 네트워크가 아닌 다른 네트워크를 사용하도록 설정할 수 있다. 특정 드라이버에 필요한 옵션은 하위 항목인 driver_ops로 전달할 수 있음
version: '3.9'
services:
myservice:
image: nginx
networks:
- mynetwork
networks:
mynetwork
driver: overlay
driver_opts:
subnet: "255.255.255.0"
IPAddress: "10.0.0.2"
ipam: IPAM(IP Address Manager)를 위해 사용할 수 있는 옵션으로서 subnet,ip 범위 등을 설정할 수 있음. driver 항목에서는 IPAM을 지원하는 드라이버 이름을 입력함
external : yaml 파일을 통해 프로젝트를 생성할 때마다 네트워크를 생성하는 것이 아닌, 기존의 네트워크를 사용하도록 설정한다. 이를 설정하려면 사용하려는 외부 네트워크의 이름을 하위 항목으로 입력한 뒤 external 값을 true로 설정한다. external 옵션은 준비된 네트워크를 사용하므로 driver, driver_ops,ipam 옵션을 함께 사용할 수 없음
볼륨 정의
driver : 볼륨을 생성할 때 , 사용될 드라이버를 설정한다. 어떠한 설정도 하지 않으면 local로 설정되며 사용하는 드라이버에 따라 변경해야한다. 드라이버를 사용하기 위한 추가 옵션은 하위 항목인 driver_ops를 통해 인자로 설정할 수 있다.
external : 도커 컴포즈는 yaml 파일에서 volumn, volumn-form 옵션 등을 사용하면 프로젝트마다 볼륨을 생성한다. 이때 external 옵션을 설정하면 볼륨을 프로젝트를 생성할 때마다 매번 생성하지 않고 기존 볼륨을 사용하도록 설정한다.
도커 컴포즈 명령어
docker-compose -f local-infra.yml up -d
- up : 도커 컴포즈 파일로, 컨테이너를 생성하기
- -f : 도커 컴포즈 파일 지정하기
- -d : 백그라운드에서 실행하기
도커 네트워크 생성
docker network create wordpress_net
- 웹브라우저에 localhost: 8080포트로 들어오면 그것이 80번 포트에 연결되어있는 app 컨테이너로 연결됨
- 80번 포트에서 리스닝하고 있는 Web Server에 접속이 들어갈 것이고 Web Server은 PHP에 그 요청을 넘기고
- php 는 var/www/html/에 위치하고 있는 PHP애플리케이션을 읽어서 거기에 있는대로 동작함
- 이때 mysql_connect('db', 'wordpress_user', '123456'); 이라고 되어있으면 같은 네트워크에 접속되어있는 db라는 이름의 컨테이너와 연결하라는 의미임
- 그럼 3306번을 리스닝하고 있는 MySQL Server가 그걸 받음
- MySQL Server는 var/lib/mysql이라는 디렉토리에 연결되어있는 db_data라는 폴더에서 데이터를 꺼내서 그 데이터를 PHP에게 줌
- PHP는 Web Server에게 응답함
- Web Server는 web browser에게 결과를 보내줌
참고한 블로그
'Docker' 카테고리의 다른 글
Docker 기본 개념 - 1일차 (0) | 2023.08.06 |
---|