lnd+docker: add "Production" Docker Image

This commit satisfies the auto-build functionality desired in #722 without changing anything in the docker folder. This allows development and testing to continue to build and use images locally, but external users get a very lean Docker image they can use. The size difference is appreciable.

REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
lnd                            latest              3634dcf5df68        17 seconds ago      1.19GB
lnd-single                     latest              b295cc248447        30 minutes ago      56MB
Right before merging this PR, an Automated Build repository should be configured on the appropriate account (lightningnetwork?) on Docker Hub with the name of lnd in order to match documentation.

I see there are already some repositories created, however I think best practice for Docker is to have a single repository and different tags for different architectures. The included image is based off of Alpine, but in the future we could extend into multiple Dockerfiles (example: ARM support, or being Ubuntu based).

So in this proposed scenario, lightningnetwork/lnd:latest would be alpine, but lightningnetwork/lnd:ubuntu would be an ubuntu-based image, for example.

(With thanks to @alingenhag for https://github.com/f-u-z-z-l-e/docker-lnd/ from which I borrowed heavily)
This commit is contained in:
tyzbit 2018-05-16 21:50:25 -04:00 committed by Olaoluwa Osuntokun
parent d0c0e5c7c2
commit fbc722147f
3 changed files with 108 additions and 5 deletions

33
Dockerfile Normal file

@ -0,0 +1,33 @@
FROM golang:alpine as builder
# Force Go to use the cgo based DNS resolver. This is required to ensure DNS
# queries required to connect to linked containers succeed.
ENV GODEBUG netdns=cgo
# Install dependencies and build the binaries.
RUN apk add --no-cache \
git \
make \
&& git clone https://github.com/lightningnetwork/lnd /go/src/github.com/lightningnetwork/lnd \
&& cd /go/src/github.com/lightningnetwork/lnd \
&& make \
&& make install
# Start a new, final image.
FROM alpine as final
# Define a root volume for data persistence.
VOLUME /root/.lnd
# Add bash and ca-certs, for quality of life and SSL-related reasons.
RUN apk --no-cache add \
bash \
ca-certificates
# Copy the binaries from the builder image.
COPY --from=builder /go/bin/lncli /bin/
COPY --from=builder /go/bin/lnd /bin/
# Specify the start command and entrypoint as the lnd daemon.
ENTRYPOINT ["lnd"]
CMD ["lnd"]

@ -67,6 +67,9 @@ discuss various aspects of `lnd` and also Lightning in general.
In order to build from source, please see [the installation
instructions](docs/INSTALL.md).
## Docker
To run lnd from Docker, please see the main [Docker instructions](docs/DOCKER.md)
## IRC
* irc.freenode.net
* channel #lnd

67
docs/DOCKER.md Normal file

@ -0,0 +1,67 @@
# Docker Instructions
## Development/testing
For development or testing, or to spin up a `btcd` backend alongside `lnd`,
check out the documentation at [docker/README.md](docker/README.md).
## Production
To use Docker in a production environment, you can run `lnd` by first creating
a Docker container, adding the appropriate command-line options as parameters.
```
$ docker create --name=lnd lightninglabs/lnd [command-line options]
```
Then, just start the container:
```
$ docker start lnd
```
## Volumes
A Docker volume will be created with your `.lnd` directory automatically, and will
persist through container restarts.
You can also optionally manually specify a local folder to be used as a volume:
```
$ docker create --name=lnd -v /media/lnd-docker/:/root/.lnd lightninglabs/lnd [command-line options]
```
## Example
Here is an example testnet `lnd` that uses Neutrino:
```
$ docker create --name lnd-testnet lightninglabs/lnd --bitcoin.active --bitcoin.testnet --bitcoin.node=neutrino --neutrino.connect=faucet.lightning.community
```
Start the container:
```
$ docker start lnd-testnet
```
Create a wallet (and write down the seed):
```
$ docker exec -it lnd-testnet lncli create
```
Confirm `lnd` has begun to synchronize:
```
$ docker logs lnd-testnet
[snipped]
2018-05-01 02:28:01.201 [INF] RPCS: RPC server listening on 127.0.0.1:10009
2018-05-01 02:28:01.201 [INF] LTND: Waiting for chain backend to finish sync, start_height=2546
2018-05-01 02:28:01.201 [INF] RPCS: gRPC proxy started at 127.0.0.1:8080
2018-05-01 02:28:08.999 [INF] LNWL: Caught up to height 10000
2018-05-01 02:28:09.872 [INF] BTCN: Processed 10547 blocks in the last 10.23s (height 10547, 2012-05-28 05:02:32 +0000 UTC)
```
This is a simple example, it is possible to use any command-line options necessary
to expose RPC ports, use `btcd` or `bitcoind`, or add additional chains.