From 1171248a88bd7b055ef204064a5bb12e36e2cdd4 Mon Sep 17 00:00:00 2001 From: super Date: Wed, 7 Apr 2021 08:10:26 +0800 Subject: [PATCH] update --- Docker/01 Docker简介.md | 6 ++ Docker/04 Docker网络.md | 144 ++++++++++-------------------------- Docker/05 Docker Compose.md | 6 +- Docker/06 综合实践.md | 18 ++--- 4 files changed, 57 insertions(+), 117 deletions(-) diff --git a/Docker/01 Docker简介.md b/Docker/01 Docker简介.md index 8564f96..ab93965 100644 --- a/Docker/01 Docker简介.md +++ b/Docker/01 Docker简介.md @@ -1,5 +1,7 @@ # Chapter 1 Docker简介与安装 +![](https://tva1.sinaimg.cn/large/008eGmZEly1gpaus0df5fj31lq0s218y.jpg) + ## 目录 - Docker简介 @@ -31,6 +33,10 @@ ![Docker](https://vuepress.mirror.docker-practice.com/assets/img/docker.20496661.png) +从上面的图中可以看到,**虚拟机**在宿主机(host)中的OS上面是hypervisor(hypervisor),然后依次建立虚拟机,虚拟化的仓库,然后安装程序。但是对于**Docker**来说,在宿主机(host)中的OS上面是Docker Engine,然后直接在Doker Engine安装应用。 + +![](https://tva1.sinaimg.cn/large/008eGmZEly1gpauta9hchj31hi0qegvt.jpg) + ## Docker三大基本概念 **Docker** 包括三个基本概念 diff --git a/Docker/04 Docker网络.md b/Docker/04 Docker网络.md index 57cb899..a552c0f 100644 --- a/Docker/04 Docker网络.md +++ b/Docker/04 Docker网络.md @@ -3,32 +3,28 @@ ## 目录 - Docker 基础网络介绍 - - [外部访问容器](#外部访问容器) - - [容器互联](#容器互联) - - [配置DNS](#配置DNS) + - 外部访问容器 + - 容器互联 + - 配置DNS - Docker的网络模式 - - [Bridge 模式](#Bridge模式) - - [Host 模式](#Host 模式) - - [None 模式](#None模式) - - [Container 模式](#Container 模式) + - Bridge 模式 + - Host 模式 + - None 模式 + - Container 模式 - Docker高级网络配置 - - [快速配置指南](#快速配置指南) - - [容器访问控制](#容器访问控制) - - [端口映射实现](#端口映射实现) - - [配置docker0网桥](#配置 docker0 网桥) - - [自定义网桥](#自定义网桥) - - [工具和示例](#工具和示例) - - [编辑网络配置文件](#编辑网络配置文件) - - [实例:创建一个点到点连接](#实例:创建一个点到点连接) + - 快速配置指南 + - 容器访问控制 + - 端口映射实现 + - 配置docker0网桥 + - 自定义网桥 + - 工具和示例 + - 编辑网络配置文件 + - 实例:创建一个点到点连接 # Docker 基础网络介绍 - - [外部访问容器](#外部访问容器) - - [容器互联](#容器互联) - - [配置DNS](#配置DNS) - ## 外部访问容器 容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过`-P`或`-p`参数来指定端口映射。 @@ -217,11 +213,6 @@ nameserver 8.8.8.8 # Docker的网络模式 -- [Bridge 模式](#Bridge模式) -- [Host 模式](#Host 模式) -- [None 模式](#None模式) -- [Container 模式](#Container 模式) - 可以通过`docker network ls`查看网络,默认创建三种网络。 ``` @@ -249,35 +240,31 @@ f4f1b3cf1b7f none null local > busybox 被称为嵌入式 Linux 的瑞士军刀,整合了很多小的 unix 下的通用功能到一个小的可执行文件中。 -![img](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/20207760dbf44b608539ed29b9f0365e~tplv-k3u1fbpfcp-zoom-1.image) +![](https://tva1.sinaimg.cn/large/008eGmZEly1gp9yisxf2hj30o8089go6.jpg) 然后宿主机通过 `ip addr` 查看信息如下: -![ ](https:////p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/be67589037c246c48c2be2af63072976~tplv-k3u1fbpfcp-zoom-1.image) +![](https://tva1.sinaimg.cn/large/008eGmZEly1gp9yj3hqloj30zs0gbtek.jpg)   通过以上的比较可以发现,证实了之前所说的:守护进程会创建一对对等虚拟设备接口 `veth pair`,将其中一个接口设置为容器的 `eth0` 接口(容器的网卡),另一个接口放置在宿主机的命名空间中,以类似 `vethxxx` 这样的名字命名。   同时,守护进程还会从网桥 `docker0` 的私有地址空间中分配一个 IP 地址和子网给该容器,并设置 docker0 的 IP 地址为容器的默认网关。也可以安装 `yum install -y bridge-utils` 以后,通过 `brctl show` 命令查看网桥信息。 -![ ](https:////p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/5c7acd76f39f4901b2aa74842065109a~tplv-k3u1fbpfcp-zoom-1.image) +![](https://tva1.sinaimg.cn/large/008eGmZEly1gp9yjciu52j30zt0it45e.jpg)   对于每个容器的 IP 地址和 Gateway 信息,可以通过 `docker inspect 容器名称|ID` 进行查看,在 `NetworkSettings` 节点中可以看到详细信息。 -![ ](https:////p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/529902ce85a140cea8043970053c3cd3~tplv-k3u1fbpfcp-zoom-1.image) +![](https://tva1.sinaimg.cn/large/008eGmZEly1gp9yjjize3j30o20lsady.jpg)   可以通过 `docker network inspect bridge` 查看所有 `bridge` 网络模式下的容器,在 `Containers` 节点中可以看到容器名称。 -![ ](https:////p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/9df1ce538e964fe6980b19785def99f6~tplv-k3u1fbpfcp-zoom-1.image) +![](https://tva1.sinaimg.cn/large/008eGmZEly1gp9yjquu1yj30mf0myq6g.jpg) ->   关于 `bridge` 网络模式的使用,只需要在创建容器时通过参数 `--net bridge` 或者 `--network bridge` 指定即可,当然这也是创建容器默认使用的网络模式,也就是说这个参数是可以省略的。 +>   关于 `bridge` 网络模式的使用,只需要在创建容器时通过参数 `--net bridge` 或者 `--network bridge` 指定即可,当然这也是创建容器默认使用的网络模式,也就是说这个参数是可以省略的。   -   +![](https://tva1.sinaimg.cn/large/008eGmZEly1gp9yjzonksj30s50e1myt.jpg) -![ ](https:////p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/4f5206a75a884cc2968ceb1f6c14acb6~tplv-k3u1fbpfcp-zoom-1.image) - -bridge模式是 `docker `的默认网络模式,不写`–net`参数,就是bridge模式。使用`docker run -p`时,`docker `实际是在`iptables`做了`DNAT`规则,实现端口转发功能。可以使用`iptables -t nat -vnL`查看。`bridge`模式如下图所示: -![bridge模式图](C:\Users\MUJI\Desktop\Docker网络\bridge模式图.jpg) - 演示: +bridge模式是 `docker `的默认网络模式,不写`–net`参数,就是bridge模式。使用`docker run -p`时,`docker `实际是在`iptables`做了`DNAT`规则,实现端口转发功能。可以使用`iptables -t nat -vnL`查看。演示: ``` $ docker run -tid --net=bridge --name docker_bri1 \ @@ -299,25 +286,23 @@ $ route –n - 采用 host 网络模式的 Docker Container,可以直接使用宿主机的 IP 地址与外界进行通信,若宿主机的 eth0 是一个公有 IP,那么容器也拥有这个公有 IP。同时容器内服务的端口也可以使用宿主机的端口,无需额外进行 NAT 转换; - host 网络模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。 -![ ](https:////p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/32ab62e6be9d4b4dbe9280ca3b9206f9~tplv-k3u1fbpfcp-zoom-1.image) +![img](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/32ab62e6be9d4b4dbe9280ca3b9206f9~tplv-k3u1fbpfcp-zoom-1.image)      比如基于 `host` 网络模式创建了一个基于 `busybox` 镜像构建的容器 `bbox02`,查看 `ip addr`: -![ ](https:////p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ff4a5f7151a143c99878964833332e38~tplv-k3u1fbpfcp-zoom-1.image) +![](https://tva1.sinaimg.cn/large/008eGmZEly1gp9ykedxwpj30p40exgq7.jpg)   然后宿主机通过 `ip addr` 查看信息如下: -![ ](https:////p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b756f89bbcb045b4b4b180eddd307e8e~tplv-k3u1fbpfcp-zoom-1.image) +![](https://tva1.sinaimg.cn/large/008eGmZEly1gp9yklkpxyj30w30dktd8.jpg)   对,你没有看错,返回信息一模一样,也可以肯定没有截错图,不信接着往下看。可以通过 `docker network inspect host` 查看所有 `host` 网络模式下的容器,在 `Containers` 节点中可以看到容器名称。 -![ ](https:////p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/c11969f9c87a46f088280d50263cffa7~tplv-k3u1fbpfcp-zoom-1.image) +![](https://tva1.sinaimg.cn/large/008eGmZEly1gp9yktmta0j30ru0mkjun.jpg) -如果启动容器的时候使用`host`模式,那么这个容器将不会获得一个独立的`Network Namespace`,而是和宿主机共用一个`Network Namespace`。容器将不会虚拟出自己的网卡,配置自己的`IP`等,而是使用宿主机的`IP`和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。 `Host`模式如下图所示: -![Host模式](C:\Users\MUJI\Desktop\Docker网络\Host模式.jpg) -演示: +如果启动容器的时候使用`host`模式,那么这个容器将不会获得一个独立的`Network Namespace`,而是和宿主机共用一个`Network Namespace`。容器将不会虚拟出自己的网卡,配置自己的`IP`等,而是使用宿主机的`IP`和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。 演示: ``` $ docker run -tid --net=host --name docker_host1 ubuntu-base:v3 @@ -335,19 +320,15 @@ $ route –n - none 网络模式是指禁用网络功能,只有 lo 接口 local 的简写,代表 127.0.0.1,即 localhost 本地环回接口。在创建容器时通过参数 `--net none` 或者 `--network none` 指定; - none 网络模式即不为 Docker Container 创建任何的网络环境,容器内部就只能使用 loopback 网络设备,不会再有其他的网络资源。可以说 none 模式为 Docke Container 做了极少的网络设定,但是俗话说得好“少即是多”,在没有网络配置的情况下,作为 Docker 开发者,才能在这基础做其他无限多可能的网络定制开发。这也恰巧体现了 Docker 设计理念的开放。 -   + 比如基于 `none` 网络模式创建了一个基于 `busybox` 镜像构建的容器 `bbox03`,查看 `ip addr`: -  比如基于 `none` 网络模式创建了一个基于 `busybox` 镜像构建的容器 `bbox03`,查看 `ip addr`: - -![ ](https:////p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/8c55e1e006db44edacbe76f4a66d7d5c~tplv-k3u1fbpfcp-zoom-1.image) +![](https://tva1.sinaimg.cn/large/008eGmZEly1gp9yl6dza2j30le05lta3.jpg)   可以通过 `docker network inspect none` 查看所有 `none` 网络模式下的容器,在 `Containers` 节点中可以看到容器名称。 -![ ](https:////p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ed2060f2dbd04d07a5f4c6926d96a271~tplv-k3u1fbpfcp-zoom-1.image) +![](https://tva1.sinaimg.cn/large/008eGmZEly1gp9ylcuw30j30rt0mjwhr.jpg) -使用`none`模式,`Docker` 容器拥有自己的 `Network Namespace`,但是,并不为`Docker` 容器进行任何网络配置。也就是说,这个 `Docker` 容器没有网卡、IP、路由等信息。需要自己为 `Docker` 容器添加网卡、配置 IP 等。 `None`模式示意图: -![None模式](C:\Users\MUJI\Desktop\Docker网络\None模式.jpg) - 演示: +使用`none`模式,`Docker` 容器拥有自己的 `Network Namespace`,但是,并不为`Docker` 容器进行任何网络配置。也就是说,这个 `Docker` 容器没有网卡、IP、路由等信息。需要自己为 `Docker` 容器添加网卡、配置 IP 等。演示: ``` $ docker run -tid --net=none --name \ @@ -364,35 +345,33 @@ $ route -n - Container 网络模式是 Docker 中一种较为特别的网络的模式。在创建容器时通过参数 `--net container:已运行的容器名称|ID` 或者 `--network container:已运行的容器名称|ID` 指定; - 处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用 localhost 高效快速通信。 -![ ](https:////p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/905bc296603243ad8ee09e13b651e5ba~tplv-k3u1fbpfcp-zoom-1.image) +![](https://tva1.sinaimg.cn/large/008eGmZEly1gp9ylkvrb8j30or0d50u7.jpg)   **Container 网络模式即新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等**。同样两个容器除了网络方面相同之外,其他的如文件系统、进程列表等还是隔离的。   比如基于容器 `bbox01` 创建了 `container` 网络模式的容器 `bbox04`,查看 `ip addr`: -![ ](https:////p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d73dd522f2b2426980c16f8bf6c208f0~tplv-k3u1fbpfcp-zoom-1.image) +![](https://tva1.sinaimg.cn/large/008eGmZEly1gp9ylvw4l3j30p3086ju3.jpg)   容器 `bbox01` 的 `ip addr` 信息如下: -![ ](https:////p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/4096c75836e2470f8b1554fadf32309e~tplv-k3u1fbpfcp-zoom-1.image) +![](https://tva1.sinaimg.cn/large/008eGmZEly1gp9ym5pqzqj30o506vgns.jpg)   宿主机的 `ip addr` 信息如下: -![ ](https:////p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/9c01adabe22947ac94c460f0f31ae3b7~tplv-k3u1fbpfcp-zoom-1.image) +![](https://tva1.sinaimg.cn/large/008eGmZEly1gp9ymfqy5cj30zt0g3tf6.jpg)   通过以上测试可以发现,Docker 守护进程只创建了一对对等虚拟设备接口用于连接 bbox01 容器和宿主机,而 bbox04 容器则直接使用了 bbox01 容器的网卡信息。   这个时候如果将 bbox01 容器停止,会发现 bbox04 容器就只剩下 lo 接口了。 -![ ](https:////p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/7f2ad30a92fc479a91163483880ccd62~tplv-k3u1fbpfcp-zoom-1.image) +![](https://tva1.sinaimg.cn/large/008eGmZEly1gp9ymnpkruj30k704t757.jpg)   然后 bbox01 容器重启以后,bbox04 容器也重启一下,就又可以获取到网卡信息了。 -![ ](https:////p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ff5616d7bf9841d4a739a3934267db98~tplv-k3u1fbpfcp-zoom-1.image) +![](https://tva1.sinaimg.cn/large/008eGmZEly1gp9ymvszr7j30ot084wh1.jpg) -这个模式指定新创建的容器和已经存在的一个容器共享一个`Network Namespace`,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的`IP`,而是和一个指定的容器共享`IP`、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。 `Container`模式示意图: -![container模式](C:\Users\MUJI\Desktop\Docker网络\container模式.jpg) -演示: +这个模式指定新创建的容器和已经存在的一个容器共享一个`Network Namespace`,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的`IP`,而是和一个指定的容器共享`IP`、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。 演示: ``` $ docker run -tid --net=container:docker_bri1 \ @@ -409,15 +388,6 @@ $ route -n # 高级网络配置 -- [快速配置指南](#快速配置指南) -- [容器访问控制](#容器访问控制) -- [端口映射实现](#端口映射实现) -- [配置docker0网桥](#配置 docker0 网桥) -- [自定义网桥](#自定义网桥) -- [工具和示例](#工具和示例) -- [编辑网络配置文件](#编辑网络配置文件) -- [实例:创建一个点到点连接](#实例:创建一个点到点连接) - ## 快速配置指南 下面是一个跟 Docker 网络相关的命令列表。 @@ -446,8 +416,6 @@ $ route -n - `-P or --publish-all=true|false` 映射容器所有端口到宿主主机 - - ## 容器访问控制 容器的访问控制,主要通过 Linux 上的 `iptables` 防火墙来进行管理和实现。`iptables` 是 Linux 上默认的防火墙软件,在大部分发行版中都自带。 @@ -456,8 +424,6 @@ $ route -n 容器要想访问外部网络,需要本地系统的转发支持。在Linux 系统中,检查转发是否打开。 - - ``` $sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 1 @@ -465,8 +431,6 @@ net.ipv4.ip_forward = 1 如果为 0,说明没有开启转发,则需要手动打开。 - - ``` $sysctl -w net.ipv4.ip_forward=1 ``` @@ -494,8 +458,6 @@ $sysctl -w net.ipv4.ip_forward=1 此时,系统中的 `iptables` 规则可能是类似 - - ``` $ sudo iptables -nL ... @@ -509,8 +471,6 @@ DROP all -- 0.0.0.0/0 0.0.0.0/0 当添加了 `--link=CONTAINER_NAME:ALIAS` 选项后,添加了 `iptables` 规则。 - - ``` $ sudo iptables -nL ... @@ -523,8 +483,6 @@ DROP all -- 0.0.0.0/0 0.0.0.0/0 **注意**:`--link=CONTAINER_NAME:ALIAS` 中的 `CONTAINER_NAME` 目前必须是 Docker 分配的名字,或使用 `--name` 参数指定的名字。主机名则不会被识别。 - - ## 端口映射实现 默认情况下,容器可以主动访问到外部网络的连接,但是外部网络无法访问到容器。 @@ -556,8 +514,6 @@ MASQUERADE all -- 172.17.0.0/16 !172.17.0.0/16 使用 `-P` 时: - - ``` $ iptables -t nat -nL ... @@ -568,8 +524,6 @@ DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:49153 to:1 使用 `-p 80:80` 时: - - ``` $ iptables -t nat -nL Chain DOCKER (2 references) @@ -582,16 +536,12 @@ DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:172. - 这里的规则映射了 `0.0.0.0`,意味着将接受主机来自所有接口的流量。用户可以通过 `-p IP:host_port:container_port` 或 `-p IP::port` 来指定允许访问容器的主机上的 IP、接口等,以制定更严格的规则。 - 如果希望永久绑定到某个固定的 IP 地址,可以在 Docker 配置文件 `/etc/docker/daemon.json` 中添加如下内容。 - - ``` { "ip": "0.0.0.0" } ``` - - ## 配置 docker0 网桥 Docker 服务默认会创建一个 `docker0` 网桥(其上有一个 `docker0` 内部接口),它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。 @@ -605,8 +555,6 @@ Docker 默认指定了 `docker0` 接口 的 IP 地址和子网掩码,让主机 由于目前 Docker 网桥是 Linux 网桥,用户可以使用 `brctl show` 来查看网桥和端口连接信息。 - - ``` $ sudo brctl show bridge name bridge id STP enabled interfaces @@ -618,8 +566,6 @@ docker0 8000.3a1d7362b4ee no veth65f9 每次创建一个新容器的时候,Docker 从可用的地址段中选择一个空闲的 IP 地址分配给容器的 eth0 端口。使用本地主机上 `docker0` 接口的 IP 作为所有容器的默认网关。 - - ``` $ sudo docker run -i -t --rm base /bin/bash $ ip addr show eth0 @@ -634,8 +580,6 @@ default via 172.17.42.1 dev eth0 172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.3 ``` - - ## 自定义网桥 除了默认的 `docker0` 网桥,用户也可以指定网桥来连接各个容器。 @@ -644,8 +588,6 @@ default via 172.17.42.1 dev eth0 如果服务已经运行,那需要先停止服务,并删除旧的网桥。 - - ``` $ sudo systemctl stop docker $ sudo ip link set dev docker0 down @@ -654,8 +596,6 @@ $ sudo brctl delbr docker0 然后创建一个网桥 `bridge0`。 - - ``` $ sudo brctl addbr bridge0 $ sudo ip addr add 192.168.5.1/24 dev bridge0 @@ -664,8 +604,6 @@ $ sudo ip link set dev bridge0 up 查看确认网桥创建并启动。 - - ``` $ ip addr show bridge0 4: bridge0: mtu 1500 qdisc noop state UP group default @@ -676,8 +614,6 @@ $ ip addr show bridge0 在 Docker 配置文件 `/etc/docker/daemon.json` 中添加如下内容,即可将 Docker 默认桥接到创建的网桥上。 - - ``` { "bridge": "bridge0", @@ -690,8 +626,6 @@ $ ip addr show bridge0 可以继续用 `brctl show` 命令查看桥接的信息。另外,在容器中可以使用 `ip addr` 和 `ip route` 命令来查看 IP 地址配置和路由信息。 - - ## 工具和示例 在介绍自定义网络拓扑之前,你可能会对一些外部工具和例子感兴趣: diff --git a/Docker/05 Docker Compose.md b/Docker/05 Docker Compose.md index f3ff566..2dae5a3 100644 --- a/Docker/05 Docker Compose.md +++ b/Docker/05 Docker Compose.md @@ -6,7 +6,7 @@ 关于docker compose的安装请移步[docker compose安装与卸载](https://vuepress.mirror.docker-practice.com/compose/install/)或根据[docker官网](https://docs.docker.com/compose/install/)进行安装。 -> 对于docker compose的学习推荐大家多看看一些项目的docker-compose.yml文件是怎么写的,慢慢模仿着去写很多就越来越熟练清晰了。在[Compose文件夹](https://github.com/datawhalechina/team-learning-program/tree/master/Docker/Compose)下也在网上收集了一些docker-compose.yml文件,欢迎大家一起补充。 +> 对于docker compose的学习推荐大家多看看一些项目的docker-compose.yml文件是怎么写的,慢慢模仿着去写很多就越来越熟练清晰了。在[Compose文件夹](https://github.com/datawhalechina/team-learning-program/tree/master/Docker/Compose)下也在网上收集了一些docker-compose.yml文件,还有**[awesome-compose](https://github.com/docker/awesome-compose)**这个项目也非常推荐。 ## 目录 @@ -127,13 +127,13 @@ $ docker-compose up -d 在创建好`docker-compose.yml`文件后,可以通过下面这个命令将文件中定义的容器都启动起来,在docker compose中我们更习惯于将每一个容器叫做service。 -``` +```bash docker-compose up ``` 命令后会自动接一个默认值`-f docker-compose.yml`,也就是默认是使用docker-compose.yml文件的。我们也可以给文件起名为`docke-test.yml`,这样在使用时指定文件名,但是为了符合规范,还是统一为`docker-compose.yml`。 -``` +```bash docker-compose up -f docer-test.yml ``` diff --git a/Docker/06 综合实践.md b/Docker/06 综合实践.md index 5dba44d..d4b83ff 100644 --- a/Docker/06 综合实践.md +++ b/Docker/06 综合实践.md @@ -15,11 +15,11 @@ 1. 将jar包上传到服务器的指定目录,比如/root/docker/jar。 -![](https://tva1.sinaimg.cn/large/008eGmZEly1gp4hbw8yj2j30bj03o0sv.jpg) +![](https://tva1.sinaimg.cn/large/008eGmZEly1gp9yobtp2tj30o007njt5.jpg) 2. 通过docker pull openjdk:8命令获取镜像 -![](https://tva1.sinaimg.cn/large/008eGmZEly1gp4hc9cp7hj30bj032q34.jpg) +![](https://tva1.sinaimg.cn/large/008eGmZEly1gp9yord00xj30o006bju3.jpg) 3. 编写docker-compose.yml文件 @@ -64,17 +64,17 @@ networks: 4. 执行命令docker-compose up –d启动jar包, 可以通过docker ps查看容器是否在运行,需要注意的是默认查看所有运行中的容器,如果想查看所有容器,需要添加参数-a -![](https://tva1.sinaimg.cn/large/008eGmZEly1gp4hcjng9qj30bj02ijrd.jpg) +![](https://tva1.sinaimg.cn/large/008eGmZEly1gp9yp7mo2wj30o0057aay.jpg) 5. 注意如果容器启动失败或者状态异常,可以通过docker logs查看日志 6. 通过docker inspect myopenjdk查看容器详细信息,可以看到容器ip已经设置成功 -![](https://tva1.sinaimg.cn/large/008eGmZEly1gp4hcr6d6cj30bj04s3ym.jpg) +![](https://tva1.sinaimg.cn/large/008eGmZEly1gp9ypl8wgdj30o009wabq.jpg) 7. 然后在虚拟机中打开浏览器输入jar包项目的访问地址,就可以看到运行的项目,需要注意访问端口是映射过的端口而非项目实际端口 -![](https://tva1.sinaimg.cn/large/008eGmZEly1gp4hczjxihj30bj06qq3b.jpg) +![](https://tva1.sinaimg.cn/large/008eGmZEly1gp9yq1vynoj30o00dytaj.jpg) ## 方式二 构建镜像部署 @@ -140,16 +140,16 @@ networks: 6. 执行docker-compose up –d直接启动基于文件构建的自定义镜像,如果镜像不存在会自动构建,如果已存在那么直接启动。如果想重新构建镜像,则执行docker-compose build。如果想在执行compose文件的时候重构,则执行docker-compose up –d –build。 -![](https://tva1.sinaimg.cn/large/008eGmZEly1gp4hd9k0amj30bj03mdfv.jpg) +![](https://tva1.sinaimg.cn/large/008eGmZEly1gp9yqi1lv0j30o007ign6.jpg) 此使通过dockerfile文件构建的镜像已经创建 -![](https://tva1.sinaimg.cn/large/008eGmZEly1gp4hdh1yb9j30bj02s74f.jpg) +![](https://tva1.sinaimg.cn/large/008eGmZEly1gp9yqxa7t1j30o005qdi5.jpg) 通过镜像运行的容器已经正常启动,可以通过docker ps查看容器是否在运行,需要注意的是默认查看所有运行中的容器,如果想查看所有容器,需要添加参数-a -![](https://tva1.sinaimg.cn/large/008eGmZEly1gp4hdp2lzkj30bj00k3yc.jpg) +![](https://tva1.sinaimg.cn/large/008eGmZEly1gp9yra1jg1j30o0013q33.jpg) 7. 在浏览器中输入访问路径可以看到项目已经正常运行 -![](https://tva1.sinaimg.cn/large/008eGmZEly1gp4hdxrrqqj30bj06edg4.jpg) \ No newline at end of file +![](https://tva1.sinaimg.cn/large/008eGmZEly1gp9yrmnnzzj30o00d975v.jpg) \ No newline at end of file