Another option, if you need to expose ports on a container without internet access, but want to let it talk to other containers would be to provide a bogus DNS configuration. This isn't a perfect solution though, since it doesn't prevent direct IP access to the outside world. docker-compose.yaml version: '3' services: service1: image: alpine command: sh -c 'ping service2 -c 1; ping google.com -c 1' dns: 0.0.0.0 service2: image: alpine command: sh -c 'ping service1 -c 1; ping google.com -c 1' dns: 0.0.0.0 isolated> docker-compose up Recreating isolated_service1_1 ... done Recreating isolated_service2_1 ... done Attaching to isolated_service2_1, isolated_service1_1 service1_1 | PING service2 (172.18.0.2) 56(84) bytes of data. service1_1 | 64 bytes from isolated_service2_1.isolated_default (172.18.0.2): icmp_seq=1 ttl=64 time=0.038 ms service1_1 | service1_1 | --- service2 ping statistics --- service1_1 | 1 packets transmitted, 1 received, 0% packet loss, time 0ms service1_1 | rtt min/avg/max/mdev = 0.038/0.038/0.038/0.000 ms service2_1 | PING service1 (172.18.0.3) 56(84) bytes of data. service2_1 | 64 bytes from isolated_service1_1.isolated_default (172.18.0.3): icmp_seq=1 ttl=64 time=0.093 ms service2_1 | service2_1 | --- service1 ping statistics --- service2_1 | 1 packets transmitted, 1 received, 0% packet loss, time 0ms service2_1 | rtt min/avg/max/mdev = 0.093/0.093/0.093/0.000 ms service1_1 | ping: google.com: Temporary failure in name resolution service2_1 | ping: google.com: Temporary failure in name resolution isolated_service1_1 exited with code 2 isolated_service2_1 exited with code 2