728x90
반응형
1. Docker Hub에서 이미지 다운로드

# docker pull centos:latest


2. Docker Macvlan 설정

# docker network create -d macvlan --subnet=192.168.0.0/24 --gateway=192.168.0.1 -o parent=enp3s0 macvlan


3. Docker 실행 (기본)

# docker run --privileged=true -d --ip 192.168.0.150 --net macvlan --name centos7.5_v1 docker.io/centos init  -> macvlan을 통한 ip할당만 설정

# docker run --privileged=true -d --ip 192.168.0.150 --net macvlan --name centos7.5_v1 -p 80:80 --hostname "test" centos7.5 init -> ip할당 및 포트맵핑, 호스트네임 설정

# docker run --privileged=true -d --ip 192.168.0.150 --net macvlan --name centos7.5_1 --hostname "doc_dev" -v /data:/data centos7.5_v1 init -> -v 옵션을 통해 도커 엔진의 /data 디렉터리를 docker안의 /data 디렉터리와 볼륨 맵핑


3-1) Docker 실행 (자원 제한 설정)

# docker run --privileged=true -d --ip 192.168.0.150 --net macvlan --name centos7.5_1 --hostname "doc_dev" --cpus="4" --memory=4g centos7.5_v1 init
-> 8코어 cpu에서 --cpus="4" 의 의미는 4개의 cpu만 할당한다는 의미, 12코어일 경우 1/3만 사용
-> 8코어 cpu에서 --cpus="4"로 지정할 경우 top 명령 실행시 8코어를 모두 사용하나 전체 사용률이 50%로 제한된다. 모든 코어를 사용하지만 50%씩만 쓴다는 의미
-> memory는 4GB로 제한, swap 영역의 제한을 안걸어둔 상태로 테스트시 4GB를 모두사용하면 swap영역을 계속 사용

# docker run --privileged=true -d --ip 192.168.0.150 --net macvlan --name centos7.5_2 --hostname "doc_dev" --cpuset-cpus="0-2" --memory=4g centos7.5_v1 init
-> 8코어 cpu에서 --cpuset-cpus="0-2"는 0번부터 2번까지의 cpu만 사용하겠다는 의미
-> top 확인시 0-2번 코어는 모두 사용중이지만 다른 코어는 id가 100%인 상태

# docker run --privileged=true -d --ip 192.168.0.150 --net macvlan --name centos7.5_1 --hostname "doc_dev" --cpus="4" --memory=4g --memory-swap=8g centos7.5_v1 init
-> Memory 4GB와 Swap 8GB를 주었을때 Memory 4GB+ Swap 8GB하여 12GB가 아니다.
-> Memory가 4GB이고 Swap을 8GB로 주었을때 Swap 8GB에서 Memory로 할당된 4GB를 제외한 남은 4GB영역이 Swap 영역으로 사용된다. 
-> Swap으로 할당된 영역에서 Memory 영역을 뺀 영역이 진짜 Swap 영역으로 사용


4. Docker 구성정보 이미지화

# docker commit centos7.5_v1 centos7.5_image


5. Docker 접속

# docker exec -it centos7.5_1 /bin/bash


6. Docker 볼륨 Mount

# docker exec --privileged=true doc_test-3 mount -t nfs -o nolock 10.0.0.254:/data1 /data1-> nfs 파일 시스템 마운트 설정



반응형

'Docker' 카테고리의 다른 글

Docker 사용중인 OS를 docker image로 만들기  (0) 2018.08.24
Docker Network - Bridge  (0) 2018.08.24
Docker Network - Macvlan  (0) 2018.08.24
Docker Nvidia Docker 구성 (Centos 7)  (2) 2018.08.24
728x90
반응형
1. 현재 OS를 tar 파일로 묶음
# tar --numeric-owner --exclude=/proc --exclude=/sys -cvf centos6-base.tar(이름 지정) / 

2. docker 서버로 tar 파일을 복사 후 docker에 import 
# cat centos6-base.tar | docker import - centos6-base(원하는 이미지 이름)

3. import 정상 확인
# docker run -i -t centos6-base cat /etc/redhat-release 




반응형

'Docker' 카테고리의 다른 글

Docker 기본 구성  (2) 2018.11.14
Docker Network - Bridge  (0) 2018.08.24
Docker Network - Macvlan  (0) 2018.08.24
Docker Nvidia Docker 구성 (Centos 7)  (2) 2018.08.24
728x90
반응형
가상 bridge 및 가상 NIC


* Docker 컨테이너는 서버의 물리 NIC와 별도로 각 컨테이너마다 가상 NIC가 할당

* 가상 NIC는 docker0 이라는 가상 bridge에 접속하여 컨테이너끼리 통신

* 컨테이너 구동시 172.17.0.0/16 서브넷 마스크를 가진 private IP가 eth0에 자동으로 할당

* eth0 (컨테이너 이더넷)에는 호스트 OS에 생성된 가상 NIC (vethxxx)가 페어로 할당
eth0 (물리 NIC) -> docker0 (가상 bridge) -> vethxxx (가상 NIC) -> eth0 (컨테이너 이더넷)

* veth는 OSI Layer 2의 가상 네트워크 인터페이스로서 페어된 NIC끼리 터널링 통신을 수행






Docker 컨테이너 간의 통신


* 동일한 호스트상의 docker 컨테이너 구동시 private Address가 자동으로 할당되므로 컨테이너끼리 통신을 위하여 링크 기능을 사용
(링크 기능을 사용하면 한 호스트상에 여러 컨테이너끼리 통신 가능 - /etc/hosts에 등록하여 호스트 네임으로도 컨테이너 접속 가능)

* 링크 기능을 사용한 통신은 동일 호스트내에 있어야함, 즉 가상 bridge docker0에 접속한 컨테이너끼리만 가능하다는 것
(멀티 호스트 환경에서는 통신 불가능)



Docker 컨테이너와 외부 네트워크 통신


* 컨테이너가 외부와 통신하려면 bridge docker0과 호스트 OS의 물리 NIC를 통해 패킷을 전송해야하기에 docker에서는 NAPT 기능을 사용



NAPT란?


* private IP 주소와 포트번호까지 변환하는 기술을 의미



& NAT와 NAPT 차이 &


* NAT의 경우 global IP와 private IP를 1:!로 변환하기에 여러 클라이언트가 액세스할 수 없지만 NAPT의 경우 private IP와 포트 번호까지 변환하기 때문에 여러 클라이언트가 액세스할 수 있다. 예를 들어 10.0.0.22 IP를 가진 클라이언트가 라우터의 NAT로 접근할 때 다른 클리이언트는 접근이 안되지만 NAPT의 경우 뒤에 오는 포트 또한 변환하기에 10.0.0.22:5901, 10.0.0.23:5902 형식으로 여러 클라이언트가 접근 가능하다.


반응형

'Docker' 카테고리의 다른 글

Docker 기본 구성  (2) 2018.11.14
Docker 사용중인 OS를 docker image로 만들기  (0) 2018.08.24
Docker Network - Macvlan  (0) 2018.08.24
Docker Nvidia Docker 구성 (Centos 7)  (2) 2018.08.24
728x90
반응형
MacVLan 개념


  • MacVLan은 브릿지가 없다. 대신 서브 인터페이스라는 개념이 등장하여 사용
  • 호스트 머신에 물리적인 NIC인 eth0은 당연히 존재하며 eth0에서 여러 개의 하위 인터페이스를 만듬으로써 동시에 여러개의 mac 주소를 가질 수 있도록 구축한다. 그렇게 되면 생성된 하위 인터페이스들에 여러개의 컨테이너들이 연결되면서 VLAN을 구성할 수 있다.
  • 하나의 네트워크 인터페이스 카드를 가상화함으로써 여러 개의 MAC주소를 생성하는 것




MacVLan 구조


  • macvlan은 부모 인터페이스(parent)와 서브 인터페이스(slave)로 나눈다. 
  • 부모 인터페이스는 가상화될 주체, 즉 실제 물리적인 NIC인 eth0이 되고 거기서 생성된 서브 인터페이스들은 mac0, mac1, mac2가 된다.
  • macvlan으로 생성된 인터페이스를 지칭할 때는 mac0@eth0과 같이 표현 (mac0은 서브 인터페이스, eth0이 부모 인터페이스)



MacVLan 구동 방식


  • 호스트(eth0)와는 통신이 안되지만 다른 서브 인터페이스간 통신은 되는 방식
  • 호스트와 통신이 안되는 것은 원래 macvlan에서 안되는 것이고 다른 서브 인터페이스간의 통신이 되는 것은 다른 방식(bridge 등)들과 차이를 가진다
  • macvlan 방식은 부모 인터페이스에 간단한 브릿지를 둬서 다른 서브 인터페이스로 향하는 트래픽을 밖으로 내보내지 않고 바로 전달하는 방식 (내부 컨테이너끼리 통신을 하는 경우)
  • 모든 서브 인터페이스의 맥 주소를 알고 있는 상태이므로 브릿지에서 Mac Learning(맥 추가) 작업도 필요없고 루핑을 방지하기 위한 STP알고리즘도 필요 없다고 함




MacVLan 생성


- 사용법

# docker network create -d macvlan --subnet=서브넷 --gateway=게이트웨이 -o parent=부모 인터페이스 macvlan 별칭


- 사용예제

# docker network create -d macvlan --subnet=10.0.10.0/24 or 255.255.248.0 --gateway=10.0.10.1 -o parent=eth0 my_macvlan



MacVLan을 컨테이너에서 사용할 경우


  • docker0 브릿지는 존재하지만 사용되지 않는다.
  • 각 컨테이너들의 네트워크 인터페이스는 서브 인터페이스가 되고 호스트의 인터페이스가 부모 인터페이스가 된다.
  • 아래의 그림은 위쪽의 설명한 그림과 조금 다른데 이런 경우는 호스트 인터페이스를 직접 부모 인터페이스로 삼은 경우




MacVLan의 장단점


- 장점

  1. 높은 대역폭
  2. 낮은 CPU 점유율


- 단점

  1. 부모 인터페이스가 죽으면 서브 인터페이스도 모두 죽음
  2. 호스트와 통신 불가능
  3. 복잡한 네트워크 구성 불가능


  • 번외로 기본 도커 브릿지인 docker0과 macvlan의 속도 테스트 결과 docker0은 초당 22GB, macvlan은 초당 27GB가 나왔다고는 한다. 각 테스트 환경마다 다르니 참고


반응형

'Docker' 카테고리의 다른 글

Docker 기본 구성  (2) 2018.11.14
Docker 사용중인 OS를 docker image로 만들기  (0) 2018.08.24
Docker Network - Bridge  (0) 2018.08.24
Docker Nvidia Docker 구성 (Centos 7)  (2) 2018.08.24
728x90
반응형
1. cuda driver install

# cuda_10.0.130_410.48_linux.run

  • 최신 nvidia-docker의 경우 cuda driver 10부터 사용가능



2. nvidia driver install

# NVIDIA-Linux-x86_64-410.73.run



3. nvidia-docker install 

# yum install nvidia-docker2



4. test

# docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi


=================================================================================

위의 방법이 안될시 아래 방법 진행 (cuda 8버전 사용한 예제)

1.cuda driver 설치 및 환경변수

# ./cuda_8.0.27_linux.run 

# vim ~/.bashrc
export PATH="/usr/local/cuda-8.0/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda-8.0/lib64:$LD_LIBRARY_PATH"

# source ~/.bashrc


2.nvidia driver 설치

# ./NVIDIA-Linux-x86_64-390.77.run


3. nvidia repo 설정

# vim nvidia-repo.sh
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.repo | \
sudo tee /etc/yum.repos.d/nvidia-docker.repo

# chmod 777 nvidia-repo.sh

# ./nvidia-repo.sh


4. docker-ce repo 설정

# yum install -y yum-utils device-mapper-persistent-data lvm2
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# yum-config-manager --enable docker-ce-edge
# yum-config-manager --enable docker-ce-test


5. nvidia docker 설치

# yum install nvidia-docker2
-> nvidia docker 설치시 의존성 패키지로 docker-ce도 함께 설치

* 기존에 docker가 설치되어 있다면 docker-ce가 설치되지 않는다. 그러므로 docker를 모두 삭제후 설치해야함

* docker-ce는 별도로 설치할 필요가 없이 nvidia-docker2 설치에 함께 설치하면 된다

* docker-ce를 설치하는 경우 기본 docker는 설치하면 안된다.
(nvidia docker의 경우 docker-ce를 사용하는데 기본 docker 패키지 설치시 docker-ce가 설치되지 않기 때문)


6. nvidia daemon 생성

# vim /usr/lib/systemd/system/nvidia-persistenced.service

[Unit]
Description=NVIDIA Persistence Daemon
Wants=syslog.target

[Service]
Type=forking
PIDFile=/var/run/nvidia-persistenced/nvidia-persistenced.pid
Restart=always
ExecStart=/usr/bin/nvidia-persistenced --verbose
ExecStopPost=/bin/rm -rf /var/run/nvidia-persistenced

[Install]
WantedBy=multi-user.target


7. nvidia 및 docker 데몬 실행

# systemctl enable nvidia-persistenced.service

# systemctl start nvidia-persistenced.service

# systemctl enable docker.service

# systemctl start docker.service


8. 테스트

# docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi


Tip

* /etc/docker/daemon.json을 수정하는 경우 모든 설정이 마무리 된후 설정해야한다. 우선적으로 해당 파일을 수정하는 경우 runtime 오류가 발생하여 docker 데몬이 올라오지 않는데 docker데몬이 올라오면 daemon.json 파일이 자동으로 갱신되니 갱신 후에 수정하는 것이 좋다.


반응형

'Docker' 카테고리의 다른 글

Docker 기본 구성  (2) 2018.11.14
Docker 사용중인 OS를 docker image로 만들기  (0) 2018.08.24
Docker Network - Bridge  (0) 2018.08.24
Docker Network - Macvlan  (0) 2018.08.24

+ Recent posts