Fully-distributed 환경에서 여러개의 컨테이너를 제어하기는 커녕 컨테이너를 실행하는 작업 또한 번거롭기 짝이 없다.
> sudo docker run -it --privileged=True -h master01 --name master01 -p 9870:9870 centos:hadoop
> source /etc/profile
> sudo docker run -it --privileged=True -h master02 --name master02 centos:hadoop
> source /etc/profile
> sudo docker run -it --privileged=True -h slave01 --name slave01 centos:hadoop
> source /etc/profile
> sudo docker run -it --privileged=True -h slave02 --name slave02 centos:hadoop
> source /etc/profile
> sudo docker run -it --privileged=True -h slave03 --name slave03 centos:hadoop
> source /etc/profile
> sudo docker inspect master01 | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",
> sudo docker inspect master02 | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.3",
"IPAddress": "172.17.0.3",
> sudo docker inspect slave01 | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.4",
"IPAddress": "172.17.0.4",
> sudo docker inspect slave02 | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.5",
"IPAddress": "172.17.0.5",
> sudo docker inspect slave03 | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.6",
"IPAddress": "172.17.0.6",
#모든 컨테이너에 반복한다.
> vim /etc/hosts
...
172.17.0.2 master01
172.17.0.3 master02
172.17.0.4 slave01
172.17.0.5 slave02
172.17.0.6 slave03
Plain Text
복사
#master01, master02
> cd $HADOOP_HOME/etc/hadoop
> vim hdfs-site.xml
...
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<property>
<name>dfs.namenode.http.address</name>
<value>master01:9870</value>
</property>
<property>
<name>dfs.secondary.http.address</name>
<value>master02:9868</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/opt/hadoop/current/data/namenode</value>
</property>
</configuration>
XML
복사
#master01
> vim workers
slave01
slave02
slave03
Plain Text
복사
학습을 목적으로 개인 컴퓨터의 로컬환경에서는 클러스터를 매번 실행, 중단해야 하는데, 반복작업은 언제나 지루하다.
Docker Compose 기술을 이용하여 여러개의 컨테이너를 동시에 실행하고, 운영체제 설정까지 조작하여 좀 더 간편하게 클러스터를 실행할 수 있다.
컨테이너를 실행할 떄 필요한 옵션을 정리하고 어떠한 설정 수정과 명령 수행을 하는지 정리한다.
공통
name 옵션(컨테이너 이름)
-it 옵션
privileged 옵션(True)
hostname 옵션(컨테이너 이름과 동일)
image 옵션(centos:hadoop)
source /etc/profile 수행
etc/hosts 각 컨테이너 IP Address 적용
master01
port number 옵션(9870:9870)
$HADOOP_HOME/etc/hadoop/hdfs-site.xml 파일 수정
$HADOOP_HOME/etc/hadoop/workers 파일 수정
master02
$HADOOP_HOME/etc/hadoop/hdfs-site.xml 파일 수정
Plain Text
복사
docker-compose.yml 을 이용해 옵션을 조정해준다.
docker-compose.yml은 컨테이너 실행에 관한 설정을 담은 파일로, services 속성에 설정을 담을 수 있다. 컨테이너 이름을 따로 지정하지 않는다면 docker-compose.yml 파일의 디렉토리 이름과 services 최상단 속성값을 조합하여 자동 생성된다.
version: "3.7"
services:
master01: --> 자동배정되는 컨테이너 이름의 예: current_directory_master01-1
...
master02: --> 자동배정되는 컨테이너 이름의 예: current_directory_master02-1
...
YAML
복사
컨테이너 이름을 직접 지정하려면 다음과 같은 속성을 추가한다.
master01:
container_name: master01
...
master02:
container_name: master02
...
YAML
복사
-it 옵션을 포함하지 않으면 컨테이너 시작과 동시에 종료되는 현상을 볼 수 있다. log도 남지 않고 정상적으로 종료(exited with 0)가 되어버려 이를 잊는다면 원인을 찾기 힘들어진다. docker 컨테이너는 command의 종료(예로, docker run에 사용되는 /bin/bash가 있다.)와 함께 종료된다고 한다.
stdin_open: true
tty: true
YAML
복사
priviledge 옵션은 systemctl, network 등 시스템 내 장치와 주요 자원에 접근하기 위해 추가한다. 기본적으로 컨테이너는 unprivileged 값으로 실행되어 systemctl을 사용할 수 없다.
previleged: true
YAML
복사
hostname은 컨테이너 이름과 동일하게 가져간다.
master01:
hostname: master01
...
master02:
hostname: master02
...
YAML
복사
image는 컨테이너를 실행할 이미지 명을 나타낸다.
image: centos:hadoop
YAML
복사
컨테이너가 실행될 때의 명령어는 command 속성을 통해 적용된다. 여러 방식으로 쓰일 수 있다.
command: bash -c "
source /etc/profile
&&echo "container up to active" 여러개의 명령을 수행할 땐 이 연산자를 사용한다.
"
YAML
복사
컨테이너가 실행되는 순서에 따라 IP주소가 배정되기에, 일일히 각 컨테이너의 IP를 확인하는것 보다 미리 배정해주는 방식을 선택하였다. network를 통해 subnet과 driver를 설정해주고, IP를 할당한다. 이미 사용중인 주소는 할당되지 않으니 유의하여 배정한다.
master01:
networks:
cluster-net:
ipv4_address: 172.16.238.2
master02:
networks:
cluster-net:
ipv4_address: 172.16.238.3
...
networks:
cluster-net:
ipam:
driver: default
config:
- subnet: "172.16.238.0/24"
YAML
복사
etc/hosts를 수정하기 위한 옵션도 존재한다. 자기 자신은 이미 등록 되어있으니 제외하고 등록한다.
master01:
extra_hosts:
- "master02:172.16.238.3"
- "slave01:172.16.238.4"
- "slave02:172.16.238.5"
- "slave03:172.16.238.6"
master02:
extra_hosts:
- "master01:172.16.238.2"
- "slave01:172.16.238.4"
- "slave02:172.16.238.5"
- "slave03:172.16.238.6"
...
YAML
복사
포트 번호를 등록한다.
master01:
ports:
- "9870:9870"
YAML
복사
위의 설정을 조합하여 다음과 같이 docker-compose.yml을 생성하였다.
version: "3.7"
services:
master01:
image: centos:hadoop
privileged: true
container_name: master01
hostname: master01
command: bash -c "
source /etc/profile
"
networks:
cluster-net:
ipv4_address: 172.16.238.2
ports:
- "9870:9870"
extra_hosts:
- "master02:172.16.238.3"
- "slave01:172.16.238.4"
- "slave02:172.16.238.5"
- "slave03:172.16.238.6"
stdin_open: true
tty: true
master02:
image: centos:hadoop
privileged: true
container_name: master02
hostname: master02
command: bash -c "
source /etc/profile
"
networks:
cluster-net:
ipv4_address: 172.16.238.3
extra_hosts:
- "master01:172.16.238.2"
- "slave01:172.16.238.4"
- "slave02:172.16.238.5"
- "slave03:172.16.238.6"
stdin_open: true
tty: true
slave01:
image: centos:hadoop
privileged: true
container_name: slave01
hostname: slave01
command: bash -c "
source /etc/profile
"
networks:
cluster-net:
ipv4_address: 172.16.238.4
extra_hosts:
- "master01:172.16.238.2"
- "master02:172.16.238.3"
- "slave02:172.16.238.5"
- "slave03:172.16.238.6"
stdin_open: true
tty: true
slave02:
image: centos:hadoop
privileged: true
container_name: slave02
hostname: slave02
command: bash -c "
source /etc/profile
"
networks:
cluster-net:
ipv4_address: 172.16.238.5
extra_hosts:
- "master01:172.16.238.2"
- "master02:172.16.238.3"
- "slave01:172.16.238.4"
- "slave03:172.16.238.6"
stdin_open: true
tty: true
slave03:
image: centos:hadoop
privileged: true
container_name: slave03
hostname: slave03
command: bash -c "
source /etc/profile
"
networks:
cluster-net:
ipv4_address: 172.16.238.6
extra_hosts:
- "master01:172.16.238.2"
- "master02:172.16.238.3"
- "slave01:172.16.238.4"
- "slave02:172.16.238.5"
stdin_open: true
tty: true
networks:
cluster-net:
ipam:
driver: default
config:
- subnet: "172.16.238.0/24"
YAML
복사
hdfs-site.xml과 worker 파일은 master node 이미지를 따로 생성하거나 copyFromLocal 등을 이용해 해결해야 될 것 같다.