기본적으로 Container-Optimized OS 호스트 방화벽은 나가는 연결을 허용하고 SSH 서비스를 통해서 새로 추가되는 연결만 수락합니다. Container-Optimized OS를 실행하는 VM 인스턴스에서 sudo iptables -L
을 실행하여 정확한 호스트 방화벽 구성을 볼 수 있습니다.
호스트 방화벽은 올바른 애플리케이션 작동을 위해 구성되어야 하는 Virtual Private Cloud 방화벽 규칙과 다르다는 것에 유의하세요. Virtual Private Cloud 방화벽 규칙에 대한 자세한 내용은 방화벽 규칙 개요를 참조하세요.
Docker 기본 네트워크 네임스페이스에서 컨테이너 실행
네트워크에서 액세스할 수 있어야 하는 컨테이너를 Container-Optimized OS에 배포하지만 Docker --net=host
옵션을 사용하지 않을 때는 Docker -p
옵션으로 컨테이너를 실행합니다. 이 옵션을 사용하면 네트워크에서 애플리케이션을 노출하도록 Docker가 호스트 방화벽을 자동으로 구성합니다. Docker 실행 옵션에 대한 자세한 내용은 Docker 실행 참조를 확인하세요.
다음 예시에서 nginx
컨테이너는 네트워크 포트 80에서 액세스할 수 있습니다.
docker run --rm -d -p 80:80 --name=nginx nginx
호스트 네트워크 네임스페이스에서 컨테이너 실행
네트워크에서 액세스할 수 있어야 하는 컨테이너를 Container-Optimized OS에 배포하지만 Docker --net=host
옵션을 사용하지 않을 때는 호스트 방화벽을 직접 명시적으로 구성해야 합니다.
표준 iptables
명령어로 호스트 방화벽을 구성할 수 있습니다. 대부분의 GNU/Linux 배포판에서와 같이 iptables
명령어로 구성된 방화벽 규칙은 재부팅 시에 유지되지 않습니다. 부팅할 때마다 호스트 방화벽이 올바르게 구성되도록 하려면 cloud-init
구성에서 호스트 방화벽을 구성합니다. 다음 cloud-init
예시를 참조하세요.
#cloud-config
write_files:
- path: /etc/systemd/system/config-firewall.service
permissions: 0644
owner: root
content: |
[Unit]
Description=Configures the host firewall
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT
- path: /etc/systemd/system/myhttp.service
permissions: 0644
owner: root
content: |
[Unit]
Description=My HTTP service
After=docker.service config-firewall.service
Wants=docker.service config-firewall.service
[Service]
Restart=always
ExecStart=/usr/bin/docker run --rm --name=%n --net=host nginx
ExecStop=-/usr/bin/docker exec %n -s quit
runcmd:
- systemctl daemon-reload
- systemctl start myhttp.service
Container-Optimized OS를 실행하는 VM에 이 cloud-init
구성을 사용하면 부팅할 때마다 다음 동작이 수행됩니다.
- 포트 80에서 새로 추가되는 TCP 연결을 허용하도록 호스트 방화벽이 구성됩니다.
nginx
컨테이너가 포트 80으로 리슨하고 새로 추가되는 HTTP 요청에 응답합니다.
Container-Optimized OS에서 cloud-init
사용에 대한 자세한 내용은 인스턴스 만들기 및 구성을 참조하세요.