You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
-[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.
4
6
5
7
- 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).
6
8
7
9
- The templates and base image configure Discourse with the Discourse team's recommended optimal defaults.
8
10
9
-
###Getting Started
11
+
## Getting Started
10
12
11
13
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
Contains container ids for currently running Docker containers. cids are Docker's "equivalent" of pids. Each container will have a unique git like hash.
20
22
21
-
####`/containers`
23
+
### `/containers`
22
24
23
25
This directory is for container definitions for your various Discourse containers. You are in charge of this directory, it ships empty.
24
26
25
-
####`/samples`
27
+
### `/samples`
26
28
27
29
Sample container definitions you may use to bootstrap your environment. You can copy templates from here into the containers directory.
28
30
29
-
####`/shared`
31
+
### `/shared`
30
32
31
33
Placeholder spot for shared volumes with various Discourse containers. You may elect to store certain persistent information outside of a container, in our case we keep various logfiles and upload directory outside. This allows you to rebuild containers easily without losing important information. Keeping uploads outside of the container allows you to share them between multiple web instances.
32
34
33
-
####`/templates`
35
+
### `/templates`
34
36
35
-
[pups](https://github.com/samsaffron/pups)-managed templates you may use to bootstrap your environment.
37
+
[pups](https://github.com/discourse/pups)-managed templates you may use to bootstrap your environment.
36
38
37
-
####`/image`
39
+
### `/image`
38
40
39
41
Dockerfiles for Discourse; see [the README](image/README.md) for further details.
40
42
41
43
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.
42
44
43
-
###Launcher
45
+
## Launcher
44
46
45
47
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.
memconfig: Configure sane defaults for available RAM
57
-
bootstrap: Bootstrap a container for the config based on a template
58
-
rebuild: Rebuild a container (destroy old, bootstrap, start new)
52
+
start: Start/initialize a container
53
+
stop: Stop a running container
54
+
restart: Restart a container
55
+
destroy: Stop and remove a container
56
+
enter: Open a shell to run commands inside the container
57
+
logs: View the Docker logs for a container
58
+
bootstrap: Bootstrap a container for the config based on a template
59
+
run: Run the given command with the config in the context of the last bootstrapped image
60
+
rebuild: Rebuild a container (destroy old, bootstrap, start new)
61
+
cleanup: Remove all containers that have stopped for > 24 hours
62
+
start-cmd: Generate docker command used to start container
59
63
```
60
64
61
65
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.
62
66
63
-
### Container Configuration
67
+
## Container Configuration
64
68
65
69
The beginning of the container definition can contain the following "special" sections:
66
70
67
-
#### templates:
71
+
### templates:
68
72
69
73
```yaml
70
74
templates:
71
-
- "templates/cron.template.yml"
72
-
- "templates/postgres.template.yml"
75
+
- 'templates/cron.template.yml'
76
+
- 'templates/postgres.template.yml'
73
77
```
74
78
75
79
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.
76
80
77
-
#### expose:
81
+
### expose:
78
82
79
83
```yaml
80
84
expose:
81
-
- "2222:22"
82
-
- "127.0.0.1:20080:80"
85
+
- '2222:22'
86
+
- '127.0.0.1:20080:80'
83
87
```
84
88
85
89
Publish 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/). To expose a port without publishing it, specify only the port number (e.g., `80`).
86
90
87
-
88
-
#### volumes:
91
+
### volumes:
89
92
90
93
```yaml
91
94
volumes:
92
95
- volume:
93
-
host: /var/discourse/shared
94
-
guest: /shared
95
-
96
+
host: /var/discourse/shared
97
+
guest: /shared
96
98
```
97
99
98
100
Expose a directory inside the host to the container.
99
101
100
-
#### links:
102
+
### links:
101
103
102
104
```yaml
103
105
links:
104
106
- link:
105
-
name: postgres
106
-
alias: postgres
107
+
name: postgres
108
+
alias: postgres
107
109
```
108
110
109
111
Links another container to the current container. This will add `--link postgres:postgres`
110
112
to the options when running the container.
111
113
112
-
#### environment variables:
114
+
### environment variables:
113
115
114
116
Setting environment variables to the current container.
115
117
116
118
```yaml
117
-
# app.yml
118
-
119
119
env:
120
120
DISCOURSE_DB_HOST: some-host
121
-
DISCOURSE_DB_NAME: "{{config}}_discourse"
121
+
DISCOURSE_DB_NAME: '{{config}}_discourse'
122
122
```
123
123
124
124
The above will add `-e DISCOURSE_DB_HOST=some-host -e DISCOURSE_DB_NAME=app_discourse` to the options when running the container.
125
125
126
-
#### labels:
126
+
### labels:
127
127
128
128
```yaml
129
-
# app.yml
130
-
131
129
labels:
132
-
monitor: "true"
133
-
app_name: "{{config}}_discourse"
130
+
monitor: 'true'
131
+
app_name: '{{config}}_discourse'
134
132
```
135
133
136
134
Add labels to the current container. The above will add `--l monitor=true -l app_name=dev_discourse` to the options
137
135
when running the container
138
136
139
-
### Upgrading Discourse
137
+
## Upgrading Discourse
140
138
141
139
The Docker setup gives you multiple upgrade options:
142
140
143
141
1. Use the front end at http://yoursite.com/admin/upgrade to upgrade an already running image.
144
142
145
143
2. Create a new base image manually by running:
146
-
-`./launcher rebuild my_image`
144
+
`./launcher rebuild my_image`
147
145
148
-
### Single Container vs. Multiple Container
146
+
## Single Container vs. Multiple Containers
149
147
150
148
The samples directory contains a standalone template. This template bundles all of the software required to run Discourse into a single container. The advantage is that it is easy.
151
149
@@ -158,14 +156,14 @@ The multiple container configuration setup is far more flexible and robust, howe
158
156
159
157
If you want a multiple container setup, see the `data.yml` and `web_only.yml` templates in the samples directory. To ease this process, `launcher` will inject an env var called `DISCOURSE_HOST_IP` which will be available inside the image.
160
158
161
-
WARNING: In a multiple container configuration, *make sure* you setup iptables or some other firewall to protect various ports (for postgres/redis).
159
+
WARNING: In a multiple container configuration, _make sure_ you setup iptables or some other firewall to protect various ports (for postgres/redis).
162
160
On Ubuntu, install the `ufw` or `iptables-persistent` package to manage firewall rules.
163
161
164
-
### Email
162
+
## Email
165
163
166
164
For a Discourse instance to function properly Email must be set up. Use the `SMTP_URL` env var to set your SMTP address, see sample templates for an example. The Docker image does not contain postfix, exim or another MTA, it was omitted because it is very tricky to set up correctly.
167
165
168
-
### Troubleshooting
166
+
## Troubleshooting
169
167
170
168
View the container logs: `./launcher logs my_container`
171
169
@@ -177,28 +175,27 @@ Behind a proxy network with no direct access to the Internet? Add proxy informat
177
175
178
176
```yaml
179
177
env:
180
-
…existing entries…
181
-
HTTP_PROXY: http://proxyserver:port/
182
-
http_proxy: http://proxyserver:port/
183
-
HTTPS_PROXY: http://proxyserver:port/
184
-
https_proxy: http://proxyserver:port/
178
+
…existing entries…
179
+
HTTP_PROXY: http://proxyserver:port/
180
+
http_proxy: http://proxyserver:port/
181
+
HTTPS_PROXY: http://proxyserver:port/
182
+
https_proxy: http://proxyserver:port/
185
183
```
186
184
187
-
### Security
185
+
## Security
188
186
189
187
Directory permissions in Linux are UID/GID based, if your numeric IDs on the
190
188
host do not match the IDs in the guest, permissions will mismatch. On clean
191
189
installs you can ensure they are in sync by looking at `/etc/passwd` and
192
190
`/etc/group`, the Discourse account will have UID 1000.
193
191
194
-
195
-
### Advanced topics
192
+
## Advanced topics
196
193
197
194
- [Setting up SSL with Discourse Docker](https://meta.discourse.org/t/allowing-ssl-for-your-discourse-docker-setup/13847)
198
195
- [Multisite configuration with Docker](https://meta.discourse.org/t/multisite-configuration-with-docker/14084)
199
196
- [Linking containers for a multiple container setup](https://meta.discourse.org/t/linking-containers-for-a-multiple-container-setup/20867)
200
197
- [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)
0 commit comments