Skip to content

Instantly share code, notes, and snippets.

@itanaskovic
Forked from thaJeztah/docker-examples.md
Created March 21, 2019 12:11
Show Gist options
  • Save itanaskovic/c97f5e6d289afa7c5ba1162aba541508 to your computer and use it in GitHub Desktop.
Save itanaskovic/c97f5e6d289afa7c5ba1162aba541508 to your computer and use it in GitHub Desktop.
Some docker examples
### Commit, clone a container
To 'clone' a container, you'll have to make an image of that container first, you can do so
by "committing" the container. Docker will (by default) *pause* all processes running in the
container during commit to preserve data-consistency.
For example;
docker commit --message="Snapshot of my container" my_container my_container_snapshot:yymmdd
Commit `my_container` as an image called `my_container_snapshot`, and tag it `yymmdd`. The "message" is optional and allows adding some extra info to the image.
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
my_container_snapshot yymmdd 9496ac4a89a6 5 seconds ago 85.1 MB
To view the "message" we added earlier, inspect the image using `docker inspect [imagename]`, and to get *just* the message provide a `--filter` option. In this case:
$ docker inspect --format="{{.Comment}}" my_container_snapshot:yymmdd
Snapshot of my container
You can start a new container from this snapshot;
docker run --name=my_clone my_container_snapshot:yymmdd
This will start a new container called "my_clone", using the snapshot we created earlier.
### Volumes
When dealing with database containers, most containers use a `volume` for data storage. Data in volumes
is not considered part of the containers filesystem and will therefore **not** be included when committing a
container (nor will it be when using `docker export` or `docker save`).
To check if a container uses volumes and where they are located, use `docker inspect`. To get just the information about 'volumes', we're providing a `--filter`;
$ docker inspect --format="{{json .Volumes}}" my_container
{"/var/lib/mysql":"/var/lib/docker/vfs/dir/8274456ae711beb73de3ba0d969931c260a1bf063088f436fb08eb79b546d21d"}
This container, running mysql, is using a volume for `/var/lib/mysql`, and is stored inside `/var/lib/docker/vfs/dir/8274456ae711beb73de3ba0d969931c260a1bf063088f436fb08eb79b546d21d` on the host filesystem.
### Backing up volume data
To export data inside a volume, use a utility container, for example, to backup the /var/lib/mysql data directory of the example above, do something like this;
docker run --rm --volumes-from=my_container debian tar cvf - /var/lib/mysql | gzip > mysql-data.tar.gz
This instruction will;
- start a debian container
- connect to the *volumes* of `my_container` and mount those volumes at the *same* location as inside `my_container` (ie, `/var/lib/mysql`)
- Tar + Gzip the `/var/lib/mysql` directory to a file called `mysql-data.tar.gz` in the current directory on the host
- Perform harakiri (it's a "self destructing" container; setting `--rm` will destroy the container after the command has completed)
### Export a database
To *export* a database, again use a utility container containing the tool to backup your data, for example, to backup
a mysql database;
docker run --rm --link=my_container:db mysql:latest mysqldump --host=db -u root my_database > my_database_dump.sql
This instruction will;
- start a mysql container (but doesn't start the mysql *server*, because we're providing a different command)
- establish a link to `my_container` and name that link `db`
- add an entry to `/etc/hosts` inside the container for the `db` link. This enables us to connect to the linked container by using `db` as hostname.
- do a `mysqldump` of the database in the *linked* container (using `db` as hostname)
- export the dump to a file called `my_database_dump.sql` in the current directory
- delete the container after the command has completed.
### Import the database in a new container
[write]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment