Manage Linux Containers with Docker on Ubuntu - Page 2
4.2 Building images with a Dockerfile
The Dockerfile uses a basic DSL with instructions for building Docker images. We then use the docker build command to build a new image from the instructions in the Dockerfile. The team at Docker, Inc., have also published a Dockerfile tutorial to help you learn how to build Dockerfiles here.
Now I will create a simple docker file which can be further enhanced as per the user's requirement. First make a directory suppose as dir=kishore:
mkdir kishore
cd kishore
Now create a Dockerfile as:
vi Dockerfile
& enter the content as follows:
FROM ubuntu:12.04 MAINTAINER Srijan Kishore <[email protected]> RUN apt-get -qq update RUN apt-get -qqy install apache2 |
Now to open the customized container use:
sudo docker build -t="srijan/custom1" .
It will yield as follows:
srijan@vboxtest:~/kishore$ sudo docker build -t="srijan/custom1" . [sudo] password for srijan: Sending build context to Docker daemon 2.56 kB Sending build context to Docker daemon Step 0 : FROM ubuntu:12.04 Pulling repository ubuntu ea7d6801c538: Download complete 511136ea3c5a: Download complete 65b7e9ccb809: Download complete f8dd6bd14f58: Download complete a343823119db: Download complete ---> ea7d6801c538 Step 1 : MAINTAINER Srijan Kishore <[email protected]> ---> Running in a6135f405eb4 ---> be97c22efa82 Removing intermediate container a6135f405eb4 Step 2 : RUN apt-get -qq update ---> Running in b5681cd85ba8 ---> cbc3a95de894 Removing intermediate container b5681cd85ba8 Step 3 : RUN apt-get -qqy install apache2 ---> Running in 5765c09b530f debconf: delaying package configuration, since apt-utils is not installed Selecting previously unselected package libsqlite3-0. (Reading database ... 7551 files and directories currently installed.) Unpacking libsqlite3-0 (from .../libsqlite3-0_3.7.9-2ubuntu1.1_amd64.deb) ... Selecting previously unselected package libroken18-heimdal. Unpacking libroken18-heimdal (from .../libroken18-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb) ... Selecting previously unselected package libasn1-8-heimdal. Unpacking libasn1-8-heimdal (from .../libasn1-8-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb) ... Selecting previously unselected package libgpg-error0. Unpacking libgpg-error0 (from .../libgpg-error0_1.10-2ubuntu1_amd64.deb) ... Selecting previously unselected package libgcrypt11. Unpacking libgcrypt11 (from .../libgcrypt11_1.5.0-3ubuntu0.2_amd64.deb) ... Selecting previously unselected package libgdbm3. Unpacking libgdbm3 (from .../libgdbm3_1.8.3-10_amd64.deb) ... Selecting previously unselected package libp11-kit0. Unpacking libp11-kit0 (from .../libp11-kit0_0.12-2ubuntu1_amd64.deb) ... Selecting previously unselected package libtasn1-3. Unpacking libtasn1-3 (from .../libtasn1-3_2.10-1ubuntu1.1_amd64.deb) ... Selecting previously unselected package libgnutls26. Unpacking libgnutls26 (from .../libgnutls26_2.12.14-5ubuntu3.8_amd64.deb) ... Selecting previously unselected package libhcrypto4-heimdal. Unpacking libhcrypto4-heimdal (from .../libhcrypto4-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb) ... Selecting previously unselected package libheimbase1-heimdal. Unpacking libheimbase1-heimdal (from .../libheimbase1-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb) ... Selecting previously unselected package libwind0-heimdal. Unpacking libwind0-heimdal (from .../libwind0-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb) ... Selecting previously unselected package libhx509-5-heimdal. Unpacking libhx509-5-heimdal (from .../libhx509-5-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb) ... Selecting previously unselected package libkrb5-26-heimdal. Unpacking libkrb5-26-heimdal (from .../libkrb5-26-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb) ... Selecting previously unselected package libheimntlm0-heimdal. Unpacking libheimntlm0-heimdal (from .../libheimntlm0-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb) ... Selecting previously unselected package libgssapi3-heimdal. Unpacking libgssapi3-heimdal (from .../libgssapi3-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb) ... Selecting previously unselected package libsasl2-2. Unpacking libsasl2-2 (from .../libsasl2-2_2.1.25.dfsg1-3ubuntu0.1_amd64.deb) ... Selecting previously unselected package libldap-2.4-2. Unpacking libldap-2.4-2 (from .../libldap-2.4-2_2.4.28-1.1ubuntu4.4_amd64.deb) ... Selecting previously unselected package libcap2. Unpacking libcap2 (from .../libcap2_1%3a2.22-1ubuntu3_amd64.deb) ... Selecting previously unselected package libexpat1. Unpacking libexpat1 (from .../libexpat1_2.0.1-7.2ubuntu1.1_amd64.deb) ... Selecting previously unselected package libmagic1. Unpacking libmagic1 (from .../libmagic1_5.09-2ubuntu0.3_amd64.deb) ... Selecting previously unselected package file. Unpacking file (from .../file_5.09-2ubuntu0.3_amd64.deb) ... Selecting previously unselected package mime-support. Unpacking mime-support (from .../mime-support_3.51-1ubuntu1_all.deb) ... Selecting previously unselected package netbase. Unpacking netbase (from .../netbase_4.47ubuntu1_all.deb) ... Selecting previously unselected package libsasl2-modules. Unpacking libsasl2-modules (from .../libsasl2-modules_2.1.25.dfsg1-3ubuntu0.1_amd64.deb) ... Selecting previously unselected package openssl. Unpacking openssl (from .../openssl_1.0.1-4ubuntu5.16_amd64.deb) ... Selecting previously unselected package libapr1. Unpacking libapr1 (from .../libapr1_1.4.6-1_amd64.deb) ... Selecting previously unselected package libaprutil1. Unpacking libaprutil1 (from .../libaprutil1_1.3.12+dfsg-3_amd64.deb) ... Selecting previously unselected package libaprutil1-dbd-sqlite3. Unpacking libaprutil1-dbd-sqlite3 (from .../libaprutil1-dbd-sqlite3_1.3.12+dfsg-3_amd64.deb) ... Selecting previously unselected package libaprutil1-ldap. Unpacking libaprutil1-ldap (from .../libaprutil1-ldap_1.3.12+dfsg-3_amd64.deb) ... Selecting previously unselected package apache2.2-bin. Unpacking apache2.2-bin (from .../apache2.2-bin_2.2.22-1ubuntu1.6_amd64.deb) ... Selecting previously unselected package apache2-utils. Unpacking apache2-utils (from .../apache2-utils_2.2.22-1ubuntu1.6_amd64.deb) ... Selecting previously unselected package libswitch-perl. Unpacking libswitch-perl (from .../libswitch-perl_2.16-2_all.deb) ... Selecting previously unselected package libclass-isa-perl. Unpacking libclass-isa-perl (from .../libclass-isa-perl_0.36-3_all.deb) ... Selecting previously unselected package perl-modules. Unpacking perl-modules (from .../perl-modules_5.14.2-6ubuntu2.4_all.deb) ... Selecting previously unselected package perl. Unpacking perl (from .../perl_5.14.2-6ubuntu2.4_amd64.deb) ... Selecting previously unselected package apache2.2-common. Unpacking apache2.2-common (from .../apache2.2-common_2.2.22-1ubuntu1.6_amd64.deb) ... Selecting previously unselected package apache2-mpm-worker. Unpacking apache2-mpm-worker (from .../apache2-mpm-worker_2.2.22-1ubuntu1.6_amd64.deb) ... Selecting previously unselected package apache2. Unpacking apache2 (from .../apache2_2.2.22-1ubuntu1.6_amd64.deb) ... Selecting previously unselected package ssl-cert. Unpacking ssl-cert (from .../ssl-cert_1.0.28ubuntu0.1_all.deb) ... Setting up libsqlite3-0 (3.7.9-2ubuntu1.1) ... Setting up libroken18-heimdal (1.6~git20120311.dfsg.1-2ubuntu0.1) ... Setting up libasn1-8-heimdal (1.6~git20120311.dfsg.1-2ubuntu0.1) ... Setting up libgpg-error0 (1.10-2ubuntu1) ... Setting up libgcrypt11 (1.5.0-3ubuntu0.2) ... Setting up libgdbm3 (1.8.3-10) ... Setting up libp11-kit0 (0.12-2ubuntu1) ... Setting up libtasn1-3 (2.10-1ubuntu1.1) ... Setting up libgnutls26 (2.12.14-5ubuntu3.8) ... Setting up libhcrypto4-heimdal (1.6~git20120311.dfsg.1-2ubuntu0.1) ... Setting up libheimbase1-heimdal (1.6~git20120311.dfsg.1-2ubuntu0.1) ... Setting up libwind0-heimdal (1.6~git20120311.dfsg.1-2ubuntu0.1) ... Setting up libhx509-5-heimdal (1.6~git20120311.dfsg.1-2ubuntu0.1) ... Setting up libkrb5-26-heimdal (1.6~git20120311.dfsg.1-2ubuntu0.1) ... Setting up libheimntlm0-heimdal (1.6~git20120311.dfsg.1-2ubuntu0.1) ... Setting up libgssapi3-heimdal (1.6~git20120311.dfsg.1-2ubuntu0.1) ... Setting up libsasl2-2 (2.1.25.dfsg1-3ubuntu0.1) ... Setting up libldap-2.4-2 (2.4.28-1.1ubuntu4.4) ... Setting up libcap2 (1:2.22-1ubuntu3) ... Setting up libexpat1 (2.0.1-7.2ubuntu1.1) ... Setting up libmagic1 (5.09-2ubuntu0.3) ... Setting up file (5.09-2ubuntu0.3) ... Setting up mime-support (3.51-1ubuntu1) ... update-alternatives: using /usr/bin/see to provide /usr/bin/view (view) in auto mode. Setting up netbase (4.47ubuntu1) ... Setting up libsasl2-modules (2.1.25.dfsg1-3ubuntu0.1) ... Setting up openssl (1.0.1-4ubuntu5.16) ... Setting up libapr1 (1.4.6-1) ... Setting up libaprutil1 (1.3.12+dfsg-3) ... Setting up libaprutil1-dbd-sqlite3 (1.3.12+dfsg-3) ... Setting up libaprutil1-ldap (1.3.12+dfsg-3) ... Setting up apache2.2-bin (2.2.22-1ubuntu1.6) ... Setting up apache2-utils (2.2.22-1ubuntu1.6) ... Setting up libclass-isa-perl (0.36-3) ... Setting up ssl-cert (1.0.28ubuntu0.1) ... debconf: unable to initialize frontend: Dialog debconf: (TERM is not set, so the dialog frontend is not usable.) debconf: falling back to frontend: Readline debconf: unable to initialize frontend: Readline debconf: (This frontend requires a controlling tty.) debconf: falling back to frontend: Teletype Setting up libswitch-perl (2.16-2) ... Setting up perl-modules (5.14.2-6ubuntu2.4) ... Setting up perl (5.14.2-6ubuntu2.4) ... update-alternatives: using /usr/bin/prename to provide /usr/bin/rename (rename) in auto mode. Setting up apache2.2-common (2.2.22-1ubuntu1.6) ... Enabling site default. Enabling module alias. Enabling module autoindex. Enabling module dir. Enabling module env. Enabling module mime. Enabling module negotiation. Enabling module setenvif. Enabling module status. Enabling module auth_basic. Enabling module deflate. Enabling module authz_default. Enabling module authz_user. Enabling module authz_groupfile. Enabling module authn_file. Enabling module authz_host. Enabling module reqtimeout. Setting up apache2-mpm-worker (2.2.22-1ubuntu1.6) ... invoke-rc.d: policy-rc.d denied execution of start. Setting up apache2 (2.2.22-1ubuntu1.6) ... Processing triggers for libc-bin ... ldconfig deferred processing now taking place ---> 634855a43331 Removing intermediate container 5765c09b530f Successfully built 634855a43331 srijan@vboxtest:~/kishore$
Now let's take a look at our new image. We can do this using the docker images command.
docker images srijan/custom1
srijan@vboxtest:~/kishore$ docker images srijan/custom1 REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE srijan/custom1 latest 634855a43331 About a minute ago 277.4 MB srijan@vboxtest:~/kishore$
Here you will find that the images will have by default apache2 installed. Lets crosscheck it as :
docker run -t -i srijan/apache2:webserver /bin/bash
Now you will get in the new container with the apache2 with 12.04ubuntu pre-installed.
5 Hostname change
Suppose you want to change the hostname or you want a customized hostname e.g. in my case server1.example.com
I will use
docker run -h 'server1.example.com' -t -i srijan/custom1 /bin/bash
It will yield the image container as
srijan@vboxtest:~/kishore$ docker run -h 'server1.example.com' -t -i srijan/custom1 /bin/bash root@server1:/# hostname -f server1.example.com root@server1:/#
6 Useful commands for docker
- pull (pull is used to pull an image or a repository from the registry)
e.g.
docker run -i -t ubuntu /bin/bash
-
commit (commit is used to save the container)
e.g.
docker commit 73527b8b4261 srijan/apache2 8ce0ea7a1528
-
cp (Copy files/folders from a container's filesystem to the host path. Paths are relative to the root of the filesystem.)
e.g.
docker cp CONTAINER:PATH HOSTPATH
where CONTAINER is container & copy files/folders from the PATH to the HOSTPATH
- start and stop a Container:
docker start 4386fb97867d
docker stop 4386fb97867d
where 4386fb97867d is your container number
- export ( Export the contents of a filesystem as a tar archive to STDOUT)
docker export 4386fb97867d > latest.tar
- import (Create an empty filesystem image and import the contents of the tarball (.tar, .tar.gz, .tgz, .bzip, .tar.xz, .txz) into it, then optionally tag it.)
docker import http://example.com/exampleimage.tgz
Import from a local file:
Import to docker via pipe and stdin.
cat exampleimage.tgz | sudo docker import - exampleimagelocal:new
Import from a local directory:
sudo tar -c . | sudo docker import - exampleimagedir
- history (Show the history of an image)
docker history [OPTIONS] IMAGE
sudo docker history ea7d6801c538
- images (It will show the images)
docker images [OPTIONS] [NAME]
It follows some options as
-a, --all=false Show all images (by default filter out the intermediate image layers)
-f, --filter=[]: Provide filter values (i.e. 'dangling=true')
--no-trunc=false Don't truncate output
-q, --quiet=false Only show numeric IDs
- info (Display system-wide information)
srijan@VE130214:~$ sudo docker info
srijan@vboxtest:~$ sudo docker info Containers: 20 Images: 65 Storage Driver: aufs Root Dir: /var/lib/docker/aufs Dirs: 105 Execution Driver: native-0.2 Kernel Version: 3.13.0-30-generic WARNING: No swap limit support
- inspect (Return low-level information on a container/image)
docker inspect CONTAINER|IMAGE [CONTAINER|IMAGE...]
- kill (Kill a running container/send SIGKILL, or specified signal)
docker kill [OPTIONS] CONTAINER [CONTAINER...]
- login (Register or Login to a docker registry server, if no server is specified "https://index.docker.io/v1/" is the default.)
docker login localhost:8080
It will login to a self-hosted registry.
- logs (Fetch the logs of a container)
docker logs CONTAINER
- ps (List containers)
docker ps [OPTIONS]
It have options as:
-a, --all=false Show all containers. Only running containers are shown by default.
--before="" Show only container created before Id or Name, include non-running ones.
-l, --latest=false Show only the latest created container, include non-running ones.
-n=-1 Show n last created containers, include non-running ones.
--no-trunc=false Don't truncate output
-q, --quiet=false Only display numeric IDs
-s, --size=false Display sizes
--since="" Show only containers created since Id or Name, include non-running ones.
- push (Push an image or a repository to the registry)
docker push NAME[:TAG]
- restart (It will restart a running container)
docker restart [OPTIONS] CONTAINER [CONTAINER...]
- rm (It will remove one or more containers)
docker rm [OPTIONS] CONTAINER [CONTAINER...]
- rmi (It will remove one or more images)
docker rmi IMAGE [IMAGE...]
- run (Run a command in a new container)
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
It have following options:
-a, --attach=[] Attach to stdin, stdout or stderr.
-c, --cpu-shares=0 CPU shares (relative weight)
--cidfile="" Write the container ID to the file
-d, --detach=false Detached mode: Run container in the background, print new container id
--dns=[] Set custom dns servers
--dns-search=[] Set custom dns search domains
-e, --env=[] Set environment variables
--entrypoint="" Overwrite the default entrypoint of the image
--env-file=[] Read in a line delimited file of ENV variables
--expose=[] Expose a port from the container without publishing it to your host
-h, --hostname="" Container host name
-i, --interactive=false Keep stdin open even if not attached
--link=[] Add link to another container (name:alias)
--lxc-conf=[] (lxc exec-driver only) Add custom lxc options --lxc-conf="lxc.cgroup.cpuset.cpus = 0,1"
-m, --memory="" Memory limit (format: <number><optional unit>, where unit = b, k, m or g)
--name="" Assign a name to the container
--net="bridge" Set the Network mode for the container
'bridge': creates a new network stack for the container on the docker bridge
'none': no networking for this container
'container:<name|id>': reuses another container network stack
'host': use the host network stack inside the container
-p, --publish=[] Publish a container's port to the host
format: ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort
(use 'docker port' to see the actual mapping)
-P, --publish-all=false Publish all exposed ports to the host interfaces
--privileged=false Give extended privileges to this container
--rm=false Automatically remove the container when it exits (incompatible with -d)
--sig-proxy=true Proxify all received signal to the process (even in non-tty mode)
-t, --tty=false Allocate a pseudo-tty
-u, --user="" Username or UID
-v, --volume=[] Bind mount a volume (e.g. from the host: -v /host:/container, from docker: -v /container)
--volumes-from=[] Mount volumes from the specified container(s)
-w, --workdir="" Working directory inside the container
- save (Save an image to a tar archive (streamed to stdout by default)
docker save IMAGE
- search (Search the docker index for images)
docker search TERM
- tag (Tag an image into a repository)
docker tag [OPTIONS] IMAGE [REGISTRYHOST/][USERNAME/]NAME[:TAG]
- top (Lookup the running processes of a container)
docker top CONTAINER [ps OPTIONS]
- version (Show the docker version information.)
sudo docker version
srijan@vboxtest:~$ sudo docker version [sudo] password for srijan: Client version: 1.0.1 Client API version: 1.12 Go version (client): go1.2.1 Git commit (client): 990021a Server version: 1.0.1 Server API version: 1.12 Go version (server): go1.2.1 Git commit (server): 990021a
6 Summary
I have tried to get you more familiar with the docker, I hope this guide will help you in understanding docker & utilize docker in your test/production environments.
For more info refer http://www.docker.com/