diff --git a/.gitignore b/.gitignore index be48820bbe..15841891c7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -.vagrant +.vagrant* bin docker/docker .*.swp @@ -13,4 +13,5 @@ auth/auth.test .DS_Store docs/_build docs/_static -docs/_templates \ No newline at end of file +docs/_templates +.gopath/ diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000..e716762d31 --- /dev/null +++ b/Makefile @@ -0,0 +1,43 @@ +DOCKER_PACKAGE := github.com/dotcloud/docker + +BUILD_DIR := $(CURDIR)/.gopath + +GOPATH ?= $(BUILD_DIR) +export GOPATH + +GO_OPTIONS ?= +ifeq ($(VERBOSE), 1) +GO_OPTIONS += -v +endif + +SRC_DIR := $(GOPATH)/src + +DOCKER_DIR := $(SRC_DIR)/$(DOCKER_PACKAGE) +DOCKER_MAIN := $(DOCKER_DIR)/docker + +DOCKER_BIN_RELATIVE := bin/docker +DOCKER_BIN := $(CURDIR)/$(DOCKER_BIN_RELATIVE) + +.PHONY: all clean test + +all: $(DOCKER_BIN) + +$(DOCKER_BIN): $(DOCKER_DIR) + @mkdir -p $(dir $@) + @(cd $(DOCKER_MAIN); go get $(GO_OPTIONS); go build $(GO_OPTIONS) -o $@) + @echo $(DOCKER_BIN_RELATIVE) is created. + +$(DOCKER_DIR): + @mkdir -p $(dir $@) + @ln -sf $(CURDIR)/ $@ + +clean: + @rm -rf $(dir $(DOCKER_BIN)) +ifeq ($(GOPATH), $(BUILD_DIR)) + @rm -rf $(BUILD_DIR) +else ifneq ($(DOCKER_DIR), $(realpath $(DOCKER_DIR))) + @rm -f $(DOCKER_DIR) +endif + +test: all + @(cd $(DOCKER_DIR); sudo -E go test $(GO_OPTIONS)) diff --git a/README.md b/README.md index 4fc7778456..7fcfa4c360 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ Notable features * Network isolation: each process container runs in its own network namespace, with a virtual interface and IP address of its own. -* Copy-on-write: root filesystems are created using copy-on-write, which makes deployment extremeley fast, memory-cheap and disk-cheap. +* Copy-on-write: root filesystems are created using copy-on-write, which makes deployment extremely fast, memory-cheap and disk-cheap. * Logging: the standard streams (stdout/stderr/stdin) of each process container are collected and logged for real-time or batch retrieval. @@ -53,6 +53,30 @@ Under the hood, Docker is built on the following components: Install instructions ================== +Building from source +-------------------- + +1. Make sure you have a [Go language](http://golang.org) compiler. + + On a Debian/wheezy or Ubuntu 12.10 install the package: + + ```bash + + $ sudo apt-get install golang-go + ``` + +2. Execute ``make`` + + This command will install all necessary dependencies and build the + executable that you can find in ``bin/docker`` + +3. Should you like to see what's happening, run ``make`` with ``VERBOSE=1`` parameter: + + ```bash + + $ make VERBOSE=1 + ``` + Installing on Ubuntu 12.04 and 12.10 ------------------------------------ diff --git a/Vagrantfile b/Vagrantfile index 6bfc77dc23..48b3ef567a 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -2,115 +2,30 @@ # vi: set ft=ruby : def v10(config) - # All Vagrant configuration is done here. The most common configuration - # options are documented and commented below. For a complete reference, - # please see the online documentation at vagrantup.com. - - # Every Vagrant virtual environment requires a box to build off of. config.vm.box = "quantal64_3.5.0-25" - - # The url from where the 'config.vm.box' box will be fetched if it - # doesn't already exist on the user's system. config.vm.box_url = "http://get.docker.io/vbox/ubuntu/12.10/quantal64_3.5.0-25.box" - # Boot with a GUI so you can see the screen. (Default is headless) - # config.vm.boot_mode = :gui - - # Assign this VM to a host-only network IP, allowing you to access it - # via the IP. Host-only networks can talk to the host machine as well as - # any other machines on the same network, but cannot be accessed (through this - # network interface) by any external networks. - config.vm.network :hostonly, "192.168.33.10" - - # Assign this VM to a bridged network, allowing you to connect directly to a - # network using the host's network device. This makes the VM appear as another - # physical device on your network. - # config.vm.network :bridged - - # Forward a port from the guest to the host, which allows for outside - # computers to access the VM, whereas host only networking does not. - # config.vm.forward_port 80, 8080 + config.vm.share_folder "v-data", "/opt/go/src/github.com/dotcloud/docker", File.dirname(__FILE__) # Ensure puppet is installed on the instance config.vm.provision :shell, :inline => "apt-get -qq update; apt-get install -y puppet" - # Share an additional folder to the guest VM. The first argument is - # an identifier, the second is the path on the guest to mount the - # folder, and the third is the path on the host to the actual folder. - config.vm.share_folder "v-data", "~/docker", "~/docker" - - # Enable provisioning with Puppet stand alone. Puppet manifests - # are contained in a directory path relative to this Vagrantfile. - # You will need to create the manifests directory and a manifest in - # the file quantal64.pp in the manifests_path directory. - # - # An example Puppet manifest to provision the message of the day: - # - # # group { "puppet": - # # ensure => "present", - # # } - # # - # # File { owner => 0, group => 0, mode => 0644 } - # # - # # file { '/etc/motd': - # # content => "Welcome to your Vagrant-built virtual machine! - # # Managed by Puppet.\n" - # # } - # config.vm.provision :puppet do |puppet| puppet.manifests_path = "puppet/manifests" puppet.manifest_file = "quantal64.pp" puppet.module_path = "puppet/modules" end - - # Enable provisioning with chef solo, specifying a cookbooks path, roles - # path, and data_bags path (all relative to this Vagrantfile), and adding - # some recipes and/or roles. - # - # config.vm.provision :chef_solo do |chef| - # chef.cookbooks_path = "../my-recipes/cookbooks" - # chef.roles_path = "../my-recipes/roles" - # chef.data_bags_path = "../my-recipes/data_bags" - # chef.add_recipe "mysql" - # chef.add_role "web" - # - # # You may also specify custom JSON attributes: - # chef.json = { :mysql_password => "foo" } - # end - - # Enable provisioning with chef server, specifying the chef server URL, - # and the path to the validation key (relative to this Vagrantfile). - # - # The Opscode Platform uses HTTPS. Substitute your organization for - # ORGNAME in the URL and validation key. - # - # If you have your own Chef Server, use the appropriate URL, which may be - # HTTP instead of HTTPS depending on your configuration. Also change the - # validation key to validation.pem. - # - # config.vm.provision :chef_client do |chef| - # chef.chef_server_url = "https://api.opscode.com/organizations/ORGNAME" - # chef.validation_key_path = "ORGNAME-validator.pem" - # end - # - # If you're using the Opscode platform, your validator client is - # ORGNAME-validator, replacing ORGNAME with your organization name. - # - # IF you have your own Chef Server, the default validation client name is - # chef-validator, unless you changed the configuration. - # - # chef.validation_client_name = "ORGNAME-validator" end -"#{Vagrant::VERSION}" < "1.1.0" and Vagrant::Config.run do |config| +Vagrant::VERSION < "1.1.0" and Vagrant::Config.run do |config| v10(config) end -"#{Vagrant::VERSION}" >= "1.1.0" and Vagrant.configure("1") do |config| +Vagrant::VERSION >= "1.1.0" and Vagrant.configure("1") do |config| v10(config) end -"#{Vagrant::VERSION}" >= "1.1.0" and Vagrant.configure("2") do |config| +Vagrant::VERSION >= "1.1.0" and Vagrant.configure("2") do |config| config.vm.provider :aws do |aws| config.vm.box = "dummy" config.vm.box_url = "https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box" @@ -119,20 +34,22 @@ end aws.keypair_name = ENV["AWS_KEYPAIR_NAME"] aws.ssh_private_key_path = ENV["AWS_SSH_PRIVKEY"] aws.region = "us-east-1" - aws.ami = "ami-1c1e8075" - aws.ssh_username = "vagrant" + aws.ami = "ami-ae9806c7" + aws.ssh_username = "ubuntu" aws.instance_type = "t1.micro" end + config.vm.provider :rackspace do |rs| config.vm.box = "dummy" config.vm.box_url = "https://github.com/mitchellh/vagrant-rackspace/raw/master/dummy.box" config.ssh.private_key_path = ENV["RS_PRIVATE_KEY"] rs.username = ENV["RS_USERNAME"] rs.api_key = ENV["RS_API_KEY"] - rs.public_key_path = ENV["RS_PUBLIC_KEY"] + rs.public_key_path = ENV["RS_PUBLIC_KEY"] rs.flavor = /512MB/ rs.image = /Ubuntu/ - end + end + config.vm.provider :virtualbox do |vb| config.vm.box = "quantal64_3.5.0-25" config.vm.box_url = "http://get.docker.io/vbox/ubuntu/12.10/quantal64_3.5.0-25.box" diff --git a/commands.go b/commands.go index 3806323879..c769568536 100644 --- a/commands.go +++ b/commands.go @@ -43,7 +43,7 @@ func (srv *Server) Help() string { {"logs", "Fetch the logs of a container"}, {"port", "Lookup the public-facing port which is NAT-ed to PRIVATE_PORT"}, {"ps", "List containers"}, - {"pull", "Pull an image or a repository to the docker registry server"}, + {"pull", "Pull an image or a repository from the docker registry server"}, {"push", "Push an image or a repository to the docker registry server"}, {"restart", "Restart a running container"}, {"rm", "Remove a container"}, diff --git a/docs/sources/commandline/basecommands.rst b/docs/sources/commandline/basecommands.rst index 180ad413a8..b065985059 100644 --- a/docs/sources/commandline/basecommands.rst +++ b/docs/sources/commandline/basecommands.rst @@ -13,11 +13,11 @@ Running an interactive shell .. code-block:: bash # Download a base image - docker import base + docker pull base # Run an interactive shell in the base image, # allocate a tty, attach stdin and stdout - docker run -a -i -t base /bin/bash + docker run -i -t base /bin/bash Starting a long-running worker process @@ -26,10 +26,10 @@ Starting a long-running worker process .. code-block:: bash # Run docker in daemon mode - (docker -d || echo "Docker daemon already running") & + (sudo docker -d || echo "Docker daemon already running") & # Start a very useful long-running process - JOB=$(docker run base /bin/sh -c "while true; do echo Hello world!; sleep 1; done") + JOB=$(docker run -d base /bin/sh -c "while true; do echo Hello world; sleep 1; done") # Collect the output of the job so far docker logs $JOB @@ -51,7 +51,7 @@ Expose a service on a TCP port .. code-block:: bash # Expose port 4444 of this container, and tell netcat to listen on it - JOB=$(docker run -p 4444 base /bin/nc -l -p 4444) + JOB=$(docker run -d -p 4444 base /bin/nc -l -p 4444) # Which public port is NATed to my container? PORT=$(docker port $JOB 4444) diff --git a/docs/sources/examples/python_web_app.rst b/docs/sources/examples/python_web_app.rst index 5b0ac30b63..922af29345 100644 --- a/docs/sources/examples/python_web_app.rst +++ b/docs/sources/examples/python_web_app.rst @@ -12,9 +12,9 @@ The goal of this example is to show you how you can author your own docker image .. code-block:: bash - $ docker import shykes/pybuilder + $ docker pull shykes/pybuilder -We are importing the "shykes/pybuilder" docker image +We are downloading the "shykes/pybuilder" docker image .. code-block:: bash diff --git a/docs/sources/installation/windows.rst b/docs/sources/installation/windows.rst index 105fb7aaff..6091d6bac1 100644 --- a/docs/sources/installation/windows.rst +++ b/docs/sources/installation/windows.rst @@ -156,7 +156,7 @@ You are now ready for the docker’s “hello world” example. Run .. code-block:: bash - docker run -a busybox echo hello world + docker run busybox echo hello world .. image:: images/win/run_04.gif :alt: run docker diff --git a/puppet/modules/docker/manifests/init.pp b/puppet/modules/docker/manifests/init.pp index b6b8aecd1c..6f7aec9001 100644 --- a/puppet/modules/docker/manifests/init.pp +++ b/puppet/modules/docker/manifests/init.pp @@ -1,38 +1,32 @@ class virtualbox { - Package { ensure => "installed" } + Package { ensure => "installed" } - # remove some files from the base vagrant image because they're old - file { "/home/vagrant/docker-master": - ensure => absent, - recurse => true, - force => true, - purge => true, - } - file { "/usr/local/bin/dockerd": - ensure => absent, - } + # remove some files from the base vagrant image because they're old + file { "/home/vagrant/docker-master": + ensure => absent, + recurse => true, + force => true, + purge => true, + } + file { "/usr/local/bin/dockerd": + ensure => absent, + } + file { "/usr/local/bin/docker": + ensure => absent, + } - # Set up VirtualBox guest utils - package { "virtualbox-guest-utils": } + # Set up VirtualBox guest utils + package { "virtualbox-guest-utils": } exec { "vbox-add" : command => "/etc/init.d/vboxadd setup", require => [ - Package["virtualbox-guest-utils"], - Package["linux-headers-3.5.0-25-generic"], ], + Package["virtualbox-guest-utils"], + Package["linux-headers-3.5.0-25-generic"], ], } } -class ec2 { -} - -class rax { -} - class docker { - - # update this with latest docker binary distro - $docker_url = "http://get.docker.io/builds/$kernel/$hardwaremodel/docker-master.tgz" - # update this with latest go binary distry + # update this with latest go binary dist $go_url = "http://go.googlecode.com/files/go1.0.3.linux-amd64.tar.gz" Package { ensure => "installed" } @@ -43,99 +37,63 @@ class docker { "linux-image-extra-3.5.0-25-generic", "linux-headers-3.5.0-25-generic"]: } - notify { "docker_url = $docker_url": withpath => true } - $ec2_version = file("/etc/ec2_version", "/dev/null") $rax_version = inline_template("<%= %x{/usr/bin/xenstore-read vm-data/provider_data/provider} %>") if ($ec2_version) { - include ec2 + $vagrant_user = "ubuntu" + $vagrant_home = "/home/ubuntu" } elsif ($rax_version) { - include rax + $vagrant_user = "root" + $vagrant_home = "/root" } else { - # virtualbox is the vagrant default, so it should be safe to assume + # virtualbox is the vagrant default, so it should be safe to assume + $vagrant_user = "vagrant" + $vagrant_home = "/home/vagrant" include virtualbox } - user { "vagrant": - ensure => present, - comment => "Vagrant User", - shell => "/bin/bash", - home => "/home/vagrant", - groups => [ - "sudo", - "vagrant", - "ubuntu", - ], - require => [ - Group["sudo"], - Group["vagrant"], - Group["ubuntu"], - ], - } - - group { "ubuntu": - ensure => present, - } - - group { "vagrant": - ensure => present, - } - - group { "sudo": - ensure => present, - } - - file { "/usr/local/bin": - ensure => directory, - owner => root, - group => root, - mode => 755, - } - exec { "fetch-go": require => Package["wget"], command => "/usr/bin/wget -O - $go_url | /bin/tar xz -C /usr/local", creates => "/usr/local/go/bin/go", } - exec { "fetch-docker" : - command => "/usr/bin/wget -O - $docker_url | /bin/tar xz -C /tmp", - require => Package["wget"], - } - file { "/etc/init/dockerd.conf": mode => 600, owner => "root", group => "root", content => template("docker/dockerd.conf"), - require => Exec["copy-docker-bin"], } - file { "/home/vagrant": - ensure => directory, - mode => 644, - require => User["vagrant"], + file { "/opt/go": + owner => $vagrant_user, + group => $vagrant_user, + recurse => true, } - file { "/home/vagrant/.profile": + file { "${vagrant_home}/.profile": mode => 644, - owner => "vagrant", - group => "vagrant", + owner => $vagrant_user, + group => $vagrant_user, content => template("docker/profile"), - require => File["/home/vagrant"], } - exec { "copy-docker-bin" : - command => "/usr/bin/sudo /bin/cp -f /tmp/docker-master/docker /usr/local/bin/", - require => [ Exec["fetch-docker"], File["/usr/local/bin"] ], + exec { "build-docker" : + cwd => "/opt/go/src/github.com/dotcloud/docker", + user => $vagrant_user, + environment => "GOPATH=/opt/go", + command => "/usr/local/go/bin/go get -v ./... && /usr/local/go/bin/go install ./docker", + creates => "/opt/go/bin/docker", + logoutput => "on_failure", + require => [ Exec["fetch-go"], File["/opt/go"] ], } service { "dockerd" : ensure => "running", start => "/sbin/initctl start dockerd", stop => "/sbin/initctl stop dockerd", - require => File["/etc/init/dockerd.conf"], + require => [ Exec["build-docker"], File["/etc/init/dockerd.conf"] ], name => "dockerd", provider => "base" } diff --git a/puppet/modules/docker/templates/dockerd.conf b/puppet/modules/docker/templates/dockerd.conf index f88d5c347f..3abb798c2b 100644 --- a/puppet/modules/docker/templates/dockerd.conf +++ b/puppet/modules/docker/templates/dockerd.conf @@ -8,5 +8,5 @@ respawn script test -f /etc/default/locale && . /etc/default/locale || true - LANG=$LANG LC_ALL=$LANG /usr/local/bin/docker -d >> /var/log/dockerd 2>&1 + LANG=$LANG LC_ALL=$LANG /opt/go/bin/docker -d >> /var/log/dockerd 2>&1 end script diff --git a/puppet/modules/docker/templates/profile b/puppet/modules/docker/templates/profile index c52d87387c..319c9c5be8 100644 --- a/puppet/modules/docker/templates/profile +++ b/puppet/modules/docker/templates/profile @@ -21,7 +21,10 @@ if [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH" fi -# set ~/docker as the go path -export GOPATH=~/docker -# add go to the PATH -export PATH=$PATH:/usr/local/go/bin \ No newline at end of file +export GOPATH=/opt/go +export PATH=$PATH:/usr/local/go/bin:$GOPATH/bin + +docker=/opt/go/src/github.com/dotcloud/docker +if [ -d $docker ]; then + cd $docker +fi