### About
-- [Docker](https://www.docker.io/) is an open source project to pack, ship and run any Linux application in a lighter weight, faster container than a traditional virtual machine.
+- [Docker](https://docker.com/) is an open source project to pack, ship and run any Linux application in a lighter weight, faster container than a traditional virtual machine.
- Docker makes it much easier to deploy [a Discourse forum](https://github.com/discourse/discourse) on your servers and keep it updated. For background, see [Sam's blog post](http://samsaffron.com/archive/2013/11/07/discourse-in-a-docker-container).
- The templates and base image configure Discourse with the Discourse team's recommended optimal defaults.
-
-### IMPORTANT: Before You Start
-
-1. Make sure you're running a **64 bit** version of either [Ubuntu 12.04 LTS](http://releases.ubuntu.com/precise/), or [Ubuntu 14.04 LTS](http://releases.ubuntu.com/14.04/).
-1. Upgrade to the [latest version of Docker](http://docs.docker.io/en/latest/installation/ubuntulinux/).
-1. Create a directory for Discourse Docker (the expected path is `/var/docker`): `install -g docker -m 2775 -d /var/docker`
-1. Run the docker installation and launcher as **root** or a member of the **docker** group.
-1. Add your user account to the docker group: `usermod -a -G docker yourusername` and re-login.
-
-If you do not do any of the above, as RoboCop once said, ["there will be… trouble."](http://www.youtube.com/watch?v=XxarhampSNI) *Please double check the above list before proceeding!*
-
### Getting Started
-The simplest way to get started is the **standalone** template:
-
-1. **Clone** this project from github into `/var/docker` on your server: `git clone https://github.com/discourse/discourse_docker.git /var/docker`
-2. **Copy** the standalone sample into the containers directory: `cp samples/standalone.yml containers/app.yml`
-3. **Edit** `containers/app.yml` with your environment specific information
- - [bindings](#expose)
- - [volumes](#volumes)
-4. **Bootstrap** the image: `sudo ./launcher bootstrap app`
-5. **Start** the image: `sudo ./launcher start app`
+The simplest way to get started is via the **standalone** template, which can be installed in 30 minutes or less. For detailed install instructions, see
-Note: you can add yourself to the Docker group if you wish to avoid `sudo` with `usermod -aG docker <your-user-name>`.
+https://github.com/discourse/discourse/blob/master/docs/INSTALL-cloud.md
### Directory Structure
#### `/samples`
-Sample container definitions you may use to bootstrap your environment. You can copy and amend templates here into the containers directory.
+Sample container definitions you may use to bootstrap your environment. You can copy templates from here into the containers directory.
#### `/shared`
#### `/templates`
-[pups](https://github.com/samsaffron/pups) managed pups templates you may use to bootstrap your environment.
+[pups](https://github.com/samsaffron/pups)-managed templates you may use to bootstrap your environment.
#### `/image`
-Dockerfile for both the base image `samsaffron/discourse_base` and discourse image `samsaffron/discourse`.
-
-- `samsaffron/discourse_base` contains all the OS dependencies including sshd, runit, postgres, nginx, ruby.
+Dockerfiles for Discourse; see [the README](image/README.md) for further details.
-- `samsaffron/discourse` builds on the base image and configures a discourse user and `/var/www/discourse` directory for the Discourse source.
-
-The Docker repository will always contain the latest built version at: https://index.docker.io/u/samsaffron/discourse/ , you should not need to build the base image.
+The Docker repository will always contain the latest built version at: https://hub.docker.com/r/discourse/base/, you should not need to build the base image.
### Launcher
-The base directory contains a single bash script which is used to manage containers. You can use it to "bootstrap" a new container, ssh in, start, stop and destroy a container.
+The base directory contains a single bash script which is used to manage containers. You can use it to "bootstrap" a new container, enter, start, stop and destroy a container.
```
-Usage: launcher COMMAND CONFIG
+Usage: launcher COMMAND CONFIG [--skip-prereqs]
Commands:
start: Start/initialize a container
stop: Stop a running container
restart: Restart a container
destroy: Stop and remove a container
- ssh: Start a bash shell in a running container
+ enter: Use docker exec to enter a container
logs: Docker logs for container
+ memconfig: Configure sane defaults for available RAM
bootstrap: Bootstrap a container for the config based on a template
+ rebuild: Rebuild a container (destroy old, bootstrap, start new)
```
+If the environment variable "SUPERVISED" is set to true, the container won't be detached, allowing a process monitoring tool to manage the restart behaviour of the container.
### Container Configuration
-The beginning of the container definition will contain 3 "special" sections:
+The beginning of the container definition can contain the following "special" sections:
#### templates:
- "templates/postgres.template.yml"
```
-This template is "composed" out of all these child templates, this allows for a very flexible configuration struture. Furthermore you may add specific hooks that extend the templates you reference.
+This template is "composed" out of all these child templates, this allows for a very flexible configuration structure. Furthermore you may add specific hooks that extend the templates you reference.
#### expose:
- "127.0.0.1:20080:80"
```
-Expose port 22 inside the container on port 2222 on ALL local host interfaces. In order to bind to only one interface, you may specify the host's IP address as `([<host_interface>:[host_port]])|(<host_port>):]<container_port>[/udp]` as defined in the [docker port binding documentation](http://docs.docker.io/en/latest/use/port_redirection/)
+Expose port 22 inside the container on port 2222 on ALL local host interfaces. In order to bind to only one interface, you may specify the host's IP address as `([<host_interface>:[host_port]])|(<host_port>):<container_port>[/udp]` as defined in the [docker port binding documentation](http://docs.docker.com/userguide/dockerlinks/)
#### volumes:
```
volumes:
- volume:
- host: /var/docker/shared
+ host: /var/discourse/shared
guest: /shared
```
-Expose a directory inside the host inside the container.
+Expose a directory inside the host to the container.
+
+#### links:
+```
+links:
+ - link:
+ name: postgres
+ alias: postgres
+```
+
+Links another container to the current container. This will add `--link postgres:postgres`
+to the options when running the container.
+
+#### labels:
+```
+# app.yml
+
+labels:
+ monitor: 'true'
+ app_name: {{config}}_discourse
+```
+
+Add labels to the current container. The above will add `--l monitor=true -l app_name=dev_discourse` to the options
+when running the container
### Upgrading Discourse
The Docker setup gives you multiple upgrade options:
-1. Use the front end at http://yoursite.com/admin/docker to upgrade an already running image.
+1. Use the front end at http://yoursite.com/admin/upgrade to upgrade an already running image.
-2. Create a new base image by running:
- - `./launcher destroy my_image`
- - `./launcher bootstrap my_image`
- - `./launcher start my_image`
+2. Create a new base image manually by running:
+ - `./launcher rebuild my_image`
### Single Container vs. Multiple Container
### Troubleshooting
-You can ssh into your container using `./launcher ssh my_container`, we will automatically set up ssh access during bootstrap.
+View the container logs: `./launcher logs my_container`
+
+Spawn a shell inside your container using `./launcher enter my_container`. This is the most foolproof method if you have host root access.
-You can spawn a shell inside your container using `./launcher enter my_container`. This is the most foolproof method if you have local root access.
+If you see network errors trying to retrieve code from `github.com` or `rubygems.org` try again - sometimes there are temporary interruptions and a retry is all it takes.
Behind a proxy network with no direct access to the Internet? Add proxy information to the container environment by adding to the existing `env` block in the `container.yml` file:
+
```yaml
env:
- …existing info…
+ …existing entries…
HTTP_PROXY: http://proxyserver:port/
http_proxy: http://proxyserver:port/
HTTPS_PROXY: http://proxyserver:port/
- [Setting up SSL with Discourse Docker](https://meta.discourse.org/t/allowing-ssl-for-your-discourse-docker-setup/13847)
- [Multisite configuration with Docker](https://meta.discourse.org/t/multisite-configuration-with-docker/14084)
+- [Linking containers for a multiple container setup](https://meta.discourse.org/t/linking-containers-for-a-multiple-container-setup/20867)
+- [Using Rubygems mirror to improve connection problem in China](https://meta.discourse.org/t/replace-rubygems-org-with-taobao-mirror-to-resolve-network-error-in-china/21988/1)
+
+### Developing with Vagrant
+
+If you are looking to make modifications to this repository, you can easily test
+out your changes before committing, using the magic of
+[Vagrant](http://vagrantup.com). Install Vagrant as per [the default
+instructions](http://docs.vagrantup.com/v2/installation/index.html), and
+then run:
+
+ vagrant up
+
+This will spawn a new Ubuntu VM, install Docker, and then await your
+instructions. You can then SSH into the VM with `vagrant ssh`, become
+`root` with `sudo -i`, and then you're right to go. Your live git repo is
+already available at `/vagrant`, so you can just `cd /vagrant`
+and then start running `launcher`.
+
License
===