summaryrefslogtreecommitdiffstats
path: root/examples/docker/utils.sh
blob: 7b46747529a7520eb6fe44dd965adb86f40bc721 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#!/bin/bash

# Creates named container from given image.
#
# $1 - container name
# $2 - image name
#
function create_container {
  container_name=$1
  image_name=$2
  echo "Creating $container_name from $image_name"
  docker run -dt --privileged --name=$container_name $image_name
}

# Starts container
# and adds container's network namespace
# to the linux runtime data (/var/run).
#
# $1 - container name
#
# See:
# https://platform9.com/blog/container-namespaces-deep-dive-container-networking/
#
function start_container {
  container_name=$1
  echo "Starting container $container_name"

  # Remove namespace if it was present
  ip netns del $container_name

  # Start container
  docker start $container_name

  # Make container's network namespaces accessible using ip netns
  pid=$(docker inspect -f '{{.State.Pid}}' $container_name)
  ln -s /proc/$pid/ns/net /var/run/netns/$container_name
  echo "Container $container_name started sucessfully (pid=$pid)"
}

# Links two containers using a veth pair.
#
# $1 - name of the container A
# $2 - name of the veth endpoint that belongs to A
# $3 - name of the veth endpoint that belongs to B
# $4 - name of the container B
#
function create_link {
  container1=$1
  if1=$2
  if2=$3
  container2=$4
  echo "Creating link from $container1($if1) to $container2($if2)"
  ip link add $if1 type veth peer name $if2

  # Move veth endpoints to corresponding namespaces
  ip link set $if1 netns $container1
  ip link set $if2 netns $container2

  # Bring interfaces up
  ip netns exec $container1 ip link set $if1 up
  ip netns exec $container2 ip link set $if2 up
  echo "Link created successfully"
}