Here are a few tips that I've found useful while delving in to Docker. For an introduction to Docker, see my post on the YP Engineering Blog. Enjoy!
Docker image size does matter. The larger your image, that more unweildy it starts to feel. Pulling a 50MB image is far preferable to pulling a 2G image. Some tips on building smaller images:
busybox
< debian
< centos
< ubuntu
. I try to use progrium/busybox
whenever possible (which isn't all that often without serious work), otherwise, I tend to use debian
.apt-get build-essential
is going to bloat your image, don't use it unless absolutly necessary.Do as much as you can in a single RUN
, as opposed to breaking things up. The downside to this is longer builds with less caching. However, it can make a huge difference in resulting image size. I once took an image from 1.3G to 555MB, just by collapsing all my commands to a single RUN
. Additionally, clean up after yourself in that same RUN
if possible. Example:
# BAD RUN apt-get install git RUN apt-get install wget RUN apt-get install build-essential COPY http://somesite.com/somefile.tgz RUN tar xzf somefile.tgz RUN cd somefile RUN ./configure && make && install # GOOD RUN \ apt-get install -y git wget build-essential && \ curl -sSL -O http://somesite.com/somefile.tgz && \ tar xzf somefile.tgz && \ cd somefile && ./configure && make && install && \ cd - && rm -rf somefile somefile.tgz && \ apt-get remove -y build-essential && \ apt-get autoremove -y && apt-get clean
sudo docker search <private domain>/<term>
# remove all containers sudo docker rm $(sudo docker ps -a -q) #... or ... sudo docker ps -aq | xargs sudo docker rm # remove all images sudo docker rmi $(sudo docker images -q) #... or ... sudo docker images -q | xargs sudo docker rmi # remove specific images in bulk sudo docker rmi myimage:{tagone,tagtwo,tagfive} # remove image containing TERM sudo docker rmi $(sudo docker images | grep TERM | awk '{ print $3 }') #... or ... sudo docker images | grep TERM | awk '{ print $3 }' | xargs sudo docker rmi # remove all non-running containers sudo docker ps -a | grep Exited | awk '{ print $NF }' | xargs sudo docker rm
# view last container sudo docker ps -l # view last container sha only sudo docker ps -lq # stop, start, attach, logs, etc. last container # # $ sudo docker <action> $(sudo docker ps -lq) sudo docker start $(sudo docker ps -lq) sudo docker stop $(sudo docker ps -lq) sudo docker logs $(sudo docker ps -lq) sudo docker attach $(sudo docker ps -lq)
# assuming image 'jmervine/centos6-nodejs' # # <current image name> <private registry>:<port>/<image name> sudo docker tag jmervine/centos6-nodejs docker.myregstry.com:5000/jmervine/centos6-nodejs sudo docker push docker.myregstry.com:5000/jmervine/centos6-nodejs # I then recommend removing your old image to avoid accidentally pushing it to the public registry. sudo docker rmi jmervine/centos6-nodejs
# running randomly assigning host port sudo docker run -d -p 3000 image/name # running with exposed ports randomly assigned on host sudo docker run -d -P image/name # printing randomly assigned ports (only) sudo docker port image_name | awk -F':' '{ print $NF }'
# Directly in to a running container. sudo docker exec -it <container_name|name> \ bash -c "echo \"$(cat /path/to/host/file.txt)\" > /path/to/container/file.txt" # When running a container. sudo docker run -i <container_id|name> \ bash -c "echo \"$(cat /path/to/host/file.txt)\" > /path/to/container/file.txt; /bin/bash ./start.sh" # Via Docker volume. # - where 'file.txt' is /path/to/host/dir/file.txt sudo docker run -v /path/to/host/dir:/path/to/container/dir <container_id|name> #... or ... sudo docker run -v /path/to/host/dir:/path/to/container/dir <container_id|name> cp /path/to/host/file.txt /path/to/host/dir/file.txt # Via file system -- untested as of yet. sudo cp -v /path/to/host/file.txt \ /var/lib/docker/aufs/mnt/**$(sudo docker inspect -f '{{.Id}}' <container_id|name>)**/root/path/to/container/file.txt
Based on comments in http://stackoverflow.com/questions/22907231/copying-files-from-host-to-docker-container