Previous: A Database Container, Up: Guix System Containers [Contents][Index]
What good is a Guix System running a PostgreSQL database service as a container when we can only talk to it with processes originating in the container? It would be much better if we could talk to the database over the network.
The easiest way to do this is to create a pair of connected virtual
Ethernet devices (known as veth
). We move one of the devices
(ceth-test
) into the net
namespace of the container and
leave the other end (veth-test
) of the connection on the host
system.
pid=5983 ns="guix-test" host="veth-test" client="ceth-test" # Attach the new net namespace "guix-test" to the container PID. sudo ip netns attach $ns $pid # Create the pair of devices sudo ip link add $host type veth peer name $client # Move the client device into the container's net namespace sudo ip link set $client netns $ns
Then we configure the host side:
sudo ip link set $host up sudo ip addr add 10.0.0.1/24 dev $host
…and then we configure the client side:
sudo ip netns exec $ns ip link set lo up sudo ip netns exec $ns ip link set $client up sudo ip netns exec $ns ip addr add 10.0.0.2/24 dev $client
At this point the host can reach the container at IP address 10.0.0.2, and the container can reach the host at IP 10.0.0.1. This is all we need to talk to the database server inside the container from the host system on the outside.
$ psql -h 10.0.0.2 -U test psql (14.4) Type "help" for help. test=> CREATE TABLE hello (who TEXT NOT NULL); CREATE TABLE test=> INSERT INTO hello (who) VALUES ('world'); INSERT 0 1 test=> SELECT * FROM hello; who ------- world (1 row)
Now that we’re done with this little demonstration let’s clean up:
sudo kill $pid sudo ip netns del $ns sudo ip link del $host
Previous: A Database Container, Up: Guix System Containers [Contents][Index]