Docker的详细使用
一、Docker概述
1. Docker为什么会出现?
- 一款产品:开发-上线两套环境!应用环境,应用配置。
- 开发-运维。问题:我在我的电脑上可以运行!版本更新,导致服务不可用!对于运维来说,考验就十分大?环境配置是十分的麻烦,每一个机器都要部署环境(集群
Redis
、ES
、Hadoop
)!费时费力。发布个项目(jr
+(Redis
MySQ
Ljdk
ES
)),项目能不能都带上环境安装打包!之前在服努器配置—个应用的环境Redis MySQL jdk ES Hadoop
,配置超麻烦了,不能够跨平台。Windows
,最后发布到Linux
! - 传统:开发
jar
,运维来做。 - 现在:开发打包部署上线,一套流程做完。
java-apk
-发布(应用商店)-张三使用apk
–安装即可用。
-java-jar
(环境)-…打包项目带上环境(镜像)-(Dσcker
仓库:商店)-…下载我们发布的镜像…-直接运行即。Docker
的思想就来自于集装箱!JRE-多个应用(端口冲突)
–原来都是交叉的!- 隔离:
Docker
核心思想!打包装箱!每个箱子是互相隔离的。 Docker
通过隔离机制,可以将服务器利用到极致!
二、Docker安装
1. Docker的基本组成
- 镜像(
Image
)
docker
镜像就好比是—个模板,可以通过这个模板来创建容器服务,tomcat
镜像==>run
==>tomcat01
容器(提供服务器)通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的。 - 容器(
container
):
Docker
利用容器技术,独立运行个或者个组应用,通过镜像来创建的。
启动,停止,删除,基本命令
目前就可以把这个容器理解为就是一个简易的linux
系统 - 仓库(
repository
)
仓库就是存放镜像的地方
仓库分为公有仓库和私有仓库
Docker hub
(默认是国外的)
阿里云…都有容器服务器(配置镜像加速!)
2. 安装Docker
环境准备
1、需要会一点点的 Linux的基础
2、 Centos7
3、我们使用 Shel连接远程服务器进行操作!
环境查看
## 查看系统内核是 3.10 以上的
[root@iz2ze0j4s19xhxuqg75l0zz ~]# uname -r
3.10.0-1127.el7.x86_64
[root@iz2ze0j4s19xhxuqg75l0zz ~]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
安装
## 1.卸载旧的版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
## 2.需要的安装包
sudo yum install -y yum-utils
## 3.设置镜像仓库
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo # 默认是国外的
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
## 更新软件包索引
yum makecache fast
## 4.安装docker相关的 docker-ce社区版 ee企业版
sudo yum install docker-ce docker-ce-cli containerd.io
## 5.启动docker
systemctl start docker
## 6.使用docker version查看docker是否安装成功
## 7. hello-world
docker run hello-world
##8.查看镜像
docker images
##1.卸载docker
sudo yum remove docker-ce docker-ce-cli containerd.io
##2.删除资源
sudo rm -rf /var/lib/docker
3. 配置阿里云镜像加速器
针对Docker客户端版本大于 1.10.0 的用户
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://m5c73hcp.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
4. docker run hello-world 命令的执行流程
5. 底层原理
Docker
是什么工作的?
Docker
是一个 Client- Server
结构的系统, Docker
的守护进程运行在主机上。通过 Socket
从客户端访问。
Dockerserver
接收到 Docker- Client
的指令,就会执行这个命令!
Docker
为什么比VM
快?
1、 Docker
有着比虚拟机更少的抽象层。
2、 Docker
利用的是宿主机的内核,vm
需要是Guest os
。
所以说,新建一个容器的时候, docker
不需要想虚拟机一样重新加载一个操作系统內核,避免引导。虚拟机是加载 Guest os
,分钟级别的,而 docker
是利用宿主机的操作系统吗,省略了这个复杂的过程,秒级!
三、Docker的常用命令
1. 帮助命令
# 显示docker的版本信息
docker version
# 显示docker的系统信息,包括镜像和容器的数量
docker info
# 帮助命令
docker --help
2. 镜像命令
-
docker images
查看所有本地的主机上的镜像[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mysql latest e1d7dc9731da 2 months ago 544MB # 解释 REPOSITORY 镜像仓库源仓库 TAG 镜像的标签 IMAGE ID 镜像id CREATED 镜像创建时间 SIZE 镜像大小 # 可选项 -a, --all 显示所有镜像(默认隐藏中间镜像) -q, --quiet 只显示镜像的id
-
docker search
搜索镜像[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 10156 [OK] mariadb MariaDB is a community-developed fork of MyS… 3738 [OK] # 可选项,通过搜索来过滤 --filter=STARS=3000
-
docker pull
下载镜像[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker pull mysql Using default tag: latest # 如果不写tag ,默认就是latest latest: Pulling from library/mysql bb79b6b2107f: Pull complete # 分层下载,docker image的核心 联合文件系统 49e22f6fb9f7: Pull complete 842b1255668c: Pull complete 9f48d1f43000: Pull complete c693f0615bce: Pull complete 8a621b9dbed2: Pull complete 0807d32aef13: Pull complete a56aca0feb17: Pull complete de9d45fd0f07: Pull complete 1d68a49161cc: Pull complete d16d318b774e: Pull complete 49e112c55976: Pull complete Digest: sha256:8c17271df53ee3b843d6e16d46cff13f22c9c04d6982eb15a9a47bd5c9ac7e2d #签名 Status: Downloaded newer image for mysql:latest docker.io/library/mysql:latest #真实地址 # 等价于它 docker pull mysql docker pull docker.io/library/mysql:latest # 指定版本下载 [root@iz2ze0j4s19xhxuqg75l0zz ~]# docker pull mysql:5.7 5.7: Pulling from library/mysql bb79b6b2107f: Already exists 49e22f6fb9f7: Already exists 842b1255668c: Already exists 9f48d1f43000: Already exists c693f0615bce: Already exists 8a621b9dbed2: Already exists 0807d32aef13: Already exists f15d42f48bd9: Pull complete 098ceecc0c8d: Pull complete b6fead9737bc: Pull complete 351d223d3d76: Pull complete Digest: sha256:4d2b34e99c14edb99cdd95ddad4d9aa7ea3f2c4405ff0c3509a29dc40bcb10ef Status: Downloaded newer image for mysql:5.7 docker.io/library/mysql:5.7
-
docker rmi
删除镜像[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker rmi -f 镜像id #删除指定镜像 [root@iz2ze0j4s19xhxuqg75l0zz ~]# docker rmi -f 镜像id 镜像id 镜像id #删除多个镜像 [root@iz2ze0j4s19xhxuqg75l0zz ~]# docker rmi -f $(docker images -aq) #删除全部镜像
3. 容器命令
说明:我们有了镜像才可以创建容器,
linux
,下载一个centos
镜像来测试学习
docker pull centos
-
新建容器并启动
docker run [可选参数] image # 参数 说明 --name="Name" 容器名字 tomcat01 tomcat02,用来区分容器 -d 后台方式运行 -it 使用交互方式运行,进入容器查看内容 -p 指定容器的端口 -p 8080:8080 -P 随机指定端口 #测试,启动并进入容器 [root@iz2ze0j4s19xhxuqg75l0zz ~]# docker run -it centos /bin/bash [root@c9c4bb01f7dc /]# [root@c9c4bb01f7dc /]# ls #查看容器内的centos,基础版本,很多命令都不完善 bin etc lib lost+found mnt proc run srv tmp var dev home lib64 media opt root sbin sys usr #从容器退出主机 exit
-
列出所有的运行容器
docker ps #列出当前正在运行的容器 -a #列出当前正在运行的容器+带出历史运行过的容器 -n=? #显示最近创建的容器 -q #只显示容器的编号
-
退出容器
exit #直接容器停止并退出 Ctrl + P +Q #容器不停止退出
-
删除容器
docker rm 容器id #删除指定的容器,不能删除正在运行的容器,如果要强制删除,rm -f docker rm -f $(docker ps -aq) #删除所有容器 docker ps -a -q|xargs docker rm #删除所有容器(没有运行的)
-
启动和停止容器的操作
docker start 容器id #启动容器 docker restart 容器id #重启容器 docker stop 容器id #停止当前正在运行的容器 docker kill 容器id #强制停止当前容器
4. 其他常用命令
-
后台启动命令
docker run -d 镜像名 [root@iz2ze0j4s19xhxuqg75l0zz /]# docker run -d centos #问题 docker ps,发现 centos停止了 #常见的坑: docker容器使用后台运行,就必须要有要一个前台进程, docker发现没有应用,就会自动停止 #ngInx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
-
查看日志
docker logs -f -t --tail 容器,没有日志 #自己编写一段shell脚本(测试未成功) [root@iz2ze0j4s19xhxuqg75l0zz /]# docker run -d centos /bin/bash -c “while true;do echo canying;sleep 1;done” #显示日志 -tf #显示日志 --tail number #要显示日志的条数 [root@iz2ze0j4s19xhxuqg75l0zz /]# docker logs -tf --tail 10 dce7b86171bf
-
查看容器中进程信息
docker top 容器id [root@iz2ze0j4s19xhxuqg75l0zz /]# docker top d43224512238 UID PID PPID C STIME TTY TIME CMD root 19810 19794 0 16:26 ? 00:00:00 /bin/bash
-
查看镜像的元数据
docker inspect 容器id [root@iz2ze0j4s19xhxuqg75l0zz /]# docker inspect d43224512238 [ { "Id": "d43224512238bf10a19bb33de20f00c8fcf23b4cae442f9461cd716bcdd69e7a", "Created": "2020-11-12T08:26:47.279424514Z", "Path": "/bin/bash", "Args": [],
-
进入当前正在运行的容器
# 我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置 # 命令 docker exec -it 容器id bashShell # 测试 [root@iz2ze0j4s19xhxuqg75l0zz /]# docker exec -it d43224512238 /bin/bash [root@d43224512238 /]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 08:26 pts/0 00:00:00 /bin/bash root 14 0 0 08:43 pts/1 00:00:00 /bin/bash root 27 14 0 08:43 pts/1 00:00:00 ps -ef # 方式二 docker attach 容器id # 测试 [root@iz2ze0j4s19xhxuqg75l0zz /]# docker attach d43224512238 [root@d43224512238 /]# 正在执行当前代码... #docker exec #进入容器后开启一个新的终端,可以在里面操作(常用) #docker attach #进入容器正在执行的终端,不会启动新的进程
-
从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 目的主机路径
四、Docker安装软件
1. 安装nginx
-
搜索镜像
docker search nginx
-
下载镜像
docker pull nginx
-
运行测试
[root@iz2ze0j4s19xhxuqg75l0zz /]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest c39a868aad02 6 days ago 133MB centos latest 0d120b6ccaa8 3 months ago 215MB # -d 后台运行 # --name 宿主机端口,容器内端口 [root@iz2ze0j4s19xhxuqg75l0zz /]# docker run -d --name nginx -p 80:80 nginx f73ed2fc8142bcf30467c996c9c862875c871adcaf046c959e21ddb3617fa3be # 拷贝配置文件 [root@iz2vc3otfvqqqhbzad3955z nginx]# docker container cp nginx:/etc/nginx /home/docker/nginx/conf [root@iz2vc3otfvqqqhbzad3955z conf]# docker run -p 80:80 --name nginx -v /home/docker/nginx/html:/usr/share/nginx/html -v /home/docker/nginx/logs:/var/log/nginx -v /home/docker/nginx/conf:/etc/nginx -d nginx [root@iz2ze0j4s19xhxuqg75l0zz /]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f73ed2fc8142 nginx "/docker-entrypoint.…" 6 seconds ago Up 4 seconds 0.0.0.0:3344->80/tcp nginx01 [root@iz2ze0j4s19xhxuqg75l0zz /]# curl localhost:3344 #进入容器 [root@iz2ze0j4s19xhxuqg75l0zz ~]# docker exec -it nginx01 /bin/bash root@f73ed2fc8142:/# whereis nginx nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx root@f73ed2fc8142:/# cd /etc/nginx root@f73ed2fc8142:/etc/nginx# ls conf.d koi-utf mime.types nginx.conf uwsgi_params fastcgi_params koi-win modules scgi_params win-utf root@f73ed2fc8142:/etc/nginx#
2. 安装tomcat
官方的使用
docker run -it --rm tomcat:9.0
我们之前的启动都是后台,停止了容器之后,容器还是可以查到 docker run -it --rm,一般用来测试,用完就删除
-
搜索镜像
docker pull tomcat
-
启动运行
docker run -d -p 3355:8080 --name tomcat01 tomcat #进入容器 [root@iz2ze0j4s19xhxuqg75l0zz ~]# docker exec -it tomcat01 /bin/bash #发现问题:1、linux命令少了,2、没有 webapps。阿里云镜像的原因。默认是最小的镜像,所有不必要的都剔除掉 #保证最小可运行的环境 cp -r webapps.dist/* webapps
3. 安装elasticsearch和kibana
es 暴露的端口很多
es 十分的耗内存
es的数据一般需要放置到安全目录!挂载
# -- net somenetwork?网络配置
#启动elasticsearch
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
#启动了1nux就卡住了 docker stats查看cpu的状态
#测试一下es是否安装成功
[root@iz2ze0j4s19xhxuqg75l0zz ~]# curl localhost:9200
{
"name" : "472f848cee04",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "7KmVkbIuSuKG5duEPgMJoQ",
"version" : {
"number" : "7.6.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
"build_date" : "2020-03-26T06:34:37.794943Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
#查看docker status
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
472f848cee04 elasticsearch 0.90% 1.233GiB / 1.795GiB 68.69% 0B / 0B 8GB / 729kB 41
#赶紧关闭,增加內存的限制,修改配置文件-e环境配置修改
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
4.可视化
-
portainer
(先用这个)Docker图形化界面管理工具!提供一个后台面板供我们操作
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer #测试 ip:8088 #注册账号 #选择本地的
-Rancher
(CICD
再用)
5. 安装mysql
-
拉取镜像
[root@iz2ze0j4s19xhxuqg75l0zz ceshi]# docker pull mysql:5.7 5.7: Pulling from library/mysql bb79b6b2107f: Already exists 49e22f6fb9f7: Pull complete 842b1255668c: Pull complete 9f48d1f43000: Pull complete c693f0615bce: Pull complete 8a621b9dbed2: Pull complete 0807d32aef13: Pull complete f15d42f48bd9: Pull complete 098ceecc0c8d: Pull complete b6fead9737bc: Pull complete 351d223d3d76: Pull complete Digest: sha256:4d2b34e99c14edb99cdd95ddad4d9aa7ea3f2c4405ff0c3509a29dc40bcb10ef Status: Downloaded newer image for mysql:5.7 docker.io/library/mysql:5.7
-
启动mysql容器
#启动1 [root@iz2ze0j4s19xhxuqg75l0zz docker]# docker run -d -p 3306:3306 -v /home/docker/mysql/conf:/etc/mysql/conf.d -v /home/docker/mysql/data:/var/lib/mysql -v /home/docker/mysql/log:/var/log/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql5.7 mysql:5.7 [root@iz2ze0j4s19xhxuqg75l0zz docker]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 732dc406a9d1 mysql:5.7 "docker-entrypoint.s…" 4 minutes ago Up 4 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp mysql5.7 # 修改密码 [root@iz2ze0j4s19xhxuqg75l0zz docker] docker exec -it mysql5.7 /bin/bash root@f3ca96a5e58b:/# apt-get update root@f3ca96a5e58b:/# apt-get install vim root@f3ca96a5e58b:/# vim /etc/mysql/conf.d/docker.cnf [mysqld] skip-host-cache skip-name-resolve skip-grant-tables root@f3ca96a5e58b:/# exit [root@iz2vc3otfvqqqhbzad3955z docker]# docker restart mysql5.7 [root@iz2ze0j4s19xhxuqg75l0zz docker] docker exec -it mysql5.7 /bin/bash root@f3ca96a5e58b:/# mysql -u root -p mysql> use mysql; mysql> alter user 'root'@'%' identified by 'rootcy'; mysql> flush privileges ; #修改报错就先刷新 # 创建一个reader:123456帐号并修改权限,使得任何ip都能访问 mysql> grant all privileges on *.* to 'reader' @'%' identified by '123456';
-
测试连接
6. 安装Jenkins
-
拉取镜像
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker pull jenkinsci/blueocean Using default tag: latest latest: Pulling from jenkinsci/blueocean 188c0c94c7c5: Pull complete 79f2a9d4c8d6: Pull complete 98c562aa3ff3: Pull complete f67b3d34ad5c: Pull complete 4f2607535ffc: Pull complete 0e660fe97dd8: Pull complete 24fe2782b74b: Pull complete bad8c347493f: Pull complete 89399c8e1d4e: Pull complete 352fadc8df25: Pull complete 5865538a56b5: Pull complete 39d3c552887f: Pull complete 9e1a8f4807da: Pull complete 12329fdac281: Pull complete 07f6145bf8ac: Pull complete bf8028cdd9b7: Pull complete Digest: sha256:4106c049e29b17163a74400c4cae9bdf12222dbcdabe8b3399af016a351bfb8f Status: Downloaded newer image for jenkinsci/blueocean:latest docker.io/jenkinsci/blueocean:latest
-
启动容器
#/var/run/docker.sock /usr/bin/docker 容器内绑定docker命令 [root@iz2ze0j4s19xhxuqg75l0zz ~]# docker run -u root -d --name jenkins -p 8080:8080 -p 50000:50000 -v /usr/tool/jenkins/jenkins-data:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker jenkins 01c0daf4553a83a3428c78044adb32c4a38540a88fb17725bb5d087e7fc46c3e
7. docker安装nacos
-
拉取镜像
root@iz2ze0j4s19xhxuqg75l0zz ~]# docker pull nacos/nacos-server
-
启动容器
root@iz2ze0j4s19xhxuqg75l0zz ~]# docker run --env MODE=standalone --name nacos -d -p 8848:8848 nacos/nacos-server spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghai db.user=root db.password=root
8. docker安装redis
-
拉取镜像:
docker pull redis
-
启动
redis
:[root@iz2vc3otfvqqqhbzad3955z ~]# docker run -p 6379:6379 --name redis -v /home/docker/redis/data:/data -d redis redis-server --appendonly yes
-
连接
redis
客户端:[root@iz2vc3otfvqqqhbzad3955z data]# docker exec -it redis redis-cli
9. docker安装RabbitMQ
-
拉取镜像:
[root@iz2vc3otfvqqqhbzad3955z ~]# docker pull rabbitmq
-
启动
RabbitMQ
服务:[root@iz2vc3otfvqqqhbzad3955z ~]# docker run -p 5672:5672 -p 15672:15672 --name rabbitmq -d rabbitmq
-
进入容器并开启管理功能:
[root@iz2vc3otfvqqqhbzad3955z /]# docker exec -it rabbitmq /bin/bash root@91dbcd73f681:/# rabbitmq-plugins enable rabbitmq_management
-
开启防火墙:
[root@iz2vc3otfvqqqhbzad3955z /]# firewall-cmd --zone=public --add-port=15672/tcp --permanent [root@iz2vc3otfvqqqhbzad3955z /]# firewall-cmd --reload
10. docker安装Elasticsearch
-
拉取镜像:
[root@iz2vc3otfvqqqhbzad3955z /]# docker pull elasticsearch:7.6.2
-
修改虚拟内存区域大小,否则会因为过小而无法启动:
[root@iz2vc3otfvqqqhbzad3955z /]# sysctl -w vm.max_map_count=262144
-
启动
Elasticsearch
服务:[root@iz2vc3otfvqqqhbzad3955z /]# docker run -p 9200:9200 -p 9300:9300 --name elasticsearch -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -e "cluster.name=elasticsearch" -v /home/docker/elasticsearch/plugins:/usr/share/elasticsearch/plugins -v /home/docker/elasticsearch/data:/usr/share/elasticsearch/data -d elasticsearch:7.6.2 # 启动时会发现/usr/share/elasticsearch/data目录没有访问权限,只需要修改 chmod 777 /home/docker/elasticsearch/data/
-
安装中文分词器
IKAnalyzer
,并重新启动:[root@iz2vc3otfvqqqhbzad3955z /]# docker exec -it elasticsearch /bin/bash [root@6b10c8975b4c elasticsearch]# elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.6.2/elasticsearch-analysis-ik-7.6.2.zip
-
访问会返回版本信息:
http://192.168.3.101:9200
:
11. docler安装Logstash
-
拉取镜像:
[root@iz2vc3otfvqqqhbzad3955z /]# docker pull logstash:7.6.2
-
创建
/home/docker/logstash
目录,并创建文件logstash.conf
:[root@iz2vc3otfvqqqhbzad3955z /]# mkdir /home/docker/logstash [root@iz2vc3otfvqqqhbzad3955z logstash]# vim logstash.conf input { tcp { mode => "server" host => "0.0.0.0" port => 4560 codec => json_lines type => "debug" } tcp { mode => "server" host => "0.0.0.0" port => 4561 codec => json_lines type => "error" } tcp { mode => "server" host => "0.0.0.0" port => 4562 codec => json_lines type => "business" } tcp { mode => "server" host => "0.0.0.0" port => 4563 codec => json_lines type => "record" } } filter{ if [type] == "record" { mutate { remove_field => "port" remove_field => "host" remove_field => "@version" } json { source => "message" remove_field => ["message"] } } } output { elasticsearch { hosts => "localhost:9200" index => "mall-%{type}-%{+YYYY.MM.dd}" } }
-
启动
Logstash
:[root@iz2vc3otfvqqqhbzad3955z logstash]# docker run --name logstash -p 4560:4560 -p 4561:4561 -p 4562:4562 -p 4563:4563 --link elasticsearch:es -v /home/docker/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf -d logstash:7.6.2
-
进入容器内部,安装
json_lines
插件:logstash-plugin install logstash-codec-json_lines
12. docker安装Kibana
-
拉取镜像:
[root@iz2vc3otfvqqqhbzad3955z /]# docker pull kibana:7.6.2
-
启动
Kibana
服务:[root@iz2vc3otfvqqqhbzad3955z /]# docker run --name kibana -p 5601:5601 --link elasticsearch:elasticsearch -e "elasticsearch.hosts=http://47.18.23.96:9200" -d kibana:7.6.2 [root@iz2vc3otfvqqqhbzad3955z /]# docker run --name kibana -p 5601:5601 --link elasticsearch:elasticsearch -d kibana:7.6.2 # kibana启动踩坑:Error: resource_already_exists_exception # 访问以下两个请求(两个请求要有内容) http://localhost:9200/_cat/indices http://localhost:9200/_cat/aliases # 终端访问 curl -X DELETE http://localhost:9200/.kibana* # 重启kibana
-
开启防火墙:
[root@iz2vc3otfvqqqhbzad3955z /]# firewall-cmd --zone=public --add-port=5601/tcp --permanent [root@iz2vc3otfvqqqhbzad3955z /]# firewall-cmd --reload
-
访问地址进行测试:
http://192.168.3.101:5601
13. docker 安装MongoDB
-
拉取镜像:
[root@iz2vc3otfvqqqhbzad3955z /]# docker pull mongo
-
启动MongoDB:
[root@iz2vc3otfvqqqhbzad3955z ~]# docker run -p 27017:27017 --name mongo -v /home/docker/mongo/db:/data/db -d mongo
14. docker 安装 zookeeper
-
拉取镜像
[root@iz2vc3otfvqqqhbzad3955z ~]# docker pull zookeeper
-
启动
zookeeper
[root@iz2vc3otfvqqqhbzad3955z ~]# docker run -d --name zookeeper -p 2181:2181 zookeeper
15. docker 安装 kafka
-
拉取镜像
[root@iz2vc3otfvqqqhbzad3955z ~]# docker pull wurstmeister/kafka
-
启动kafka
[root@iz2vc3otfvqqqhbzad3955z ~]# docker run -d --name kafka --publish 9092:9092 --link zookeeper --env KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 --env KAFKA_ADVERTISED_HOST_NAME=47.108.223.96 --env KAFKA_ADVERTISED_PORT=9092 --volume /home/docker/kafka/localtime:/etc/localtime wurstmeister/kafka:latest
-
进入容器
[root@iz2vc3otfvqqqhbzad3955z ~]# docker exec -it kafka /bin/bash
-
进入
kafka
软件目录bash-5.1# cd /opt/kafka_2.13-2.7.0
-
测试
# 创建一个topic 名为test01 bash-5.1# bin/kafka-topics.sh --create --zookeeper zookeeper:2181 --replication-factor 1 --partitions 1 --topic test01 # 查看我们的topic列表 bash-5.1# bin/kafka-topics.sh --list --zookeeper zookeeper:2181 test01 # 运行一个生产者去发送消息 bash-5.1# bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test01 # 消费消息 bash-5.1# bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test01 --from-beginning 123
五、Docker镜像
1. 镜像是什么
镜像是—种轻量级、可执行的独立软件包,用来打包软件运行环境璄和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
所有的应用,直接打包docker
镜像,就可以直接跑起来!
如何得到一个镜像:
- 从远程仓库下载
- 朋友拷贝
- 自己制作一个镜像DockerFile
2. Docker镜像加载原理
UnionFS(联合文件系统)
UnionFS
(联合文件系统): Union
文件系统( UnionFS
)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的加,同时可以将不同目录挂载到同一个虚拟文件系统下 (unite several directories into a single virtual filesystem
)。 Union
文件系统是 Docker
镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
Docker镜像加载原理
docker
的镜像实际上由一层一层的文件系统组成,这种层级的文件系统 UnionFs
。
boots(boot file system
)主要包含 bootloadr
和kernel
, bootloader
主要是引导加载kernel
, Linux
刚启动时会加载 bootfs
文件系统,在 Docker
镜像的最底层是 bootfs
。这一层与我们典型的 Linux/Unⅸ
系统是一样的,包含boot
加载器和内核。当boot
加载完成之后整个内核就都在内存中了,此时内存的使用权已由 bootfs
转交给内核,此时系统也会卸载 bootfs
。
rootfs(root file system)
,在 bootfs
之上。包含的就是典型Lnux
系统中的/dev
,/proc
,/bin
,/etc
等标准目录和文件。rootfs
就是各种不同的操作系统发行版,比如 Ubuntu
, Centos
等等。
平时我们安装进虚拟机的 Centos
都是好几个G
,为什么 Docker
这里才200M
?
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat 9.0 2703bbe9e9d4 3 days ago 648MB
centos latest 0d120b6ccaa8 3 months ago 215MB
对于一个精简的OS
, rootfs
可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用Host
的 kernel
,自己只需要提供 rootfs
就可以了。由此可见对于不同的linux
发行版, bootfs
基本是一致的, rootfs
会有差别,因此不同的发行版可以公用bootfs
。
虚拟机是分钟级别,容器是秒级!
3. commit 镜像
docker commit 提交容器成为一个新的副本
#命令和git类似
docker commit -m="提交描述信息" -a="作者" 容器id 镜像名:[TAG]
#测试
#1、启动一个默认的tomcat
#2、默认的 tomcat是没有 webapps应用,镜像的原因,官方的镜像默认webapps下面是没有文件的
#3、我自己拷贝进去了基本的文件
#4、将我们操作过的容器通过 commit提交为一个镜像!我们以后就使用我们修改过的镜像即可,这就是我们自己的一个修改的镜像
docker commit -a="canying" -m="add webapps app" 65754bc4526b tomcat02:1.0
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker commit -a="canying" -m="add webapps app" 65754bc4526b tomcat02:1.0
sha256:4fdf997677ae08ce17591755a1122a8ffeba10031ee360f171f4f234c35b5c7c
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat02 1.0 4fdf997677ae 10 seconds ago 653MB
tomcat 9.0 2703bbe9e9d4 3 days ago 648MB
六、容器数据卷
1. 容器数据卷
docker
的理念回顾
将应用和环境打包成一个镜像! 数据?如果数据都在容器中,那么我们容器删除,数据就会丟失!需求:数据可以持久化。
MySQL
,容器删了,删库跑路!需求:MySQL
数据可以存储在本地 容器之间可以有一个数据共享的技术。
docker
容器中产生的数据,同步到本地! 这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux
上面。
2. 使用数据卷
方式一 :直接使用命令来挂载 -v
docker run -it -v 主机目录:容器目录
#测试
[root@iz2ze0j4s19xhxuqg75l0zz home]# docker run -it -v /home/ceshi:/home centos /bin/bash
#启动起来通过 docker inspect 容器id
[root@iz2ze0j4s19xhxuqg75l0zz home]# docker inspect 6f2fc79145d1
"Mounts": [
{
"Type": "bind",
"Source": "/home/ceshi",
"Destination": "/home",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
3. 具名和匿名挂载
#匿名挂载
-v 容器内镜像
[root@iz2ze0j4s19xhxuqg75l0zz docker]# docker run -d --name nginx02 -P -v /etc/nginx nginx
#查看所有volume情况
[root@iz2ze0j4s19xhxuqg75l0zz docker]# docker volume ls
DRIVER VOLUME NAME
local c129e61311c81fac871cd37b697ec438b8b0157b756579697590d11ca7be06cf
local d4cf95f6016660f504cef5cb4845c746f22712e6bd72ace3c3b9039d1d203886
local e87e7ead2bb8c9a04ad473cd4dfbf72c47d44c53a03e03015ab8955bb21958e4
local eb7ada05768e696c45681a5073a50630ea8544395bc2f824354c400365ca3f39
local eb8a248b5e30f4310949e315a29eec433088bce35e89438c5d5ab088ff79b8c1
#具名挂载
[root@iz2ze0j4s19xhxuqg75l0zz docker]# docker run -d --name nginx03 -P -v juming-nginx:/etc/nginx nginx
6f69e62559e2ab874a8c99c58f8fbd0b370aed84cc21e0944bf711ed49b04903
[root@iz2ze0j4s19xhxuqg75l0zz docker]# docker volume ls
DRIVER VOLUME NAME
local c129e61311c81fac871cd37b697ec438b8b0157b756579697590d11ca7be06cf
local d4cf95f6016660f504cef5cb4845c746f22712e6bd72ace3c3b9039d1d203886
local e87e7ead2bb8c9a04ad473cd4dfbf72c47d44c53a03e03015ab8955bb21958e4
local eb7ada05768e696c45681a5073a50630ea8544395bc2f824354c400365ca3f39
local eb8a248b5e30f4310949e315a29eec433088bce35e89438c5d5ab088ff79b8c1
local juming-nginx
#通过-v 卷名:容器内路径
[root@iz2ze0j4s19xhxuqg75l0zz docker]# docker volume inspect juming-nginx
[
{
"CreatedAt": "2020-11-16T15:11:55+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
#所有的docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxx/_data
#我们通过具名挂载可以方便的找到我们的一个卷,大多数情况在使用的具名挂载
拓展:
#通过-V容器内路径:ro rw改变读写权限
ro readonly#只读
rw readwrite#可读可写
#一旦这个了设置了容器权限,容器对我们挂载出来的内容就有限定了!
docker run -d -P --name nginx02 -v juming-nginx: /etc/nginx: ro nginx
docker run -d -P --name nginx02 -v juming-nginx: /etc/ nginx: rw nginx
#ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作!
4. 数据卷容器
多个mysql
同步数据!
七、DockerFile
1. DockerFile介绍
dockerfile
是用来构建 docker
镜像的文件!命令参数脚本!
构建步骤:
- 编写一个
dockerfile
文件。 docker build
构建成为一个镜像。docker run
运行镜像。docker push
发布镜像(Dockerhub
、阿里云镜像仓库) 。
2. DockerFile的构件过程
基础知识:
- 每个保留关键字(指令)都是必须是大写字母。
- 执行从上到下顺序执行。
- #表示注释。
- 每一个指令都会创建提交一个新的镜像层,并提交。
dockerfile
是面向开发的,我们以后要发布项目,做镜像,就需要编写 dockerfile
文件,这个文件十分简单!
Docker
镜像逐渐成为企业交付的标准,必须要掌握!
步骤:开发,部署,运维…缺一不可!
DockerFile
:构建文件,定义了一切的步骤,源代码。DockerImages
:通过Dockerfile
构建生成的镜像,最终发布和运行的产品。Docker
容器:容器就是镜像运行起来提供服务器
3. DockerFile 指令
FROM #基础镜镜像,一切从这里开始构建
MAINTAINER #镜像是谁写的,姓名+邮箱
RUN #镜像构建的时候需要运行的命令
ADD #步骤: tomcat镜像,这个 tomcat压缩包!添加内容
WORKDIR #镜像的工作目录
VOLUME #挂载的目录
EXPOSE #映射端口配置
CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD #当构建一个被继承 Dockerfile这个时候就会运行 ONBUTLD的指令。触发指令。
COPY #类似ADD,将我们文件拷贝到镜像中
ENV #构建的时候设置环境变量
4. 实战测试
DockerHub
中99%镜像都是从这个基础镜像过来的 FROM scratch
,然后配置需要的软件和配置来进行的构建。
创建一个自己的centos
# 1.编写dockerfile文件
[root@iz2ze0j4s19xhxuqg75l0zz dockerfile]# cat dockerfile-mycentos
FROM centos
MAINTAINER canying<248919076@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "----end---"
CMD /bin/bash
#2.通过这个文件构件镜像
#命令:docker build -f dockerfile文件路径 -t 镜像名:[tag]
[root@iz2ze0j4s19xhxuqg75l0zz dockerfile]# docker build -f dockerfile-mycentos -t mycentos:0.1 .
Sending build context to Docker daemon 2.048kB
Step 1/10 : FROM centos
---> 0d120b6ccaa8
...
...
Step 10/10 : CMD /bin/bash
---> Running in fab3e45b924e
Removing intermediate container fab3e45b924e
---> 265de36195c1
Successfully built 265de36195c1
Successfully tagged mycentos:0.1
#3.测试运行
5. 实战:Tomcat镜像
-
准备镜像文件tomcat压缩包,jdk的压缩包。
#下载tomcat压缩包 wget https://mirror.bit.edu.cn/apache/tomcat/tomcat-9/v9.0.39/bin/apache-tomcat-9.0.39.tar.gz #下载jdk压缩包(wget下载的不能解压) wget http://download.oracle.com/otn-pub/java/jdk/8u141-b15/336fa29ff2bb4ef291e347e091f7f4a7/jdk-8u141-linux-x64.tar.gz [root@iz2ze0j4s19xhxuqg75l0zz tomcat]# ll total 11028 -rw-r--r-- 1 root root 11282879 Oct 6 22:33 apache-tomcat-9.0.39.tar.gz -rw-r--r-- 1 root root 5307 Mar 21 2012 jdk-8u141-linux-x64.tar.gz
-
编写dockerfile文件
FROM centos MAINTAINER canying<248919076@qq.com> COPY readme.txt /usr/local/readme.txt ADD jdk-8u171-linux-x64.tar.gz /usr/local ADD apache-tomcat-9.0.39.tar.gz /usr/local RUN yum -y install vim ENV MYPATH /usr/local WORKDIR $MYPATH ENV JAVA_HOME /usr/local/jdk1.8.0_171 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.39 ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.39 ENV PATH $PATH:$JAVA_HOME/bin;$CATALINA_HOME/lib:$CATALINA_HOME/bin EXPOSE 8080 CMD /usr/local/apache-tomcat-9.0.39/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.39/bin/logs/catalina.out
-
构建镜像
[root@iz2ze0j4s19xhxuqg75l0zz tomcat]# docker build -t diytomcat . [root@iz2ze0j4s19xhxuqg75l0zz tomcat]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE diytomcat latest e9aa6b0127b6 3 minutes ago 675MB
-
启动容器
-
访问测试
-
发布项目
6. 发布镜像
DockerHub
-
地址 注册自己的账号。
-
确定账号可以登录。
-
在服务器上提交自己的镜像。
[root@iz2ze0j4s19xhxuqg75l0zz tomcat]# docker login --help Usage: docker login [OPTIONS] [SERVER] Log in to a Docker registry. If no server is specified, the default is defined by the daemon. Options: -p, --password string Password --password-stdin Take the password from stdin -u, --username string Username [root@iz2ze0j4s19xhxuqg75l0zz ~]# docker login -u canying66 Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded
-
登录完毕,提交镜像。docker pull
#push镜像名需要登录DockerHub账号 [root@iz2ze0j4s19xhxuqg75l0zz ~]# docker pull diytomcat Using default tag: latest Error response from daemon: pull access denied for diytomcat, repository does not exist or may require 'docker login': denied: requested access to the resource is denied [root@iz2ze0j4s19xhxuqg75l0zz ~]# docker push canying/tomcat:1.0 The push refers to repository [docker.io/canying/tomcat] fe2971b3c6ea: Preparing 05061b32954d: Preparing 634c8fa3488f: Preparing 799363d05cfc: Preparing 291f6e44771a: Preparing denied: requested access to the resource is denied [root@iz2ze0j4s19xhxuqg75l0zz ~]# docker tag e9aa6b0127b6 canying66/tomcat:1.0 [root@iz2ze0j4s19xhxuqg75l0zz ~]# docker push canying66/tomcat:1.0 The push refers to repository [docker.io/canying66/tomcat] Get https://registry-1.docker.io/v2/: net/http: request canceled (Client.Timeout exceeded while awaiting headers) [root@iz2ze0j4s19xhxuqg75l0zz ~]# docker push canying66/tomcat:1.0 The push refers to repository [docker.io/canying66/tomcat] fe2971b3c6ea: Pushed 05061b32954d: Pushed 634c8fa3488f: Pushed 799363d05cfc: Pushed 291f6e44771a: Pushed 1.0: digest: sha256:a6879060e9a5fe080ba5b0e9077ad510949bc9ecab23ff4edcf381020865249f size: 1373
阿里云镜像服务
-
登录阿里云。
-
找到容器镜像服务。
-
创建命名空间。
-
创建容器镜像。
-
浏览镜像。
-
发布镜像参考官方文档。
7.小结
八、Docker网络
1. 理解Docker0
清空所有环境。
测试
[root@iz2ze0j4s19xhxuqg75l0zz ~]# ip addr
#本机回环地址
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
#阿里云内网地址
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:16:3e:16:f8:c4 brd ff:ff:ff:ff:ff:ff
inet 172.24.5.85/18 brd 172.24.63.255 scope global dynamic eth0
valid_lft 314647934sec preferred_lft 314647934sec
#docker0地址
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:d0:2a:82:3f brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
三个网络
#问题:docker是如何处理容器网络访问的?
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker run -d -p 3355:8080 --name tomcat01 tomcat
#查看容器的内部网络地址 ip addr, 发现容器启动的时候会得到一个eth0@if183 ip地址, docker分配的!
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker exec -it tomcat01 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
182: eth0@if183: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
#思考。1iunx能不能ping通容器内部!
[root@iz2ze0j4s19xhxuqg75l0zz ~]# ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.061 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.053 ms
64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.067 ms
64 bytes from 172.17.0.3: icmp_seq=4 ttl=64 time=0.078 ms
#1inux可以ping通 docker容器内部
原理
-
我们每启动—个
docker
容器,docker
就会给docker
容器分配一个ip
,我们只要安装了docker
,就会有一个网卡docker0
桥接模式,使用的技术是evth-pair
技术!再次测试ip addr
。[root@iz2ze0j4s19xhxuqg75l0zz ~]# ip addr 183: veth8497c2d@if182: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether 06:ef:9a:b5:3a:fb brd ff:ff:ff:ff:ff:ff link-netnsid 1
-
再启动一个容器测试,发现又多了一对网卡。
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker run -d -P --name tomcat02 tomcat b78428ff8ab84523f2325c2f19ebd306a69c8d9d0e3f2446f2ab50ef10924417 [root@iz2ze0j4s19xhxuqg75l0zz ~]# ip addr 183: veth8497c2d@if182: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether 06:ef:9a:b5:3a:fb brd ff:ff:ff:ff:ff:ff link-netnsid 1 215: veth07a6102@if214: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether 3e:fd:c8:20:a7:7e brd ff:ff:ff:ff:ff:ff link-netnsid 0
#我们发现这个容器带来网卡,都是一对对的 #evth-pair就是一对的虚拟设备接口,他们都是成对出现的,一段连着协 一段彼此相连 #正因为有这个特性,evth-pair充当一个桥梁,连接各种虚拟网络设备的 #OpenStack, Docker容器之间的连接,OVS的连接,都是使用evth-pair技术
-
测试一下
tomcat01
和tomcat02
之间是否可ping
通。[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker exec -it tomcat01 ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 182: eth0@if183: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever [root@iz2ze0j4s19xhxuqg75l0zz ~]# docker exec -it tomcat02 ping 172.17.0.3 PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data. 64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.110 ms 64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.071 ms 64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.066 ms 64 bytes from 172.17.0.3: icmp_seq=4 ttl=64 time=0.071 ms
-
网络模型图:
结论:tomcat01
和tomcat02
是公用的一个路由器docker0
,所有的容器不指定网络的情况下,都是docker0
路由的,docker
会给我们的容器分配一个默认的可用ip
。小结
Docker
使用的是Linux
的桥接,宿主机中是一个Dokcer
容器的网桥docker0
。
Docker
中的所有的网络接囗都是虚拟的。虛拟的转发效率高!(内网传递文件)
只要容器删除,对应网桥一对就没了!
2. --link
思考个场景,我们编写了一个微服务,database url=ip:,项目不重启,数据库jp换掉了,我们希望可以处理这个问题,可以名字来进行访问容器?
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker exec -it tomcat01 ping tomcat02
ping: tomcat02: Name or service not known
#如何可以解决呢
#通过--link 可以解决网络连通问题
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker run -d -P --name tomcat03 --link tomcat02 tomcat
d9fa7828fe1e51117176135dd8e0cb27e4a5515b46113f001fe77f7e621ce033
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker exec -it tomcat03 ping tomcat02
PING tomcat02 (172.17.0.2) 56(84) bytes of data.
64 bytes from tomcat02 (172.17.0.2): icmp_seq=1 ttl=64 time=0.108 ms
64 bytes from tomcat02 (172.17.0.2): icmp_seq=2 ttl=64 time=0.069 ms
64 bytes from tomcat02 (172.17.0.2): icmp_seq=3 ttl=64 time=0.070 ms
64 bytes from tomcat02 (172.17.0.2): icmp_seq=4 ttl=64 time=0.080 ms
#反向可以ping通吗
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Name or service not known
其实这个tomcat03
就是在本地配置了 tomcat02
的配置?
#查看 hosts配置,在这里原理发现
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker exec -it tomcat03 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 tomcat02 b78428ff8ab8
172.17.0.4 d9fa7828fe1e
3. 自定义网络
查看所有的Docker网络
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
8b4881cb0337 bridge bridge local
8ad55277a98b host host local
fcc90d1fa3ca none null local
网络模式:
- 桥接:
docker
(默认,自己创建也使用bridge
模式)。 none
:不配置网络。host
:和宿主机共享网络。container
:容器网络连通!(用的少!局限很大)。
测试:
#我们直接启动的命令 --net bridge,而这个就是我们的 docker0
docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat01 --net bridge tomcat
# docker0特点:默认,域名不能访间,--1ink可以打通连接!
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
c98a1f1c17003e0886e7f12a11e3aea0a9420ac002381b2a93c517fb48c769ba
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
8b4881cb0337 bridge bridge local
8ad55277a98b host host local
c98a1f1c1700 mynet bridge local
fcc90d1fa3ca none null local
#查看自己创建网络
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker network inspect mynet
[
{
"Name": "mynet",
"Id": "c98a1f1c17003e0886e7f12a11e3aea0a9420ac002381b2a93c517fb48c769ba",
"Created": "2020-11-18T10:43:21.366495797+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": {}
}
]
使用自己创建的网络创建容器:
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat
0b094f2b4d16eb573dbefa8efd243fdfbd17cef0151ffcc1b97fbc6669b3d8be
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat
881da4f42d7159e50598d1e1e39cd9371dc97a6d1236eef6ab59914c6b22cc70
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker network inspect mynet
[
{
"Containers": {
"0b094f2b4d16eb573dbefa8efd243fdfbd17cef0151ffcc1b97fbc6669b3d8be": {
"Name": "tomcat-net-01",
"EndpointID": "bcdf8cf8407208aa86566e446c9fb0b19bf9ab23a7d1f2cfc04c6a7ddea5a7a6",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
},
"881da4f42d7159e50598d1e1e39cd9371dc97a6d1236eef6ab59914c6b22cc70": {
"Name": "tomcat-net-02",
"EndpointID": "566ab7b488794d3ca8aec59a0699719d7e4706c721a52e31d87c7a2d0914805f",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
#再次测试ping连接
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker exec -it tomcat-net-01 ping 192.168.0.3
PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.114 ms
64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.067 ms
64 bytes from 192.168.0.3: icmp_seq=3 ttl=64 time=0.075 ms
64 bytes from 192.168.0.3: icmp_seq=4 ttl=64 time=0.069 ms
#现在不使用--link也可以ping名字了!
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker exec -it tomcat-net-01 ping tomcat-net-02
PING tomcat-net-02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.050 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.075 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.067 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=4 ttl=64 time=0.076 ms
我们自定义的网络 docker
都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络!
好处:
- redis-不同的集群使用不同的网络,保证集群是安全和健康的。
- mysql-不同的集群使用不同的网络,保证集群是安全和健康的。
4. 网络连通
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker network --help
Usage: docker network COMMAND
Manage networks
Commands:
connect Connect a container to a network #将容器连接到网络
#测试tomcat01 - mynet
#连通之后就是将 tomcat01放到了 mynet网络下
#一个容器两个ip地址!
#阿里云服务:公网ip,私网ip
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker network connect mynet tomcat01
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker network inspect mynet
[
{
"Containers": {
"0b094f2b4d16eb573dbefa8efd243fdfbd17cef0151ffcc1b97fbc6669b3d8be": {
"Name": "tomcat-net-01",
"EndpointID": "bcdf8cf8407208aa86566e446c9fb0b19bf9ab23a7d1f2cfc04c6a7ddea5a7a6",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
},
"881da4f42d7159e50598d1e1e39cd9371dc97a6d1236eef6ab59914c6b22cc70": {
"Name": "tomcat-net-02",
"EndpointID": "566ab7b488794d3ca8aec59a0699719d7e4706c721a52e31d87c7a2d0914805f",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
},
"c836f6338a6e48005981053fcf3b517e94a4c9ef607228a5e08d0cb05cc86d56": {
"Name": "tomcat01",
"EndpointID": "a837fda5baf5a212d4c926de3a844cd5a02a692f6b94ceb52f4e61885424a177",
"MacAddress": "02:42:c0:a8:00:04",
"IPv4Address": "192.168.0.4/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
#01连通
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker exec -it tomcat01 ping tomcat-net-01
PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.075 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.084 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.072 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=4 ttl=64 time=0.082 ms
#02还是不通
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker exec -it tomcat02 ping tomcat-net-01
ping: tomcat-net-01: Name or service not known
4. 实战部署redis集群
5. Springboot微服务应用打包Docker镜像
- 构架
springboot
项目 - 打包应用
- 编写
dockerfile
- 构建镜像
- 发布运行!
九、Docker Compose
9.1 Docker Compose的安装与卸载
9.1.1 安装条件
Docker Compose
是依赖于Docker
引擎的,所以在安装Docker Compose
之前要确保机器上已经安装了Docker
。
9.1.2 安装Compose
-
使用
curl
命令从GitHub
的Compose
仓库拉取Docker Compose
:$ sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
-
更改
Docker Compose
的可执行文件权限:$ sudo chmod +x /usr/local/bin/docker-compose $ docker-compose --version
-
Compose
的卸载操作:$ sudo rm /usr/local/bin/docker-compose