Project Docker Deployment
The project in this course may be deployed on Docker containers managed by Docker Compose.
Getting Set Up: your computer
You should be able to use any OS on your computer to set up the Docker and Docker Compose.
- Install Docker. You can do this in Windows, OSX, or Linux.
- Install Docker Compose. You can also do this in Windows, OSX, or Linux.
- Get the template code for the project from the project template repository.
Working with Containers
docker-compose command will do most of the management of Docker containers we use.
docker-compose build: Build any images from Dockerfiles referenced in your
docker-compose up: Start all of the containers described in your
docker-compose.yml. Press control-C to stop them.
docker-compose stop: Stop any containers described in your
docker-compose rm: Destroy any containers described in your
docker system prune: Remove any unused containers and images.
docker-compose run app bash: Run a command (
bash) in a new instance of the container (
Building Container Images
Docker Compose is a tool for managing Docker container images. As an example, in this fragment of a
ruby: build: context: . dockerfile: ruby.Dockerfile
This creates a container with hostname
ruby (the first line) that is built from the Dockerfile
ruby.Dockerfile in the same directory (last lines).
Dockerfiles let you describe container images that contain whatever software you need to get things done. As a brief example to see what happens:
FROM ruby:2.7 WORKDIR /app COPY . . RUN gem install bunny CMD ruby rpc_server.rb
This Dockerfile describes a container image that starts with the Ruby container from Docker Hub (
FROM); changes to the
/app directory (
WORKDIR, similar to the Unix command
cd); copies the current directory (everything in the directory containing the Dockerfile) to
/app in the container image (
COPY); runs a
gem command as part of building the image (
RUN). Finally, it sets the command that will run when the container starts (
The template code provides a simple Dockerfile for many programming languages that are at least capable of running the "hello world" program that's also in the repo.
If you need extra Debian/Ubuntu packages installed in a container, there is an example
RUN block in the c.Dockerfile provided. (The example installs C/C++ tools, but could be adapted to install any other packages.)
Compiling and Starting Services
If you have compilation steps that have to happen before a particular container can run, those should be done as part of the image build process.
You can add
RUN lines to execute any Linux command as part of building the container image.
If you have a server process that needs to be started (and will, presumably run as long as the container exists), the command to start it should be the
CMD command for the container image.
Ports and Servers
As part of defining the containers in the docker-compose.yml file, you have given each one a hostname (the first line in the docker-compose.yml service stanza: generally the programming language name in my template, but could be anything).
Within the Docker private network, all services you start will be accessible from other containers by default.
For example, if you have an HTTP service in a contained named "rust", listening on port 8080, other containers can access it at http://rust:8080/.
If you would like to access that server from your own computer (perhaps in a web browser), you can expose that port in the docker-compose.yml like this:
rust: build: context: . dockerfile: rust.Dockerfile ports: - "127.0.0.1:8080:8080"
Then that service will be accessible at http://localhost:8080/.