1.Docker概念
Docker 官网:https://www.docker.com
Github Docker 源码:https://github.com/docker/docker-ce
Docker:是一个容器引擎,用于管理容器的生命周期
容器:用于运行一个软件的容器,这个容器里面准备了软件运行所需要的一系列依赖
镜像:容器的安装包,容器中需要哪些内容,以及对应的配置信息,全部打包在这里面,要运行一个容器,必须要现有一个镜像
仓库:用于存放各个镜像,对镜像进行统一管理
可以看看其对容器与虚拟机的介绍

推荐运行在Linux上,同时推荐内核在3.10以上
uname -a

Docker CE包括两个程序,一个是Docker Client ,一个是Docker Daemon后台守护进程。
2.Docker安装
安装
参考
docker-ce镜像_docker-ce下载地址_docker-ce安装教程-阿里巴巴开源镜像站 (aliyun.com)
1.安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
2.添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4.更新并安装Docker-CE
sudo yum makecache fast sudo yum -y install docker-ce
5.开启Docker服务
sudo service docker start
6.开机自启
systemctl enable docker
检查是否安装成功
docker version

可使用自己的账户中的链接加速。

3.Docker基本命令
官方图片

查看docker命令帮助信息
docker --help

查看docker某条命令帮助信息
docker 某条命令 --help

1.操控镜像
1.搜索镜像
从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/
docker search + 要搜索内容
如:
docker search java

- NAME: 镜像仓库源的名称
- DESCRIPTION: 镜像的描述
- OFFICIAL: 是否 docker 官方发布
- STARS: 表示点赞、喜欢的意思。
- AUTOMATED: 自动构建。
2.拉取镜像
docker pull 镜像名(后跟版本,默认下载最新)
如:
docker pull ubuntu:13.10
docker pull node

可以看到上面下载了9层,镜像采用分层的结构。
所有的docker镜像都起源于一个基础的镜像,当对镜像进行修改或者增加新内容时,就会在当前的镜像层之上,创建新的镜像层。分层最大的优点是共享资源,
如下图,下载过的镜像层就不会下载。

3.列出镜像列表
列出本地主机上的镜像。
docker images

- REPOSITORY:表示镜像的仓库源
- TAG:镜像的标签
- IMAGE ID:镜像ID
- CREATED:镜像创建时间
- SIZE:镜像大小
4.删除镜像
删除 node 镜像
docker rmi node

1.操控容器
1.启动容器
docker run 镜像ID
如:
docker run e24ac15e052e
或使用 ubuntu 镜像启动一个容器,参数为以命令行模式进入该容器
docker run -it rabbitmq /bin/bash

参数说明:
- -i: 交互式操作。
- -t: 终端。
- rabbitmq: rabbitmq镜像。
- /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
输入 exit退出终端
或
docker run -itd --name rabbitmq-test rabbitmq /bin/bash
- 加入-d参数后台启动
- —name 后指定名称,可以使用名称来替代<容器 ID>指定


当然,容器网络是隔离的,所以还有映射问题,
可以通过 -P 或 -p 参数来指定端口映射
- -P :是容器内部端口随机映射到主机的端口。
- -p : 是容器内部端口绑定到指定的主机端口。
-p后接本机端口:容器端口,-P无需后接端口随机
docker run -d --hostname my-rabbit --name rabbit-demo -p 15672:15672 -p 5672:5672 rabbitmq

–hostname指定容器对应的主机名
2.查看所有的容器
查看已运行容器
docker ps
查看所有的容器docker ps -a
3.停止容器
停止容器的命令如下:
docker stop <容器 ID>

4.删除容器
docker rm -f <容器 ID>
-f强制删除
注意,只要<容器 ID>可以定位到,就能删除。

5.退出自动删除容器
加入–rm参数即可
docker run -d --rm --hostname my-rabbit --name rabbit-rm -p 15672:15672 -p 5672:5672 rabbitmq

6.容器重启策略
Docker容器的重启策略如下:
- no,默认策略,在容器退出时不重启容器
- on-failure,在容器非正常退出时(退出状态非0),才会重启容器
- on-failure:3,指定启动的次数,在容器非正常退出时重启容器,最多重启3次
- always,在容器退出时总是重启容器(只要docker启动,就启动)
- unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
如下,加入以下参数
--restart on-failure:3
如:
docker run -d --hostname my-rabbit --name rabbit-rm -p 15672:15672 -p 5672:5672 --restart on-failure:3 rabbitmq
7.为容器设置环境变量
1.使用–env或-e
docker run -itd --name=xxx -e SERVER_PORT=80 --env APP_NAME=pkslow xxx:7 b3d42726ca6cdddd7ae09d70e720d6db94ff030617c7ba5f58374ec43f8e8d68
一个-e一个环境变量,配置多个使用一个-e一个环境变量
2.把配置信息放在文件env.list里,
如:
VAR1=www VAR2=pkslow.com VAR3=www.pkslow.com
启动容器时传入文件
docker run -itd --name=xxx --env-file env.list xxx:7 1ef776e2ca2e4d3f8cdb816d3a059206fc9381db58d7290ef69301472f9b4186
8.查看环境变量
docker inspect 容器名/id
如
docker inspect rabbit-demo

或
exec指定哪个容器执行去env命令
docker exec rabbit-rm env

8.限制容器的cpu与内存
可在run命令中配置
查看run命令的帮助信息
docker run --help
限制cpu

限制内存

如-m限制6m
docker run -d -m 6m --name nginx-rm -P nginx
可以看到限制6m

9.查看容器当前状态
docker stats 容器名/id
输出实时的状态,停止按ctrl+C

10.启动容器
docker start 容器名/id

10.查看容器日志与进入容器
docker logs 容器名/id

实时动态查看
docker logs -f 容器名/id
11.进入容器内部
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
docker exec -it 容器名 /bin/bash

输入exit回车退出
4.docker数据卷Volume
比较官方的说法是:Volume是外部默认的联合文件系统或者是存在于宿主文件系统中正常的文件或文件夹。
Docker镜像被存储在一系列的只读层中。创建一个容器时,Docker会在顶部添加读写层。而对文件的修改,只会被存储在读写层中。当此容器被删除后,之前那个容器中的数据更改就会丢失掉。只读层和读写层的组合被Docker称为联合文件系统(Union File System)。
为了能够持久化这些更改过的数据,并且能够很容易实现容器间共享数据,Docker提出了Volume的概念。
数据卷的最大特点是:其生存周期独立于容器的生存周期。
数据卷相当于是容器的虚拟文件系统和主机的文件系统之间的一个交互通道,可以让容器运行时所产生的数据变更被保存到主机中,能够更方便的对数据进行备份以及保护。
1.匿名绑定
-v 后加容器内目录,如
docker run -d --name nginx-rm -P -v /usr/share/nginx/html nginx

匿名绑定方式指定数据卷在主机的哪个位置,需要使用docker inspect consainer_id来查看
docker inspect 容器名

2.具名绑定
-v 任意名称:容器内路径
docker run -d --name nginx-rm -P -v nginx-html:/usr/share/nginx/html nginx

docker inspect nginx-rm
对比匿名绑定可以自定义目录名

删除容器后,具名绑定卷不会被删除。
3.Bing Mount(绑定挂载 )
绑定挂载也是映射本地文件夹到运行的容器,与卷不同的是,可以直接修改本地文件夹,修改直接反映到容器。本地文件夹将覆盖容器文件夹。
-v 绝对路径:容器内文件夹
docker run -d --name nginx-rm -P -v /www/nginx-html:/usr/share/nginx/html nginx
docker inspect nginx-rm

多个绑定挂载使用多个-v,如:
-v 绝对路径:容器内文件夹 -v 绝对路径:容器内文件夹
4.docker数据卷命令
查看帮助信息
docker volume

展示所有数据卷
docker volume ls

create:创建一个卷
docker volume create 卷名

inspect:显示一个或多个卷的详细信息
docker volume inspect 卷名

rm:删除一个或多个卷
docker volume rm 卷名

prune:删除所有未使用的本地卷
docker volume prune
5.Docker网络
1.网络模式
查看网络模式
docker network ls

1.bridge 网络模式(桥接模式)
在创建容器时通过参数–net bridge 或者–network bridge指定,不加创建容器默认使用的网络模式.
Docker 守护进程创建了一个虚拟以太网桥 docker0,守护进程会创建一对对等虚拟设备接口 veth pair(虚拟网卡),将其中一个接口设置为容器的 eth0 接口(容器的网卡),另一个接口以 vethxxxx 这样命名在宿主机的命名空间中,从而将宿主机上的所有容器都连接到这个内部网络上。
如下docker0

大致如下

查看所有bridge网络模式下的容器,在 Containers节点中可以看到容器名称。
docker network inspect bridge
没有容器启动时

启动一个容器后

2.host 网络模式
host 网络模式需要在创建容器时通过参数–net host或者–network host指定。
采用 host 网络模式的容器,可以直接使用宿主机的 IP 地址与外界进行通信。

3.none 网络模式
在创建容器时通过参数–net none或者–network none 指定
none 网络模式就是禁用网络功能
4.container网络模式
在创建容器时通过参数 –net container:容器名称/id 或者 –network container:容器名称/id 指定
Container 网络模式不会配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。当然,两个容器除了网络方面相同之外,其他的资源还是隔离的。
5.自定义
查看network命令帮助信息
docker network

1.create
docker network create --help

示例:
docker network create --driver bridge --subnet 192.168.177.0/24 --gateway 192.168.177.1 test-net
–driver 指定具体网络模式
–gateway 指定网关ip
–subnet指定子网
最后接名字

查看该网络信息
docker network inspect 名字

现在就可以指定
如:
docker run -d --name nginx-rm -P --rm --net test-net nginx
查看容器的信息,
docker inspect nginx-rm
在 NetworkSettings节点中可以看到详细信息。

在network中

2.容器间网络间通信
创建两个默认的 bridge网络模式的容器。
docker run -di --name default_01 centos
docker run -di --name default_02 centos
查看两容器的具体 IP 信息
docker network inspect bridge

这样看的到ip,也可以
docker exec -it default_02 /bin/bash
cat /etc/hosts

使用另一个bridge模式下得容器ping上面的ip
docker exec -it default_01 ping 172.17.0.3
可以看到能ping通

要实现容器中通信,如果要知道ip就过于麻烦了
可以通过–link指定通信
docker run -di --name test_02 --link test_01 centos
如图,test_02能直接ping test_01,不过只能单方面通信,即test_01 ping不通test_02。

其实原理就是有一层映射

注意:新版本的docker实现了一个内嵌的 DNS server,使容器可以直接通过容器名通信。只要使用自定义网络来创建容器且使用 –name为容器命名即可。
3.容器间跨网络间通信
我们使用自定义网络模式创建一个容器
docker run -di --name test_03 --net test-net centos
让他ping test_02
docker exec -it test_03 ping 172.17.0.3

可以看到不同网络无法通信,会一直卡下去。
解决方法:
为容器连接新的网络模式。
docker network connect 网络名称 容器名称
这样就可以ping通

我们查看test_02发生了什么变化
docker inspect test_02
可以看到NetworkSettings里的Networks有了两个网络

Networks有了两个网络

同理:
test-net网络也加入了test_02容器
docker network inspect test-net

参考资料:
docker-compose命令 – 简书 (jianshu.com)
Docker 网络模式详解及容器间网络通信 – 知乎 (zhihu.com)
【docker】Docker容器的重启策略_docker unless-stopped-CSDN博客
尚硅谷Docker实战教程(docker教程天花板)_哔哩哔哩_bilibili


