What happens when you run a container?

Either by using the docker binary or via the API, the Docker client tells the Docker daemon to run a container.

$ docker run -i -t ubuntu /bin/bash

Let’s break down this command. The Docker client is launched using the docker binary with the run option telling it to launch a new container. The bare minimum the Docker client needs to tell the Docker daemon to run the container is:

  • What Docker image to build the container from, hereubuntu, a base Ubuntu image;
  • The command you want to run inside the container when it is launched, here /bin/bash, to start the Bash shell inside the new container.

So what happens under the hood when we run this command?

In order, Docker does the following:

  • Pulls the ubuntu image: Docker checks for the presence of the ubuntu image and, if it doesn’t exist locally on the host, then Docker downloads it from Docker Hub. If the image already exists, then Docker uses it for the new container.
  • Creates a new container: Once Docker has the image, it uses it to create a container.
  • Allocates a filesystem and mounts a read-write layer:The container is created in the file system and a read-write layer is added to the image.
  • Allocates a network / bridge interface: Creates a network interface that allows the Docker container to talk to the local host.
  • Sets up an IP address: Finds and attaches an available IP address from a pool.
  • Executes a process that you specify: Runs your application, and;
  • Captures and provides application output: Connects and logs standard input, outputs and errors for you to see how your application is running.
Here is the function template for isEqualTo: ``` template<typename T> bool isEqualTo(const T& a, const T& b) { return a == b; } ``` Here is an example program that uses isEqualTo with built-in types: ``` #include <iostream> int main() { std::cout << std::boolalpha; std::cout << isEqualTo(5, 5) << std::endl; std::cout << isEqualTo(5, 7) << std::endl; std::cout << isEqualTo('a', 'a') << std::endl; std::cout << isEqualTo('a', 'b') << std::endl; std::cout << isEqualTo(true, true) << std::endl; std::cout << isEqualTo(true, false) << std::endl; std::cout << isEqualTo(3.14, 3.14) << std::endl; std::cout << isEqualTo(3.14, 2.71) << std::endl; return 0; } ``` When we attempt to run this program with the user-defined class type Complex, we get a compilation error because the compiler doesn't know how to compare two Complex objects. To fix this, we can overload the equality operator in the Complex class: ``` class Complex { public: Complex(double real, double imag) : m_real(real), m_imag(imag) {} double real() const { return m_real; } double imag() const { return m_imag; } private: double m_real; double m_imag; }; bool operator==(const Complex& lhs, const Complex& rhs) { return lhs.real() == rhs.real() && lhs.imag() == rhs.imag(); } ``` Now when we attempt to run the program with Complex objects, it works as expected: ``` #include <iostream> class Complex { public: Complex(double real, double imag) : m_real(real), m_imag(imag) {} double real() const { return m_real; } double imag() const { return m_imag; } private: double m_real; double m_imag; }; bool operator==(const Complex& lhs, const Complex& rhs) { return lhs.real() == rhs.real() && lhs.imag() == rhs.imag(); } template<typename T> bool isEqualTo(const T& a, const T& b) { return a == b; } int main() { std::cout << std::boolalpha; std::cout << isEqualTo(Complex(1.0, 2.0), Complex(1.0, 2.0)) << std::endl; std::cout << isEqualTo(Complex(1.0, 2.0), Complex(3.0, 4.0)) << std::endl; return 0; } ``` Output: ``` true false ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值