2018-02-05 16:05:59 -05:00
|
|
|
package daemon // import "github.com/docker/docker/daemon"
|
2014-08-07 23:01:55 -04:00
|
|
|
|
|
|
|
import (
|
2016-11-16 16:30:29 -05:00
|
|
|
"fmt"
|
2014-08-07 23:01:55 -04:00
|
|
|
"os"
|
|
|
|
"runtime"
|
2017-05-16 19:56:56 -04:00
|
|
|
"strings"
|
2015-03-10 14:25:47 -04:00
|
|
|
"time"
|
2014-08-07 23:01:55 -04:00
|
|
|
|
2016-11-02 13:04:39 -04:00
|
|
|
"github.com/docker/docker/api"
|
2016-09-06 14:18:12 -04:00
|
|
|
"github.com/docker/docker/api/types"
|
2016-12-12 03:33:58 -05:00
|
|
|
"github.com/docker/docker/cli/debug"
|
2017-04-11 17:21:21 -04:00
|
|
|
"github.com/docker/docker/daemon/logger"
|
2015-11-09 13:32:46 -05:00
|
|
|
"github.com/docker/docker/dockerversion"
|
2015-03-29 17:17:23 -04:00
|
|
|
"github.com/docker/docker/pkg/fileutils"
|
2014-08-07 23:01:55 -04:00
|
|
|
"github.com/docker/docker/pkg/parsers/kernel"
|
|
|
|
"github.com/docker/docker/pkg/parsers/operatingsystem"
|
2015-11-14 17:03:02 -05:00
|
|
|
"github.com/docker/docker/pkg/platform"
|
2015-08-06 07:54:48 -04:00
|
|
|
"github.com/docker/docker/pkg/sysinfo"
|
2014-10-24 18:48:23 -04:00
|
|
|
"github.com/docker/docker/pkg/system"
|
2014-08-07 23:01:55 -04:00
|
|
|
"github.com/docker/docker/registry"
|
2016-02-16 13:05:05 -05:00
|
|
|
"github.com/docker/go-connections/sockets"
|
2017-07-26 17:42:13 -04:00
|
|
|
"github.com/sirupsen/logrus"
|
2014-08-07 23:01:55 -04:00
|
|
|
)
|
|
|
|
|
2015-07-30 17:01:53 -04:00
|
|
|
// SystemInfo returns information about the host server the daemon is running on.
|
2015-09-29 13:51:40 -04:00
|
|
|
func (daemon *Daemon) SystemInfo() (*types.Info, error) {
|
2014-08-07 23:01:55 -04:00
|
|
|
kernelVersion := "<unknown>"
|
2016-03-11 10:08:25 -05:00
|
|
|
if kv, err := kernel.GetKernelVersion(); err != nil {
|
|
|
|
logrus.Warnf("Could not get kernel version: %v", err)
|
|
|
|
} else {
|
2014-08-07 23:01:55 -04:00
|
|
|
kernelVersion = kv.String()
|
|
|
|
}
|
|
|
|
|
|
|
|
operatingSystem := "<unknown>"
|
2016-03-11 10:08:25 -05:00
|
|
|
if s, err := operatingsystem.GetOperatingSystem(); err != nil {
|
|
|
|
logrus.Warnf("Could not get operating system name: %v", err)
|
|
|
|
} else {
|
2014-08-07 23:01:55 -04:00
|
|
|
operatingSystem = s
|
|
|
|
}
|
2015-04-27 11:38:01 -04:00
|
|
|
|
|
|
|
// Don't do containerized check on Windows
|
|
|
|
if runtime.GOOS != "windows" {
|
|
|
|
if inContainer, err := operatingsystem.IsContainerized(); err != nil {
|
|
|
|
logrus.Errorf("Could not determine if daemon is containerized: %v", err)
|
|
|
|
operatingSystem += " (error determining if containerized)"
|
|
|
|
} else if inContainer {
|
|
|
|
operatingSystem += " (containerized)"
|
|
|
|
}
|
2014-08-07 23:01:55 -04:00
|
|
|
}
|
|
|
|
|
2014-10-24 18:48:23 -04:00
|
|
|
meminfo, err := system.ReadMemInfo()
|
|
|
|
if err != nil {
|
2015-03-26 18:22:04 -04:00
|
|
|
logrus.Errorf("Could not read system memory info: %v", err)
|
2016-07-12 15:30:21 -04:00
|
|
|
meminfo = &system.MemInfo{}
|
2014-10-24 18:48:23 -04:00
|
|
|
}
|
|
|
|
|
2015-10-09 02:57:47 -04:00
|
|
|
sysInfo := sysinfo.New(true)
|
2017-02-09 21:57:35 -05:00
|
|
|
cRunning, cPaused, cStopped := stateCtr.get()
|
2015-10-27 16:12:33 -04:00
|
|
|
|
2016-11-16 16:30:29 -05:00
|
|
|
securityOptions := []string{}
|
2016-03-29 00:10:37 -04:00
|
|
|
if sysInfo.AppArmor {
|
2016-11-16 16:30:29 -05:00
|
|
|
securityOptions = append(securityOptions, "name=apparmor")
|
2016-03-29 00:10:37 -04:00
|
|
|
}
|
2016-07-08 18:54:48 -04:00
|
|
|
if sysInfo.Seccomp && supportsSeccomp {
|
2016-09-02 09:20:54 -04:00
|
|
|
profile := daemon.seccompProfilePath
|
|
|
|
if profile == "" {
|
|
|
|
profile = "default"
|
|
|
|
}
|
2016-11-16 16:30:29 -05:00
|
|
|
securityOptions = append(securityOptions, fmt.Sprintf("name=seccomp,profile=%s", profile))
|
2016-03-29 00:10:37 -04:00
|
|
|
}
|
|
|
|
if selinuxEnabled() {
|
2016-11-16 16:30:29 -05:00
|
|
|
securityOptions = append(securityOptions, "name=selinux")
|
2016-03-29 00:10:37 -04:00
|
|
|
}
|
2017-05-31 17:56:23 -04:00
|
|
|
rootIDs := daemon.idMappings.RootPair()
|
2017-05-19 18:06:46 -04:00
|
|
|
if rootIDs.UID != 0 || rootIDs.GID != 0 {
|
2016-11-16 16:30:29 -05:00
|
|
|
securityOptions = append(securityOptions, "name=userns")
|
2016-10-27 18:35:51 -04:00
|
|
|
}
|
2016-03-29 00:10:37 -04:00
|
|
|
|
2017-08-24 14:48:16 -04:00
|
|
|
var ds [][2]string
|
2017-05-16 19:56:56 -04:00
|
|
|
drivers := ""
|
2018-02-07 15:52:47 -05:00
|
|
|
statuses := daemon.imageService.LayerStoreStatus()
|
2017-08-24 14:48:16 -04:00
|
|
|
for os, gd := range daemon.graphDrivers {
|
2018-02-02 17:18:46 -05:00
|
|
|
ds = append(ds, statuses[os]...)
|
2017-08-24 14:48:16 -04:00
|
|
|
drivers += gd
|
|
|
|
if len(daemon.graphDrivers) > 1 {
|
|
|
|
drivers += fmt.Sprintf(" (%s) ", os)
|
2017-05-16 19:56:56 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
drivers = strings.TrimSpace(drivers)
|
2017-08-24 14:48:16 -04:00
|
|
|
|
2016-11-16 16:30:29 -05:00
|
|
|
v := &types.Info{
|
2015-04-10 13:26:30 -04:00
|
|
|
ID: daemon.ID,
|
2017-08-24 13:11:44 -04:00
|
|
|
Containers: cRunning + cPaused + cStopped,
|
|
|
|
ContainersRunning: cRunning,
|
|
|
|
ContainersPaused: cPaused,
|
|
|
|
ContainersStopped: cStopped,
|
2018-02-02 17:18:46 -05:00
|
|
|
Images: daemon.imageService.CountImages(),
|
2017-05-16 19:56:56 -04:00
|
|
|
Driver: drivers,
|
2017-08-24 14:48:16 -04:00
|
|
|
DriverStatus: ds,
|
2015-10-23 02:08:26 -04:00
|
|
|
Plugins: daemon.showPluginsInfo(),
|
2015-08-06 07:54:48 -04:00
|
|
|
IPv4Forwarding: !sysInfo.IPv4ForwardingDisabled,
|
2016-02-26 13:47:43 -05:00
|
|
|
BridgeNfIptables: !sysInfo.BridgeNFCallIPTablesDisabled,
|
|
|
|
BridgeNfIP6tables: !sysInfo.BridgeNFCallIP6TablesDisabled,
|
2016-12-12 03:33:58 -05:00
|
|
|
Debug: debug.IsEnabled(),
|
2015-04-10 13:26:30 -04:00
|
|
|
NFd: fileutils.GetTotalUsedFds(),
|
|
|
|
NGoroutines: runtime.NumGoroutine(),
|
|
|
|
SystemTime: time.Now().Format(time.RFC3339Nano),
|
|
|
|
LoggingDriver: daemon.defaultLogConfig.Type,
|
2016-02-18 05:10:31 -05:00
|
|
|
CgroupDriver: daemon.getCgroupDriver(),
|
2015-04-10 13:26:30 -04:00
|
|
|
NEventsListener: daemon.EventsService.SubscribersCount(),
|
|
|
|
KernelVersion: kernelVersion,
|
|
|
|
OperatingSystem: operatingSystem,
|
2015-07-21 15:40:36 -04:00
|
|
|
IndexServerAddress: registry.IndexServer,
|
2015-11-14 17:03:02 -05:00
|
|
|
OSType: platform.OSType,
|
|
|
|
Architecture: platform.Architecture,
|
2016-03-08 16:03:37 -05:00
|
|
|
RegistryConfig: daemon.RegistryService.ServiceConfig(),
|
2016-06-25 10:26:00 -04:00
|
|
|
NCPU: sysinfo.NumCPU(),
|
2015-04-10 13:26:30 -04:00
|
|
|
MemTotal: meminfo.MemTotal,
|
2017-05-30 20:02:11 -04:00
|
|
|
GenericResources: daemon.genericResources,
|
2015-12-03 05:46:53 -05:00
|
|
|
DockerRootDir: daemon.configStore.Root,
|
|
|
|
Labels: daemon.configStore.Labels,
|
2016-10-06 10:09:54 -04:00
|
|
|
ExperimentalBuild: daemon.configStore.Experimental,
|
2015-11-09 13:32:46 -05:00
|
|
|
ServerVersion: dockerversion.Version,
|
2015-12-03 05:46:53 -05:00
|
|
|
ClusterStore: daemon.configStore.ClusterStore,
|
|
|
|
ClusterAdvertise: daemon.configStore.ClusterAdvertise,
|
2016-02-16 13:05:05 -05:00
|
|
|
HTTPProxy: sockets.GetProxyEnv("http_proxy"),
|
|
|
|
HTTPSProxy: sockets.GetProxyEnv("https_proxy"),
|
|
|
|
NoProxy: sockets.GetProxyEnv("no_proxy"),
|
2016-07-24 16:00:15 -04:00
|
|
|
LiveRestoreEnabled: daemon.configStore.LiveRestoreEnabled,
|
2016-11-16 16:30:29 -05:00
|
|
|
SecurityOptions: securityOptions,
|
2016-09-07 18:10:00 -04:00
|
|
|
Isolation: daemon.defaultIsolation,
|
2015-04-10 13:26:30 -04:00
|
|
|
}
|
|
|
|
|
2016-11-11 11:02:23 -05:00
|
|
|
// Retrieve platform specific info
|
|
|
|
daemon.FillPlatformInfo(v, sysInfo)
|
2015-07-09 19:37:54 -04:00
|
|
|
|
2016-05-03 03:26:32 -04:00
|
|
|
hostname := ""
|
|
|
|
if hn, err := os.Hostname(); err != nil {
|
|
|
|
logrus.Warnf("Could not get hostname: %v", err)
|
|
|
|
} else {
|
|
|
|
hostname = hn
|
2014-11-17 14:23:41 -05:00
|
|
|
}
|
2016-05-03 03:26:32 -04:00
|
|
|
v.Name = hostname
|
2015-04-10 13:26:30 -04:00
|
|
|
|
2016-11-16 16:30:29 -05:00
|
|
|
return v, nil
|
2014-08-07 23:01:55 -04:00
|
|
|
}
|
2015-10-23 02:08:26 -04:00
|
|
|
|
2015-12-03 13:11:19 -05:00
|
|
|
// SystemVersion returns version information about the daemon.
|
|
|
|
func (daemon *Daemon) SystemVersion() types.Version {
|
2017-12-05 09:29:37 -05:00
|
|
|
kernelVersion := "<unknown>"
|
|
|
|
if kv, err := kernel.GetKernelVersion(); err != nil {
|
|
|
|
logrus.Warnf("Could not get kernel version: %v", err)
|
|
|
|
} else {
|
|
|
|
kernelVersion = kv.String()
|
|
|
|
}
|
|
|
|
|
2015-12-03 13:11:19 -05:00
|
|
|
v := types.Version{
|
2017-12-05 09:29:37 -05:00
|
|
|
Components: []types.ComponentVersion{
|
|
|
|
{
|
|
|
|
Name: "Engine",
|
|
|
|
Version: dockerversion.Version,
|
|
|
|
Details: map[string]string{
|
|
|
|
"GitCommit": dockerversion.GitCommit,
|
|
|
|
"ApiVersion": api.DefaultVersion,
|
|
|
|
"MinAPIVersion": api.MinVersion,
|
|
|
|
"GoVersion": runtime.Version(),
|
|
|
|
"Os": runtime.GOOS,
|
|
|
|
"Arch": runtime.GOARCH,
|
|
|
|
"BuildTime": dockerversion.BuildTime,
|
|
|
|
"KernelVersion": kernelVersion,
|
|
|
|
"Experimental": fmt.Sprintf("%t", daemon.configStore.Experimental),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
// Populate deprecated fields for older clients
|
2016-11-02 13:04:39 -04:00
|
|
|
Version: dockerversion.Version,
|
|
|
|
GitCommit: dockerversion.GitCommit,
|
2017-12-05 09:29:37 -05:00
|
|
|
APIVersion: api.DefaultVersion,
|
2016-11-02 13:04:39 -04:00
|
|
|
MinAPIVersion: api.MinVersion,
|
|
|
|
GoVersion: runtime.Version(),
|
|
|
|
Os: runtime.GOOS,
|
|
|
|
Arch: runtime.GOARCH,
|
|
|
|
BuildTime: dockerversion.BuildTime,
|
2017-12-05 09:29:37 -05:00
|
|
|
KernelVersion: kernelVersion,
|
2016-11-02 13:04:39 -04:00
|
|
|
Experimental: daemon.configStore.Experimental,
|
2015-12-03 13:11:19 -05:00
|
|
|
}
|
|
|
|
|
2017-12-05 09:29:37 -05:00
|
|
|
v.Platform.Name = dockerversion.PlatformName
|
2015-12-03 13:11:19 -05:00
|
|
|
|
|
|
|
return v
|
|
|
|
}
|
|
|
|
|
2015-10-23 02:08:26 -04:00
|
|
|
func (daemon *Daemon) showPluginsInfo() types.PluginsInfo {
|
|
|
|
var pluginsInfo types.PluginsInfo
|
|
|
|
|
2018-03-19 17:18:52 -04:00
|
|
|
pluginsInfo.Volume = daemon.volumes.GetDriverList()
|
2016-07-23 13:57:53 -04:00
|
|
|
pluginsInfo.Network = daemon.GetNetworkDriverList()
|
2017-04-30 12:24:12 -04:00
|
|
|
// The authorization plugins are returned in the order they are
|
|
|
|
// used as they constitute a request/response modification chain.
|
|
|
|
pluginsInfo.Authorization = daemon.configStore.AuthorizationPlugins
|
2017-04-11 17:21:21 -04:00
|
|
|
pluginsInfo.Log = logger.ListDrivers()
|
2015-12-29 16:10:23 -05:00
|
|
|
|
2015-10-23 02:08:26 -04:00
|
|
|
return pluginsInfo
|
|
|
|
}
|