가상서버에서 Docker를 정상적으로 사용하기 위해서는 다음과 같은 설정이 필요합니다.
목차
A. Docker?
B. Docker 설치 방법
C. Docker MTU 문제 해결 방법
C-1. HOST Network 사용 설정
C-2. Docker MTU 설정 변경
A. Docker?
Docker는 가상화된 공간에서 애플리케이션을 개발, 제공, 실행할 수 있는 플랫폼입니다.
Docker Container를 사용하여 하나의 VM(host machine)위의 격리된 환경에서 애플리케이션을 관리할 수 있습니다.
Docker를 사용하면 경량화된 이미지로 컨테이너를 빠르게 배포할 수 있으며, 가상화된 공간을 사용할 때의 성능 또한 손실이 거의 없습니다.
Docker의 장점 및 특징은 다음과 같습니다.
(1) 애플리케이션의 개발과 배포가 편해집니다.
(2) 애플리케이션의 독립성과 확장성이 높아집니다.
B. Docker 설치 방법
운영체제에 따른 Docker Engine 설치 방법은 다음과 같습니다.
(1) CentOS : Install Docker Engine on CentOS
(2) Ubuntu : Install Docker Engine on Ubuntu
C. Docker MTU 문제 해결 방법
가상서버에 Docker를 설치하면 가상서버와 Docker의 MTU 수치가 달라 통신이 불가능합니다.
가상서버에서 MTU 설정 정보는 다음과 같이 확인할 수 있습니다.
가상서버에 설정된 MTU는 1450(eth0)이고, Docker 서비스가 사용하는 MTU는 1500(docker0)입니다.
[centos@cafe24 ~]$ ip a | grep 'eth0|docker0'
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.1.42/24 brd 192.168.1.255 scope global dynamic eth0
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
inet 172.17.0.1/16 scope global docker0
따라서 Docker에서 가상서버로 넘어오는 Packet에 Packet loss가 발생하면 통신 오류가 생기게 됩니다.
다음 중 원하는 방법으로 해당 문제를 해결 할 수 있습니다.
하지만 리눅스 사용이 익숙하지 않은 사용자의 경우 좀 더 간단하게 해결할 수 있는 C-1 방법을 권장합니다.
C-1. HOST Network 사용 설정
C-2. Docker MTU 설정 변경
C-1. HOST Network 사용 설정
(1) Docker run 할 때 해당 컨테이너가 Host network를 사용하도록 변경
컨테이너가 Host network를 사용하면 별도의 network interface가 생성되지 않아 MTU 변경 없이 사용 가능합니다.
"--network" 옵션을 사용하여 host network를 사용하도록 설정합니다.
# sudo docker run --rm -d --network host --name my_nginx nginx
C-2. Docker MTU 설정 변경
(1) Docker의 MTU를 1450으로 변경
$ cat << EOF | sudo tee /etc/docker/daemon.json
{
"mtu": 1450
}
EOF
(2) Docker 데몬 재시작
# sudo systemctl restart docker
(3) 가상서버(Host)에서 network 정보 확인
docker0 인터페이스의 MTU가 eth0의 MTU와 동일하게 1450으로 변경된 것을 확인합니다.
$ sudo docker network inspect bridge | grep mtu
"com.docker.network.driver.mtu": "1450"
(4) Docker container의 정상 동작 확인
테스트 용으로 nginx 컨테이너 하나를 생성합니다.
$ sudo docker run --rm -d --name my_nginx nginx
생성한 my_nginx 컨테이너의 shell에 접속하고, curl로 외부 web의 정보를 정상적으로 가져오는지 확인합니다.
$ sudo docker exec -it my_nginx bash
root@2a17da973db2:/# curl --head https://hosting.cafe24.com/
HTTP/2 200
server: NWS
content-type: text/html; charset=UTF-8
cache-control: no-cache, no-store, must-revalidate
pragma: no-cache
p3p: CP="CAO DSP CURa ADMa TAIa PSAa OUR LAW STP PHY ONL UNI PUR FIN COM NAV INT DEM STA PRE"
x-frame-options: DENY
x-xss-protection: 1; mode=block
strict-transport-security: max-age=63072000; includeSubdomains
referrer-policy: unsafe-url
date: Mon, 15 Mar 2021 04:27:13 GMT
content-length: 0