最近公司项目要用docker部署,第一次接触,记录一下,方便使用时查阅。

你有没有遇到过这种情况,在本地运行良好的代码,在另一台电脑或者另一个环境里一堆bug,可以说是水土不服,本质上是两个电脑的运行环境不一样,但是不能每次给到别人都要装一遍运行环境吧,这样很抓狂,这时候docker就横空出世来拯救我们了。docker相当于我们平时使用的虚拟环境,但是它比虚拟环境好,比它轻便,并且可移植,使用起来非常方便。

docker主要有三块内容:仓库(registry)、镜像(image)和容器(container)。理解了这三个内容,相信大家使用起来也没什么问题了。当然最好的教程是它的官方文档了:https://docs.docker.com/engine/reference/run/

 

一、仓库镜像 

使用过github的人应该对仓库不陌生,docker仓库就相当于一个收纳盒,里面有很多官方或者个人上传的镜像,我们要用时只需要从里面拿出来就好了。

1、docker search 

用于查找仓库里的镜像,比如我要用python,那么我就可以用这个命令查看里面已有的python镜像,拿来用即可,一般官方的镜像都是在第一个,如下图中,它是按星标量(stars)来排序的。

2、docker pull [image]

用于从docker仓库中拉取我们需要的镜像到我们本地,不指定版本的话,默认下载的是最新版本,如果我们要python3.7版本,则可以用python:3.7的格式

3、docker push [image]

用于将本地的镜像上传到镜像仓库,要先登陆到镜像仓库才可上传

4、docker login

用于登陆到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub

5、docker logout

用于登出一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub

 

二、本地镜像管理 

上面说的是如何操作官方镜像仓库,接下来我们说说本地镜像,比如我们下载了好几个镜像到本地,我们本地也就有了镜像了,就可以以这些镜像为基础做很多事了。

1、docker images

用于查看本地的所有镜像

2、docker rmi 

用于删除本地镜像,后面可以接镜像名,也可以是镜像ID,镜像ID还可以不用写全名,只要写前几位,只要能区分就行,比如下面都是删除同一个镜像。加上-f可强制退出。后面也可以同时接多个镜像,它会一起删除

  1. docker rmi python_v5
  2. docker rmi e1b

3、docker tag

用于标记本地镜像,将其归入某一仓库,相当于重命名。如下图中,执行之后image ID没有变。

4、docker save

用于将指定镜像保存成 tar 归档文件。我们做好的镜像要传给别人一般会保存成tar格式。

  1. docker save [OPTIONS] IMAGE [IMAGE...]

以上两种方式都可以把本地镜像Ubuntu保存为tar文档,然后可以将它们拷贝给别人用了,使用的人怎么导入到自己的docker里呢?

5、docker load

用于导入使用 docker save 命令导出的镜像。以下两种方式都可以。

6、docker export/import

用于将镜像归档为tar文件和从归档文件中创建镜像。刚刚save和load也是这种功能,有什么区别呢?

(1) docker save image-name:  将镜像保存为文件,然后通过docker load再加载回来为一个镜像。会保存该镜像的的所有历史记录,比docker export 导出的文件大,很容易理解,因为save时保存了镜像的所有历史记录。

(2) docker export container-name: 将一个容器导出为文件,再使用docker import命令将容器导入成为一个新的镜像,但是相比docker save命令,容器文件会丢失所有元数据和历史记录,仅保存容器当时的状态,相当于虚拟机快照。

7、docker history

查看指定镜像的创建历史

 

三、容器操作

1、docker run 

创建一个新的容器并运行一个命令,注意Docker容器后台运行,就必须有一个前台进程,主线程结束,容器会退出。所以如果docker run -d image 这样启动容器后,你在用docker ps 往往看不到容器正在运行,其实它启动过,然后马上又停止了,但是如果你给它一个前台进程,它会一直running,即必须有交互。比如用docker run -dit image

  1. docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
  2. OPTIONS说明:
  3. -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
  4. -d: 后台运行容器,并返回容器ID
  5. -i: 以交互模式运行容器,通常与 -t 同时使用;
  6. -P: 随机端口映射,容器内部端口随机映射到主机的高端口
  7. -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
  8. -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  9. --name="nginx-lb": 为容器指定一个名称;
  10. --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
  11. --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
  12. -h "mars": 指定容器的hostname
  13. -e username="ritchie": 设置环境变量;
  14. --env-file=[]: 从指定文件读入环境变量;
  15. --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
  16. -m :设置容器使用内存最大值;
  17. --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
  18. --link=[]: 添加链接到另一个容器;
  19. --expose=[]: 开放一个端口或一组端口;
  20. --volume , -v: 绑定一个卷

View Code

实例
  1. 1 使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx
  2. docker run --name=mynginx -d nginx:latest
  3. 2 使用镜像nginx:latest以后台模式启动一个容器,并将容器的80端口映射到主机随机端口。
  4. docker run -P -d nginx:latest
  5. 3 使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data
  6. docker run -p 80:80 -v /data:/data -d nginx:latest
  7. 4 绑定容器的 8080 端口,并将其映射到本地主机 127.0.0.1 80 端口上。
  8. docker run -p 127.0.0.1:80:8080/tcp ubuntu bash
  9. 5 使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
  10. ~$ docker run -it nginx:latest /bin/bash
  11. root@b8573233d675:/#
    6 使用镜像python:v2以后台模式启动一个容器,并运行容器内的/opt/下的hello.py文件
    docker run -d 59c /bin/bash -c \'python /opt/hello.py\'

2、docker ps [-a]

查看正在运行的容器,加上-a表示查看所有容器,不管是否在运行。a即all的意思。

3、docker inspect

查看某个镜像或容器信息。

  1. Downloads docker inspect python_v5
  2. [
  3. {
  4. "Id": "sha256:e1b27deb648064491092ee935137217b99d4bb69df6cbf67387cbf7f4c58d32c",
  5. "RepoTags": [
  6. "python_v5:latest"
  7. ],
  8. "RepoDigests": [],
  9. "Parent": "",
  10. "Comment": "",
  11. "Created": "2019-08-01T08:07:31.264992514Z",
  12. "Container": "6302d3a0173fb32427ca0da36f01623ff84c62db06bdd2bb9096573ec99b7166",
  13. "ContainerConfig": {
  14. "Hostname": "6302d3a0173f",
  15. "Domainname": "",
  16. "User": "",
  17. "AttachStdin": true,
  18. "AttachStdout": true,
  19. "AttachStderr": true,
  20. "Tty": true,
  21. "OpenStdin": true,
  22. "StdinOnce": true,
  23. "Env": [
  24. "PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
  25. "LANG=C.UTF-8",
  26. "GPG_KEY=0D96DF4D4110E5C43FBFB17F2D347EA6AA65421D",
  27. "PYTHON_VERSION=3.7.4",
  28. "PYTHON_PIP_VERSION=19.1.1"
  29. ],
  30. "Cmd": [
  31. "/bin/bash"
  32. ],
  33. "Image": "830",
  34. "Volumes": null,
  35. "WorkingDir": "",
  36. "Entrypoint": null,
  37. "OnBuild": null,
  38. "Labels": {}
  39. },
  40. "DockerVersion": "19.03.0",
  41. "Author": "",
  42. "Config": {
  43. "Hostname": "6302d3a0173f",
  44. "Domainname": "",
  45. "User": "",
  46. "AttachStdin": true,
  47. "AttachStdout": true,
  48. "AttachStderr": true,
  49. "Tty": true,
  50. "OpenStdin": true,
  51. "StdinOnce": true,
  52. "Env": [
  53. "PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
  54. "LANG=C.UTF-8",
  55. "GPG_KEY=0D96DF4D4110E5C43FBFB17F2D347EA6AA65421D",
  56. "PYTHON_VERSION=3.7.4",
  57. "PYTHON_PIP_VERSION=19.1.1"
  58. ],
  59. "Cmd": [
  60. "/bin/bash"
  61. ],
  62. "Image": "830",
  63. "Volumes": null,
  64. "WorkingDir": "",
  65. "Entrypoint": null,
  66. "OnBuild": null,
  67. "Labels": {}
  68. },
  69. "Architecture": "amd64",
  70. "Os": "linux",
  71. "Size": 1178611787,
  72. "VirtualSize": 1178611787,
  73. "GraphDriver": {
  74. "Data": {
  75. "LowerDir": "/var/lib/docker/overlay2/94b14c0267ea97d2e202b03c961a526a5d0e7efa569b369ecaaf5b4a158c6b0f/diff:/var/lib/docker/overlay2/8088e680020134339f3dbebae5e350a7d5289d49c05747194098d5edddb5d320/diff:/var/lib/docker/overlay2/8d6375915ac6b8ac7bab53ea08b7eb4d55ad34983d1571d55c2d2cbfc7e34533/diff:/var/lib/docker/overlay2/1e1a0b9b37457942435da7f36fcc5e9edc537502f5f7bafc6c3f0a306f9fe9b5/diff:/var/lib/docker/overlay2/908161c3a74b133dfa9f64b92263502986a6f4928a35ddb36be66f82c8c450c0/diff:/var/lib/docker/overlay2/f878d6e9110afb24ae50b3cd4ec19add29cf3eeb65f4fc902f0be8121487688c/diff:/var/lib/docker/overlay2/600822aff1d1245171a2d6b4d445c648e8a647baae59d17ab24c06c816030751/diff:/var/lib/docker/overlay2/f5254203568c9d7a82d99756c04d1198d8104a385058cc7d8fa72af1e53b0bbf/diff:/var/lib/docker/overlay2/a253040337dc2660037f2c654d5781a259d98a225ff8777db7ed8eb6e3f4527c/diff:/var/lib/docker/overlay2/78e6b4db4897d7473557fe9700cfdd384703dcee8fe7bee3edb2d65f2fccbf41/diff:/var/lib/docker/overlay2/ff2b9485217fa82eec4461ee662b0bc99aab13625a4f3794c6e7188a6b1cc108/diff:/var/lib/docker/overlay2/e596defbdc38e3c423601d8fc559579012acd5b219447374ed6ea73ca4420560/diff",
  76. "MergedDir": "/var/lib/docker/overlay2/e5b7b0d9262a7ad3775893caa0629d13786d0ff59c52ab223b55b45eb9ac6d0c/merged",
  77. "UpperDir": "/var/lib/docker/overlay2/e5b7b0d9262a7ad3775893caa0629d13786d0ff59c52ab223b55b45eb9ac6d0c/diff",
  78. "WorkDir": "/var/lib/docker/overlay2/e5b7b0d9262a7ad3775893caa0629d13786d0ff59c52ab223b55b45eb9ac6d0c/work"
  79. },
  80. "Name": "overlay2"
  81. },
  82. "RootFS": {
  83. "Type": "layers",
  84. "Layers": [
  85. "sha256:31b0e148310d3953be8ba9ff530a91424f01688ee604f99cbfb519dab9e8c66d",
  86. "sha256:46601dcd41143bcf3068c33e6a3c243b91a9887cccc9f2538dd04e0052029db5",
  87. "sha256:e9313b51f46d907a186066e017c68c9201dbfb858dc862e30ba25f0e1b2ea6b3",
  88. "sha256:05c027e771c84f989d3014001fb68093d26433d8cdbd8a33ef6a9fb421236ebd",
  89. "sha256:8c487c756d719a312177878c31e091160a82466c592082f229b81150cabd8891",
  90. "sha256:a8063b4b5a7d8c0c0f7a4bc3f7ad3b40022fee3e4d80cddc422c035337d63bab",
  91. "sha256:9c97ad5abfed00d029883bcc6d16f59f0a93d64613f125f6161622589e5adae0",
  92. "sha256:bf67ef7447f3277d7ad9f21c89386e517ef7400c0e8edd69b613c59d1ad3d907",
  93. "sha256:0d93f713b4088e1d0121f020642e524965bd88ba808360ce402a94bfa4c33099",
  94. "sha256:e03d22e105305aefe1cd4cc1888438d35f4cfd1be4201c48812b1f1223ef5fdf",
  95. "sha256:beaa082ea74ddfd28eeaeb6afe1d9d3c1cfa97f327f62a716915babd7bb8ba95",
  96. "sha256:e07fc2dcedcb9699d7d275a292fbf2bc012487e723d914147ede6351e4f59980",
  97. "sha256:c6043ace8fd9e940870be978e72abdfa976bc1513682f24c9b0bf4626da3cc98"
  98. ]
  99. },
  100. "Metadata": {
  101. "LastTagTime": "0001-01-01T00:00:00Z"
  102. }
  103. }
  104. ]

View Code

4、docker start/stop/restart

docker start :启动一个或多个已经被停止的容器

docker stop :停止一个运行中的容器

docker restart :重启容器

5、docker rm

删除一个或多少容器,加上-f可强制退出,后面也可以接多个container一起删除

  1. docker rm [OPTIONS] CONTAINER [CONTAINER...]
  2. OPTIONS说明:
  3. -f :通过SIGKILL信号强制删除一个运行中的容器
  4. -l :移除容器间的网络连接,而非容器本身
  5. -v :-v 删除与容器关联的卷

View Code

6、docker create 

创建一个容器但不运行它。

  1. docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

7、decker exec

在运行的容器中执行命令

  1. docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

  2. OPTIONS说明:
  3. -d :分离模式: 在后台运行
  4. -i :即使没有附加也保持STDIN 打开
  5. -t :分配一个伪终端

实例

在容器 mynginx 中以交互模式执行容器内 /root/runoob.sh 脚本:

  1. docker exec -it mynginx /bin/sh /root/runoob.sh
  2. http://www.runoob.com/

在容器 mynginx 中开启一个交互模式的终端:

  1. ~$ docker exec -i -t mynginx /bin/bash
  2. root@b1a0703e41e7:/#

8、docker attach

连接到正在运行中的容器。要attach上去的容器必须正在运行,可以同时连接上同一个container来共享屏幕,带上–sig-proxy=false可以确保CTRL-D或CTRL-C不会关闭容器。

  1. docker attach --sig-proxy=false mynginx

9、docker commit

从容器创建一个新的镜像。这个比较实用。

  1. docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
  2. OPTIONS说明:
  3. -a :提交的镜像作者;
  4. -c :使用Dockerfile指令来创建镜像;
  5. -m :提交时的说明文字;
  6. -p :在commit时,将容器暂停。
  1. ~$ docker commit -a "runoob.com" -m "my apache" a404c6c174a2 mymysql:v1
  2. sha256:37af1236adef1544e8886be23010b66577647a40bc02c0885a6600b33ee28057
  3. ~$ docker images mymysql:v1
  4. REPOSITORY TAG IMAGE ID CREATED SIZE
  5. mymysql v1 37af1236adef 15 seconds ago 329 MB

10、docker cp

用于容器与主机之间的数据拷贝。我们经常要将写好的代码放入容器中,这个方法就很适用。

  1. docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
  2. docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
  1. docker cp /opt/try 96f7f14e99ab:/home/zzf

11、docker logs

获取容器的日志

  1. docker logs [OPTIONS] CONTAINER

  OPTIONS说明:

  • -f : 跟踪日志输出

  • –since :显示某个开始时间的所有日志

  • -t : 显示时间戳

  • –tail :仅列出最新N条容器日志

 12、docker 启停

  1. # 停止服务
  2. systemctl stop docker
  3. # 重启服务
  4. systemctl daemon-reload
  5. systemctl restart docker
  6. systemctl enable docker

13、Docker DeviceMapper占用空间太大解决方案

  • 问题主要在于原先分配的空间过大导致的,使用“docker info”查看
  • 首先备份需要的容器和镜像,使用“docker save”或者“docker export”.
  • 然后暂停docker;
  • 删除/var/lib/docker目录;
  • 重建目录,空间分配
  1. mkdir -p /var/lib/docker/devicemapper/devicemapper
  2. dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/data bs=1M count=0 seek=8192
  • 重启docker

 

版权声明:本文为zongfa原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zongfa/p/11295685.html