##### SUMMARY
<!--- Explain the problem briefly below -->

When launching multiple sets of test with docker simultaneously, for example
```
ansible-test units --docker
```
and
```
ansible-test sanity --docker
```
Any launched after the first have started, but before it finished, can't start because `ansible-test` tries to launch a separate container sharing port 3141, which is already in use by the first one.

The second one will try to launch the container twice. The output is like so:

```
Run command: docker run --detach -p 3141:3141 quay.io/ansible/pypi-test-container:1.0.0
ERROR: Command "docker run --detach -p 3141:3141 quay.io/ansible/pypi-test-container:1.0.0" returned exit status 125.
>>> Standard Error
docker: Error response from daemon: driver failed programming external connectivity on endpoint keen_darwin (826d23fac0f9f09ba80290edf61c3c37e7d5268b340b18b679a7f27856aa4ac9): Bind for 0.0.0.0:3141 failed: port is already allocated.
>>> Standard Output
54a46cf4a883d7765ae2a4818923c23201396e56f5d1675880409aaa599b4a76
WARNING: Failed to run docker image "quay.io/ansible/pypi-test-container:1.0.0". Waiting a few seconds before trying again.
Run command: docker run --detach -p 3141:3141 quay.io/ansible/pypi-test-container:1.0.0
ERROR: Command "docker run --detach -p 3141:3141 quay.io/ansible/pypi-test-container:1.0.0" returned exit status 125.
>>> Standard Error
docker: Error response from daemon: driver failed programming external connectivity on endpoint bold_sammet (cd2dd8378432a96a3c918c1200985d58fcb270bf47bf629a5aaefb4f1fad2eec): Bind for 0.0.0.0:3141 failed: port is already allocated.
>>> Standard Output
960d4344e6a73b7c41c28fa8c59432011be9588e716f2816c61c83eb040a2375
WARNING: Failed to run docker image "quay.io/ansible/pypi-test-container:1.0.0". Waiting a few seconds before trying again.
ERROR: Failed to run docker image "quay.io/ansible/pypi-test-container:1.0.0".
```

---

Ideally, if `ansible-test` could somehow detect that such a container is already available, or maybe adapt port numbers dynamically, that'd be great. Unsure if it's possible though.

---
Images if helpful:

![image](https://user-images.githubusercontent.com/1260690/116124379-37690e80-a692-11eb-908f-a60d79355329.png)

![image](https://user-images.githubusercontent.com/1260690/116124389-3cc65900-a692-11eb-803c-38b7102fda33.png)

![image](https://user-images.githubusercontent.com/1260690/116124399-40f27680-a692-11eb-8d00-3b2530cbc1a9.png)

---

cc @mattclay 

##### ISSUE TYPE
- Bug Report

##### COMPONENT NAME
<!--- Write the short name of the module, plugin, task or feature below, use your best guess if unsure -->
ansible-test

##### ANSIBLE VERSION
<!--- Paste verbatim output from "ansible --version" between quotes -->
(using `hacking/env-setup`)
```paste below
ansible [core 2.12.0.dev0]  (devel 68bdfd0052) last updated 2021/04/26 12:05:24 (GMT -400)
  config file = None
  configured module search path = [u'/home/briantist/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /home/briantist/code/ansible/ansible.core/lib/ansible
  ansible collection location = /home/briantist/.ansible/collections:/usr/share/ansible/collections
  executable location = /home/briantist/code/ansible/ansible.core/bin/ansible
  python version = 2.7.17 (default, Jul 20 2020, 15:37:01) [GCC 7.5.0]
  jinja version = 2.11.2
  libyaml = False
```

##### CONFIGURATION
<!--- Paste verbatim output from "ansible-config dump --only-changed" between quotes -->

##### OS / ENVIRONMENT
<!--- Provide all relevant information below, e.g. target OS versions, network device firmware, etc. -->


##### STEPS TO REPRODUCE
<!--- Describe exactly how to reproduce the problem, using a minimal test-case -->

<!--- Paste example playbooks or commands between quotes below -->
```yaml

```

<!--- HINT: You can paste gist.github.com links for larger files -->

##### EXPECTED RESULTS
<!--- Describe what you expected to happen when running the steps above -->


##### ACTUAL RESULTS
<!--- Describe what actually happened. If possible run with extra verbosity (-vvvv) -->

<!--- Paste verbatim command output between quotes -->
```paste below

```





with tempdir() as local_temp_path:
                playbook_vars = {'remote_temp_path': remote_temp_path, 'local_temp_path': local_temp_path}
                run_playbook(args, inventory_path, 'windows_coverage_teardown.yml', playbook_vars)
                for filename in os.listdir(local_temp_path):
                    with open_zipfile(os.path.join(local_temp_path, filename)) as coverage_zip:
                        coverage_zip.extractall(ResultType.COVERAGE.path)
        if args.remote_terminate == 'always' or (args.remote_terminate == 'success' and success):
            for instance in instances:
                instance.result.stop()
def windows_init(args, internal_targets):  
    """
    :type args: WindowsIntegrationConfig
    :type internal_targets: tuple[IntegrationTarget]
    """
    
    SshKey(args)
    if not args.windows:
        return
    if args.metadata.instance_config is not None:
        return
    instances = []  
    for version in args.windows:
        instance = WrappedThread(functools.partial(windows_start, args, version))
        instance.daemon = True
        instance.start()
        instances.append(instance)
    while any(instance.is_alive() for instance in instances):
        time.sleep(1)
    args.metadata.instance_config = [instance.wait_for_result() for instance in instances]
def windows_start(args, version):