最近公司项目要用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

Docker学习——基本使用的更多相关文章

  1. Docker学习总结

    本文作为总结性文章,不会详细讲解Docker.但会把已学习的.了解的内容按照由易到难的顺序串起来,更多的是帮助Docker新手快速的了解Docker,知道目前处在哪个阶段,接下来该学些什么,避免碰太多 ...

  2. Docker学习笔记 — 配置国内免费registry mirror

    Docker学习笔记 — 配置国内免费registry mirror Docker学习笔记 — 配置国内免费registry mirror

  3. docker学习笔记1 -- 安装和配置

    技术资料 docker中文官网:http://www.docker.org.cn/ 中文入门课程:http://www.docker.org.cn/book/docker.html docker学习笔 ...

  4. docker学习资料整理(持续更新中..)

    docker最近可以说火得一踏糊涂,跟 51大神在交流技术的时候这个东西会多次被提到,当我们还玩vm+linux/freebsd的时候,人家已经上升到更高层次了,这就是差距,感觉好高大上的样子,技术之 ...

  5. Docker学习笔记之一,搭建一个JAVA Tomcat运行环境

    Docker学习笔记之一,搭建一个JAVA Tomcat运行环境 前言 Docker旨在提供一种应用程序的自动化部署解决方案,在 Linux 系统上迅速创建一个容器(轻量级虚拟机)并部署和运行应用程序 ...

  6. Docker学习总结之Run命令介绍

    Docker学习总结之Run命令介绍 本文由Vikings(http://www.cnblogs.com/vikings-blog/) 原创,转载请标明.谢谢! 在使用Docker时,执行最多的命令某 ...

  7. docker~学习笔记索引

    回到占占推荐博客索引 使用docker也有段时间了,写了不少文章与总结,下面把它整理个目录出来,方便大家去学习与检索! docker~学习笔记索引 docker~linux下的部署和基本命令(2017 ...

  8. Docker学习笔记 - Docker容器内部署redis

    Docker学习笔记(2-4)Docker应用实验-redist server 和client的安装使用 一.获取redis容器(含客户端和服务端) 二.创建服务端容器 1.在终端A中运行redis- ...

  9. docker学习笔记(一)—— ubuntu16.04下安装docker

    docker学习笔记(一)—— ubuntu16.04下安装docker 原创 2018年03月01日 14:53:00 标签: docker / ubuntu 1682 本文开发环境为Ubuntu ...

  10. Docker 学习8 Dockerfile详解2

    一.继续上章节Docker学习7 CMD命令后. 11.ENTRYPOINT a.容器启动后相当于会启动ENTRYPOINT + CMD 命令,CMD相当于参数传给entrypoint的 [root@ ...

随机推荐

  1. August 11th, 2019. Week 33rd, Sunday

    Worry does not empty tomorrow of its sorrow. It empties today of its strength. 忧虑不会消除明天的痛苦,它只会削弱今天的力 ...

  2. 《数据挖掘导论》实验课——实验四、数据挖掘之KNN,Naive Bayes

    实验四.数据挖掘之KNN,Naive Bayes 一.实验目的 1. 掌握KNN的原理 2. 掌握Naive Bayes的原理 3. 学会利用KNN与Navie Bayes解决分类问题 二.实验工具 ...

  3. Nim 游戏

    你和你的朋友,两个人一起玩 Nim 游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头. 拿掉最后一块石头的人就是获胜者.你作为先手. 你们是聪明人,每一步都是最优解. 编写一个函数,来判断 ...

  4. Java之Lambda表达式

    函数式编程思想概述 面向对象过分强调“必须通过对象的形式来做事情”,而函数式思想则尽量忽略面向对象的复杂语法——强调做什么,而不是以什么形式做. 面向对象的思想: 做一件事情,找一个能解决这个事情的对 ...

  5. MIT / BSD / Apache / LGPL / Mozilla / GPL 区别

    自由度:MIT > BSD > Apache > LGPL > Mozilla > GPL

  6. Linux下离线安装python项目的依赖包

    第一步新建一个site-packages文件夹,把python项目有需要的依赖包名称导出到site-packages下的requirements.txt中 $ pip3 freeze > req ...

  7. SAP 表汇总

    SAP 表整理:VBKPF-预制凭证抬头表: VBKPF-预制凭证抬头表 VBKPF-预制凭证抬头表 VBSEG-预制凭证行项目表: VBSEG-预制凭证行项目表 VBSEG-预制凭证行项目表 VBS ...

  8. BASE64Encoder cannot be resolved to a type类似问题的解决办法

    我们有时候会碰见在JDK或者其他jar包中提供了某方法或者类,接口,而开发工具仍然报红,无法使用该类或者方法,那是应为我们的编译器没有识别,或者没有支持某些方法或者类 这个时候需要我们手动的开启.具体 ...

  9. iOS中点击按钮复制指定内容

    话不多说,直接上图和代码:

  10. 如何判断Linux系统安装在VMware上?

    如何判断当前Linux系统是否安装在VMware上面呢? 因为公司大部分服务器位于VMware上,也有小部分系统部署在物理机上面.今天老大要求统计一下VMware和物理机上服务器的数量,个人简单测试. ...