Lets recap where we are so far. We've gone over some of the basics of a Dockerfile. Talked a bit about some basic commands that will come in handy as we continue. Wrote a Dockerfile to build our little Golang API. Finally we have built an image and discussed tags.
Docker Run
So lets deploy this image and play with it a little bit. Open up a terminal and type this command.
$ docker run --publish 127.0.0.1:8080:10000/tcp helloFromIntegratnIO
Lets step through this command 1 piece at a time.
docker run
: Here we are telling the Docker cli that we want to run an image as a container.
-publish
: Publish will bind a local port to a port in the container.
127.0.0.1
: Keeps us only exposing localhost, so our container won't be available outside of our machine.
:8080
: is the local port on our host machine that we are binding to
:10000
: is the port inside the container that we want 8080
to impersonate.
/tcp
: is the protocol we want to use. You could also use udp
or sctp
if needed. You can learn more about that in the User Guide
If you haven't hit enter yet. Go ahead and hit it now and kick off that Docker run command.
You should see the following output.
$ docker run -p 127.0.0.1:8080:10000/tcp helloFromIntegratnIO
Starting Web Server
Preparing to handle requests
Ready for requests
Lets see if it works.
Open up a second terminal and enter:
$ curl localhost:8080
Output:
$ curl localhost:8080
Hello from Integratn.IO!!!
Now we are cooking. But what else can we do with this little container.
Lets change the response from the curl request. We can do this by passing an environment variable into the container. We can do this one of two ways. We can edit the docker file. Add the ENV instruction. Tell it it we want MESSAGE
to equal something else. Rebuild our image. Then finally run it again. This is a great method for establishing default values for environment variables. Or we can add the parameter --env with a value to our docker run
command and change it on the fly. Environment Variables passed during a docker run
command will always trump what is in your Dockerfile. If you haven't exited the container already hit ctrl +c
to exit the container from the terminal.
Lets run the following command:
docker run --env MESSAGE="Hello from outerspace" -p 127.0.0.1:8080:10000/tcp helloFromIntegratnIO
Now in another terminal lets use that curl statement again.
$ curl localhost:8080
Hello from outerspace
Look at that. We changed the response with the environment variable.
Docker exec
Lets look at the docker exec command while our container is running. Docker exec allows us to run commands inside our container while its already running. This can be very handy for debugging a container. But first we have to figure out what our container is named.
Lets look at our running container with a command we covered in lesson 1:
$ docker ps
You will get an output similar to this but your NAMES
field will not be the same.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
56290825f889 helloFromIntegratnIO "/go/bin/hello" 2 minutes ago Up 2 minutes 127.0.0.1:8080->10000/tcp hungry_bohr
Now that we have found our running container. Lets use the container name and execute a shell to get into our container.
docker exec --interactive --tty hungry_bohr /bin/sh
Output:
$ docker exec --interactive --tty hungry_bohr /bin/sh
/go/src/integratnio/go-rest-api #
Does that path look familiar? Its the same path we set for WORKDIR
in the Dockerfile. We are in the shell of the container. Type exit
and hit enter
to leave the container.
Lets look at the command real quick.
docker exec
is the base command. This is declaring that we want to execute something against a running container.
--interactive
will keep STDIN open even if we aren't attached.
--tty
gives us a pseudo tty.
hungry_bohr
is the name of my running container. Yours will be different.
/bin/sh
This is the command we want to run in the container. One caveat to this. Whatever you run against the container has to actually be part of the container. In an effort to trim containers down a lot of container images don't have a shell command available.
So now, we've ran our container. We've exec'd into our container so that we can explore it. Thats it for this time. Get ready for next time when we have a brief exploration into the build context.
Top comments (1)
It sounds great that you got good training and sharing it with us. In this regard, Udemy is also offering one of the best courses in reasonable prices for busy DevOps teams. I found its courses Docker for Java Developers and Docker Crash Course very impressive hereof.
On the other hand, Reddit communities and GitHub are also great platforms to understand Docker and its deployments. It is seamless to deploy Docker apps with cloud computing PaaS and IaaS platforms. You can use Azure, AWS, Back4App and GCP to smoothly deploy your Docker applications with zero downtime.