颠覆世界观的Docker

docker概述

docker为什么出现

环境配置十分麻烦,发布项目需要配置服务器,部署环境费时费力。项目能否带上环境安装???

docker 解决了这些问题

docker能干嘛

kernel(内核) —> lib(依赖库) —> app(n个)

虚拟机技术缺点 :资源占用多;冗余步骤多;启动慢;

kernel(内核) —> (lib + app)(n个)

容器化技术不是模拟一个完整的操作系统

传统虚拟机,虚拟出一套硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件;容器内的应用直接运行在宿主机,容器是没有自己的内核的,也没有虚拟自己的硬件;每个容器是隔离的,不会一起故障;

使用容器化开发之后,我们的开发,测试环境都是高度一致的,更加快捷的交付和部署,更便捷的升级和拓缩,更高效的计算资源利用。

docker安装

docker基本组成

镜像(image):docker镜像就好比一个模板,可以通过这个模板来创建容器服务,tomcat镜像–>run—>tomcat01容器,通过这个镜像可以创建多个容器。

容器(container):docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的。(启动,停止,删除)

仓库(repository):存放镜像的地方,分为共有和私有。

安装与启动测试

ubuntu安装Docker官网地址

https://docs.docker.com/engine/install/ubuntu/

#安装参考官网 systemctl start docker #启动 Docker systemctl enable docker #设置开机启动 Docker docker version #查看版本

Hello World!

sudo docker run hello-world

然后出现如下输出

Unable to find image ‘hello-world:latest’ locally #没有在本地找到镜像
latest: Pulling from library/hello-world #从远程仓库pull镜像
 0e03bdcc26d7: Pull complete
 Digest: sha256:49a1c8800c94df04e9658809b006fd8a686cab8028d33cfba2cc049724254202
 Status: Downloaded newer image for hello-world:latestHello from Docker! #运行成功
 This message shows that your installation appears to be working correctly.To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the “hello-world” image from the Docker Hub.
 (amd64)3. The Docker daemon created a new container from that image which runs the
 executable that produces the output you are currently reading.4. The Docker daemon streamed that output to the Docker client, which sent it
 to your terminal.To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bashShare images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/For more examples and ideas, visit:
 https://docs.docker.com/get-started/
sudo docker images #查看刚刚下载的镜像

镜像加速(阿里云)

针对Docker客户端版本大于 1.10.0 的用户

您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器

sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://vxyb1km7.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker

底层原理

docker是一个 Client-Server 结构的系统,Docker的守护进程运行在主机上,通过socket从客户端访问。

server接收到client的命令,就会执行命令。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AbREpKBW-1596116988769)(/home/lxl/Pictures/选区_071.png)]

docker安装 ovs客户端 docker omv_centos

  • docker有着比虚拟机更少的抽象层
  • docker利用的是宿主机的内核,vm需要的是Guest OS;新建一个容器的时候,docker不需要向宿主机一样重新加载一个操作系统内核,避免引导,虚拟机加载的是Guest Os,分钟级别的,而docker利用的是宿主机的操作系统,省略了这个复杂的过程,秒级。

docker命令

docker version     #查看docker文档
sudo docker info #查看docker服务信息
docker --help        #查看帮助信息

镜像命令

sudo docker images #查看本机所有的镜像
lxl@lxl-Vostro-15-3568:~$ sudo docker images -a
REPOSITORY          TAG                 IMAGE ID             CREATED                    SIZE
hello-world         latest              bf756fb1ae65        6 months ago        13.3kB
镜像的仓库源      镜像的标签         镜像的id            镜像的创建时间     镜像的大小
sudo docker search mysql #搜索mysql
sudo docker search mysql --filter=STARS=3000 #搜索star数大于3000的例子
sudo docker pull mysql[:版本号]	#拉取镜像
sudo docker rmi -f 镜像id
sudo docker rmi -f $(sudo docker images -q) #删除所有镜像

容器命令

有了镜像便可以制作容器

sudo docker pull centos #拉取centos镜像
sudo docker run	[参数] image

参数说明

--name=名称 #指定容器名称 -d #后台方式运行 -it #使用交互方式运行,进入容器查看内容 -p #指定容器的端口 -p 8080:8080 -p 主机端口:容器端口 -p 容器端口 -p ip:主机端口:容器端口 -P #随机指定端口

sudo docker run  -it centos	#启动并进入容器
#退出容器只需要 exit 即可
sudo docker ps #列出所有运行中的容器
sudo docker ps -a #查看曾经运行过的容器当前正在运行中的
sudo docker ps -n=[0-9] #显示1最近创建的容器
sudo docker ps -q #只显示容器的编号
exit #容器退出
ctrl+P+Q #容器不停止退出
sudo docker attach 容器id
docker rm 容器id #删除容器(未运行)
docker rm -f 容器id #删除运行中的容器

启动与停止容器操作

sudo docker start 容器id
sudo docker restart 容器id
sudo docker stop 容器id
sudo docker kill 容器id

其他命令

lxl@lxl-Vostro-15-3568:~$ sudo docker run -d centos
84b884fa4113250ae4a35a97d6bc8bf563c735eeef191c3ee64ea92d76e1233a

通过 -d 来运行发现镜像停止了,这是因为 docker 使用后台运行,就必须要有一个前台进程,否则就会停止运行。

sudo docker logs  -tf --tail 10 容器id    #查看docker的日志,显示时间戳和前10行
sudo docker top 0f441322acb7 #查看当前容器进程内的信息
sudo docker inspect 0f441322acb7 #查看容器的信息

进入容器

sudo docker exec -it 容器id 交互命令行(例如 /bin/bash)
sudo docker attach 容器id

exec是新开了一个窗口,attach是连接刚刚的窗口

sudo docker cp 容器id:容器内路径 目的地址 #复制容器内文件到外面

未来会通过 -v 卷的技术,可以实现自动同步。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eX2hFbDd-1596116988778)(/home/lxl/Pictures/选区_074.png)]

docker安装 ovs客户端 docker omv_linux_02

练习:docker搭建nginx

sudo docker search nginx sudo docker pull nginx sudo docker run -d --name nginxWork -p 3344:80 nginx #在虚拟机80启动nginx并映射到外部的3344端口

然后访问 http://localhost:3344/ ,出现如下页面

Welcome to nginx!

If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.

表示安装成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tTGHQsFt-1596116988785)(/home/lxl/Pictures/选区_075.png)]

docker安装 ovs客户端 docker omv_docker安装 ovs客户端_03

sudo docker exec -it nginxWork /bin/bash #进入nginx

目前修改nginx配置文件需要进入容器内部,十分麻烦,我们要在容器外部提供一个映射路径,达到在容器外部修改文件,容器内部可以自动修改。可以使用 -v数据卷技术来实现。

练习:部署tomcat

sudo docker search tomcat
sudo docker pull tomcat
sudo docker run -d --name tomcatWork -p 7070:8080 tomcat
sudo docker exec -it tomcatWork /bin/bash

使用 sudo docker stats 来查看镜像的状态

思考:每次部署 Tomcat 都要进入容器,能否在容器外部提供一个映射路径webapps,我们在外部放置项目,就自动同步到容器内部。

使用portainer进行图形化

安装

sudo docker run -d -p 9876:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

访问浏览器 http://127.0.0.1:9876 即可访问docker图形化界面

docker镜像

镜像是什么

镜像是一种轻量级,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码,运行库,环境变量和配置文件。

所有的应用,直接打包 docker 镜像,都可以跑起来。

UnionFS (联合文件系统)

Union文件系统是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一虚拟文件系统下,Union文件系统是Docker镜像的基础,镜像可以通过分层来进行继承,基于镜像基础,可以制作各种具体的应用镜像。

特性:一次加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

分层理解

所有的镜像都是基于一个基础镜像层,当进行修改或增加新的内容时,就会在当前的镜像层之上,创建新的镜像层。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HrdjLEqF-1596116988799)(/home/lxl/Pictures/选区_076.png)]

docker安装 ovs客户端 docker omv_centos_04

如何提交自己的镜像

docker commit -m="描述" -a="作者" 容器id 目标镜像名:[tag]

修改 tomcat 后进行提交

sudo docker commit -a="lxllxl233" -m="add index.html" tomcatNewImage tomcat-new-image:1.0

OUTPUT

sha256:916915b26a8021b8d56b861931d5b8a3bbb069debccadfd6561ba1248dbe4b8b

然后查看镜像列表,发现出现了刚刚提交的镜像。

lxl@lxl-Vostro-15-3568:~/softwore/mq$ sudo docker images
 REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat-new-image 1.0 916915b26a80 2 minutes ago 652MB
 tomcat latest b4f6a90c69a4 5 days ago 647MB
 portainer/portainer latest 62771b0b9b09 6 days ago 79.1MB
 nginx latest 8cf1bfb43ff5 7 days ago 132MB
 centos latest 831691599b88 6 weeks ago 215MB

容器数据卷

什么是容器数据卷

docker 理念:将应用和环境打包成为一个镜像。

数据?如果数据都在容器中,那么容器删除,数据就会丢失! 需求:数据可视化

所以需要一个容器之间可以有一个数据共享的技术,Docker容器中产生的数据,同步到本地。这就是卷技术,目录的挂载,将容器内的目录,挂载到 Linux 上面。(容器的持久化和同步操作,容器间数据也可以共享)

使用数据卷

  • 直接使用目录挂载
sudo docker run -v 容器外目录:容器内目录sudo docker run -it --name linuxos -v /home/lxl/clone:/home centos #启动centos容器并挂载home目录到/home/lxl/clone目录
实战,部署 mysql
sudo docker pull mysql:5.7
sudo docker run -d -p 3300:3306 -v /home/lxl/vmdir/mysql/conf:/etc/mysql/conf.d -v /home/lxl/vmdir/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name sqldata mysql:5.7
登录数据库,查看映射文件是否为空。

具名挂载和匿名挂载

lxl@lxl-Vostro-15-3568:~/vmdir/mysql$ sudo docker volume ls [sudo] lxl 的密码: DRIVER VOLUME NAME local 2bdc64321ea971fff19c8220d8694009c5dd13c40fb88576b6a7d298fa650f02

未给卷起名叫匿名挂载 例如:2bdc64321ea971fff19c8220d8694009c5dd13c40fb88576b6a7d298fa650f02

具名挂载

sudo docker run -v 卷名:容器内目录

具名挂载会挂载到: /var/lib/docker/volumes 目录下

sudo docker run -v 卷名:容器内目录:(ro/rww) #可读/可写

编写 dockerFile

FROM centos
VOLUME ["volume01","volume02"]
CMD echo "---end---"
CMD /bin/bash
— 使用dockerFile
sudo docker build -f ./dockerFile-1 -t lxl/centos ~/vmdir/vm-test/
lxl@lxl-Vostro-15-3568:~/vmdir/sh-file$ sudo docker images
 REPOSITORY TAG IMAGE ID CREATED SIZE
 lxl/centos latest 95babca6fc71 2 minutes ago 215MB
 tomcat-new-image 1.0 916915b26a80 5 hours ago 652MB
 tomcat latest b4f6a90c69a4 6 days ago 647MB
 portainer/portainer latest 62771b0b9b09 6 days ago 79.1MB
 mysql 5.7 8679ced16d20 6 days ago 448MB
 mysql latest e3fcc9e1cc04 6 days ago 544MB
 nginx latest 8cf1bfb43ff5 7 days ago 132MB
 centos latest 831691599b88 6 weeks ago 215MB
 taylorcoffelt/macos-docker latest 7749d9c82553 12 months ago 101MB发现生成了自己的镜像

数据卷容器

容器与容器间同步,多个 mysql 同步数据 –volumes-from

多个镜像之间文件共享

#centos-01 容器创建
sudo docker run -it --name centos-01 -v /home/lxl/vmdir/centos/homes:/home centos
#centos-02 容器创建
sudo docker run -it --name centos-02 --volumes-from centos-01 centos
在 /home/lxl/vmdir/centos/homes 下1创建文件,俩个容器内都会读取到这个文件

dockerFile

dockerFile 是用来构建docker镜像的文件,命令参数脚本。

  • 编写一个dockerFile文件
  • docker build 构建成为一个镜像
  • docker run 运行镜像
  • docker push 发布镜像

BASE

  • 每个关键字(指令)都是必须大写字母
  • 执行顺序从上到下顺序执行
  • #表示注释
  • 每一个指令都会创建一个新的镜像层,并提交

DockerFile : 构建文件,定义了一切的步骤,源代码

DockerImages : 通过DockerFile构建生成的镜像,最终发布和运行的产品

DockerFile的指令

FROM #基础镜像,一切从这里开始 MAINTAINER #镜像是谁写的,姓名+邮箱 RUN #镜像构建的时候需要运行的命令 ADD #步骤:tomcat镜像,这个tomcat压缩包;添加内容 WORKDIR #镜像的工作目录 VOLUME #挂载的目录 EXPOSE #暴露端口配置 CMD #指定容器启动的时候运行的命令 ENTRYPOINT #和CMD相同,但CMD只有最后一个会生效,这个可以直接追加命令 ONBUILD #当构建一个被继承 DockerFile ,这个时候就会运行 ONBUILD 的指令。触发指令 COPY #类似 ADD,将我们的文件拷贝到镜像中 ENV #构建的时候设置环境变量

编写 docker file文件

FROM ubuntu
MAINTAINER lxllxl233<2209706071@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN apt install vim
RUN apt install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "everything is be ok"
CMD /bin/bash

构建镜像

sudo docker build -f dockerFile-ubuntu -t myubuntu:1.0 .

实战:tomcat镜像搭建

  • 准备 jdk 和 tomcat 的压缩包
  • 编写 Dockerfile 文件
FROM ubuntu
MAINTAINER lxllxl233<2209706071@qq.com>
ADD apache-tomcat-9.0.37.tar.gz /usr/local/
ADD jdk-8u202-linux-x64.tar.gz /usr/local/
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_202
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.37
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.37
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.37/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.37/bin/logs/catalina.out
向 ubuntu 镜像里面加 tomcat 和 jdk
  • build -t 镜像 sudo docker build -t u-tomcat:1.0 .
  • 启动镜像 sudo docker run -d --name my-tomcat-01 -p 9001:8080 u-tomcat:1.0
  • 访问 9001 测试

发布自己的镜像

发布到dockerhub
  • 注册 dockerhub
  • 命令行登录 sudo docker -u 用户名
  • sudo docker tag u-tomcat:1.0 lxllxl233/u-tomcat:1.0 修改刚刚的镜像名称
  • sudo docker push lxllxl233/u-tomcat:1.0 push镜像
发布到阿里云
  1. 登录阿里云Docker Registry
$ sudo docker login --username=暮雪千年长 registry.cn-hangzhou.aliyuncs.com

用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。

您可以在访问凭证页面修改凭证密码。

  1. 从Registry中拉取镜像
$ sudo docker pull registry.cn-hangzhou.aliyuncs.com/lxllxl233/hub:[镜像版本号]
  1. 将镜像推送到Registry
$ sudo docker login --username=暮雪千年长 registry.cn-hangzhou.aliyuncs.com$ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/lxllxl233/hub:[镜像版本号]$ sudo docker push registry.cn-hangzhou.aliyuncs.com/lxllxl233/hub:[镜像版本号]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QsG5LwVD-1596116988809)(/home/lxl/Pictures/选区_077.png)]

docker安装 ovs客户端 docker omv_centos_05

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CA8A3Omv-1596116988818)(/home/lxl/Pictures/选区_078.png)]

docker安装 ovs客户端 docker omv_docker_06

docker网络原理

理解 Docker0

查看 docker0 信息,只要安装 docker 就会有这个网卡,就是桥接模式,使用 evth-pair 技术。

docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
       inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
       inet6 fe80::42:fcff:fece:8a1e  prefixlen 64  scopeid 0x20<link>
       ether 02:42:fc:ce:8a:1e  txqueuelen 0  (以太网)
       RX packets 31391  bytes 7712855 (7.7 MB)
       RX errors 0  dropped 0  overruns 0  frame 0
       TX packets 43714  bytes 67292774 (67.2 MB)
       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

vethc7b7dc8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
       inet6 fe80::401b:6bff:fe1b:259c  prefixlen 64  scopeid 0x20<link>
       ether 42:1b:6b:1b:25:9c  txqueuelen 0  (以太网)
       RX packets 28108  bytes 2156120 (2.1 MB)
       RX errors 0  dropped 0  overruns 0  frame 0
       TX packets 36768  bytes 65201147 (65.2 MB)
       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlp2s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
       inet 192.168.3.16  netmask 255.255.255.0  broadcast 192.168.3.255
       inet6 fe80::dfbb:a65:7676:2fd3  prefixlen 64  scopeid 0x20<link>
       ether 2c:6f:c9:15:3b:e3  txqueuelen 1000  (以太网)
       RX packets 2614512  bytes 2872833323 (2.8 GB)
       RX errors 0  dropped 0  overruns 0  frame 0
       TX packets 1510503  bytes 1014942496 (1.0 GB)
       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

查看虚拟机网卡信息

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
       inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
       ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
       RX packets 35451  bytes 64836054 (64.8 MB)
       RX errors 0  dropped 0  overruns 0  frame 0
       TX packets 27018  bytes 2095713 (2.0 MB)
       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
       inet 127.0.0.1  netmask 255.0.0.0
       loop  txqueuelen 1000  (Local Loopback)
       RX packets 0  bytes 0 (0.0 B)
       RX errors 0  dropped 0  overruns 0  frame 0
       TX packets 0  bytes 0 (0.0 B)
       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Linux可以 ping 通 docker 容器内部,容器内部也可以ping通外部,容器和容器之间也可以互相 ping 通。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RESfHNQm-1596116988824)(/home/lxl/Pictures/选区_079.png)]

docker安装 ovs客户端 docker omv_docker_07

通过 docker0 桥接,实现的容器之间相互 ping 通。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aN5fp1TW-1596116988826)(/home/lxl/Pictures/选区_080.png)]

docker安装 ovs客户端 docker omv_运维_08

编写了一个微服务, 数据库url里面有ip地址,项目不重启,数据库ip换掉了,我们希望可以解决这个问题。

容器互联 --link

sudo docker run -d -p 9004:8080 --link my-tomcat-01 --name my-tomcat-04 u-tomcat:1.0

这样容器 4 能 ping 通容器 1,1不一定能ping通4

查看 host 地址发现 hosts 文件,即 --link 本质就是修改 hosts 文件

172.17.0.2 my-tomcat-01 9e27c2bfc8d1

自定义网络

查看所有的 docker 网络

sudo docker network ls

网络模式

bridge : 桥接 docker

none : 不配置网络

host : 和宿主机共享网络

container : 容器内网络连通

可以使用 --net 指定网络类型

默认使用 docker0 ,使用 --net 指定, –net bridge

我们可以自定义网络

sudo docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

使用 sudo docker network ls 来查看,发现刚刚创建的桥接网络

bbd91e4e48cd        mynet               bridge              local

使用 sudo docker network inspect mynet 查看详情

[
   {
       "Name": "mynet",
       "Id": "bbd91e4e48cd658008fd9b4d3fd245e04d40d3d70d59780ebcead459caa422e1",
       "Created": "2020-07-30T19:48:34.161496168+08:00",
       "Scope": "local",
       "Driver": "bridge",
       "EnableIPv6": false,
       "IPAM": {
           "Driver": "default",
           "Options": {},
           "Config": [
               {
                   "Subnet": "192.168.0.0/16",
                   "Gateway": "192.168.0.1"
               }
           ]
       },
       "Internal": false,
       "Attachable": false,
       "Ingress": false,
       "ConfigFrom": {
           "Network": ""
       },
       "ConfigOnly": false,
       "Containers": {},
       "Options": {},
       "Labels": {}
   }
]

到此自己的网络便创建好了,我们的服务可以添加到自己的网络。

使用自己的网络来构建容器

sudo docker run -d -p 9001:8080 --name tomcat-1 --net mynet u-tomcat:1.0 sudo docker run -d -p 9002:8080 --name tomcat-2 --net mynet u-tomcat:1.0

此时再用 sudo docker network inspect mynet 来查看

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WpZtx5uj-1596116988828)(/home/lxl/Pictures/选区_081.png)]

docker安装 ovs客户端 docker omv_docker安装 ovs客户端_09

发现刚刚创建的镜像被分配的 ip

使用自己的网络可以根据容器的 name 相互 ping 通

自己的虚拟网卡

br-bbd91e4e48cd: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
       inet 192.168.0.1  netmask 255.255.0.0  broadcast 192.168.255.255
       inet6 fe80::42:f9ff:fe09:7f9d  prefixlen 64  scopeid 0x20<link>
       ether 02:42:f9:09:7f:9d  txqueuelen 0  (以太网)
       RX packets 21  bytes 23846 (23.8 KB)
       RX errors 0  dropped 0  overruns 0  frame 0
       TX packets 147  bytes 20564 (20.5 KB)
       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

不同的集群可以使用不同的网络,保证集群健康。

docker0 网卡与 mynet 网卡网络打通,docker0里的容器与mynet打通

启动俩个容器到 docker0

sudo docker run -d -p 9003:8080 --name dk0-tomcat-1 u-tomcat:1.0 sudo docker run -d -p 9004:8080 --name dk0-tomcat-2 u-tomcat:1.0

将 dk0-tomcat-1 连接到 mynet

sudo docker network connect mynet dk0-tomcat-1

再次查看 mynet

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PEzWmOYN-1596116988830)(/home/lxl/Pictures/选区_082.png)]

docker安装 ovs客户端 docker omv_linux_10

发现 dk0-tomcat-1 被加到 mynet 中,而 bridge 网络中也有这个ip,即 一个容器,俩个ip !!!

lxl@lxl-Vostro-15-3568:~$ sudo docker exec -it tomcat-1 ping dk0-tomcat-1 
PING dk0-tomcat-1 (192.168.0.4): 56 data bytes
64 bytes from 192.168.0.4: icmp_seq=0 ttl=64 time=0.153 ms
64 bytes from 192.168.0.4: icmp_seq=1 ttl=64 time=0.278 ms
^C--- dk0-tomcat-1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
测试 ping 通!!!!!!!!!!!!!!!!!!!

总结:跨网络使用 socker network connect 网络 名容器名 来联通容器与网络。

Redis 集群部署 (这部分集群我没有成功,redis需要深入学习)

六台 redis 服务器,master : r-m1( r-s1 ), r-m2( r-s2 ), r-m3( r-s3 ),当集群中的主机挂掉,它的从机就会顶替主机,例如 r-m2 挂掉,r-s2就会顶替原来的r-m2

  • 创建一个网络

sudo docker network create redis --subnet 172.38.0.0/16 --gateway 172.38.0.1

  • 一个 redis 自动配置的脚本,在家目录下使用
for port in $(seq 1 6); \
do \
mkdir -p $(pwd)/redis-cluster/redis-${port}/conf
touch $(pwd)/redis-cluster/redis-${port}/conf/redis.conf
cat << EOF >>$(pwd)/redis-cluster/redis-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enable yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done
  • 启动集群的脚本
for port in $(seq 1 6); \
do \
sudo docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} \
-v $(pwd)/redis-cluster/redis-${port}/data:/data \
-v $(pwd)/redis-cluster/redis-${port}/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.1${port}  redis redis-server
done
  • 进入其中一个命令行 sudo docker exec -it redis-1 /bin/sh
  • 集群搭建 redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15.6379 172.38.0.16:6379 --cluster-replicas 1

idea整合docker打包微服务

  • 构建 springboot 微服务项目

@RestController public class HelloController { @GetMapping("/api/hello") public String hello(){ return "Hello world!"; } }

一个 hello world ,自测通过。

  • 使用 maven 打包应用为 jar 包,idea安装docker插件
  • 编写 Dockerfile

FROM java:8 #docker 和 jar 包在同一目录下;本镜像根据 java8 构建 COPY *.jar /app.jar CMD ["--server.port=8080"] EXPOSE 8080 ENTRYPOINT ["java","-jar","/app.jar"]

  • 运行 sudo docker run -d -p 9527:8080 myapp:1.0
  • 测试 9527 通过
  • …不过一个helloworld居然用掉了600多MB的空间…

后续更新

docker Compose

docker Swarm -(k8s)

CI/CD jenkins