Allow a user to bind to a unix socket

pull/2/head
Michael Crosby 2013-12-30 10:40:08 -08:00
parent efd58156f7
commit 75d5bd1217
3 changed files with 77 additions and 27 deletions

View File

@ -1,25 +1,16 @@
# Dockerfile for DockerUI
FROM ubuntu:12.04
MAINTAINER Michael Crosby http://crosbymichael.com
RUN apt-get update
RUN apt-get upgrade -y
RUN apt-get install -y curl ;\
curl -s https://go.googlecode.com/files/go1.1.2.linux-amd64.tar.gz | tar -v -C /opt -xz ;\
RUN apt-get install -y curl
RUN curl -s https://go.googlecode.com/files/go1.2.linux-amd64.tar.gz | tar -v -C /opt -xz ;\
cp -a /opt/go/* /usr/local/ ;\
rm -rf /opt/go ;\
#RUN
rm -rf /opt/go;
ENV GOROOT /usr/local/
ADD . /app/
WORKDIR /app/
RUN go build dockerui.go
EXPOSE 9000
ENTRYPOINT ["./dockerui"]
ENTRYPOINT ["./dockerui"]

View File

@ -1,4 +1,4 @@
##DockerUI
## DockerUI
![Containers](/containers.png)
DockerUI is a web interface to interact with the Remote API. The goal is to provide a pure client side implementation so it is effortless to connect and manage docker. This project is not complete and is still under heavy development.
@ -13,12 +13,12 @@ DockerUI is a web interface to interact with the Remote API. The goal is to pro
### Container Quickstart
* Run your docker daemon with the following options:
* `docker -d -H="0.0.0.0:4243" -api-enable-cors`
* `docker -d -H="0.0.0.0:4243" -api-enable-cors`
* `docker run -d -p 80:9000 crosbymichael/dockerui -e="http://<dockerd host ip>:4243"`
* Open your browser to `http://<dockerd host ip>`
###Setup
### Setup
1. Make sure that you are running dockerd ( docker -d ) with the -H and [-api-enable-cors](http://docs.docker.io/en/latest/api/docker_remote_api_v1.2/#cors-requests) so that the UI can make requests to the Remote API.
@ -37,14 +37,21 @@ DockerUI is a web interface to interact with the Remote API. The goal is to pro
5. Everything should be good to go, if you experience any issues please report them on this repository.
###Stack
### Connect via a unix socket
If you want to connect to docker via the unix socket you can pass the socket path to the `-e` variable. If you are running dockerui in a container you can bind mount the unix socket into the container.
```bash
docker run -d -p 9000:9000 -v /var/run/docker.sock:/docker.sock dockerui -e /docker.sock
```
### Stack
* Angular.js
* Flatstrap ( Flat Twitter Bootstrap )
* Spin.js
* Ace editor
###Todo:
### Todo:
* Multiple endpoints
* Full repository support
* Search
@ -53,7 +60,7 @@ DockerUI is a web interface to interact with the Remote API. The goal is to pro
* Authentication and Authorization
###License - MIT
### License - MIT
The DockerUI code is licensed under the MIT license. Flatstrap(bootstrap) is licensed under the Apache License v2.0 and Angular.js is licensed under MIT.

View File

@ -2,10 +2,13 @@ package main
import (
"flag"
"io"
"log"
"net"
"net/http"
"net/http/httputil"
"net/url"
"strings"
)
var (
@ -14,20 +17,69 @@ var (
assets = flag.String("a", ".", "Path to the assets")
)
func createHandler(dir string, dockerEndpoint string) http.Handler {
mux := http.NewServeMux()
type UnixHandler struct {
path string
}
fileHandler := http.FileServer(http.Dir(dir))
u, err := url.Parse(dockerEndpoint)
func (h *UnixHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
conn, err := net.Dial("unix", h.path)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
log.Println(err)
return
}
c := httputil.NewClientConn(conn, nil)
defer c.Close()
res, err := c.Do(r)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
log.Println(err)
return
}
defer res.Body.Close()
copyHeader(w.Header(), res.Header)
if _, err := io.Copy(w, res.Body); err != nil {
log.Println(err)
}
}
func copyHeader(dst, src http.Header) {
for k, vv := range src {
for _, v := range vv {
dst.Add(k, v)
}
}
}
func createTcpHandler(e string) http.Handler {
u, err := url.Parse(e)
if err != nil {
log.Fatal(err)
return nil
}
reverseProxy := httputil.NewSingleHostReverseProxy(u)
return httputil.NewSingleHostReverseProxy(u)
}
mux.Handle("/dockerapi/", http.StripPrefix("/dockerapi", reverseProxy))
func createUnixHandler(e string) http.Handler {
return &UnixHandler{e}
}
func createHandler(dir string, e string) http.Handler {
var (
mux = http.NewServeMux()
fileHandler = http.FileServer(http.Dir(dir))
h http.Handler
)
if strings.Contains(e, "http") {
h = createTcpHandler(e)
} else {
h = createUnixHandler(e)
}
mux.Handle("/dockerapi/", http.StripPrefix("/dockerapi", h))
mux.Handle("/", fileHandler)
return mux
}