Docker

Docker概述

Docker为什么会出现

一款产品 : 开发—上线 两套环境 应用环境 应用配置

开发 — 运维 问题 我在我的电脑上可以运行 版本更新 导致服务不可用 对于运维来说 考验十分大?
环境配置是十分的麻烦 每一个机器都要部署环境(集群 Redis、ES、Hadoop…) 费时费力

发布一个项目(jar + (Redis MySql jdk Es)) 项目能不能带上环境安装打包!

之前在服务器配置一个应用的环境 redis mysql jdk es hadoop 配置超麻烦了 不能够跨平台

windows 最后发布到linux!

传统 : 开发jar 运维来做

现在 开发打包部署上线 一套流程做完

java----apk ---- 发布(应用商店) ---- 张三使用apk — 安装即可用

java — jar (环境) — 打包项目带上环境(镜像) ----- (Docker仓库:商店) ---- 下载我们发布的镜像 ----- 直接运行即可

docker的出现就是为了解决以上问题的

Docker的思想就来自于集装箱

jRE --多个应用(端口冲突) – 原来都是交叉的!

隔离: Docker核心思想 打包装箱 每个箱子是互相隔离的

水果 生化武器

Docker 通过隔离机制 可以将服务器利用到极致

本质 所有的技术都是因为一些问题 我们就需要去解决这些问题 所以才去学习

Docker的历史

2010年 几个搞IT的年轻人 就在美国成立一家公司dotCloud

做一些pass的云计算服务 LXC有关的容器技术

他们将自己的技术 (容器化技术)命名就是Docker

Docker刚刚诞生的时候没有引起行业的注意 docCloud 就活不下去啦

就想到啦开源

开发源代码!

2013年 Docker开源

Docker 越来越多的人发现Docker的优点 火了 Docker每个月都会更新一个版本

2014 年4月9日 Docker1.0发布

Docker为什么这么火 十分的轻巧

在容器技术出来之前 我们都是使用虚拟机技术

虚拟机 在windows中装一个Vmware 通过这个软件我们可以虚拟出一台或者多台电脑 比较笨重 虚拟机也是属于虚拟化技术 Docker容器技术 也是一种虚拟化技术

vm: linux centos原生镜像(一个电脑) 隔离 需要开启多个虚拟机 几个G 几分钟
docker: 隔离 镜像(最核心的环境 4m+jdk+mysql) 十分的小巧 运行镜像就可以了 小巧 几个M kb 秒级启动!

聊聊Docker

Docker是基于Go语言开发的 开源项目

官网:https://www.docker.com/

文档:https://docs.docker.com/

仓库地址: https://hub.docker.com/

Docker安装

Docker的基本组成

镜像(image)

docker镜像就好比是一个模板 可以通过这个模板来创建容器服务 tomcat镜像===> run ==> tomcat01容器(提供服务器)

通过这个镜像可以创建多个容器 (最终服务运行或者项目运行就是在容器中的)

容器(container)

Docker利用容器技术 独立运行一个或者一个组应用 通过镜像来创建的

启动 停止 删除 基本命令!

目前就可以吧这个容器理解为就是一个简易的linux系统

仓库(repository)

仓库就是存放镜像的地方

仓库分为公有仓库和私有仓库

Docker Hub(默认是国外的)

阿里云… 都有容器服务器(配置镜像加速)

安装Docker

环境准备

1.需要会一点点的Liunx的基础

2.CentOs 7

3.我们需要Xshell连接远程服务器进行操作

环境查看

#系统内核是3.10以上的
[root@guchenstudy /]# uname -r
3.10.0-514.26.2.el7.x86_64
[root@guchenstudy /]# uname -r
3.10.0-514.26.2.el7.x86_64
[root@guchenstudy /]# 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"

帮助文档:https://docs.docker.com/

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

sudo systemctl start docker

6.使用 docker version 查看是否安装成功

7.hello world

sudo docker run hello-world

8.查看一下下载的hello-world镜像

docker images

卸载docker

# 卸载依赖
sudo yum remove docker-ce docker-ce-cli containerd.io
# 删除docker资源目录
# /var/lib/docker   docker的默认工作路径
sudo rm -rf /var/lib/dockersudo rm -rf /var/lib/containerd

阿里云镜像加速器

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

回顾docker中的helloWorld

docker run 指令原理图

底层原理

Docker是什么工作的?

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

DockerServer 接收到Docker-Client的指令 就会执行这个命令

Docker 为什么比VM快?

1.Docker有着比虚拟机更少的抽象层

2.docker 利用的是宿主机的内核 vm需要是Guest OS

所以说 新建一个容器的时候 docker不需要像虚拟机一样重新加载一个操作系统内核 避免引导 虚拟机是加载Cuest Os 分钟级别 而Docker 是 利用宿主机的操作系统吗 省略了这个复杂的过程 秒级

docker的常用命令

帮助命令

docker version --查看版本信息
docker info --查看详细信息
docker 命令 --help #万能命令

帮助文档地址:https://docs.docker.com/engine/reference/builder/

镜像命令

docker images 查看所有本地的主机上的镜像

[root@guchenstudy ~]# docker images
REPOSITORY    TAG       IMAGE ID               SIZE
hello-world   latest    d1165f221234   2 months ago   13.3kB
#解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的id
CREATED 镜像的创建时间
SIZE 镜像的大小
#可选项-a, --all        #查询全部-q, --quiet      #只显示镜像的id

docker search 镜像搜索

[root@guchenstudy ~]# docker search mysql
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   10881     [OK]
mariadb                           MariaDB Server is a high performing open sou…   4104      [OK]
mysql/mysql-server                Optimized MySQL Server Docker images. Create…   808                  [OK]
percona                           Percona Server is a fork of the MySQL relati…   537       [OK]    #可选项
docker search mysql  --filter=stars=3000 搜索出来的镜像就是Strats 大于 3000的
[root@guchenstudy ~]# docker search mysql  --filter=stars=3000
NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used, open-source relation…   10881     [OK]
mariadb   MariaDB Server is a high performing open sou…   4104      [OK]
[root@guchenstudy ~]# docker search mysql  --filter=stars=5000
NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used, open-source relation…   10881     [OK]

docker pull 镜像名称 下载镜像

[root@vvvv ~]# docker pull mysql
Using default tag: latest #如果不写版本,默认下载最新的
latest: Pulling from library/mysql
a076a628af6f: Pull complete  #分层下载,docker images的核心 联合文件系统
f6c208f3f991: Pull complete
88a9455a9165: Pull complete
406c9b8427c6: Pull complete
7c88599c0b25: Pull complete
25b5c6debdaf: Pull complete
43a5816f1617: Pull complete
1a8c919e89bf: Pull complete
9f3cf4bd1a07: Pull complete
80539cea118d: Pull complete
201b3cad54ce: Pull complete
944ba37e1c06: Pull complete
Digest: sha256:feada149cb8ff54eade1336da7c1d080c4a1c7ed82b5e320efb5beebed85ae8c
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址#等价于它
docker pull mysql
docker pull docker.io/library/mysql:latest

指定版本下载

[root@vvvv ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
a076a628af6f: Already exists # 联合文件,因为latest里面有这些所以无需下载
f6c208f3f991: Already exists
88a9455a9165: Already exists
406c9b8427c6: Already exists
7c88599c0b25: Already exists
25b5c6debdaf: Already exists
43a5816f1617: Already exists
1831ac1245f4: Pull complete # 只需要下载5.7特有的即可
37677b8c1f79: Pull complete
27e4ac3b0f6e: Pull complete
7227baa8c445: Pull complete
Digest: sha256:b3d1eff023f698cd433695c9506171f0d08a8f92a0c8063c1a4d9db9a55808df
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

docker rmi -f 镜像id 删除镜像

docker rmi -f 镜像id                #删除一个镜像 通过id删除
docker rmi -f 镜像id 镜像id 镜像id  #删除多个镜像 通过id删除
docker rmi -f $(docker images -aq) #删除查询出来的所有的镜像ID 依次递归删除

容器命令

新建容器并启动

docker run [可选参数] image#参数说明
--name = "Name" 容器名字 tomcat01 tomcat02 用来区分容器的
-d 后台方式运行
-it 使用交互方式运行 进入容器查看内容
-p 指定容器的端口 -p 8080:8080-p ip 主机端口 容器端口-p 主机端口:容器端口-p 容器端口容器端口
-P 随机指定端口#测试 启动并进入容器
docker run -it 镜像名称 /bin/bash#从容器中退出
exit  #直接容器停止并退出
Ctrl+P+Q #容器不停止退出#查看正在运行中的容器
docker ps
-a  #列出所有的正在运行的容器 带出历史运行过的容器
-n=? #显示最近创建的容器
-q # 显示容器的编号#删除容器
docker rm  #容器id 删除指定的容器id 不能删除正在运行的容器 如果要强制删除 rm -f
docker rm -f $(docker ps -aq) #递归删除查询出所有的容器id
docker ps -a -q|xargs docker rm #删除所有的容器#启动和停止容器的操作
docker start 容器id # 启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器

常用其他命令

后台启动容器

#命令 docker run -d 镜像名 !

docker run -d centos

#问题 docker ps 发现 centos 停止了

常见的坑 docker容器使用后台运行 就必须要有一个前台进程 docker发现没有应用 就会自动停止

比如nginx 容器启动后 发现自己没有提供服务 就会立刻停止 就是没有程序运行 所以就会立即杀死

查看日志

docker logs -f -t --tail 容器 查看日志
#自己编写一段shell脚本
docker run -d centos /bin/sh -c "while true;do echo kuangshen;sleep 1; done"#参数详解
--tf #显示日志
--tail number #显示日志停止条数 number表示条数
#测试命令
docker logs -tf --tail 10 容器id

查看dokcer中的进程信息

#命令 docker top 容器id

查看镜像的元数据

docker inspect 容器id#测试
[root@guchenstudy /]# docker inspect 6933fd39db19
[{"Id": "6933fd39db1900bb4a3f014dc15a05a79d0e178a197811c8ac0ff36dd8fe93ec","Created": "2021-05-18T06:43:28.088848126Z","Path": "/bin/bash","Args": [],"State": {"Status": "running","Running": true,"Paused": false,"Restarting": false,"OOMKilled": false,"Dead": false,"Pid": 32090,"ExitCode": 0,"Error": "","StartedAt": "2021-05-18T06:43:28.348389809Z","FinishedAt": "0001-01-01T00:00:00Z"},"Image": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55","ResolvConfPath": "/var/lib/docker/containers/6933fd39db1900bb4a3f014dc15a05a79d0e178a197811c8ac0ff36dd8fe93ec/resolv.conf","HostnamePath": "/var/lib/docker/containers/6933fd39db1900bb4a3f014dc15a05a79d0e178a197811c8ac0ff36dd8fe93ec/hostname","HostsPath": "/var/lib/docker/containers/6933fd39db1900bb4a3f014dc15a05a79d0e178a197811c8ac0ff36dd8fe93ec/hosts","LogPath": "/var/lib/docker/containers/6933fd39db1900bb4a3f014dc15a05a79d0e178a197811c8ac0ff36dd8fe93ec/6933fd39db1900bb4a3f014dc15a05a79d0e178a197811c8ac0ff36dd8fe93ec-json.log","Name": "/stupefied_chaplygin","RestartCount": 0,"Driver": "overlay2","Platform": "linux","MountLabel": "","ProcessLabel": "","AppArmorProfile": "","ExecIDs": null,"HostConfig": {"Binds": null,"ContainerIDFile": "","LogConfig": {"Type": "json-file","Config": {}},"NetworkMode": "default","PortBindings": {},"RestartPolicy": {"Name": "no","MaximumRetryCount": 0},"AutoRemove": false,"VolumeDriver": "","VolumesFrom": null,"CapAdd": null,"CapDrop": null,"CgroupnsMode": "host","Dns": [],"DnsOptions": [],"DnsSearch": [],"ExtraHosts": null,"GroupAdd": null,"IpcMode": "private","Cgroup": "","Links": null,"OomScoreAdj": 0,"PidMode": "","Privileged": false,"PublishAllPorts": false,"ReadonlyRootfs": false,"SecurityOpt": null,"UTSMode": "","UsernsMode": "","ShmSize": 67108864,"Runtime": "runc","ConsoleSize": [0,0],"Isolation": "","CpuShares": 0,"Memory": 0,"NanoCpus": 0,"CgroupParent": "","BlkioWeight": 0,"BlkioWeightDevice": [],"BlkioDeviceReadBps": null,"BlkioDeviceWriteBps": null,"BlkioDeviceReadIOps": null,"BlkioDeviceWriteIOps": null,"CpuPeriod": 0,"CpuQuota": 0,"CpuRealtimePeriod": 0,"CpuRealtimeRuntime": 0,"CpusetCpus": "","CpusetMems": "","Devices": [],"DeviceCgroupRules": null,"DeviceRequests": null,"KernelMemory": 0,"KernelMemoryTCP": 0,"MemoryReservation": 0,"MemorySwap": 0,"MemorySwappiness": null,"OomKillDisable": false,"PidsLimit": null,"Ulimits": null,"CpuCount": 0,"CpuPercent": 0,"IOMaximumIOps": 0,"IOMaximumBandwidth": 0,"MaskedPaths": ["/proc/asound","/proc/acpi","/proc/kcore","/proc/keys","/proc/latency_stats","/proc/timer_list","/proc/timer_stats","/proc/sched_debug","/proc/scsi","/sys/firmware"],"ReadonlyPaths": ["/proc/bus","/proc/fs","/proc/irq","/proc/sys","/proc/sysrq-trigger"]},"GraphDriver": {"Data": {"LowerDir": "/var/lib/docker/overlay2/e960904618add6cad78268dc00d0804e33e59d6c6110c712e99872e94c8636de-init/diff:/var/lib/docker/overlay2/ee4a7d2321b34119b7af4bd4ddaf040075af83fb1562958bdeb384b1483cf89a/diff","MergedDir": "/var/lib/docker/overlay2/e960904618add6cad78268dc00d0804e33e59d6c6110c712e99872e94c8636de/merged","UpperDir": "/var/lib/docker/overlay2/e960904618add6cad78268dc00d0804e33e59d6c6110c712e99872e94c8636de/diff","WorkDir": "/var/lib/docker/overlay2/e960904618add6cad78268dc00d0804e33e59d6c6110c712e99872e94c8636de/work"},"Name": "overlay2"},"Mounts": [],"Config": {"Hostname": "6933fd39db19","Domainname": "","User": "","AttachStdin": true,"AttachStdout": true,"AttachStderr": true,"Tty": true,"OpenStdin": true,"StdinOnce": true,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd": ["/bin/bash"],"Image": "centos","Volumes": null,"WorkingDir": "","Entrypoint": null,"OnBuild": null,"Labels": {"org.label-schema.build-date": "20201204","org.label-schema.license": "GPLv2","org.label-schema.name": "CentOS Base Image","org.label-schema.schema-version": "1.0","org.label-schema.vendor": "CentOS"}},"NetworkSettings": {"Bridge": "","SandboxID": "4db413b15f2f81479c9ce4b2fddc096578be6beb177d94dd765e42074cacc2a4","HairpinMode": false,"LinkLocalIPv6Address": "","LinkLocalIPv6PrefixLen": 0,"Ports": {},"SandboxKey": "/var/run/docker/netns/4db413b15f2f","SecondaryIPAddresses": null,"SecondaryIPv6Addresses": null,"EndpointID": "6a75286874f3f990b08a29c19f4b14f7cfa8e406864f883522fa5c9afeb22b89","Gateway": "172.17.0.1","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"IPAddress": "172.17.0.2","IPPrefixLen": 16,"IPv6Gateway": "","MacAddress": "02:42:ac:11:00:02","Networks": {"bridge": {"IPAMConfig": null,"Links": null,"Aliases": null,"NetworkID": "b5ccae51de7d8c84ac95c588dc31a8dbf0e327e88bd25047957089967653cd9a","EndpointID": "6a75286874f3f990b08a29c19f4b14f7cfa8e406864f883522fa5c9afeb22b89","Gateway": "172.17.0.1","IPAddress": "172.17.0.2","IPPrefixLen": 16,"IPv6Gateway": "","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"MacAddress": "02:42:ac:11:00:02","DriverOpts": null}}}}
]

进入当前正在运行的容器

#我们通常容器都是使用后台方式运行的 需要进入容器 修改一些配置#命令
docker exec -it 容器id bashShell#测试
[root@guchenstudy /]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
48cae1240ab6   centos    "/bin/bash"   13 seconds ago   Up 12 seconds             goofy_tesla
[root@guchenstudy /]# docker exec -it 48cae1240ab6 /bin/bash
[root@48cae1240ab6 /]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 06:51 pts/0    00:00:00 /bin/bash
root        15     0  0 06:52 pts/1    00:00:00 /bin/bash
root        30     0  1 06:53 pts/2    00:00:00 /bin/bash
root        44    30  0 06:53 pts/2    00:00:00 ps -ef#方式二
docker attach 容器id
#测试
docker attach 容器id
显示正在执行当前的代码....#docker exec  # 进入容器后开启一个新的终端 可以在里面进行操作(常用)
#docker attach #进入容器正在执行的终端 不回启动新的进程

从容器内拷贝文件到主机上

docker cp 容器id  容器内路径 目的地主机路径[root@guchenstudy home]# docker run -it centos /bin/bash
[root@5b72d081fca3 /]# ls
bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr
[root@5b72d081fca3 /]# cd /home
[root@5b72d081fca3 home]# touch text.java
[root@5b72d081fca3 home]# ls
text.java
[root@5b72d081fca3 home]# exit
exit
[root@guchenstudy home]# docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED              STATUS                         PORTS     NAMES
5b72d081fca3   centos         "/bin/bash"   About a minute ago   Exited (0) 19 seconds ago                naughty_kapitsa
6933fd39db19   centos         "/bin/bash"   19 minutes ago       Exited (0) 15 minutes ago                stupefied_chaplygin
f54ac01edcc4   centos         "/bin/bash"   25 minutes ago       Exited (130) 25 minutes ago              focused_dubinsky
d2e11ab86c97   centos         "/bin/bash"   About an hour ago    Exited (0) About an hour ago             priceless_kirch
d401b85bf954   d1165f221234   "/hello"      21 hours ago         Exited (0) 21 hours ago                  heuristic_keldysh
f135635d9f76   d1165f221234   "/hello"      5 days ago           Exited (0) 5 days ago                    boring_hofstadter
[root@guchenstudy home]# docker cp 5b72d081fca3:/home/text.java /home
[root@guchenstudy home]# ls
guchen  jdk  redis  text.java  www#拷贝是一个手动过程 未来我们使用 -v卷的技术 可以实现

查看docker所有容器的占cpu,内存情况

docker stats

小结

练习

安装Nginx

[root@guchenstudy home]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
69692152171a: Already exists
49f7d34d62c1: Pull complete
5f97dc5d71ab: Pull complete
cfcd0711b93a: Pull complete
be6172d7651b: Pull complete
de9813870342: Pull complete
Digest: sha256:df13abe416e37eb3db4722840dd479b00ba193ac6606e7902331dcea50f4f1f2
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
[root@guchenstudy home]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    f0b8a9a54136   5 days ago     133MB
mysql        latest    c0cdc95609f1   5 days ago     556MB
centos       latest    300e315adb2f   5 months ago   209MB
[root@guchenstudy home]# docker run -d --name nginx01 -p 5000:80 nginx
2e156fa85b6419502a952b32d519436061aafc4a8a19acd96c13c5ff008d7fa0
[root@guchenstudy home]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                   NAMES
2e156fa85b64   nginx     "/docker-entrypoint.…"   16 seconds ago   Up 16 seconds   0.0.0.0:5000->80/tcp, :::5000->80/tcp   nginx01#进入容器
[root@guchenstudy home]# docker exec -it nginx01 /bin/bash
root@2e156fa85b64:/# whereis nginx #查询所有存在的目录
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@2e156fa85b64:/# cd /etc/nginx
root@2e156fa85b64:/etc/nginx# ls
conf.d      koi-utf  mime.types  nginx.conf   uwsgi_params
fastcgi_params  koi-win  modules     scgi_params  win-utf

端口暴露概念

es+kibana

# 下载并启动
docker run -d --name es -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.12.1
# 发现服务器异常卡顿,es占用内存过高 -e 环境配置文件修改
docker run -d --name es1 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTs="-Xms64m -Xmx526m" elasticsearch:7.12.1docker run --name kibana -e ELASTICSEARCH_URL=ip:9200 -p 5601:5601 -d kibana:7.12.1

可视化面板

portainer

Docker图形化界面管理工具 提供后天面板供我们操作使用

docker run -d -p 9000:9000 \--restart=always \-v /var/run/docker.sock:/var/run/docker.sock \--name portainer-test \docker.io/portainer/portainer

镜像讲解

概述

Docker镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含某个软件所需的所有内容,包括代码、库、环境变量、配置文件、运行时环境等。
所有的应用,直接打包成Docker镜像,然后通过镜像创建出容器,然后就可以直接跑起来。

如何得到镜像:

  • 从远程仓库下载,比如docker hub、阿里云的镜像仓库等。
  • 朋友拷贝给你。
  • 自己制作一个镜像DockerFile。
  • 通过对原有的镜像创建的容器进行一些修改(也可以不修改),然后通过Commit命令提交一个新的镜像。

Docker镜像加载原理

UnionFS(联合文件系统)

我们在下载某个镜像的时候,可能会看到下载了一层一层的多个镜像。

联合文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层叠加,联合文件系统是Docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像的镜像)比如centos镜像,可以制作出各种具体应用的镜像,比如mysql镜像。一个成型的应用进行都是由若干个镜像一层层组成的。

Docker镜像加载原理

docker镜像实际上是由一层层的文件系统组成,这种层级文件系统就是联合文件系统。

bootfs(boot file system)主要包含BootLoader和kernel,BootLoader主要负责引导加载kernel,Linux刚启动时会加载bootfs文件系统来引导内核的加载,Docker镜像的最底层就是bootfs。这一层与我们典型的unix系统是一样的,包含boot引导器和内核,当boot加载完成后整个内核就在内存中了,此时内存的使用权已经由bootfs转交给内核,此时系统会卸载bootfs。

rootfs(root file system)在bootfs之上,包含的就是典型的unix系统的/dev、 /proc、 /etc等标准目录和文件和一些命令,rootfs就是不同unix系统的发行版,比如Ubuntu、centos等。

我们平时安装的虚拟机centos镜像好几个G,Docker安装的才200多m,因为对于一个精简的OS,rootfs可以很小,只需包含最基本的命令,工具和程序库就行了,因为底层直接使用宿主机的内核,自己只需提供rootfs(相当于操作内核的客户端)就可以,由此可见不同发行版的bootfs基本是一致的,roorfs有差别,因此不同的发行版可以公有bootfs。

第一个图仅仅是bootfs+rootfs,然后如果要制作一个emacs环境的镜像,就在这个基础上新加一层emacs镜像,如图二。如果要在添加一个Apache环境,那就再图二基础上加一个apache镜像。如图三。图中的每一层镜像都能进行复用。

比如:上面的redis镜像。使用docker inspect redis镜像的ID 命令查看镜像的元信息,找到layer信息。

由上图可以看到下载的redis镜像是由6个镜像一层层组成的。

这些镜像都是一个个独立可复用的镜像,如果下载其他镜像是,某一层镜像是已经存在本地的了,就不用在下载,直接复用该镜像,节省空间。比如上面下载redis镜像时,提示某个镜像已经存在。

注意:

Docker镜像都是只读的,用镜像创建容器启动时,实际上是在原本的镜像上新建了一层可写层到原本镜像的顶部,这一层我们叫作容器层,容器层之下的叫作镜像层。

如上图,使用Tomcat镜像创建容器后,会在Tomcat镜像的基础上新建一个可写层,容器的写入是在可写层进行记录,然后使用commit命令把该容器创建一个新的镜像,实际上新的镜像是tomcat镜像+可写层镜像,以tomcat镜像为基础。通过下面介绍使用容器构建镜像,可以更好地理解。

commit镜像

docker commit 提交容器成为新的镜像
#命令和git原理类似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:tag tag 表示版本号

##实战测试

  1. 启动一个默认的tomcat
  2. 对默认的tomcat进行自己需要的修改
  3. 将我们操作过的容器通过commit提交为一个镜像 我们以后就可以使用自己提交过的镜像即可 就是我们自己修改的镜像

容器数据卷(重点)

什么是容器数据卷

docker的理念回顾

将应用和环境打包一个镜像

数据 如果数据都在容器中 那么我们容器删除 数据机会丢失 需求 数据可以持久化

Mysql 容器删了 删库跑路 需求 mysql数据可以存储在本地

容器之间可以有一个数据共享的技术 docker容器中产生的数据 同步到本地

这就是卷技术 目录的挂载 将我们容器内的目录 挂载到linux上面

总结一句话 容器的持久化和同步操作 容器间也是可以数据共享的

使用数据卷

基本操作

创建卷:docker volume create
查看所有的卷:docker volume ps
查看具体某一个卷的信息: docker volume inspect 卷名

方式一 直接使用命令来挂载 -v

docker run -it -v 主机目录 容器目录 -p #测试

测试文件的同步

好处: 我们以后只需要在宿主机上面修改即可 因为绑定了容器数据卷 就会自动同步到绑定的目录上

具名和匿名挂载

# 匿名挂载
-v 容器内路径!
# -P 大写p 的意思 由docker 默认给端口开发
docker run -d -P --name 取名字 -v 容器挂载的路径 镜像名称#查看所有的volume 的情况
[root@guchenstudy date]# docker volume ls
DRIVER    VOLUME NAME
local     8cacc94e643579e01d4672e4a7a35401163bca18d1ac34a1569e7a08287aa1e5
#这里发现 这种就是匿名挂载 我们在-v只写了容器内的路径 没有写容器外的路径#具名挂载
# docker run -d -P --name 名字 -v 外部名字:容器挂载目录 镜像名字
DRIVER          VOLUME NAME
local           具体写的名字#通过 -v 卷名:容器内路径
#查看一下这个卷的信息
docker volume inspect 外部名字

所有的docker容器内的卷 没有指定目录的情况下都是在/var/lib/docker/volumes/xxxx/_data

我们通过具名挂载可以方便的找到我们的一个卷 大多数情况在使用的是具名挂载

# 如何确定是具名挂载还是匿名挂载 还是指定路径挂载-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机的路径:容器内路径 #指定路径挂载

拓展:

# 通过 -v 容器内路径:ro rw 改变读写权限
ro readonly 只读
rw readwrite 可读可写
#一旦这个设置了容器权限 容器对我们挂载出来的内容就有限定了
docker run -d -P --name nginx -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx -v juming-nginx:/etc/nginx:rw nginx#ro 只要看到ro就说明这个路径只能通过宿主机来操作 容器内部无法操作

容器中的数据卷同步

多个mysql同步数据

多容器实现同步数据的方式:https://blog.csdn.net/weixin_43342105/article/details/109984865

结论:

容器之间配置信息的传递 数据卷容器的生命周期一直持续到没有容器使用为止

但是一旦你持久化到了本地 这个时候 本地的数据是不会删除的啦 除非自己手动删除

DockerFile(重点)

初识DockerFile

dockerFile就是用来构建docker镜像的构建文件 命令脚本 先体验一下

通过这个脚本可以生成自己的镜像 镜像是一层层的 脚本一个个的命令 每个命令都是一层!

# 创建一个dockerfile文件 名字可以随机 建议使用dockerfile
# 文件中的内容 指令(大写) 参数FROM centos
VOLUME ["数据卷名字","数据卷名字"]
CMD echo "---打印的内容---"
CMD /bin/bash
#这里的每个命令 就是镜像的一层!

测试了一下 挂载的路径下跟我容器中的新建的文件同步啦

DockerFile介绍

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

构建步骤:

  1. 编写一个dockerfile文件
  2. docker build 构建一个镜像
  3. docker run 运行镜像
  4. docker push 发布镜像 (docker Hub 阿里云镜像仓库)

基础知识

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

Docker 镜像逐渐成为企业交付的标准 必须要掌握

步骤

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

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

Docker容器: 容器就是镜像运行起来提供服务器

DockerFile的指令

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

自己编些一个dockerFile测试

1.编写一个dockerFile文件

FROM centos #在centos的基础进行增加
MAINTAINER 作者信息
# 配置环境变量
ENV MYPATH /usr/local
WORKDIR $MYPATH #工具目录
# 导入需要执行的包
RUN yum -y install vim  #安装vim
RUN yum -y install net-tools #安装ip指令
EXPOSE 80 #暴露端口
CMD echo $MYPATH #输出
CMD echo "------end------"
CMD /bin/bash #以bash运行

2.执行自己写好的dockerFile
docker build -f dockerfile文件路径 -t 镜像名字:[tag] . “.” 点一定不要忘记

3.构建镜像时候的打印

[root@vvvv dockerfile]# docker build -f mydockerfile-centos -t mycentos:0.1 .
Sending build context to Docker daemon  2.048kB
Step 1/10 : FROM centos
latest: Pulling from library/centos
7a0437f04f83: Pull complete
Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1
Status: Downloaded newer image for centos:latest---> 300e315adb2f
Step 2/10 : MAINTAINER vvvv<vurx@qq.com>---> Running in 40a5b7bb22c9
Removing intermediate container 40a5b7bb22c9---> b2c8ac4399b9
Step 3/10 : ENV MYPATH /usr/local---> Running in bdc5a61f1803
Removing intermediate container bdc5a61f1803---> 78e356498ede
Step 4/10 : WORKDIR $MYPATH---> Running in 64cde09115f2
Removing intermediate container 64cde09115f2---> dd92de8e574a
Step 5/10 : RUN yum -y install vim---> Running in c17e2fb1e8c5
CentOS Linux 8 - AppStream                      4.1 MB/s | 6.3 MB     00:01
CentOS Linux 8 - BaseOS                         2.9 MB/s | 2.3 MB     00:00
CentOS Linux 8 - Extras                          13 kB/s | 9.2 kB     00:00
Last metadata expiration check: 0:00:01 ago on Mon Mar  8 06:01:16 2021.
Dependencies resolved.
================================================================================Package             Arch        Version                   Repository      Size
================================================================================
Installing:vim-enhanced        x86_64      2:8.0.1763-15.el8         appstream      1.4 M
Installing dependencies:gpm-libs            x86_64      1.20.7-15.el8             appstream       39 kvim-common          x86_64      2:8.0.1763-15.el8         appstream      6.3 Mvim-filesystem      noarch      2:8.0.1763-15.el8         appstream       48 kwhich               x86_64      2.21-12.el8               baseos          49 k
Transaction Summary
================================================================================
Install  5 Packages
Total download size: 7.8 M
Installed size: 30 M
Downloading Packages:
(1/5): gpm-libs-1.20.7-15.el8.x86_64.rpm        146 kB/s |  39 kB     00:00
(2/5): vim-filesystem-8.0.1763-15.el8.noarch.rp 711 kB/s |  48 kB     00:00
(3/5): which-2.21-12.el8.x86_64.rpm             395 kB/s |  49 kB     00:00
(4/5): vim-enhanced-8.0.1763-15.el8.x86_64.rpm  2.4 MB/s | 1.4 MB     00:00
(5/5): vim-common-8.0.1763-15.el8.x86_64.rpm    4.5 MB/s | 6.3 MB     00:01
--------------------------------------------------------------------------------
Total                                           3.3 MB/s | 7.8 MB     00:02
warning: /var/cache/dnf/appstream-02e86d1c976ab532/packages/gpm-libs-1.20.7-15.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEY
CentOS Linux 8 - AppStream                      306 kB/s | 1.6 kB     00:00
Importing GPG key 0x8483C65D:Userid     : "CentOS (CentOS Official Signing Key) <security@centos.org>"Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65DFrom       : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transactionPreparing        :                                                        1/1 Installing       : which-2.21-12.el8.x86_64                               1/5 Installing       : vim-filesystem-2:8.0.1763-15.el8.noarch                2/5 Installing       : vim-common-2:8.0.1763-15.el8.x86_64                    3/5 Installing       : gpm-libs-1.20.7-15.el8.x86_64                          4/5 Running scriptlet: gpm-libs-1.20.7-15.el8.x86_64                          4/5 Installing       : vim-enhanced-2:8.0.1763-15.el8.x86_64                  5/5 Running scriptlet: vim-enhanced-2:8.0.1763-15.el8.x86_64                  5/5 Running scriptlet: vim-common-2:8.0.1763-15.el8.x86_64                    5/5 Verifying        : gpm-libs-1.20.7-15.el8.x86_64                          1/5 Verifying        : vim-common-2:8.0.1763-15.el8.x86_64                    2/5 Verifying        : vim-enhanced-2:8.0.1763-15.el8.x86_64                  3/5 Verifying        : vim-filesystem-2:8.0.1763-15.el8.noarch                4/5 Verifying        : which-2.21-12.el8.x86_64                               5/5
Installed:gpm-libs-1.20.7-15.el8.x86_64         vim-common-2:8.0.1763-15.el8.x86_64    vim-enhanced-2:8.0.1763-15.el8.x86_64 vim-filesystem-2:8.0.1763-15.el8.noarchwhich-2.21-12.el8.x86_64
Complete!
Removing intermediate container c17e2fb1e8c5---> d753a853ed88
Step 6/10 : RUN yum -y install net-tools---> Running in 9cea2adb7017
Last metadata expiration check: 0:00:11 ago on Mon Mar  8 06:01:16 2021.
Dependencies resolved.
================================================================================Package         Architecture Version                        Repository    Size
================================================================================
Installing:net-tools       x86_64       2.0-0.52.20160912git.el8       baseos       322 k
Transaction Summary
================================================================================
Install  1 Package
Total download size: 322 k
Installed size: 942 k
Downloading Packages:
net-tools-2.0-0.52.20160912git.el8.x86_64.rpm   1.5 MB/s | 322 kB     00:00
--------------------------------------------------------------------------------
Total                                           212 kB/s | 322 kB     00:01
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transactionPreparing        :                                                        1/1 Installing       : net-tools-2.0-0.52.20160912git.el8.x86_64              1/1 Running scriptlet: net-tools-2.0-0.52.20160912git.el8.x86_64              1/1 Verifying        : net-tools-2.0-0.52.20160912git.el8.x86_64              1/1
Installed:net-tools-2.0-0.52.20160912git.el8.x86_64
Complete!
Removing intermediate container 9cea2adb7017---> ec81f0874bf4
Step 7/10 : EXPOSE 80---> Running in de8a50ba9121
Removing intermediate container de8a50ba9121---> ef4e1dda7932
Step 8/10 : CMD echo $MYPATH---> Running in 0a8209f16e92
Removing intermediate container 0a8209f16e92---> d35f59696851
Step 9/10 : CMD echo "------end------"---> Running in 8f3f4d463844
Removing intermediate container 8f3f4d463844---> 68a8371f4718
Step 10/10 : CMD /bin/bash---> Running in 9f5c311bcc9f
Removing intermediate container 9f5c311bcc9f---> 5ed3b4ceae6e
Successfully built 5ed3b4ceae6e
Successfully tagged mycentos:0.1

4.启动测试
docker run -it 刚刚编写生成的镜像id /bin/bash

5.查看别人的镜像是怎么编写的 docker history 镜像id

docker history 5ed3b4ceae6e
=================================================================================
IMAGE          CREATED         CREATED BY                                      SIZE      COMMENT
5ed3b4ceae6e   7 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B
68a8371f4718   7 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B
d35f59696851   7 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B
ef4e1dda7932   7 minutes ago   /bin/sh -c #(nop)  EXPOSE 80                    0B
ec81f0874bf4   7 minutes ago   /bin/sh -c yum -y install net-tools             14.3MB
d753a853ed88   7 minutes ago   /bin/sh -c yum -y install vim                   58MB
dd92de8e574a   7 minutes ago   /bin/sh -c #(nop) WORKDIR /usr/local            0B
78e356498ede   7 minutes ago   /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B
b2c8ac4399b9   7 minutes ago   /bin/sh -c #(nop)  MAINTAINER vvvv<vurx@qq.c…   0B
300e315adb2f   3 months ago    /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
<missing>      3 months ago    /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B
<missing>      3 months ago    /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7…   209MB

CMD和 ENTRYPOINT 区别

测试cmd

#编写一个dockerfile 文件进行测试
FROM centos
CMD ["ls","-a"]
#生成镜像#docker build -f dockerfiletest -t testcentos .
Sending build context to Docker daemon  3.072kB
Step 1/2 : FROM centos---> 300e315adb2f
Step 2/2 : CMD ["ls","-a"]---> Running in 7f7afeca2628
Removing intermediate container 7f7afeca2628---> f040f2ca4844
Successfully built f040f2ca4844
Successfully tagged testcentos:latest
#运行测试
#docker run -it f040f2ca4844
.   .dockerenv  dev  home  lib64       media  opt   root  sbin  sys  usr
..  bin     etc  lib   lost+found  mnt    proc  run   srv  tmp  var#追加一个命令时  -l  发现 报错
[root@guchenstudy dockerfile]# docker run f040f2ca4844 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:367: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
#cmd 的清理下 -l替换成了CMD ["ls","-a"] 命令 -l 不是命令所以报错

测试ENTRYPOINT

[root@guchenstudy dockerfile]# vim dockerfiletest01
[root@guchenstudy dockerfile]# docker build -f dockerfiletest01 -t centostest .
Sending build context to Docker daemon  4.096kB
Step 1/2 : FROM centos---> 300e315adb2f
Step 2/2 : ENTRYPOINT ["ls","-a"]---> Running in 75b78ff743d0
Removing intermediate container 75b78ff743d0---> df374f6cbe6b
Successfully built df374f6cbe6b
Successfully tagged centostest:latest
[root@guchenstudy dockerfile]# docker run df374f6cbe6b
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
#我们追加的命令 是直接拼接到我们的  ENTRYPOINT 后面的
[root@guchenstudy dockerfile]# docker run df374f6cbe6b -l
total 56
drwxr-xr-x   1 root root 4096 May 19 09:20 .
drwxr-xr-x   1 root root 4096 May 19 09:20 ..
-rwxr-xr-x   1 root root    0 May 19 09:20 .dockerenv
lrwxrwxrwx   1 root root    7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x   5 root root  340 May 19 09:20 dev
drwxr-xr-x   1 root root 4096 May 19 09:20 etc
drwxr-xr-x   2 root root 4096 Nov  3  2020 home
lrwxrwxrwx   1 root root    7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx   1 root root    9 Nov  3  2020 lib64 -> usr/lib64
drwx------   2 root root 4096 Dec  4 17:37 lost+found
drwxr-xr-x   2 root root 4096 Nov  3  2020 media
drwxr-xr-x   2 root root 4096 Nov  3  2020 mnt
drwxr-xr-x   2 root root 4096 Nov  3  2020 opt
dr-xr-xr-x 114 root root    0 May 19 09:20 proc
dr-xr-x---   2 root root 4096 Dec  4 17:37 root
drwxr-xr-x  11 root root 4096 Dec  4 17:37 run
lrwxrwxrwx   1 root root    8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x   2 root root 4096 Nov  3  2020 srv
dr-xr-xr-x  13 root root    0 May 19 09:20 sys
drwxrwxrwt   7 root root 4096 Dec  4 17:37 tmp
drwxr-xr-x  12 root root 4096 Dec  4 17:37 usr
drwxr-xr-x  20 root root 4096 Dec  4 17:37 var

dockerfile 很多命令都十分相似 我们需要了解它们的区别 我们最好的学习就是对比他们然后测试效果

实战tomcat与jdk镜像

博客实战:https://blog.csdn.net/miapecloud/article/details/97889026

发布自己的镜像

DockerHub

  1. 地址: https://hub.docker.com/ 注册自己的账号

  2. 确定这个账号可以登录

  3. 在我们服务器上提交自己的镜像

    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#登录成功界面
    docker login -u guchenstudy
    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-storeLogin Succeeded

    4.登录完毕后就可以提交镜像 就是一步 docker push

修改tag版本号

docker tag 镜像ID 名字:版本号

提交的镜像也是按层级来的

阿里云镜像

  1. 登录阿里云

    sudo docker login --username=顾晨努力学习 registry.cn-shanghai.aliyuncs.com
    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-storeLogin Succeeded
    
  2. 找到容器镜像服务

  3. 创建命名空间

  4. 创建容器镜像

  5. 登录阿里云

  6. docker push 镜像id:版本号

Docker小结

Docker 网络(重点)

理解docker0网络

外部宿主机能否拼通容器内部的机器

[root@guchenstudy ~]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.064 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.056 ms
^C
— 172.17.0.2 ping statistics —

veth-pair

博客:https://blog.csdn.net/z530234020/article/details/103304145

–link

通过容器名字来ping通网络

[root@guchenstudy ~]# docker exec -it tomcat02 ping tomcat01
PING tomcat01 (172.17.0.2) 56(84) bytes of data.
64 bytes from tomcat01 (172.17.0.2): icmp_seq=1 ttl=64 time=0.098 ms
64 bytes from tomcat01 (172.17.0.2): icmp_seq=2 ttl=64 time=0.091 ms
64 bytes from tomcat01 (172.17.0.2): icmp_seq=3 ttl=64 time=0.069 ms

可以ping通 但是反过来tomcat01pingtomcat02就ping不通啦[root@guchenstudy ~]# docker exec -it tomcat01 ping tomcat02
ping: tomcat02: Name or service not known

探究 可以通过inspect来看

命令是 docker network inspect 网络id

–link 其实就是当前容器绑定你要ping的容器名的ip地址 绑定在当前容器的/etc/hosts 目录下

不推荐使用–link啦

自定义网络

查看所有的docker网络

[root@guchenstudy ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
b5ccae51de7d   bridge    bridge    local
54c05fb66a41   host      host      local
68ce43d6b9d3   none      null      local

网络模式

bridge 桥接docker(默认 自己自定义网络也是用bridge模式)

none 不配置网络

host 和宿主机共享网络

container 容器网络连通(用的少 局限很大)

**测试 **

# 我们直接启动的命令 --net bridge 而这个就是我们的docker0
docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat01 --net bridge tomcat #不写--net 默认也是桥接模式#docker0特点 默认 域名不能访问 --link 可以打通连接#我们可以自定义一个网络
#--driver 网络模式
[root@guchenstudy ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
2927cbaa94335bd86644e303103d59b183d7199712d1407ee2efa730fb21c24b
[root@guchenstudy ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
b5ccae51de7d   bridge    bridge    local
54c05fb66a41   host      host      local
2927cbaa9433   mynet     bridge    local
68ce43d6b9d3   none      null      local#查看自己配置的网络的数据
[root@guchenstudy ~]# docker network inspect mynet
[{"Name": "mynet","Id": "2927cbaa94335bd86644e303103d59b183d7199712d1407ee2efa730fb21c24b","Created": "2021-05-20T17:00:45.289238648+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@guchenstudy ~]# docker run -d --name tomcatnet01 --net mynet tomcat
be78f37c466ab674dc5bac05660b865cfc15f4dd3ffe1b7cc23243a668c30005
[root@guchenstudy ~]# docker run -d --name tomcatnet02 --net mynet tomcat
d5f143478ffab9661f5c77d63e1468f3a001075449440ecefb4c90671919768f
[root@guchenstudy ~]# docker network inspect mynet
[{"Name": "mynet","Id": "2927cbaa94335bd86644e303103d59b183d7199712d1407ee2efa730fb21c24b","Created": "2021-05-20T17:00:45.289238648+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": {"be78f37c466ab674dc5bac05660b865cfc15f4dd3ffe1b7cc23243a668c30005": {"Name": "tomcatnet01","EndpointID": "2fc67eebca86b17ec395c8f55e99c43302959c340a8ad38bd4ad79d4915e9081","MacAddress": "02:42:c0:a8:00:02","IPv4Address": "192.168.0.2/16","IPv6Address": ""},"d5f143478ffab9661f5c77d63e1468f3a001075449440ecefb4c90671919768f": {"Name": "tomcatnet02","EndpointID": "3b86e01bdd2aba62f8247a00700acd4c1d360c6ae0bc968cad966c3e9b6ac99e","MacAddress": "02:42:c0:a8:00:03","IPv4Address": "192.168.0.3/16","IPv6Address": ""}},"Options": {},"Labels": {}}
]
#突然发现 可以通过容器名去ping网络啦
[root@guchenstudy ~]# docker exec -it tomcatnet02 ping tomcatnet01
PING tomcatnet01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcatnet01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.073 ms
64 bytes from tomcatnet01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.069 ms
[root@guchenstudy ~]# docker exec -it tomcatnet01 ping tomcatnet02
PING tomcatnet02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcatnet02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.064 ms
64 bytes from tomcatnet02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.093 ms
64 bytes from tomcatnet02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.077 ms
64 bytes from tomcatnet02.mynet (192.168.0.3): icmp_seq=4 ttl=64 time=0.071 ms推荐使用自定义网络来配置

好处是 不同的集群使用不同的网络 保证集群是安全和健康的

网络连通的操作

[root@guchenstudy ~]# docker run -d --name tomcat01 -P tomcat
71a3e3f09c8e71c4defa922d38fb3a25a83d5f6739d7efb48de70330395fb399
[root@guchenstudy ~]# docker network connect mynet tomcat01
[root@guchenstudy ~]# docker exec -it tomcat01 ping tomcatnet01
PING tomcatnet01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcatnet01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.070 ms
64 bytes from tomcatnet01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.066 ms
64 bytes from tomcatnet01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.068 ms
64 bytes from tomcatnet01.mynet (192.168.0.2): icmp_seq=4 ttl=64 time=0.080 ms#查看连通后的信息
[{"Name": "mynet","Id": "2927cbaa94335bd86644e303103d59b183d7199712d1407ee2efa730fb21c24b","Created": "2021-05-20T17:00:45.289238648+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": {"71a3e3f09c8e71c4defa922d38fb3a25a83d5f6739d7efb48de70330395fb399": {"Name": "tomcat01","EndpointID": "986c51aef55136f3d196a58a8dd9d2b2762899035b5450fb8079adfcfcf69852","MacAddress": "02:42:c0:a8:00:04","IPv4Address": "192.168.0.4/16","IPv6Address": ""},"be78f37c466ab674dc5bac05660b865cfc15f4dd3ffe1b7cc23243a668c30005": {"Name": "tomcatnet01","EndpointID": "2fc67eebca86b17ec395c8f55e99c43302959c340a8ad38bd4ad79d4915e9081","MacAddress": "02:42:c0:a8:00:02","IPv4Address": "192.168.0.2/16","IPv6Address": ""},"d5f143478ffab9661f5c77d63e1468f3a001075449440ecefb4c90671919768f": {"Name": "tomcatnet02","EndpointID": "3b86e01bdd2aba62f8247a00700acd4c1d360c6ae0bc968cad966c3e9b6ac99e","MacAddress": "02:42:c0:a8:00:03","IPv4Address": "192.168.0.3/16","IPv6Address": ""}},"Options": {},"Labels": {}}
]#原理 就是一个容器两个IP地址
# 阿里云服务 公网ip 私网ip 类似

结论 假设要跨网络操作别人 就需要使用docker network connect 连通

Docker的学习笔记相关推荐

  1. 《自己动手写Docker》学习笔记2

    <自己动手写Docker>学习笔记2 1 前言 由于本人毕业设计与云原生领域相关,因此最近在学习Docker相关知识,<自己动手写Docker>涵盖了Docker底层的各类知识 ...

  2. 《深入浅出Docker》学习笔记

    <深入浅出Docker>学习笔记 第三章:docker 安装 linux服务器安装:-略 windows服务器安装:-略 确认安装结果 docker --version 第四章:纵观DOc ...

  3. Docker容器学习笔记一

    Docker容器学习笔记一 狂神说B站视频:https://www.bilibili.com/video/BV1og4y1q7M4?p=1 Docker容器学习笔记二:https://blog.csd ...

  4. docker,k8s学习笔记汇总

    整理了下博客里关于docker和k8s的文章,方便查看 docker学习笔记(一)docker入门 docker学习笔记(二)创建自己的镜像 docker学习笔记(三)docker中的网络 docke ...

  5. Docker入门学习笔记(狂神版)

    下述笔记是自己花一天时间看B站狂神说Docker视频的笔记,下列的笔记是根据自己的实践的记录下来的,若想细学掌握Docker建议自行观看(<Docker入门到精通>),去观看狂胜的视频记得 ...

  6. 【学习笔记】尚硅谷周阳老师的Docker教程学习笔记

    本文是尚硅谷周阳老师的Docker教程的相关学习笔记,暂时还没有检查勘误过. 一.Docker简介 1. 简介 Docker的出现是为了解决代码在本机可以正常运行,而部署到其他机器不能运行的问题.这是 ...

  7. Docker入门学习笔记

    文章目录 Docker入门学习 Docker为什么出现? 一.Docker的历史 二.Docker做什么 三.Docker 安装 Docker的基本组成 安装Docker 阿里云镜像加速 运行流程 底 ...

  8. Docker容器学习笔记(看了狂神视频)

    狂神的笔记更加系统详细,推荐大家可以去看狂神的视频教程和笔记.我这里仅根据我自己的需求写的笔记,对于需要快速掌握docker的使用的朋友可以参考学习. Docker 背景需求 之前,开发一套环境,上线 ...

  9. 狂神Docker通俗易懂学习笔记2

    二.镜像命令 1.doccker images------------# 查看所有本地主机上的镜像 @@@解释 REPOSITORY -------------# 镜像的仓库源 TAG ------- ...

  10. Docker02 狂神Docker视频学习笔记 :【狂神说Java 哔哩哔哩】Docker最新超详细版教程通俗易懂

    目录 0. 视频源 0. 学习网址 基础篇 1. Docker概述 1.1 Docker为什么出现? 1.2 Docker历史 1.3 Docker能干什么 2. Docker安装 2.1 Docke ...

最新文章

  1. html5知识点补充—hgroup元素的使用
  2. MySQL/MariaDB基础及简单SQL语句
  3. 如何自动保存 Spring Boot 应用进程号?
  4. RHEL/CentOS/Fedora各种源(EPEL、Remi、RPMForge、RPMFusion)配置
  5. 安卓x86程序安装目录_电脑上的安卓系统体验
  6. 关于微信公众号小程序在运营过程中的注意事项
  7. java 检测目录下的文件_如何在Java中检查文件是目录还是文件
  8. 微软ODBC服务器驱动,Microsoft SQL Server ODBC 驱动程序修复
  9. DW集训营数据库Mysql梳理[五]
  10. paddle 图标注_没那么简单,手把手教你用Origin制作XRD谱图!
  11. iframe嵌入微信公众号页面(有图片)
  12. 语音文件格式转换:.amr 转 .MP3, .wav格式
  13. 编译ORB-SLAM2遇到的问题及解决方法
  14. lsdyna如何设置set中的node_list_如何使用定速巡航功能 图文解说一看就会!
  15. 如何把自媒体平台文章同步到WordPress等网站
  16. BLAM源码解析(二)—— 从激光回调入手
  17. win10时间服务器未运行,win10 Windows License Manager Service服务未运行如何解决
  18. 网络编程之listen函数
  19. 基于vue焕心眼镜商城的设计与实现毕业设计源码091546
  20. 信息化基础知识、服务管理、监理知识

热门文章

  1. js中如何拼接字符串
  2. 2023年场外个股期权研究报告
  3. 双系统-Windows与Linux
  4. Shopee虾皮网,新手小白如何正确选品?
  5. PTA---高速公路超速处罚 (15 分)
  6. eclipse plugs
  7. SKIL/工作流程/与SKIL客户端一起工作
  8. 如何将pycharm中的默认镜像源更换为国内的镜像源
  9. 仿小米商城网页设计(10页)
  10. c语言编程打不了字,c语言编程中,怎么打汉字啊??我是新手啊~~