最近公司项目要用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可强制退出。后面也可以同时接多个镜像,它会一起删除

docker rmi python_v5
docker rmi e1b

3、docker tag

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

4、docker save

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

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

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

OPTIONS说明:

-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;

-d: 后台运行容器,并返回容器ID;

-i: 以交互模式运行容器,通常与 -t 同时使用;

-P: 随机端口映射,容器内部端口随机映射到主机的高端口

-p: 指定端口映射,格式为:主机(宿主)端口:容器端口

-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;

--name="nginx-lb": 为容器指定一个名称;

--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;

--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;

-h "mars": 指定容器的hostname;

-e username="ritchie": 设置环境变量;

--env-file=[]: 从指定文件读入环境变量;

--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;

-m :设置容器使用内存最大值;

--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;

--link=[]: 添加链接到另一个容器;

--expose=[]: 开放一个端口或一组端口;

--volume , -v:    绑定一个卷
实例
 使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx。
docker run --name=mynginx -d nginx:latest
使用镜像nginx:latest以后台模式启动一个容器,并将容器的80端口映射到主机随机端口。
docker run -P -d nginx:latest
使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 端口映射到主机的 端口,主机的目录 /data 映射到容器的 /data。
docker run -p : -v /data:/data -d nginx:latest
绑定容器的 端口,并将其映射到本地主机 127.0.0.1 的 端口上。
docker run -p 127.0.0.1::/tcp ubuntu bash
使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
~$ docker run -it nginx:latest /bin/bash
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

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

➜  Downloads docker inspect python_v5
[
{
"Id": "sha256:e1b27deb648064491092ee935137217b99d4bb69df6cbf67387cbf7f4c58d32c",
"RepoTags": [
"python_v5:latest"
],
"RepoDigests": [],
"Parent": "",
"Comment": "",
"Created": "2019-08-01T08:07:31.264992514Z",
"Container": "6302d3a0173fb32427ca0da36f01623ff84c62db06bdd2bb9096573ec99b7166",
"ContainerConfig": {
"Hostname": "6302d3a0173f",
"Domainname": "",
"User": "",
"AttachStdin": true,
"AttachStdout": true,
"AttachStderr": true,
"Tty": true,
"OpenStdin": true,
"StdinOnce": true,
"Env": [
"PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"LANG=C.UTF-8",
"GPG_KEY=0D96DF4D4110E5C43FBFB17F2D347EA6AA65421D",
"PYTHON_VERSION=3.7.4",
"PYTHON_PIP_VERSION=19.1.1"
],
"Cmd": [
"/bin/bash"
],
"Image": "",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {}
},
"DockerVersion": "19.03.0",
"Author": "",
"Config": {
"Hostname": "6302d3a0173f",
"Domainname": "",
"User": "",
"AttachStdin": true,
"AttachStdout": true,
"AttachStderr": true,
"Tty": true,
"OpenStdin": true,
"StdinOnce": true,
"Env": [
"PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"LANG=C.UTF-8",
"GPG_KEY=0D96DF4D4110E5C43FBFB17F2D347EA6AA65421D",
"PYTHON_VERSION=3.7.4",
"PYTHON_PIP_VERSION=19.1.1"
],
"Cmd": [
"/bin/bash"
],
"Image": "",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {}
},
"Architecture": "amd64",
"Os": "linux",
"Size": ,
"VirtualSize": ,
"GraphDriver": {
"Data": {
"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",
"MergedDir": "/var/lib/docker/overlay2/e5b7b0d9262a7ad3775893caa0629d13786d0ff59c52ab223b55b45eb9ac6d0c/merged",
"UpperDir": "/var/lib/docker/overlay2/e5b7b0d9262a7ad3775893caa0629d13786d0ff59c52ab223b55b45eb9ac6d0c/diff",
"WorkDir": "/var/lib/docker/overlay2/e5b7b0d9262a7ad3775893caa0629d13786d0ff59c52ab223b55b45eb9ac6d0c/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:31b0e148310d3953be8ba9ff530a91424f01688ee604f99cbfb519dab9e8c66d",
"sha256:46601dcd41143bcf3068c33e6a3c243b91a9887cccc9f2538dd04e0052029db5",
"sha256:e9313b51f46d907a186066e017c68c9201dbfb858dc862e30ba25f0e1b2ea6b3",
"sha256:05c027e771c84f989d3014001fb68093d26433d8cdbd8a33ef6a9fb421236ebd",
"sha256:8c487c756d719a312177878c31e091160a82466c592082f229b81150cabd8891",
"sha256:a8063b4b5a7d8c0c0f7a4bc3f7ad3b40022fee3e4d80cddc422c035337d63bab",
"sha256:9c97ad5abfed00d029883bcc6d16f59f0a93d64613f125f6161622589e5adae0",
"sha256:bf67ef7447f3277d7ad9f21c89386e517ef7400c0e8edd69b613c59d1ad3d907",
"sha256:0d93f713b4088e1d0121f020642e524965bd88ba808360ce402a94bfa4c33099",
"sha256:e03d22e105305aefe1cd4cc1888438d35f4cfd1be4201c48812b1f1223ef5fdf",
"sha256:beaa082ea74ddfd28eeaeb6afe1d9d3c1cfa97f327f62a716915babd7bb8ba95",
"sha256:e07fc2dcedcb9699d7d275a292fbf2bc012487e723d914147ede6351e4f59980",
"sha256:c6043ace8fd9e940870be978e72abdfa976bc1513682f24c9b0bf4626da3cc98"
]
},
"Metadata": {
"LastTagTime": "0001-01-01T00:00:00Z"
}
}
]

4、docker start/stop/restart

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

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

docker restart :重启容器

5、docker rm

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

docker rm [OPTIONS] CONTAINER [CONTAINER...]

OPTIONS说明:

-f :通过SIGKILL信号强制删除一个运行中的容器

-l :移除容器间的网络连接,而非容器本身

-v :-v 删除与容器关联的卷

6、docker create 

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

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

7、decker exec

在运行的容器中执行命令

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

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

实例

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

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

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

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

8、docker attach

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

docker attach --sig-proxy=false mynginx

9、docker commit

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

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

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

10、docker cp

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

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

11、docker logs

获取容器的日志

docker logs [OPTIONS] CONTAINER

OPTIONS说明:

  • -f : 跟踪日志输出

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

  • -t : 显示时间戳

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

 12、docker 启停

# 停止服务
systemctl stop docker
# 重启服务
systemctl daemon-reload
systemctl restart docker
systemctl enable docker

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

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

最新文章

  1. sha1散列(C语言)
  2. xpth 字符串截取
  3. STL:原地归并排序模板(InplaceMergeSort)
  4. 捕获异常try:except
  5. IOS 友盟使用详解
  6. 疯狂java讲义——继承
  7. android中的ellipsize设置(省略号的问题)
  8. Java NIO类库Selector机制解析(上)
  9. iOS 将系统文字设置为中文
  10. poj 3641 Pseudoprime numbers(快速幂)
  11. opencv3.1自带demo的介绍和运行操作。转载
  12. 判断数字 字母 isDigit(), isalpha()
  13. LPC1788的LCD接口驱动真彩屏
  14. php使用curl下载指定大小的文件
  15. JS原型学习之旅(一)之一图了解原型链关系
  16. sync_binlog innodb_flush_log_at_trx_commit 浅析【转】
  17. Oracle存储过程中使用临时表
  18. matlab柱面图
  19. 十一:image 图片
  20. vue + typescript 项目起手式

热门文章

  1. leetcode动态规划--基础题
  2. vue 父子父组件通过props传父页面请求后的数据
  3. 修改项目语言为C#8.0
  4. Git 将已有项目推送到新建的远程仓库
  5. Selenium(五):CSS选择器(二)
  6. requests-html库render的使用
  7. 用XHR简单封装一个axios
  8. 推荐四个phpstorm酷炫实用插件 让你写代码的时候不在孤单!
  9. ES6中Class的用法及在微信小程序中的应用实例
  10. DBUtils框架的使用(上)