一:容器中运行简单应用程序

1:hello  world

使用docker可以在容器中运行应用程序,使用docker run命令即可。比如下面的命令:

  1. $ docker run ubuntu /bin/echo 'Hello world'
  2. Hello world

docker run命令用于运行一个新的容器,ubuntu指定了该容器运行基于的镜像是Ubuntu操作系统镜像。指定镜像后,Docker首先在Docker主机本地寻找镜像,如果找不到则去公共镜像仓库:Docker Hub下载。

接下来,就是指定要在新容器中运行的命令:/bin/echo  'Hello  world'。

运行该容器时,Docker创建一个新的Ubuntu操作系统环境,并且在其中执行/bin/echo命令,然后将命令结果输出到终端。

这种情况下,容器只有在运行命令时处于running状态,一旦命令执行完成,输出” Hello world”之后,该容器也就停止运行了。

2:交互式的容器

运行以下命令:

  1. $ docker run -t -i ubuntu /bin/bash
  2. root@af8bae53bdd3:/#

还是以ubunt为基础镜像,这次运行的命令是/bin/bash,在容器中加载一个BASH  shell。docker命令中多了两个选项:-t和-i,-t用于在容器中分配一个新的终端,-i使得用户可以与容器进行交互。

因此,容器加载后,就可以在容器中执行其他命令了:

  1. root@af8bae53bdd3:/# pwd
  2. /
  3. root@af8bae53bdd3:/# ls
  4. bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
  5. root@af8bae53bdd3:/# exit

可见,在容器中,当前处于根目录下,并且根目录的结构就是典型的Linux文件系统。

运行exit退出当前shell,Bash shell进程也就停止了,因此容器也就停止运行了。

3:后台运行容器

使用以下命令,可以在后台运行容器:

  1. $ docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
  2. 1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147

这里使用-d选项,将容器置于后台运行,使其成为daemon进程。

这里在容器中运行的程序是一个在/bin/sh中,每隔1s打印一次hello  world的程序。

运行该命令后,返回的是一个容器ID,利用该容器ID,可以使用docker ps命令,查看当前处于运行状态的容器:

  1. $ docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 1e5535038e28 ubuntu /bin/sh -c 'while tr 2 minutes ago Up 1 minute insane_babbage

可见,刚刚运行的容器处于UP状态,该命令还列出了刚刚容器的名字:insane_babbage,可以根据该名字,使用docker logs命令可以得到容器的标准输出。查看容器中的命令输出:

  1. $ docker logs insane_babbage
  2. hello world
  3. hello world
  4. hello world
  5. . . .

使用docker  stop命令,可以停止该容器:

  1. $ docker stop insane_babbage
  2. insane_babbage

再次使用docker ps命令查看,发现已经没有容器运行了:

  1. $ docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

二:容器中运行实际应用

1:docker客户端

每次在shell中使用docker命令,实际上是启动了一个docker客户端,docker客户端连接docker服务器,由服务器执行相应的命令。可以使用docker version命令,查看当前主机上安装的docker客户单和docker服务器版本:

  1. [hh_93_197 /]# docker version
  2. Client:
  3. Version: 1.10.3
  4. API version: 1.22
  5. Go version: go1.5.3
  6. Git commit: 20f81dd
  7. Built: Thu Mar 10 15:39:25 2016
  8. OS/Arch: linux/amd64
  9.  
  10. Server:
  11. Version: 1.10.3
  12. API version: 1.22
  13. Go version: go1.5.3
  14. Git commit: 20f81dd
  15. Built: Thu Mar 10 15:39:25 2016
  16. OS/Arch: linux/amd64

2:查看docker命令帮助信息

可以使用命令docker --help,查看docker帮助信息,也可以使用--help,查看docker子命令的帮助信息,比如:

  1. [hh_93_197 /]# docker run --help
  2.  
  3. Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
  4.  
  5. Run a command in a new container
  6.  
  7. -a, --attach=[] Attach to STDIN, STDOUT or STDERR
  8. --add-host=[] Add a custom host-to-IP mapping (host:ip)
  9. --blkio-weight Block IO (relative weight), between 10 and 1000
  10. --blkio-weight-device=[] Block IO weight (relative device weight)
  11. --cpu-shares CPU shares (relative weight)
  12. --cap-add=[] Add Linux capabilities
  13. --cap-drop=[] Drop Linux capabilities
  14. ...

3:在docker中运行web服务器

使用以下命令,可以在容器中运行一个python的web服务器:

  1. $ docker run -d -P training/webapp python app.py

这里使用的镜像是training/webapp,其中包含了简单的Python flask web应用。-d选项使容器后台运行,-P选项将容器中的端口映射到主机上的端口,后续会详细解释。

4:查看容器

使用docker ps命令查看刚刚运行的容器:

  1. [hh_93_197 /]# docker ps -l
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 026fcbe4b3dd training/webapp "python app.py" 23 hours ago Up 3 seconds 0.0.0.0:32770->5000/tcp stoic_davinci
  1.  

docker ps命令,加上-l选项,可以列出最后一个启动的容器,docker ps命令只能列出运行状态的容器,通过-a选项,可以列出所有状态的容器。

这里,在PORTS列下的信息是;0.0.0.0:32770->5000/tcp,因为在docker run中指定了-P选项,因此docker会将容器内的端口映射到主机的端口上,这里就是将容器的tcp端口5000映射到主机的32770端口上。因此,访问主机的32770端口,实际访问的就是容器中的5000端口(默认的Python flask端口):

使用-p选项,也可以自行指定容器和主机之间的端口映射关系,比如下面的命令:

  1. [hh_93_197 /]# docker run -d -p 80:5000 training/webapp python app.py
  1.  

该命令就将容器的5000映射到主机上的80端口了:

使用docker  port命令,可以查看容器的端口映射情况:

  1. [hh_93_197 /]# docker port sad_archimedes
  2. 5000/tcp -> 0.0.0.0:80
  1.  

使用docker logs命令查看容器的日志:

  1. [hh_93_197 /]# docker logs -f sad_archimedes
  2. * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
  3. 10.1.80.66 - - [16/Mar/2016 07:41:30] "GET / HTTP/1.1" 200 -
  4. 10.1.80.66 - - [16/Mar/2016 07:41:30] "GET /favicon.ico HTTP/1.1" 404 -
  5. 10.1.80.66 - - [16/Mar/2016 07:41:33] "GET / HTTP/1.1" 200 -
  6. ...
  1.  

这里的-f选项,类似于tail  -f中的选项。

使用docker  top命令,可以查看容器中运行的进程:

  1. [hh_93_197 /]# docker top sad_archimedes
  2. UID PID PPID C STIME TTY TIME CMD
  3. root 21864 24559 0 15:40 ? 00:00:00 python app.py
  1.  

可见容器中只运行了python的web应用。

使用docker  inspect命令,可以获得容器的更详细的信息,该命令返回一个JSON格式信息:

  1. [hh_93_197 /]# docker inspect sad_archimedes
  2. [
  3. {
  4. "Id": "a7910dd9cafff213db102d679de6a71b2051f980c6d46c3080870973f39af162",
  5. "Created": "2016-03-16T07:40:27.345500271Z",
  6. "Path": "python",
  7. "Args": [
  8. "app.py"
  9. ],
  10. "State": {
  11. "Status": "running",
  12. "Running": true,
  13. "Paused": false,
  14. "Restarting": false,
  15. "OOMKilled": false,
  16. "Dead": false,
  17. "Pid": 21864,
  18. "ExitCode": 0,
  19. "Error": "",
  20. "StartedAt": "2016-03-16T07:40:27.726836748Z",
  21. "FinishedAt": "0001-01-01T00:00:00Z"
  22. },
  23. "Image": "sha256:6fae60ef344644649a39240b94d73b8ba9c67f898ede85cf8e947a887b3e6557",
  24. "ResolvConfPath": "/var/lib/docker/containers/a7910dd9cafff213db102d679de6a71b2051f980c6d46c3080870973f39af162/resolv.conf",
  25. "HostnamePath": "/var/lib/docker/containers/a7910dd9cafff213db102d679de6a71b2051f980c6d46c3080870973f39af162/hostname",
  26. "HostsPath": "/var/lib/docker/containers/a7910dd9cafff213db102d679de6a71b2051f980c6d46c3080870973f39af162/hosts",
  27. "LogPath": "/var/lib/docker/containers/a7910dd9cafff213db102d679de6a71b2051f980c6d46c3080870973f39af162/a7910dd9cafff213db102d679de6a71b2051f980c6d46c3080870973f39af162-json.log",
  28. "Name": "/sad_archimedes",
  29. "RestartCount": 0,
  30. "Driver": "devicemapper",
  31. "MountLabel": "",
  32. "ProcessLabel": "",
  33. "AppArmorProfile": "",
  34. "ExecIDs": null,
  35. "HostConfig": {
  36. "Binds": null,
  37. "ContainerIDFile": "",
  38. "LogConfig": {
  39. "Type": "json-file",
  40. "Config": {}
  41. },
  42. "NetworkMode": "default",
  43. "PortBindings": {
  44. "5000/tcp": [
  45. {
  46. "HostIp": "",
  47. "HostPort": "80"
  48. }
  49. ]
  50. },
  51. "RestartPolicy": {
  52. "Name": "no",
  53. "MaximumRetryCount": 0
  54. },
  55. "VolumeDriver": "",
  56. "VolumesFrom": null,
  57. "CapAdd": null,
  58. "CapDrop": null,
  59. "Dns": [],
  60. "DnsOptions": [],
  61. "DnsSearch": [],
  62. "ExtraHosts": null,
  63. "GroupAdd": null,
  64. "IpcMode": "",
  65. "Links": null,
  66. "OomScoreAdj": 0,
  67. "PidMode": "",
  68. "Privileged": false,
  69. "PublishAllPorts": false,
  70. "ReadonlyRootfs": false,
  71. "SecurityOpt": null,
  72. "UTSMode": "",
  73. "ShmSize": 67108864,
  74. "ConsoleSize": [
  75. 0,
  76. 0
  77. ],
  78. "Isolation": "",
  79. "CpuShares": 0,
  80. "CgroupParent": "",
  81. "BlkioWeight": 0,
  82. "BlkioWeightDevice": null,
  83. "BlkioDeviceReadBps": null,
  84. "BlkioDeviceWriteBps": null,
  85. "BlkioDeviceReadIOps": null,
  86. "BlkioDeviceWriteIOps": null,
  87. "CpuPeriod": 0,
  88. "CpuQuota": 0,
  89. "CpusetCpus": "",
  90. "CpusetMems": "",
  91. "Devices": [],
  92. "KernelMemory": 0,
  93. "Memory": 0,
  94. "MemoryReservation": 0,
  95. "MemorySwap": 0,
  96. "MemorySwappiness": -1,
  97. "OomKillDisable": false,
  98. "PidsLimit": 0,
  99. "Ulimits": null
  100. },
  101. "GraphDriver": {
  102. "Name": "devicemapper",
  103. "Data": {
  104. "DeviceId": "66",
  105. "DeviceName": "docker-8:6-538261252-268466c24d896a48119782e8aaf98fc2acf786ce8db86a806b0bddace665169d",
  106. "DeviceSize": "10737418240"
  107. }
  108. },
  109. "Mounts": [],
  110. "Config": {
  111. "Hostname": "a7910dd9caff",
  112. "Domainname": "",
  113. "User": "",
  114. "AttachStdin": false,
  115. "AttachStdout": false,
  116. "AttachStderr": false,
  117. "ExposedPorts": {
  118. "5000/tcp": {}
  119. },
  120. "Tty": false,
  121. "OpenStdin": false,
  122. "StdinOnce": false,
  123. "Env": [
  124. "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
  125. ],
  126. "Cmd": [
  127. "python",
  128. "app.py"
  129. ],
  130. "Image": "training/webapp",
  131. "Volumes": null,
  132. "WorkingDir": "/opt/webapp",
  133. "Entrypoint": null,
  134. "OnBuild": null,
  135. "Labels": {},
  136. "StopSignal": "SIGTERM"
  137. },
  138. "NetworkSettings": {
  139. "Bridge": "",
  140. "SandboxID": "b41b21041836349d572454db6822fdd8b1128762ec83a8d2fcad7c31de93fcfc",
  141. "HairpinMode": false,
  142. "LinkLocalIPv6Address": "",
  143. "LinkLocalIPv6PrefixLen": 0,
  144. "Ports": {
  145. "5000/tcp": [
  146. {
  147. "HostIp": "0.0.0.0",
  148. "HostPort": "80"
  149. }
  150. ]
  151. },
  152. "SandboxKey": "/var/run/docker/netns/b41b21041836",
  153. "SecondaryIPAddresses": null,
  154. "SecondaryIPv6Addresses": null,
  155. "EndpointID": "ef7147d741b0a2da2dc768fd23bd9433436a52bedf5773132cbefb6457fe0077",
  156. "Gateway": "172.17.0.1",
  157. "GlobalIPv6Address": "",
  158. "GlobalIPv6PrefixLen": 0,
  159. "IPAddress": "172.17.0.2",
  160. "IPPrefixLen": 16,
  161. "IPv6Gateway": "",
  162. "MacAddress": "02:42:ac:11:00:02",
  163. "Networks": {
  164. "bridge": {
  165. "IPAMConfig": null,
  166. "Links": null,
  167. "Aliases": null,
  168. "NetworkID": "4948e842e58f3fedd25afe97bf292d53d7023ddeb90fefb7825103b56c5251b8",
  169. "EndpointID": "ef7147d741b0a2da2dc768fd23bd9433436a52bedf5773132cbefb6457fe0077",
  170. "Gateway": "172.17.0.1",
  171. "IPAddress": "172.17.0.2",
  172. "IPPrefixLen": 16,
  173. "IPv6Gateway": "",
  174. "GlobalIPv6Address": "",
  175. "GlobalIPv6PrefixLen": 0,
  176. "MacAddress": "02:42:ac:11:00:02"
  177. }
  178. }
  179. }
  180. }
  181. ]
  1.  

还可以返回特定的信息:

  1. [hh_93_197 /]# docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' sad_archimedes
  2. 172.17.0.2
  1.  

5:容器的导入和导出

可以使用docker  export命令,将容器导出到本地文件:

  1. [hh_93_197 ~]# docker export fa0fecad952f > ubuntu.tar

查看ubuntu.tar的内容:

可以使用docker  import命令,从容器快照文件中再导入为镜像:

  1. [hh_93_197 ~]# cat ubuntu.tar | docker import - test/ubuntu:v1.0
  2. sha256:50288f29d8ad89d09f0a341201a9118118b7d7314466b2c14cea9184734a1056
  3. [hh_93_197 ~]# docker images
  4. REPOSITORY TAG IMAGE ID CREATED SIZE
  5. test/ubuntu v1.0 50288f29d8ad 9 seconds ago 187.7 MB

6:停止,启动、删除容器

使用docker  stop命令可以停止容器,使用docker  start命令可以启动容器,使用docker rm命令可以删除容器,注意删除之前必须先停止容器。

三:镜像

docker中,镜像是容器的基础。每次运行docker  run命令时,必须指定要使用的镜像。运行容器时,docker首先在docker主机上查找镜像,找不到则去镜像仓库Docker Hub Registry中寻找。

1:列出主机上的镜像

使用docker  images命令可以列出主机上本地镜像:

  1. $ docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. ubuntu 14.04 1d073211c498 3 days ago 187.9 MB
  4. busybox latest 2c5ac3f849df 5 days ago 1.113 MB
  5. training/webapp latest 54bb4e8718e8 5 months ago 348.7 MB

一般镜像库保存着一个镜像的多个版本,比如ubuntu镜像就有10.04, 12.04, 12.10, 13.04, 13.10和14.04版本。这些版本通过tag来区分,比如:ubuntu:14.04。所以,docker命令中指定镜像tag的例子如下:

  1. $ docker run -t -i ubuntu:14.04 /bin/bash

如果不指定tag,则docker使用最新的镜像:ubuntu:latest。

2:下载新的镜像

使用docker  pull命令可以下载镜像,比如:

  1. $ docker pull centos
  2. Pulling repository centos
  3. b7de3133ff98: Pulling dependent layers
  4. 5cc9e91966f7: Pulling fs layer
  5. 511136ea3c5a: Download complete
  6. ef52fb1fe610: Download complete
  7. . . .
  8.  
  9. Status: Downloaded newer image for centos

3:查找镜像

可以在Dcoker  Hub(https://hub.docker.com/)上查找镜像,也可以使用命令docker search来查找,比如想找所有安装了Sinatra的镜像,可以:

  1. $ docker search sinatra
  2. NAME DESCRIPTION STARS OFFICIAL AUTOMATED
  3. training/sinatra Sinatra training image 0 [OK]
  4. marceldegraaf/sinatra Sinatra test app 0
  5. mattwarren/docker-sinatra-demo 0 [OK]
  6. luisbebop/docker-sinatra-hello-world 0 [OK]
  7. bmorearty/handson-sinatra handson-ruby + Sinatra for Hands on with D... 0
  8. subwiz/sinatra 0
  9. bmorearty/sinatra 0
  10. . . .

注意,Official  Repositories指的是由Docker公司维护的镜像,Automated
 Builds
 指的是允许验证源和内容的镜像。

像ubuntu这种形式的镜像,称为基或者根镜像,它们是由docker公司构建、验证和支持的。像training/sinatra这样的镜像,是从属于某个docker社区成员的用户镜像,由该Docker社区成员构建并维护,这些镜像总是以创建镜像的用户名为前缀,比如这里的training。

想要下载training/sinatra镜像,可以这样:$docker  pull  training/sinatra

4:创建自己的镜像

可以通过以下两种方式升级和创建镜像。

a:可以在某个镜像基础上,创建并提交新的镜像;

b:可以通过Dockerfile来指定创建镜像的命令;

a:升级并提交一个镜像

要升级一个镜像,首选需要创建一个基于该镜像的容器:

  1. [hh_93_197 /]# docker run -t -i ubuntu /bin/bash
  2. root@8ff95f120ff2:/#
  1.  

比如这里在/tmp目录下创建一个readme.txt,当做升级镜像的动作:

  1. root@0843755bad78:/# cd /tmp
  2. root@0843755bad78:/tmp# cat readme.txt
  3. this is my image

然后直接运行exit命令退出,这样容器就停止了。此时,可以根据该容器,使用docker commit命令创建一个新的镜像:

  1. [hh_93_197 /]# docker commit -m "Added readme.txt" -a "hh" 0843755bad78 hh/ubuntu:v1
  2. sha256:554a3b147ad10933c7643c65241f02b87d55bf4342f14a852aefe7ff04344a2e
  1.  

这里使用了-m和-a选项。-m选项后跟一个注释信息(类似于git的-m命令),-a命令用于指定作者。接下来就是指定根据哪个容器创建镜像了,这里0843755bad78就是该容器的ID,然后就是新镜像的名称和tag:hh/ubuntu:v1,其中包含了新镜像的用户名hh,镜像的名称ubuntu,以及镜像的tag :v1.

使用docker  images命令查看镜像:

  1. [hh_93_197 /]# docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. hh/ubuntu v1 554a3b147ad1 3 minutes ago 187.9 MB
  4. docker-whale latest 1b1c047367b4 47 hours ago 247 MB
  5. ubuntu latest 07c86167cdc4 12 days ago 187.9 MB
  6. hello-world latest 690ed74de00f 5 months ago 960 B
  7. docker/whalesay latest 6b362a9f73eb 9 months ago 247 MB
  8. training/webapp latest 6fae60ef3446 10 months ago 348.7 MB
  1.  

使用新的镜像创建一个容器:

  1. [hh_93_197 /]# docker run -i -t hh/ubuntu:v1 /bin/bash
  2. root@88400cbc3e23:/# cat /tmp/readme.txt
  3. this is my image
  1.  

可见,该容器中确实是有/tmp/readme.txt文件的。

b:根据Dockerfile创建镜像

使用docker  commit创建镜像有些麻烦且不易于分享。可以使用docker build命令,根据Dockerfile创建镜像。

首先需要创建一个Dockerfile文件,该文件包含了构建镜像的一系列指令:

  1. [hh_93_197 ~]# mkdir ubuntu_hh
  2. [hh_93_197 ~]# cd ubuntu_hh/
  3. [hh_93_197 ~/ubuntu_hh]# touch Dockerfile
  1.  

在Dockerfile文件中,每条指令都创建了镜像的一个新的层(镜像是分层的),简单的例子如下:

  1. # This is a comment
  2. FROM ubuntu:latest
  3. MAINTAINER hh
  4. RUN touch /tmp/readme.txt
  5. RUN echo "this is my ubuntu V2" >> /tmp/readme.txt

Dockerfile中,以”#”开头的是注释语句,每条指令以一个大写的声明开始。第一条FROM指令用于告诉docker新建的镜像以哪个镜像为基础,这里以ubuntu:latest为基础创建新镜像。MAINTAINER用于指定镜像的作者。

之后是两个RUN指令,每条RUN指令用于在镜像中运行命令,这里首先是新建文件/tmp/readme.txt,然后将"this is my ubuntu V2"写入该文件。

现在,根据该Dockerfile,使用docker  build命令创建新镜像:

  1. [hh_93_197 ~/ubuntu_hh]# docker build -t hh/ubuntu:v2 .
  2. Sending build context to Docker daemon 2.048 kB
  3. Step 1 : FROM ubuntu:latest
  4. ---> 07c86167cdc4
  5. Step 2 : MAINTAINER hh
  6. ---> Running in 249d7e34ce6b
  7. ---> b77f4b33c9ab
  8. Removing intermediate container 249d7e34ce6b
  9. Step 3 : RUN touch /tmp/readme.txt
  10. ---> Running in 23c8fdeeca89
  11. ---> 447a799e19f4
  12. Removing intermediate container 23c8fdeeca89
  13. Step 4 : RUN echo "this is my ubuntu V2" >> /tmp/readme.txt
  14. ---> Running in 758d510038a3
  15. ---> 450ca66f56da
  16. Removing intermediate container 758d510038a3
  17. Successfully built 450ca66f56da

使用-t选项,指定新镜像的作者为hh,镜像名称为ubuntu,tag为v2。而且指定当前目录作为Dockerfile文件所在的目录,当然也可以指定Dockerfile所在目录的绝对路径。

运行该命令之后,docker首先upload构建环境:基本上就是构建目录的内容;接下来就是执行Dockerfile文件中每一条指令,可以看见每条指令都创建一个新的临时容器,然后在容器中运行指令(比如:---> Running in 23c8fdeeca89),然后提交容器的变化(跟docker commit类似),生成一个临时镜像(比如:--->
b77f4b33c9ab),然后删除临时容器(Removing intermediate container 249d7e34ce6b)。

最后,当所有指令执行完成之后,新的镜像就构建成功了,这里的镜像ID是450ca66f56da。所有的临时镜像也都被删除了,使用docker  images查看新建的镜像:

  1. [hh_93_197 ~/ubuntu_hh]# docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. hh/ubuntu v2 450ca66f56da 36 seconds ago 187.9 MB
  4. hh/ubuntu v1 554a3b147ad1 27 minutes ago 187.9 MB
  5. docker-whale latest 1b1c047367b4 47 hours ago 247 MB
  6. ubuntu latest 07c86167cdc4 12 days ago 187.9 MB
  7. hello-world latest 690ed74de00f 5 months ago 960 B
  8. docker/whalesay latest 6b362a9f73eb 9 months ago 247 MB
  9. training/webapp latest 6fae60ef3446 10 months ago 348.7 MB

可以根据新建的镜像运行一个容器:

  1. [hh_93_197 ~/ubuntu_hh]# docker run -t -i hh/ubuntu:v2 /bin/bash
  2. root@b6f9f8bbe491:/# cat /tmp/readme.txt
  3. this is my ubuntu V2

5:更改镜像的tag

可以使用docker  tag命令更改一个镜像的tag,比如:

  1. docker tag 450ca66f56da ouruser/sinatra:devel

使用docker  images查看镜像,发现同一个镜像ID具有多个标签:

  1. [hh_93_197 ~/ubuntu_hh]# docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. hh/ubuntu v2 450ca66f56da 28 minutes ago 187.9 MB
  4. ouruser/sinatra devel 450ca66f56da 28 minutes ago 187.9 MB
  5. ...

6:镜像摘要

使用V2或者更新格式的镜像,具有一个叫做摘要的可寻址内容的标识符。只要用于创建镜像的输入不变,则镜像的摘要值就是可预期的,列出镜像的摘要值,可以在docker  images中使用--digests选项:

  1. $ docker images --digests | head
  2. REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
  3. ouruser/sinatra latest sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf 5db5f8471261 11 hours ago 446.7 MB

当从2.0的镜像库push或者pull时,push或pull命令的输出包含摘要信息,可以在pull时使用摘要信息:

  1. $ docker pull ouruser/sinatra@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf

也可以在create、run和rmi命令中,以及Dockerfile中的FROM指令中,使用摘要指定镜像。

7:镜像的导入和导出

使用docker  save命令,可以导出镜像到本地文件:

  1. [hh_93_197 ~]# docker save -o ubuntu.tar ubuntu

查看ubuntu.tar的内容:

使用docker load命令,可以将本地文件导入到本地镜像库,比如:

  1. [hh_93_197 ~]# docker load --input ubuntu.tar

或者

  1. [hh_93_197 ~]# docker load < ubuntu.tar

注意:用户既可以使用 docker  load 来导入镜像存储文件到本地镜像库,也可以使用docker  import 来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。

8:其他

可以使用docker  push命令,将新建的镜像上传至Docker  Hub。

可以使用docker  rmi命令删除本地的镜像。删除镜像前,需要确认没有基于该镜像的容器运行。

https://docs.docker.com/engine/userguide/containers/dockerizing/

https://docs.docker.com/engine/userguide/containers/usingdocker/

https://docs.docker.com/engine/userguide/containers/dockerimages/

01docker简单使用和配置(容器、镜像)的更多相关文章

  1. Kubernetes — 深入理解容器镜像

    而正如我前面所说的,Namespace 的作用是“隔离”,它让应用进程只能看到该 Namespace 内的“世界”:而 Cgroups 的作用是“限制”,它给这个“世界”围上了一圈看不见的墙.这么一折 ...

  2. Harbor实现容器镜像仓库的管理和运维

    本次分享主要讲述了在开发运维中的管理容器镜像方法.为了便于说明原理,较多地使用Harbor作为例子. 内容主要包括: 开发和生产环境中镜像仓库的权限控制: 镜像远程同步(复制)的原理: 大规模应用镜像 ...

  3. Java应用在docker环境配置容器健康检查

    在<极速体验docker容器健康>一文已体验了docker容器健康检查功能,今天就来给java应用的容器加入健康检查,使应用的状态随时都可以被监控和查看. 实战环境信息 操作系统:macO ...

  4. 阿里云开源 image-syncer 工具,容器镜像迁移同步的终极利器

    为什么要做这个工具? 由于阿里云上的容器服务 ACK 在使用成本.运维成本.方便性.长期稳定性上大大超过公司自建自维护 Kubernets 集群,有不少公司纷纷想把之前自己维护 Kubernetes ...

  5. 使用jdk 容器镜像注意默认编码问题

    最近在使用一个开源数据pipeline 处理的工具的时候,发现了jdk容器镜像编码的一些问题 以下是一个简单的描述 问题 使用了streamsets 工具,使用容器运行,默认使用了adoptopenj ...

  6. 使用nodejs+ harbor rest api 进行容器镜像迁移

    最近因为基础设施调整,需要进行harbor 镜像仓库的迁移,主要是旧版本很老了,不想使用,直接 打算部署新的,原以为直接使用复制功能就可以,但是发现版本差异太大,直接失败,本打算使用中间 版本过度进行 ...

  7. 私有容器镜像仓库harbor

    私有镜像仓库Harbor 1.Harbor概述 Habor是由VMWare公司开源的容器镜像仓库.事实上,Habor是在Docker Registry上进行了相应的企业级扩展,从而获得了更加广泛的应用 ...

  8. 云原生交付加速!容器镜像服务企业版支持 Helm Chart

    2018 年 6 月,Helm 正式加入了 CNCF 孵化项目:2018 年 8 月,据 CNCF 的调研表明,有百分之六十八的开发者选择了 Helm 作为其应用包装方案:2019 年 6 月,阿里云 ...

  9. [Docker镜像] 关于阿里云容器镜像服务的使用(以天池比赛提交镜像为例)

    最近在参加天池比赛,由于比赛需要使用阿里云容器镜像服务完成线上预测任务,所以花费了3-4天的时间了解并使用Docker完成相关镜像操作,在此分享下我学习的内容,以下是本文的目录结构: 介绍 镜像 容器 ...

随机推荐

  1. php获取数据转换成json格式

    <?php header("content-type:text/html;charset=utf-8"); $con=mysql_connect("localhos ...

  2. windows 2008 安装 apache + mysql + php

    下载准备 php : http://windows.php.net/downloads/releases/archives/ apache : https://www.apachehaus.com/c ...

  3. vmware的Linux虚拟机ping不通外网的解决办法

    转载自:https://blog.csdn.net/l_l_b_/article/details/79409843 1.点击此处编辑 2.选择虚拟网络编辑器 3.点击更改设置 4.选择v8 并将使用本 ...

  4. What every computer science major should know 每一个计算机科学专业的毕业生都应该都知道的

    Given the expansive growth in the field, it's become challenging to discern what belongs in a modern ...

  5. Exception in thread "AWT-EventQueue-0" javax.persistence.PersistenceException: No Persistence provider for EntityManager named null

    swing Exception in thread "AWT-EventQueue-0" javax.persistence.PersistenceException: No Pe ...

  6. sar网络统计数据

    sar是一个研究磁盘I/O的优秀工具.以下是sar磁盘I/O输出的一个示例. 第一行-d显示磁盘I/O信息,5 2选项是间隔和迭代,就像sar数据收集器那样.表3-3列出了字段和说明. 表3-3    ...

  7. 微信小程序--每个独立的page的page.json只能修改window属性

    app.json 配置项列表 app.json文件用来对微信小程序进行全局配置,决定页面文件的路径.窗口表现.设置网络超时时间.设置多 tab 等. window配置 用于设置小程序的状态栏.导航条. ...

  8. Ajax--同源策略,jsonp跨域传输原理(callback),

    什么是同源策略? 阮一峰的博客 同源策略 同源策略的解决方法: 跨域传输 img 标签的src是可以引入其他域名下的图片 script标签的src属性同理 ,也可以引入其他域名下的js文件,并执行 1 ...

  9. web App libraries跟referenced libraries的一些问题

    该博文内容经参看网上其他资料归纳所成,并注明出处: 问题一:myeclipse中Web App Libraries无法自动识别lib下的jar包(http://blog.csdn.net/tianca ...

  10. 简单介绍几个CSSReset的方法

    对于小型的网站来说,用这个并不会带来大的资源浪费,但如果是像Yahoo这种架构非常大的网站,必须要有选择地进行CSS重设,以减 少资源浪费. 正在使用CSS的你,用过CSS Reset吗?当然,或许你 ...