Agenda-
Building Images
Dockerfile
Managing Images and Containers
Distributing Images on Docker Hub
Docker Volumes
Basic Container networking
Docker in continuous integration
Build New Image
- Create a container from an Ubuntu image and run a bash terminal: docker run -i -t ubuntu:14.04 /bin/bash
- Inside the container, install curl: apt-get install curl
- Exit the container terminal
- Run docker ps -a and take note of your container ID
- Save the container as a new image. For the repository name use <yourname>/curl. Tag the image as 1.0: docker commit <container ID> <yourname>/curl:1.0
- Run docker images and verify that you can see your new image
Use New Image
- Create a container using the new image you created in the previous exercise. Run /bin/bash as the process to get terminal access: docker run -i -t <yourname>/curl:1.0 /bin/bash
- Verify that curl is installed: which curl
Dockerfile Instructions
Instructions specify what to do when building the image
FROM instruction specifies what the base image should be
RUN instruction specifies a command to execute
#Example of a comment
FROm ubuntu:14.04 RUN apt-get install vim RUN apt-get install curl
Docker Build
docker build [options] [path]
Common option to tag the build: docker build -t [repository:tag] [path]
docker build -t johnnytu/myimage:1.0 . docker build -t johnnytu/myimage:1.0 myproject
Build from Dockerfile
- In your home directory, create a folder called test
- In the test folder, create a file called “Dockerfile”
- In the file, specify to use Ubuntu 14.04 as the base image: FROM ubuntu:14.04
- Write an instruction to install curl and vim after an apt-get update: RUN apt-get update && apt-get install -y curl vim
- Build an image from the Dockerfile. Give it the repository <yourname>/textimage and tag it as 1.0: docker build -t johnnytu/textimage:1.0 .
- Create a container using your newly built image and verify that curl and vim are installed
Try CMD
- Go into the test folder and open your Dockerfile from the previous exercise
- Add the following line to the end: CMD ping 127.0.0.1 -c 30
- Build the image: docker build -t <yourname>/textimage:1.1 .
- Execute a container from the image and observe the output: docker run <yourname>/testimage:1.1
- Execute another container from the image and specify the echo command: docker run <yourname>/textimage:1.1 echo “hello world”
- Observe how the container argument overrides the CMD instruction
Push to Docker Hub
- Login to your Docker Hub account
- Create a new public repository called “testexample”
- Tag your local image to give it the same repo name as the repository you created on Docker Hub: docker tag <yourname>/testimage:1.1 <yourname>/testexample:1.1
- Push the new image to Docker Hub: docker push <yourname>/testexample:1.1
- Go to your Docker Hub repository and check for the tag
Mount a Volume
Volumes are mounted when creating or executing a container
Can be mapped to a host directory
Volume paths specified must be absolute
Execute a new container and mount the folder /myvolume into its file system
docker run -d -P -v /myvolume nginx:1.7
Execute a new container and map the /data/src folder from the host into the /test/src folder in the container
docker run -i -t -v /data/src:/test/src nginx:1.7
Create and test a Volume
- Execute a new container and initialise a volume at /www/website. Run a bash terminal as your container process. docker run -i -t -V /www/website ubuntu:14.04 bash
- Inside the container, verify that you can get to /www/website
- Create a file inside the /www/website folder
- Exit the container
- Commit the updated container as a new image called test and tag it as 1.0. docker commit <container ID> test:1.0
- Execute a new container with your test image and go into it’s bash shell. docker run -i -t test:1.0 bash
- Verify that the /www/website folder exists and the there are no files inside
EXPOSE net work port
Create a Link
- Create the source container first. docker run -d —name database postgres
- Create the recipient container and use the —link option. docker run -d -P —name website —link database:db nginx