1. 程式人生 > >從Docker零基礎到懂一點實踐教程(五)

從Docker零基礎到懂一點實踐教程(五)

Docker客戶端和守護程序

Docker的CS模式

在Docker的實現機制中,有兩個重要的概念,“Docker客戶端”和“Docker守護程序”。“Docker守護程序”執行在宿主計算機上,在CS模式中充當Server的角色,它為“Docker客戶端”提供服務,並且完成Docker中的各項任務。

sequenceDiagram
使用者->>Docker客戶端: 命令列指令
Docker客戶端->>Docker守護程序: 執行指令
Docker守護程序->>Docker客戶端: 執行結果
Docker客戶端->>使用者: 命令列輸出

除了“Docker客戶端”這個最主要的與“Docker守護程序”互動的方式外,Docker還提供了RESTful風格的“Remote API”,這就意味著我們可以通過編寫程式,呼叫這些API來將自己的程式與Docker進行整合。“Remote API”在某些複雜的情況下,也支援“STDIN”、“STDOUT”以及“STRERR”的通訊機制進行互動。

sequenceDiagram
使用者->>自定義程式: 程式輸入
自定義程式->>Docker守護程序: Remote API
Docker守護程序->>自定義程式: 執行結果
自定義程式->>使用者: 程式輸出

連線方式

“Docker客戶端”和“Docker守護程序”是通過socket進行連線的,官方提供了三種進行連線的模式:
- unix:///var/run/docker.sock
- tcp://host:port
- fd://socketfd

其中,“unix”模式是預設提供的,我們來驗證一下:

schen@scvmu01:~$ ps -ef | grep docker
root      1106     1  0 21:14 ?        00:00:04 /usr/bin/dockerd -H fd://
root      1224  1106  0 21:15 ?        00:00:00 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --shim docker-containerd-shim --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --runtime docker-runc
schen 1603 1582 0 22:03 pts/0 00:00:00 grep --color=auto docker schen@scvmu01:~$ schen@scvmu01:~$ docker version Client: Version: 1.12.1 API version: 1.24 Go version: go1.6.3 Git commit: 23cf638 Built: Thu Aug 18 05:33:38 2016 OS/Arch: linux/amd64 Server: Version: 1.12.1 API version: 1.24 Go version: go1.6.3 Git commit: 23cf638 Built: Thu Aug 18 05:33:38 2016 OS/Arch: linux/amd64 schen@scvmu01:~$ schen@scvmu01:~$ ls -l /var/run/docker.sock srw-rw---- 1 root docker 0 Sep 7 21:14 /var/run/docker.sock schen@scvmu01:~$ schen@scvmu01:~$ nc -U /var/run/docker.sock GET /info HTTP/1.0 HTTP/1.0 200 OK Content-Type: application/json Server: Docker/1.12.1 (linux) Date: Thu, 17 Nov 2016 12:16:25 GMT Content-Length: 1874 {"ID":"VVPW:WOIW:TCPI:YDUG:J67N:5DHU:WSWW:RMMN:64FK:KNHO:NPPH:ATSL","Containers":26,"ContainersRunning":0,"ContainersPaused":0,"ContainersStopped":26,"Images":44,"Driver":"aufs","DriverStatus":[["Root Dir","/var/lib/docker/aufs"],["Backing Filesystem","extfs"],["Dirs","83"],["Dirperm1 Supported","true"]],"SystemStatus":null,"Plugins":{"Volume":["local"],"Network":["host","bridge","null","overlay"],"Authorization":null},"MemoryLimit":true,"SwapLimit":false,"KernelMemory":true,"CpuCfsPeriod":true,"CpuCfsQuota":true,"CPUShares":true,"CPUSet":true,"IPv4Forwarding":true,"BridgeNfIptables":true,"BridgeNfIp6tables":true,"Debug":false,"NFd":14,"OomKillDisable":true,"NGoroutines":22,"SystemTime":"2016-11-17T20:16:25.663603424+08:00","ExecutionDriver":"","LoggingDriver":"json-file","CgroupDriver":"cgroupfs","NEventsListener":0,"KernelVersion":"4.4.0-45-generic","OperatingSystem":"Ubuntu 16.04 LTS","OSType":"linux","Architecture":"x86_64","IndexServerAddress":"https://index.docker.io/v1/","RegistryConfig":{"InsecureRegistryCIDRs":["127.0.0.0/8"],"IndexConfigs":{"docker.io":{"Name":"docker.io","Mirrors":null,"Secure":true,"Official":true}},"Mirrors":null},"NCPU":1,"MemTotal":512176128,"DockerRootDir":"/var/lib/docker","HttpProxy":"","HttpsProxy":"","NoProxy":"","Name":"scvmu01.shichen.org","Labels":null,"ExperimentalBuild":false,"ServerVersion":"1.12.1","ClusterStore":"","ClusterAdvertise":"","SecurityOptions":["apparmor","seccomp"],"Runtimes":{"runc":{"path":"docker-runc"}},"DefaultRuntime":"runc","Swarm":{"NodeID":"","NodeAddr":"","LocalNodeState":"inactive","ControlAvailable":false,"Error":"","RemoteManagers":null,"Nodes":0,"Managers":0,"Cluster":{"ID":"","Version":{},"CreatedAt":"0001-01-01T00:00:00Z","UpdatedAt":"0001-01-01T00:00:00Z","Spec":{"Orchestration":{},"Raft":{},"Dispatcher":{},"CAConfig":{},"TaskDefaults":{}}}},"LiveRestoreEnabled":false} schen@scvmu01:~$

可以看到,在Docker的守護程序dockerd的引數列表中,我們並沒有指定“unix”套接字,但是我們卻可以通過它來訪問Docker的守護程序,並使用HTTP協議獲取有關Docker守護程序的資訊,當然這些資訊是以JSON格式提供的。

Docker守護程序的配置和操作

檢視Docker守護程序的執行狀態

要檢視Docker守護程序的狀態,我們可以使用Linux自帶的ps命令:

[email protected]:~$ ps -ef | grep docker
root      1106     1  0 21:14 ?        00:00:04 /usr/bin/dockerd -H fd://
root      1224  1106  0 21:15 ?        00:00:00 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --shim docker-containerd-shim --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --runtime docker-runc
schen     1603  1582  0 22:03 pts/0    00:00:00 grep --color=auto docker
[email protected]:~$ 

除了我們熟悉的ps命令外,我們還可以通過status命令進行檢視,但是由於該命令在Ubuntu虛擬機器中需要額外的設定才能使用,故這裡不再演示。而如果status命令不存在,可以使用sudo apt-get install upstart進行安裝。

啟動、停止、重啟Docker守護程序

我們可以使Linux的service命令來管理Docker的守護程序,它可以:
1. 啟動docker的守護程序 sudo service docker start
2. 停止docker的守護程序 sudo service docker stop
3. 重啟docker的守護程序 sudo service docker restart
4. 檢視docker的守護程序 sudo service docker status

schen@scvmu01:~$ sudo service docker status | grep PID
 Main PID: 1080 (dockerd)
schen@scvmu01:~$ 
schen@scvmu01:~$ sudo service docker stop
schen@scvmu01:~$ 
schen@scvmu01:~$ sudo service docker status | grep PID
 Main PID: 1080 (code=exited, status=0/SUCCESS)
schen@scvmu01:~$ 
schen@scvmu01:~$ sudo service docker start
schen@scvmu01:~$ 
schen@scvmu01:~$ sudo service docker status | grep PID
 Main PID: 27822 (dockerd)
schen@scvmu01:~$ 
schen@scvmu01:~$ sudo service docker restart
schen@scvmu01:~$ 
schen@scvmu01:~$ sudo service docker status | grep PID
 Main PID: 27937 (dockerd)
schen@scvmu01:~$ 

Docker守護程序的啟動選項

Docker守護程序提供了非常豐富的配置選項,其中包括:
1. 守護程序執行相關選項(-D, -e, -g, --icc, -l, --label, -p等)
2. Docker伺服器連線相關選項(-G, -H, --tls, --tlscacert, --tlscert, --tlskey, --tlsverify等)
3. RemoteAPI相關選項(--api-enable-cors等)
4. 儲存相關選項(-s, --selinux-enabled, --storage-opt等)
5. Registry相關選項(--insecure-registry, --registry-mirror等)
6. 網路相關選項(-b, --bip, --fixed-cidr, --dns, --dns-search, --ip, --ip-forward, --ip-masq, --iptables, --ipv6, --mtu等)

有關於這些引數的解釋,可以通過docker daemon --help命令檢視,也可以查閱Docker的官方網站。

修改Docker守護程序的啟動配置

我們可以通過修改/etc/default/docker檔案實現對Docker守護程序的啟動配置。

schen@scvmu01:~$ sudo vi /etc/default/docker
schen@scvmu01:~$ 
schen@scvmu01:~$ grep "^DOCKER_OPTS" /etc/default/docker
DOCKER_OPTS="--label name=docker_server_1"
schen@scvmu01:~$ 
schen@scvmu01:~$ sudo service docker restart
schen@scvmu01:~$ 
schen@scvmu01:~$ ps -ef | grep docker
root     28238     1 13 22:39 ?        00:00:01 /usr/bin/dockerd -H fd://
root     28244 28238  0 22:39 ?        00:00:00 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --shim docker-containerd-shim --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --runtime docker-runc
schen    28333 27696  0 22:39 pts/0    00:00:00 grep --color=auto docker
schen@scvmu01:~$ 

這時我們發現設定並沒有生效,這是因為/etc/default/docker檔案是為upstartSysVInit準備的(正如檔案第一行註釋所言),而使用service命令時並不會讀取它,因此我們還需要做如下更改:

schen@scvmu01:~$ sudo mkdir -p /etc/systemd/system/docker.service.d
schen@scvmu01:~$ 
schen@scvmu01:~$ sudo vi /etc/systemd/system/docker.service.d/Using_Environment_File.conf
[Service]
EnvironmentFile=-/etc/default/docker
ExecStart=
ExecStart=/usr/bin/docker daemon -H fd:// $DOCKER_OPTS
~
~
schen@scvmu01:~$ 
schen@scvmu01:~$ sudo systemctl daemon-reload
schen@scvmu01:~$ 
schen@scvmu01:~$ sudo service docker restart
schen@scvmu01:~$ 
schen@scvmu01:~$ ps -ef | grep docker
root      4287     1  0 21:52 ?        00:00:02 dockerd -H fd:// --label name=docker_server_1
root      4296  4287  0 21:52 ?        00:00:00 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --shim docker-containerd-shim --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --runtime docker-runc
schen     4395  2377  0 22:07 pts/1    00:00:00 grep --color=auto docker
schen@scvmu01:~$ 

Docker客戶端與守護程序

通過配置Docker守護程序,可以使Docker客戶端和守護程序執行在不同的伺服器上,即實現Docker的遠端訪問。

環境準備

準備工作:
1. 第二臺安裝有Docker的伺服器;
2. 修改Docker守護程序啟動選項,用--label區別伺服器;
3. 保證Client API與Server API版本一致;

我們在第一臺伺服器上將其Docker守護程序的label指定為name=docker_server_1,同樣將第二臺伺服器上的label指定為name=docker_server_2,並重啟Docker服務。以下是這兩臺Docker伺服器的詳細資訊:

[email protected]:~$ docker info
Containers: 15
 Running: 0
 Paused: 0
 Stopped: 15
Images: 8
Server Version: 1.12.1
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 49
 Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host null overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Security Options: apparmor seccomp
Kernel Version: 4.4.0-45-generic
Operating System: Ubuntu 16.04 LTS
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 488.4 MiB
Name: scvmu01.shichen.org
ID: VVPW:WOIW:TCPI:YDUG:J67N:5DHU:WSWW:RMMN:64FK:KNHO:NPPH:ATSL
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Username: shichen
Registry: https://index.docker.io/v1/
WARNING: No swap limit support
Labels:
 name=docker_server_1
Insecure Registries:
 127.0.0.0/8
[email protected]:~$ 
[email protected]:~$ docker info
Containers: 15
 Running: 0
 Paused: 0
 Stopped: 15
Images: 8
Server Version: 1.12.1
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 49
 Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: overlay null host bridge
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Security Options: apparmor seccomp
Kernel Version: 4.4.0-45-generic
Operating System: Ubuntu 16.04 LTS
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 488.4 MiB
Name: scvmu02.shichen.org
ID: VVPW:WOIW:TCPI:YDUG:J67N:5DHU:WSWW:RMMN:64FK:KNHO:NPPH:ATSL
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Username: shichen
Registry: https://index.docker.io/v1/
WARNING: No swap limit support
Labels:
 name=docker_server_2
Insecure Registries:
 127.0.0.0/8
[email protected]:~$ 

修改伺服器端配置

要實現遠端訪問,我們就要修改docker守護程序啟動選項-H的值,將它指定為tcp模式。

schen@scvmu01:~$ sudo vi /etc/default/docker
schen@scvmu01:~$ 
schen@scvmu01:~$ grep "^DOCKER_OPTS" /etc/default/docker
DOCKER_OPTS="--label name=docker_server_1 -H tcp://0.0.0.0:2375"
schen@scvmu01:~$ 
schen@scvmu01:~$ sudo service docker restart
schen@scvmu01:~$ 

我們在第一臺伺服器上,將Docker守護程序-H選項指定為tcp://0.0.0.0:2375,這裡使用全零的地址是讓Docker繫結伺服器自身的IP地址,而“2375”是Docker伺服器常用的埠號。現在我們來到第二臺伺服器上,驗證一下我們的配置:

schen@scvmu02:~$ curl http://scvmu01:2375/info
{"ID":"VVPW:WOIW:TCPI:YDUG:J67N:5DHU:WSWW:RMMN:64FK:KNHO:NPPH:ATSL","Containers":15,"ContainersRunning":0,"ContainersPaused":0,"ContainersStopped":15,"Images":8,"Driver":"aufs","DriverStatus":[["Root Dir","/var/lib/docker/aufs"],["Backing Filesystem","extfs"],["Dirs","49"],["Dirperm1 Supported","true"]],"SystemStatus":null,"Plugins":{"Volume":["local"],"Network":["overlay","null","host","bridge"],"Authorization":null},"MemoryLimit":true,"SwapLimit":false,"KernelMemory":true,"CpuCfsPeriod":true,"CpuCfsQuota":true,"CPUShares":true,"CPUSet":true,"IPv4Forwarding":true,"BridgeNfIptables":true,"BridgeNfIp6tables":true,"Debug":false,"NFd":15,"OomKillDisable":true,"NGoroutines":23,"SystemTime":"2016-10-25T19:50:46.471062364+08:00","ExecutionDriver":"","LoggingDriver":"json-file","CgroupDriver":"cgroupfs","NEventsListener":0,"KernelVersion":"4.4.0-45-generic","OperatingSystem":"Ubuntu 16.04 LTS","OSType":"linux","Architecture":"x86_64","IndexServerAddress":"https://index.docker.io/v1/","RegistryConfig":{"InsecureRegistryCIDRs":["127.0.0.0/8"],"IndexConfigs":{"docker.io":{"Name":"docker.io","Mirrors":null,"Secure":true,"Official":true}},"Mirrors":null},"NCPU":1,"MemTotal":512176128,"DockerRootDir":"/var/lib/docker","HttpProxy":"","HttpsProxy":"","NoProxy":"","Name":"scvmu01.shichen.org","Labels":["name=docker_server_1"],"ExperimentalBuild":false,"ServerVersion":"1.12.1","ClusterStore":"","ClusterAdvertise":"","SecurityOptions":["apparmor","seccomp"],"Runtimes":{"runc":{"path":"docker-runc"}},"DefaultRuntime":"runc","Swarm":{"NodeID":"","NodeAddr":"","LocalNodeState":"inactive","ControlAvailable":false,"Error":"","RemoteManagers":null,"Nodes":0,"Managers":0,"Cluster":{"ID":"","Version":{},"CreatedAt":"0001-01-01T00:00:00Z","UpdatedAt":"0001-01-01T00:00:00Z","Spec":{"Orchestration":{},"Raft":{},"Dispatcher":{},"CAConfig":{},"TaskDefaults":{}}}},"LiveRestoreEnabled":false}
schen@scvmu02:~$ 

因為主機名已經設定好,所以我們可以直接使用主機名scvmu01代替其IP地址。使用curl命令訪問遠端Docker伺服器的/info介面,得到了JSON格式的資料反饋,說明伺服器已經可以正常連線了。

修改客戶端配置

與服務端類似,客戶端也支援-H選項,我們可以通過指定這個選項,讓客戶端與指定的服務端相連:

[email protected]:~$ docker -H tcp://scvmu01:2375 info
Containers: 15
 Running: 0
 Paused: 0
 Stopped: 15
Images: 8
Server Version: 1.12.1
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 49
 Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: overlay null host bridge
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Security Options: apparmor seccomp
Kernel Version: 4.4.0-45-generic
Operating System: Ubuntu 16.04 LTS
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 488.4 MiB
Name: scvmu01.shichen.org
ID: VVPW:WOIW:TCPI:YDUG:J67N:5DHU:WSWW:RMMN:64FK:KNHO:NPPH:ATSL
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Username: shichen
Registry: https://index.docker.io/v1/
WARNING: No swap limit support
Labels:
 name=docker_server_1
Insecure Registries:
 127.0.0.0/8
[email protected]:~$ 

當我們要頻繁操作一個遠端Docker伺服器時,重複地使用-H選項就會顯得很麻煩,這時我們可以通過設定DOCKER_HOST環境變數解決這個問題:

schen@scvmu02:~$ export DOCKER_HOST="tcp://scvmu01:2375"
schen@scvmu02:~$ 
schen@scvmu02:~$ docker info
Containers: 15
 Running: 0
 Paused: 0
 Stopped: 15
Images: 8
Server Version: 1.12.1
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 49
 Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: host bridge null overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Security Options: apparmor seccomp
Kernel Version: 4.4.0-45-generic
Operating System: Ubuntu 16.04 LTS
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 488.4 MiB
Name: scvmu01.shichen.org
ID: VVPW:WOIW:TCPI:YDUG:J67N:5DHU:WSWW:RMMN:64FK:KNHO:NPPH:ATSL
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Username: shichen
Registry: https://index.docker.io/v1/
WARNING: No swap limit support
Labels:
 name=docker_server_1
Insecure Registries:
 127.0.0.0/8
schen@scvmu02:~$ 

當我們使用完遠端的Docker伺服器後,想要連線本機的Docker服務端,只需要將DOCKER_HOST變數置空即可:

schen@scvmu02:~$ export DOCKER_HOST=""
schen@scvmu02:~$ 
schen@scvmu02:~$ docker info
Containers: 15
 Running: 0
 Paused: 0
 Stopped: 15
Images: 8
Server Version: 1.12.1
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 49
 Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: host null bridge overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Security Options: apparmor seccomp
Kernel Version: 4.4.0-45-generic
Operating System: Ubuntu 16.04 LTS
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 488.4 MiB
Name: scvmu02.shichen.org
ID: VVPW:WOIW:TCPI:YDUG:J67N:5DHU:WSWW:RMMN:64FK:KNHO:NPPH:ATSL
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Username: shichen
Registry: https://index.docker.io/v1/
WARNING: No swap limit support
Labels:
 name=docker_server_2
Insecure Registries:
 127.0.0.0/8
schen@scvmu02:~$ 

指定多種連線方式

當我們回到第一臺伺服器上,發現Docker客戶端仍然可以在不指定-H引數的情況下,直接與本地的服務端相連。這是因為Docker守護程序在啟動時,還預設指定了-H fd://引數,這也說明我們可以通過給Docker守護程序指定多個-H引數來為Docker客戶端提供更多的連線方式:

[email protected]:~$ echo $DOCKER_HOST
[email protected]:~$ 
[email protected]:~$ docker info
Containers: 15
 Running: 0
 Paused: 0
 Stopped: 15
Images: 8
Server Version: 1.12.1
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 49
 Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: overlay null host bridge
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Security Options: apparmor seccomp
Kernel Version: 4.4.0-45-generic
Operating System: Ubuntu 16.04 LTS
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 488.4 MiB
Name: scvmu01.shichen.org
ID: VVPW:WOIW:TCPI:YDUG:J67N:5DHU:WSWW:RMMN:64FK:KNHO:NPPH:ATSL
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Username: shichen
Registry: https://index.docker.io/v1/
WARNING: No swap limit support
Labels:
 name=docker_server_1
Insecure Registries:
 127.0.0.0/8
[email protected]:~$ ps -ef | grep dockerd
root      1131     1  0 19:34 ?        00:00:06 dockerd -H fd:// --label name=docker_server_1 -H tcp://0.0.0.0:2375
schen     1637  1587  0 20:31 pts/0    00:00:00 grep --color=auto dockerd
[email protected]:~$ 

相關推薦

Docker基礎一點實踐教程

Docker客戶端和守護程序 Docker的CS模式 在Docker的實現機制中,有兩個重要的概念,“Docker客戶端”和“Docker守護程序”。“Docker守護程序”執行在宿主計算機上,在CS模式中充當Server的角色,它為“Docker客戶端

Docker基礎一點實踐教程

Docker映象與倉庫(一) 檢視和刪除映象 Docker映象是一種使用聯合載入技術實現的層疊的只讀檔案系統,它是容器構建的基石。Docker的映象儲存在/var/lib/docker目錄下。通過docker info命令可以檢視到Docker使用的儲存

Docker基礎一點實踐教程

Docker容器的資料管理 Docker容器的資料卷 Docker的設計理念是提供應用程式之間的隔離,因此Docker容器的生存週期通常與應用程式是一致的,但我們對資料的生存週期卻有著不一樣的需求。此外,我們也需要一個在容器之間共享資料的機制。這些因素催

Docker基礎一點實踐教程

Docker容器的網路連線 Docker容器的網路基礎 docker0 通過ifconfig命令我們可以檢視到一個名為“docker0”的虛擬網橋,Docker就是通過這個網路裝置為容器提供各種網路服務的。 schen@scvmu01:~/d

基礎APP自動化測試教程

APP自動化框架選擇 目前較火的自動化工具特點對比: Appium(適用於Android&iOS;支援多語言;不需要應用原始碼)Uiautomator(適用於Android;僅Java語言;不需要應用原始碼)Robotium(適用於Android;僅Java語言;不需要應用原始碼)Calabash(

基礎玩轉樹莓派—控制直流電機

前面教程學會如何使用樹莓派來控制LED燈,接下來主要講如何控制直流電機,這樣就可以做小車等可以運動的專案,可玩性更高。 一、硬體介紹 直流電機控制主要用到的硬體為: 1、燒寫好系統的樹莓派控制板·········1塊 2、L298N電機驅動板模組········

Python基礎入門到高階教程附安裝指南、安裝包、程式碼

你想要進入一個全新的領域時,首先要弄清楚的就是它的體系。那麼在Python領域,應該掌握哪些知識點呢? Python基礎與高階程式設計   1、Linux環境搭建與python安裝 2、Python語法基礎 3、Python字串解析 4、Python時間和日曆

Swift教程_基礎學習Swift完整例項_swift基礎簡單值、控制流、方法和閉包

三、Swift基礎介紹 本章將對Swift做一個簡單說明,內容取自《The Swift Programming Language》,並加之自己的理解。首先swift全域性作用域中的程式碼會被自動當做程

Swift教程_基礎學習Swift完整例項_swift例項簡介

一、文章簡介 本人最近開始學習有關Swift這個新東東,由於沒有專案支撐,只能通過官方文件進行自學,精簡的看了Swift官方文件,感覺理解起來還是比較簡單,於是突發奇想,想把官方object-c的sa

Swift教程_基礎學習Swift完整例項_swift完整例項構建展示層

本章節主要來完善前前面已經建立好的storyboard中的頁面,包括自定義的view等。 1.PKOElementTableViewCell 該自定義view作為列表的行view,包含左側的圖片以及中間的文字描述。這裡要注意需要通過setNeedsDisplay告訴系統進行繪製。 程式碼如下。 import

Swift教程_基礎學習Swift完整例項_總結

五、總結 加上寫博文的時間,用了前前後後一週左右的時間,每晚2小時左右,完成了這個改造,由於我是第一次碰swift,有些東西還用不順手,用時比較長。期間還簡單學習了一下swift基本語法和部分用法。

Swift教程_基礎學習Swift完整例項_swift完整例項新增View的動畫效果、新增View的陰影

6.新增View的動畫效果 本章節主要來做明細頁面點選後翻轉的動畫效果,該效果可以進行多種改變,以達到想要的效果。 1.首先我們需要進行翻轉的正反兩個view,前面我們已經做好了,分別是PKOElementDetailImageView和PKOElementDetailIm

開始學 Web 之 ES6ES6基礎語法三

一、Generator Generator 函式是 ES6 提供的一種非同步程式設計解決方案。 Generator 函式有多種理解角度。語法上,首先可以把它理解成,Generator 函式是一個狀態機,封裝了多個內部狀態。 執行 Generator 函式會返回一個遍歷器物件,也就是說,Generator

python基礎教程

() 文件名 nal cnblogs 文件 求長 元素 fin 查詢 字符串基本操作   所有標準的序列操作(索引、分片、乘法、判斷成員資格、求長度、取最小值和最大值)對字符串同樣適用,前面已經講述的這些操作。但是,請註意字符串都是不可變的。 字符串的方法: 字符串從s

0 開始的微服務架構:代碼給你,看如何用Docker支撐微服務

這一 復用 微軟 .com 擴展 版本發布 生產 通信 ibm 很好的一篇文章,全面、系統。 雖然已經紅了很久,但是“微服務架構”正變得越來越重要,也將繼續火下去。各個公司與技術人員都在分享微服務架構的相關知識與實踐經驗,但我們發現,目前網上的這些相關文章中,要麽上來就

開始學 Web 之 Ajax同步異步請求,數據格式

遊記 document 空閑 name center 20px 實現 resp 也會 大家好,這裏是「 從零開始學 Web 系列教程 」,並在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公眾號:Web前端之

基礎快速入門SpringBoot2.0

acc href 項目文件 apache tro maven打包 相關 utf tps 零基礎快速入門SpringBoot2.0 (一) 一、SpringBoot2.x依賴環境和版本新特性說明 簡介:講解新版本依賴環境和springboot2新特性概述

開始學習比特幣--P2P網路建立的流程之套接字的讀取和傳送

寫在前面: 本篇文章接續 從零開始學習比特幣開發(四)–網路初始化,載入區塊鏈和錢包,匯入區塊啟動節點 從零開始學習區塊鏈技術(三)-接入比特幣網路的關鍵步驟解析、建立比特幣錢包,以及重要rpc指令 從零開始學習區塊鏈技術(二)–如何接入比特幣網路以及其原理分析 從零開始學習

Spring.NET教程容器中物件的作用域(基礎篇)

容器中物件的部署分為兩種方式:singleton和非singleton(Java裡叫prototype)。這裡的singleton指的是“單例模式”,就是說當一個物件被定義為singleton時,容器中就只會有一個共享的例項,任何時候通過id或別名請求該物件都會返回這個共享例項的引用(也就是說這個物件只會被建

基礎入門學習Python》10--列表:一個打了激素的陣列

  前言 有時候我們需要把一些東西暫時儲存起來,因為他們有著一些直接或間接的聯絡,我們需要把它們放在某個組或者集合中,未來可能用得上。 很多接觸過程式設計的朋友都知道,都接觸過陣列這個概念,那麼陣列這個概念事實上很簡單,把一大堆同總型別資料挨個擺在一塊,然後通過陣列的下標進行索