on master help sign in
Adds basic getting started docs
6b13d44Deni Bertovic
src/Docker/Client.hs+59−1
@@ -1,13 +1,71 @@
1{-# LANGUAGE ExplicitForAll #-}
1{-# LANGUAGE ExplicitForAll #-}
2{-# LANGUAGE ScopedTypeVariables #-}
2{-# LANGUAGE ScopedTypeVariables #-}
3
3
4+{-|
5+Module : Docker.Client
6+Copyright : (c) Deni Bertovic, 2016
7+License : BSD3
8+Maintainer : deni@denibertovic.com
9+Stability : experimental
10+Portability : POSIX
11+
12+Getting started
13+
14+* Creating a container:
15+
16+We're going to create a nginx container and we're going to map port @80@ from within the container to port @8000@ on
17+the host.
18+
19+@
20+import Docker.Client
21+
22+runNginxContainer :: IO ContainerID
23+runNginxContainer = runDockerT (defaultClientOpts, defaultHttpHandler) $ do
24+ let pb = PortBinding 80 TCP [HostPort "0.0.0.0" 8000]
25+ let myCreateOpts = addPortBinding (defaultCreateOpts "nginx:latest") pb
26+ cid <- createContainer myCreateOpts
27+ case cid of
28+ Left err -> error $ show err
29+ Right i -> do
30+ _ <- startContainer defaultStartOpts i
31+ return i
32+@
33+
34+Let's start out nginx container:
35+
36+>>> cid <- runNginxContainer
37+
38+
39+Visit http://localhost:8000 and verify that nginx is running.
40+
41+Let's stop the container now:
42+
43+@
44+stopNginxContainer :: ContainerID -> IO ()
45+stopNginxContainer cid = runDockerT (defaultClientOpts, defaultHttpHandler) $ do
46+ r <- stopContainer DefaultTimeout cid
47+ case r of
48+ Left err -> error "I failed to stop the container"
49+ Right _ -> return ()
50+@
51+
52+>>> stopNginxContainer cid
53+
54+* Get Docker API Version:
55+
56+>>> runDockerT (defaultClientOpts, defaultHttpHandler) $ getDockerVersion
57+Right (DockerVersion {version = "1.12.0", apiVersion = "1.24", gitCommit = "8eab29e", goVersion = "go1.6.3", os = "linux", arch = "amd64", kernelVersion = "4.6.0-1-amd64", buildTime = "2016-07-28T21:46:40.664812891+00:00"})
58+
59+-}
4module Docker.Client (
60module Docker.Client (
61+ -- * Client functions
5 module Docker.Client.Api
62 module Docker.Client.Api
63+ -- * Types
6 , module Docker.Client.Types
64 , module Docker.Client.Types
65+ -- * Http
7 , module Docker.Client.Http
66 , module Docker.Client.Http
8 ) where
67 ) where
9
68
10import Docker.Client.Api
69import Docker.Client.Api
11import Docker.Client.Http
70import Docker.Client.Http
12import Docker.Client.Types
71import Docker.Client.Types
13−
src/Docker/Client/Types.hs+17−1
@@ -76,6 +76,7 @@ module Docker.Client.Types (
76 , ExposedPorts(..)
76 , ExposedPorts(..)
77 , DeviceWeight(..)
77 , DeviceWeight(..)
78 , DeviceRate(..)
78 , DeviceRate(..)
79+ , addPortBinding
79 ) where
80 ) where
80
81
81import Data.Aeson (FromJSON, ToJSON, genericParseJSON,
82import Data.Aeson (FromJSON, ToJSON, genericParseJSON,
@@ -830,6 +831,11 @@ instance FromJSON PortType where
830newtype PortBindings = PortBindings [PortBinding]
831newtype PortBindings = PortBindings [PortBinding]
831 deriving (Eq, Show)
832 deriving (Eq, Show)
832
833
834+
835+instance Monoid PortBindings where
836+ mempty = PortBindings []
837+ mappend (PortBindings p1) (PortBindings p2) = PortBindings (p1 ++ p2)
838+
833-- { <port>/<protocol>: [{ "HostPort": "<port>" }] }
839-- { <port>/<protocol>: [{ "HostPort": "<port>" }] }
834data PortBinding = PortBinding {
840data PortBinding = PortBinding {
835 containerPort :: Port
841 containerPort :: Port
@@ -837,10 +843,20 @@ data PortBinding = PortBinding {
837 , hostPorts :: [HostPort]
843 , hostPorts :: [HostPort]
838 } deriving (Eq, Show)
844 } deriving (Eq, Show)
839
845
840−
841portAndType2Text :: Port -> PortType -> Text
846portAndType2Text :: Port -> PortType -> Text
842portAndType2Text p t = (T.pack $ show p) <> "/" <> (T.pack $ show t)
847portAndType2Text p t = (T.pack $ show p) <> "/" <> (T.pack $ show t)
843
848
849+-- | A convenience function that adds PortBindings to and exiting
850+-- "CreateOpts" record. Useful with 'defaultCreateOpts'
851+-- Example:
852+--
853+-- >>> let pb = PortBinding 80 TCP [HostPort "0.0.0.0" 8000]
854+-- >>> addPortBinding (defaultCreateOpts "nginx:latest") pb
855+addPortBinding :: CreateOpts -> PortBinding -> CreateOpts
856+addPortBinding c pb = c{hostConfig=hc{portBindings=pbs <> PortBindings [pb]}}
857+ where hc = hostConfig c
858+ pbs = portBindings $ hostConfig c
859+
844instance ToJSON PortBinding where
860instance ToJSON PortBinding where
845 toJSON (PortBinding {..}) = object [portAndType2Text containerPort portType .= hostPorts]
861 toJSON (PortBinding {..}) = object [portAndType2Text containerPort portType .= hostPorts]
846
862