mirror of
https://github.com/bingohuang/docker-labs.git
synced 2025-07-17 04:27:27 +08:00
Merge pull request #4 from alexellis/ulimit_experimental
Experimental ulimit implementation and README.md
This commit is contained in:
commit
429a5f9014
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
play-with-docker
|
||||||
|
|
30
README.md
30
README.md
@ -1 +1,29 @@
|
|||||||
# play-with-docker
|
# play-with-docker
|
||||||
|
|
||||||
|
Play With Docker gives you the experience of having a free Alpine Linux Virtual Machine in the cloud
|
||||||
|
where you can build and run Docker containers and even create clusters with Docker features like Swarm Mode.
|
||||||
|
|
||||||
|
Under the hood DIND or Docker-in-Docker is used to give the effect of multiple VMs/PCs.
|
||||||
|
|
||||||
|
A live version is available at: http://play-with-docker.com/
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
Start the Docker daemon on your machine and run `docker pull docker:1.12.2-rc2-dind`.
|
||||||
|
|
||||||
|
1) Install go 1.7.1 with `brew` on Mac or through a package manager.
|
||||||
|
|
||||||
|
2) `go get`
|
||||||
|
|
||||||
|
3) `go build`
|
||||||
|
|
||||||
|
4) Run the binary produced as `play-with-docker`
|
||||||
|
|
||||||
|
5) Point to http://localhost:3000/ and click "New Instance"
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
|
||||||
|
* There is a hard-coded limit to 5 Docker playgrounds per session. After 1 hour sessions are deleted.
|
||||||
|
* If you want to override the DIND version or image then set the environmental variable i.e.
|
||||||
|
`DIND_IMAGE=docker:dind`
|
||||||
|
|
||||||
|
@ -29,10 +29,14 @@ func GetContainerInfo(id string) (types.ContainerJSON, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func CreateNetwork(name string) error {
|
func CreateNetwork(name string) error {
|
||||||
|
// TODO: This line appears to give an error when running on localhost:3000
|
||||||
|
// when driver is specified a name must be given.
|
||||||
opts := types.NetworkCreate{Attachable: true, Driver: "overlay"}
|
opts := types.NetworkCreate{Attachable: true, Driver: "overlay"}
|
||||||
_, err := c.NetworkCreate(context.Background(), name, opts)
|
_, err := c.NetworkCreate(context.Background(), name, opts)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
log.Printf("Starting session err [%s]\n", err)
|
||||||
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -70,10 +74,14 @@ func AttachExecConnection(execId string, ctx context.Context) (*types.HijackedRe
|
|||||||
return &conn, nil
|
return &conn, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func CreateInstance(net string) (*ptypes.Instance, error) {
|
func CreateInstance(net string, dindImage string) (*ptypes.Instance, error) {
|
||||||
|
|
||||||
|
var maximumPidLimit int64
|
||||||
|
maximumPidLimit = 150 // Set a ulimit value to prevent misuse
|
||||||
h := &container.HostConfig{NetworkMode: container.NetworkMode(net), Privileged: true}
|
h := &container.HostConfig{NetworkMode: container.NetworkMode(net), Privileged: true}
|
||||||
conf := &container.Config{Image: "docker:dind"}
|
h.Resources.PidsLimit = maximumPidLimit
|
||||||
|
|
||||||
|
conf := &container.Config{Image: dindImage}
|
||||||
container, err := c.ContainerCreate(context.Background(), conf, h, nil, "")
|
container, err := c.ContainerCreate(context.Background(), conf, h, nil, "")
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -1,19 +1,37 @@
|
|||||||
package services
|
package services
|
||||||
|
|
||||||
import "github.com/franela/play-with-docker/types"
|
import (
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/franela/play-with-docker/types"
|
||||||
|
)
|
||||||
|
|
||||||
var instances map[string]map[string]*types.Instance
|
var instances map[string]map[string]*types.Instance
|
||||||
|
|
||||||
|
var dindImage string
|
||||||
|
var defaultDindImageName string
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
instances = make(map[string]map[string]*types.Instance)
|
instances = make(map[string]map[string]*types.Instance)
|
||||||
|
dindImage = getDindImageName()
|
||||||
|
}
|
||||||
|
|
||||||
|
func getDindImageName() string {
|
||||||
|
dindImage := os.Getenv("DIND_IMAGE")
|
||||||
|
defaultDindImageName = "docker:1.12.2-rc2-dind"
|
||||||
|
if len(dindImage) == 0 {
|
||||||
|
dindImage = defaultDindImageName
|
||||||
|
}
|
||||||
|
return dindImage
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewInstance(session *types.Session) (*types.Instance, error) {
|
func NewInstance(session *types.Session) (*types.Instance, error) {
|
||||||
//TODO: Validate that a session can only have 10 instances
|
|
||||||
|
|
||||||
|
//TODO: Validate that a session can only have 5 instances
|
||||||
//TODO: Create in redis
|
//TODO: Create in redis
|
||||||
|
log.Printf("NewInstance - using image: [%s]\n", dindImage)
|
||||||
instance, err := CreateInstance(session.Id)
|
instance, err := CreateInstance(session.Id, dindImage)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -18,6 +18,7 @@ func NewSession() (*types.Session, error) {
|
|||||||
s := &types.Session{}
|
s := &types.Session{}
|
||||||
s.Id = uuid.NewV4().String()
|
s.Id = uuid.NewV4().String()
|
||||||
s.Instances = map[string]*types.Instance{}
|
s.Instances = map[string]*types.Instance{}
|
||||||
|
log.Printf("NewSession id=[%s]\n", s.Id)
|
||||||
|
|
||||||
//TODO: Store in something like redis
|
//TODO: Store in something like redis
|
||||||
sessions[s.Id] = s
|
sessions[s.Id] = s
|
||||||
|
Loading…
x
Reference in New Issue
Block a user