Docker命令使用

帮助命令

docker version    # 显示docker的版本信息
docker info       # 显示docker系统信息,包括镜像和容器的数量
docker 命令 --help # 帮助命令

帮助文档的地址

https://docs.docker.com/engine/reference/commandline/

镜像命令

docker images 查看使用本机上的镜像

[root@iZbp1cnxvv325atsz2k5xcZ ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
adminer      latest    015ac408c7d5   13 days ago   90.3MB# 解释
REPOSITORY  镜像的仓库源
TAG         镜像的标签
IMAGE ID    镜像的id
CREATED     镜像的创建时间
SIZE        镜像的大小# 可选项-a, --all            # 列出所有镜像-q, --quiet          # 只显示镜像的id

docker search 搜索镜像

docker search mysql# 可选项,通过搜索来过滤
--filter=STARS=5000  #搜索出来的镜像就是STARS大于5000的
docker search mysql --filter=STARS=5000

docker pull 下载镜像

 #默认下载最新版本的mysql
docker pull mysql #指定镜像版本下载
docker pull mysql:5.7

docker rmi 删除镜像

# 删除指定的镜像
docker rmi -f 镜像id
# 删除多个的镜像
docker rmi -f 镜像id,镜像id
#删除全部镜像
docker rmi -f $(docker images -aq)

容器命令

说明:我们有了镜像才可以创建容器,linux下载一个centos镜像来测试学习

docker pull centos

新建容器并启动

docker run [可选参数] image# 参数说明
--name=”Name“ 容器名字 tomcat01,tomcat02,用来区分容器
-d            后台方式运行
-it           使用交互方式运行,进入容器查看内容
-p            指定容器的端口 -p 8080:8080-p ip:主机端口:容器端口-p 主机端口:容器端口(常用)-p 容器端口
-P            随机指定端口# 测试,启动并进入容器
docker run -it centos /bin/bash#从容器中退回主机
exit

列出所有运行的容器

# docker ps 命令# 列出当前正在运行的容器
-a      # 列出当前正在运行的容器+带出历史运行的容器
-n=?(数量)   # 显示最近创建的容器
-q      # 只显示容器的编号
docker ps

退出容器

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      # 强制停止当前容器

常用的其他命令

后台启动容器

# 命令 docker run -d 镜像名!
docker run -d mysql# 问题dockers ps,发现 mysql 停止了# 常见的坑,docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
# nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了

查看日志

docker logs -f -t --tail 容器,没有日志# 自己编写一段shell脚本
docker run -d mysql /bin/sh -c "while true;do echo junge;sleep 1;done"# docker ps# 查看全部日志
# docker logs -tf 容器id
docker logs -tf 41132814d678# 查看指定行数打印日志
# docker logs -tf --tail 10 容器id
docker logs -tf --tail 10 41132814d678

查看容器内部中的进程信息

# 命令 docker top 容器id
[root@iZbp1cnxvv325atsz2k5xcZ ~]# docker top 94c1e99dc77f# 测试
[root@iZbp1cnxvv325atsz2k5xcZ ~]# docker top 94c1e99dc77f
UID         PID         PPID         C        STIME        TTY        TIME        CMD
polkitd     1758         1738         0       Jan30         ?        00:05:55    mysqld

查看镜像的元数据

# 命令 docker inspect 容器id
docker inspect 94c1e99dc77f# 测试
[root@iZbp1cnxvv325atsz2k5xcZ ~]# docker inspect 94c1e99dc77f
[{"Id": "94c1e99dc77f59efcb2aee922d3944c2b2e745c5de51c7f4dbad33be86bdadf0","Created": "2021-01-17T09:56:33.463912659Z","Path": "docker-entrypoint.sh","Args": ["mysqld"],"State": {"Status": "running","Running": true,"Paused": false,"Restarting": false,"OOMKilled": false,"Dead": false,"Pid": 1758,"ExitCode": 0,"Error": "","StartedAt": "2021-01-30T13:45:07.128428191Z","FinishedAt": "2021-01-30T13:41:17.036910334Z"},"Image": "sha256:102816b1ee7d6f5943c251647275f0d112f4617bb4ab3f7583206404b7834732","ResolvConfPath": "/var/lib/docker/containers/94c1e99dc77f59efcb2aee922d3944c2b2e745c5de51c7f4dbad33be86bdadf0/resolv.conf","HostnamePath": "/var/lib/docker/containers/94c1e99dc77f59efcb2aee922d3944c2b2e745c5de51c7f4dbad33be86bdadf0/hostname","HostsPath": "/var/lib/docker/containers/94c1e99dc77f59efcb2aee922d3944c2b2e745c5de51c7f4dbad33be86bdadf0/hosts","LogPath": "/var/lib/docker/containers/94c1e99dc77f59efcb2aee922d3944c2b2e745c5de51c7f4dbad33be86bdadf0/94c1e99dc77f59efcb2aee922d3944c2b2e745c5de51c7f4dbad33be86bdadf0-json.log","Name": "/mysql","RestartCount": 0,"Driver": "overlay2","Platform": "linux","MountLabel": "","ProcessLabel": "","AppArmorProfile": "","ExecIDs": null,"HostConfig": {"Binds": null,"ContainerIDFile": "","LogConfig": {"Type": "json-file","Config": {}},"NetworkMode": "default","PortBindings": {"3306/tcp": [{"HostIp": "","HostPort": "3306"}]},"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/9acb5f8389a77aa13f691856c37e130832a2472bc4258213c64cefde3ccc8f9e-init/diff:/var/lib/docker/overlay2/319443e9b50dd77a98aa51c43232e44e0fac7577129b83a0641ba527bf3733b7/diff:/var/lib/docker/overlay2/8c77d389812dcbbe157581ca0f21b66fe73ce3044f9900e798a8b13b4831d39e/diff:/var/lib/docker/overlay2/0de729db81a9bba685e275b67890ee7e9f5989952c2616fcc2f7159fec8fa1a8/diff:/var/lib/docker/overlay2/5e57ea0be0c1fbafb8ee5b05fb15e0c9f87c1911aaa256e72aa03fe64fc662e1/diff:/var/lib/docker/overlay2/09c1fac6555dbb201c2b304618f3f1d867dbf806309f71ec4a287eec3ff1b770/diff:/var/lib/docker/overlay2/4a55564fdf95ca7cff5e83d68ed606d1e3f3cfa82ce1d232639bd051df68e7fa/diff:/var/lib/docker/overlay2/fc5cb2e704232153db68a8588b9ef20cea37342a59ce2b9296f5af47c56bab80/diff:/var/lib/docker/overlay2/92bcb00b3d6d6d485dda67148aa2da6e14902ae5823af317854f03e49b766f66/diff:/var/lib/docker/overlay2/aa87c58826f0b6dabe41bb26637c5c831c854ac21138f3f4c4c60fae6447fdc8/diff:/var/lib/docker/overlay2/19a2dbbd3063c8183c7a46cfc600a3d3da787c4531f8a036424b3f4c9783e1eb/diff:/var/lib/docker/overlay2/f7e977dc8b33b8d21d02c240005f0ea06b93b372e45fbe140fcc6dbb98fef734/diff:/var/lib/docker/overlay2/934e939ce3075b9bc4c1158f9903cf252a430a9ed4b6f546ffc872877e1e42aa/diff","MergedDir": "/var/lib/docker/overlay2/9acb5f8389a77aa13f691856c37e130832a2472bc4258213c64cefde3ccc8f9e/merged","UpperDir": "/var/lib/docker/overlay2/9acb5f8389a77aa13f691856c37e130832a2472bc4258213c64cefde3ccc8f9e/diff","WorkDir": "/var/lib/docker/overlay2/9acb5f8389a77aa13f691856c37e130832a2472bc4258213c64cefde3ccc8f9e/work"},"Name": "overlay2"},"Mounts": [{"Type": "volume","Name": "c3228ce79161473c1a367735ca852afc8f2dbd512f09bc7b44807ae3be9a714b","Source": "/var/lib/docker/volumes/c3228ce79161473c1a367735ca852afc8f2dbd512f09bc7b44807ae3be9a714b/_data","Destination": "/var/lib/mysql","Driver": "local","Mode": "","RW": true,"Propagation": ""}],"Config": {"Hostname": "94c1e99dc77f","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"ExposedPorts": {"3306/tcp": {},"33060/tcp": {}},"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["MYSQL_ROOT_PASSWORD=123456","PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin","GOSU_VERSION=1.7","MYSQL_MAJOR=8.0","MYSQL_VERSION=8.0.13-1debian9"],"Cmd": ["mysqld"],"Image": "mysql:8.0.13","Volumes": {"/var/lib/mysql": {}},"WorkingDir": "","Entrypoint": ["docker-entrypoint.sh"],"OnBuild": null,"Labels": {}},"NetworkSettings": {"Bridge": "","SandboxID": "1ebea130c3263b307fe1650918b030047f8f0675d840b5a84ecf84900fb44e6c","HairpinMode": false,"LinkLocalIPv6Address": "","LinkLocalIPv6PrefixLen": 0,"Ports": {"3306/tcp": [{"HostIp": "0.0.0.0","HostPort": "3306"}],"33060/tcp": null},"SandboxKey": "/var/run/docker/netns/1ebea130c326","SecondaryIPAddresses": null,"SecondaryIPv6Addresses": null,"EndpointID": "9a691b014f15170b01fa1f7f6e60f23889e1cc0bfbd27bb12473e084983f7388","Gateway": "172.18.0.1","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"IPAddress": "172.18.0.2","IPPrefixLen": 16,"IPv6Gateway": "","MacAddress": "02:42:ac:12:00:02","Networks": {"bridge": {"IPAMConfig": null,"Links": null,"Aliases": null,"NetworkID": "0d497996a1fcde014b7c399ba100012dc8ac926630124e680b70f8317bcf94e4","EndpointID": "9a691b014f15170b01fa1f7f6e60f23889e1cc0bfbd27bb12473e084983f7388","Gateway": "172.18.0.1","IPAddress": "172.18.0.2","IPPrefixLen": 16,"IPv6Gateway": "","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"MacAddress": "02:42:ac:12:00:02","DriverOpts": null}}}}
]

进入当前正在运行的容器

# 我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置# 命令
docker exec -it 容器id bashShell# 测试
[root@iZbp1cnxvv325atsz2k5xcZ ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED       STATUS        PORTS                               NAMES
94c1e99dc77f   mysql:8.0.13   "docker-entrypoint.s…"   13 days ago   Up 18 hours   0.0.0.0:3306->3306/tcp, 33060/tcp   mysql
[root@iZbp1cnxvv325atsz2k5xcZ ~]# docker exec -it 94c1e99dc77f /bin/bash
root@94c1e99dc77f:/# ls
bin  boot  dev  docker-entrypoint-initdb.d  entrypoint.sh  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@94c1e99dc77f:/# ps -ef
bash: ps: command not found# 方式二
docker attach 容器id# 测试
docker attach 94c1e99dc77f# 这两个区别
docker exec    # 进入容器后开启一个新的终端,可以在里面操作(常用)
docker attach  # 进入容器正在执行的终端,不会启动新的进程!

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

# 命令 docker cp 容器id:容器内路径 目的地主机路径
docker cp 94c1e99dc77f:/home/text.java /home/# 测试
# 查看当前主机目录下
[root@iZbp1cnxvv325atsz2k5xcZ home]# ls
apache-tomcat-7.0.47.tar.gz  jdk-8u221-linux-x64.tar.gz
[root@iZbp1cnxvv325atsz2k5xcZ home]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED       STATUS        PORTS                               NAMES
94c1e99dc77f   mysql:8.0.13   "docker-entrypoint.s…"   13 days ago   Up 18 hours   0.0.0.0:3306->3306/tcp, 33060/tcp   mysql# 进入docker 容器内部
[root@iZbp1cnxvv325atsz2k5xcZ home]# docker exec -it 94c1e99dc77f /bin/bash
root@94c1e99dc77f:/# ls
bin  boot  dev  docker-entrypoint-initdb.d  entrypoint.sh  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@94c1e99dc77f:/# cd /home/
root@94c1e99dc77f:/home# ls
# 在容器内新建一个文件
root@94c1e99dc77f:/home# touch text.java
root@94c1e99dc77f:/home# ls
text.java
# 退出容器
root@94c1e99dc77f:/home# exit
exit
[root@iZbp1cnxvv325atsz2k5xcZ home]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED       STATUS        PORTS                               NAMES
94c1e99dc77f   mysql:8.0.13   "docker-entrypoint.s…"   13 days ago   Up 18 hours   0.0.0.0:3306->3306/tcp, 33060/tcp   mysql
# 将在容器内创建的文件拷贝到我们的主机上
[root@iZbp1cnxvv325atsz2k5xcZ home]# docker cp 94c1e99dc77f:/home/text.java /home/
[root@iZbp1cnxvv325atsz2k5xcZ home]# ls
apache-tomcat-7.0.47.tar.gz  jdk-8u221-linux-x64.tar.gz  text.java# 拷贝是一个手动过程,未来我们使用 -v 卷的技术,可以实现,自动同步

查看容器占用CPU状态

[root@iZbp1cnxvv325atsz2k5xcZ home]# docker stats

测试容器端口是否能访问成功

# 命令
curl localhost:端口号

小结

attach   # 当前 shell 下 attach 连接自动运行的镜像
build    # 通过dockerfile定制镜像
commit   # 提交当前容器为新的镜像
cp       # 从容器中拷贝指定文件或者目录到宿主机中
create   # 创建一个新的容器,同 run ,但不启动容器
biff     # 查看docker 容器变化
events   # 从docker 服务获取容器实时事件
exec     # 在已存在的容器上运行命令
export   # 导出容器的容器流作为一个 tar 归文件【对应import】
history  # 展示一个镜像形成历史
images   # 列出当前系统镜像
import   # 从tar包中的内容创建一个新的文件系统映像【对应export】
info     # 显示系统相关信息
inspect  # 查看容器详细信息
kill     # kill指定docker容器
load     # 从一个tar包中加载一个镜像【对应save】
login    # 注册或者登陆一个docker源服务器
logout   # 从当前docker registry退出
logs     # 输出当前容器日志信息
port     # 查看映射端口对应的容器内部源端口
pause    # 暂停服务
ps       # 列出容器列表
pull     # 从docker镜像源服务器拉取指定镜像或者库镜像
push     # 推送指定镜像或者库镜像至docker源服务器
restart  # 重启运行的容器
rm       # 移除一个或者多个容器
rmi      # 移除一个或多个镜像【无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除】
run      # 创建一个新的容器并运行一个命令
save     # 保存一个镜像为一个tar包【对应load】
search   # 在docker hub 中搜索镜像
start    # 启动容器
stop     # 停止容器
tag      # 给源中镜像打标签
top      # 查看容器中运行的进程信息
unpause  # 取消暂停容器
version  # 查看docker版本号
wait     # 截取容器停止时的退出状态值

练习1

Docker 安装 Nginx
# 1.搜索镜像 search
[root@iZbp1cnxvv325atsz2k5xcZ /]# docker search nginx
# 2.下载镜像 pull
[root@iZbp1cnxvv325atsz2k5xcZ /]# docker pull nginx
# 3.运行测试
[root@iZbp1cnxvv325atsz2k5xcZ /]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
adminer      latest    015ac408c7d5   2 weeks ago   90.3MB
redis        latest    621ceef7494a   2 weeks ago   104MB
tomcat       latest    040bdb29ab37   2 weeks ago   649MB
nginx        latest    f6d0b4767a6c   2 weeks ago   133MB
mysql        latest    d4c3cafb11d5   2 weeks ago   545MB
mysql        8.0.13    102816b1ee7d   2 years ago   486MB
# -d 后台运行
# --name 给容器命名
# -p 宿主机端口:容器内部端口
[root@iZbp1cnxvv325atsz2k5xcZ /]# docker run -d --name nginx01 -p 3344:80 nginx
349bf136d82c60937128e7277c4c6c16209e6d98aebbe3ee8137ce8587f8caeb
[root@iZbp1cnxvv325atsz2k5xcZ /]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                               NAMES
349bf136d82c   nginx          "/docker-entrypoint.…"   3 seconds ago   Up 3 seconds   0.0.0.0:3344->80/tcp                nginx01
94c1e99dc77f   mysql:8.0.13   "docker-entrypoint.s…"   2 weeks ago     Up 40 hours    0.0.0.0:3306->3306/tcp, 33060/tcp   mysql
[root@iZbp1cnxvv325atsz2k5xcZ /]# curl localhost:3344# 进入容器
[root@iZbp1cnxvv325atsz2k5xcZ ~]# docker exec -it 349bf136d82c /bin/bash
root@349bf136d82c:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@349bf136d82c:/# cd /etc/nginx/
root@349bf136d82c:/etc/nginx# ls
conf.d  fastcgi_params  koi-utf  koi-win  mime.types  modules  nginx.conf  scgi_params  uwsgi_params  win-utf
root@349bf136d82c:/etc/nginx#

端口暴露的概念

练习2

# 官方的使用
docker run -it --rm tomcat:9.0
# 我们之前的启动都是后台,停止了容器之后,容器还是可以查到 docker run -it --rm,一般用来测试,用完就删除# 下载在启动
docker pull tomcat:9.0# 启动运行
docker run -d -p 3355:8080 --name tomcat01 tomcat# 测试访问没有问题
#进入容器
docker exec -it tomcat01 /bin/bash#发现问题,1.linux命令少了 ,2.没有webapps。阿里云镜像的原因,默认是最小的镜像,所有不必要的都剔除掉。
# 保证最小可运行环境

可视化

portainer(先用这个)

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

Rancher(CI/CD再用)

什么portainer ?

Docker图形化界面管理工具,提供一个后台面板供我们操作

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

访问测试:外网:http://47.111.110.89:8088

通过它来访问:

选择本地的

进入之后的面板

commit镜像

docker commit 提交容器成为一个新的副本# 命令和git原理类似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]

实战测试

# 1.启动一个默认的tomcat# 2.发现这个默认的tomcat 是没有webapps应用的,镜像的原因,官方的镜像默认 webapps下面是没有文件的# 3.我自己拷贝进去了基本的文件# 4.将我们操作过的容器通过commit提交为一个镜像!

*容器数据卷

什么是容器数据卷

docker的理念回顾,将应用和环境打包成一个镜像!

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

MySQL,容器删了,删库跑路!需求MySQL数据可以存储在本地!

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

这就卷技术!目录的挂载,将我们容器的目录,挂载到Linux上面!

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

使用数据卷

方式一:直接使用命令来挂载 -v
docker run -it -v 主机目录:容器内目录 -p# 测试
docker run -it -v /home/ceshi:/home centos /bin/bash# 启动起来的时候我们可以通过docker inspect 容器id

测试文件的同步

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZAPXyE3e-1615893158978)(C:\Users\Lj\AppData\Roaming\Typora\typora-user-images\1612429165279.png)]

再来测试!

1、停止容器

2、宿主机上修改文件

3、启动容器

4、容器内的数据依旧是同步的!

好处:我们以后修改只需要在本地修改即可,容器内会自动同步!

实战:安装MySQL

思考LMySQL数据持久化的问题!

# 获取镜像
[root@iZbp1cnxvv325atsz2k5xcZ ~]# docker pull mysql:5.7# 运行容器,需要做数据挂载! # 安装启动mysql,需要配置密码的,这是要注意的!
# 官方测试:docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag# 启动我们的
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
-- name 容器名字
[root@iZbp1cnxvv325atsz2k5xcZ ~]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7# 启动成功之后,我们在本地使用mysql 来连接测试
# mysql-连接到服务器 3310  和容器内的 3306映射,这个时候我们就可以连接上了# 在本地测试创建一个数据库,查看一下我们映射的路径是否ok !

假设我们将容器删除

你就会发现,我们挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能!

具名和匿名挂载

# 匿名挂载
-v 容器内路径!
docker run -d -P --name nginx01 -v /etc/nginx nginx# 查看所有(卷)volume 的情况
[root@iZbp1cnxvv325atsz2k5xcZ /]# docker volume ls
数据发现都是这种:
local     3e1f5d5bec196d12896f3cedfb15f31516ac8f5887d74d24ab67a8cb00287692# 这里发现,这就是匿名挂载,我们在 -v 只写了容器内路径,没有写容器外的路径!# 具名挂载
[root@iZbp1cnxvv325atsz2k5xcZ /]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
3b97a89d3e7f2090fe8a19aec6be3d069b1359c8df044f32aea2e78f0639543b
[root@iZbp1cnxvv325atsz2k5xcZ /]# docker volume ls
DRIVER    VOLUME NAME
local     f8893b0a2a699f79477f29438e71c38e3924aca6f136b829e9edea68708c9a17
local     juming-nginx# 通过 -v 卷名:容器内路径
# 查看一下这个卷

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

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

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

扩展:

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

初识Dockerfile

Dockerfile 就是用来构建docker镜像的构建文件!命令脚本!

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

# 创建一个dockerfile文件,名字可以随机 建议 Dockerfile# 文件中的内容 指令(大写)
FROM centosVOLUME ["volume01","volume02"]CMD echo "----end----"CMD /bin/bash# 这里的每个命令,就是镜像的一层!#volume01,volume02 就是匿名挂载

通过自己构建镜像

# 命令
docker build -f /home/docker-test-volume/dockerfile1 -t junge/centos:1.0 .

# 启动自己写的容器

这个卷和外部一定有一个同步的目录!

查看一下卷挂载的路径

# 命令 docker inspect 容器id
docker inspect 94c1e99dc77f

测试一下刚才的文件是否同步出去了!

这种方式我们未来使用的十分多,因为我们通常会构建自己的镜像!

假设构建镜像时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径

不懂可参考视频:https://www.bilibili.com/video/BV1og4y1q7M4?p=24

数据卷容器

多个mysql同步数据

# 启动3个容器,通过我们刚才自己的写镜像启动

*DockerFile

DockerFile介绍

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

构建步骤:

1.编写一个dockerfile文件

2.docker build 构建成为一个镜像

3.docker run 运行镜像

4.docker push 发布镜像 (dockerHub,阿里云镜像仓库!)

查看一下官方是怎么做的?

很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像!

DockerFile构建过程

基础知识:

1、每个保留关键字(指令)都是必须是大写字母

2、执行从上到下顺序执行

3、#表示注释

4、每一个指令都会创建提交一个新的镜像层,并提交!

dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!

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

步骤:开发,部署,上线运维。。。缺一不可!

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

Dockerlmages :通过DockerFile构建生成的镜像,最终发布和运行的产品,原来是jar war

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

DockerFile指令

以前的话我们就是使用别人的,现在我们知道了这些指令后,我们来练习自己写一个镜像!

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

实战测试

Docker Hub中 99%镜像都是从这个基础镜像过来的 FROM scratch,然后配置需要的软件和配置来进行的构建

创建一个自己的centos

# 1.编写dockerfile的文件
vi mydockerfile-centos 创建文件并编写
[root@iZbp1hz9x5a2zfv9fzc1wsZ dockerfile]# cat mydockerfile-centos FROM centosMAINTAINER junge<1965355964@qq.com>ENV MYPATH /usr/local
WORKDIR $MYPATHRUN yum -y install vim
RUN yum -y install net-toolsEXPOSE 80CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash# 2.通过这个文件构建镜像
# 命令 docker build -f dockerfile文件路径 -t 镜像名:[tag]
[root@iZbp1hz9x5a2zfv9fzc1wsZ dockerfile]# docker build -f mydockerfile-centos -t mycentos:0.1 .# 3.测试运行

对比:之前d的原生的centos

我们增加之后的镜像

我们可以列出本地进行的变更历史

通过 docker history 镜像id

可以查看一个镜像是怎么一步一步做起来的

我们平时拿到一个镜像,可以研究一下它是怎么做的了?

CMD 和 ENTRYPOINT区别

CMD              # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT      # 指定这个容器启动的时候要运行的命令,可以追加命令

测试cmd命令

# 第一步编写dockerfile文件
[root@iZbp1hz9x5a2zfv9fzc1wsZ dockerfile]# vi dockerfile-cmd-test
FROM centos
CMD ["ls","-a"]# 第二步构建镜像
[root@iZbp1hz9x5a2zfv9fzc1wsZ dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest .Sending build context to Docker daemon  15.87kB
Step 1/2 : FROM centos---> 300e315adb2f
Step 2/2 : CMD ["ls","-a"]---> Running in 3c8f373b87e6
Removing intermediate container 3c8f373b87e6---> ac81ff3f6648
Successfully built ac81ff3f6648
Successfully tagged cmdtest:latest# 通过run运行,发现我的ls -a命令生效了
[root@iZbp1hz9x5a2zfv9fzc1wsZ dockerfile]# docker run ac81ff3f6648
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found# 想追加一个命令 -l    ls -al
[root@iZbp1hz9x5a2zfv9fzc1wsZ dockerfile]# docker run ac81ff3f6648 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:370: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.# cmd的清理下 -l 替换了 CMD ["ls","-a"]命令,-l 不是命令所以报错!

测试 ENTRYPOINT 命令

[root@iZbp1hz9x5a2zfv9fzc1wsZ dockerfile]# vi dockerfile-cmd-entrypoint
FROM centos
ENTRYPOINT ["ls","-a"][root@iZbp1hz9x5a2zfv9fzc1wsZ dockerfile]# ls
dockerfile-cmd-entrypoint  dockerfile-cmd-test  mydockerfile-centos
[root@iZbp1hz9x5a2zfv9fzc1wsZ dockerfile]# docker build -f dockerfile-cmd-entrypoint -t entrypoint .
Sending build context to Docker daemon   16.9kB
Step 1/2 : FROM centos---> 300e315adb2f
Step 2/2 : ENTRYPOINT ["ls","-a"]---> Running in 7a206e52d7ef
Removing intermediate container 7a206e52d7ef---> 748db3a07ffe
Successfully built 748db3a07ffe
Successfully tagged entrypoint:latest
[root@iZbp1hz9x5a2zfv9fzc1wsZ dockerfile]# docker run 748db3a07ffe
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var# 我们的追加命令,是直接拼接在我们的 ENTRYPOINT 命令的后面!
[root@iZbp1hz9x5a2zfv9fzc1wsZ dockerfile]# docker run 748db3a07ffe -l
total 56
drwxr-xr-x  1 root root 4096 Feb 22 01:15 .
drwxr-xr-x  1 root root 4096 Feb 22 01:15 ..
-rwxr-xr-x  1 root root    0 Feb 22 01:15 .dockerenv
lrwxrwxrwx  1 root root    7 Nov  3 15:22 bin -> usr/bin
drwxr-xr-x  5 root root  340 Feb 22 01:15 dev
drwxr-xr-x  1 root root 4096 Feb 22 01:15 etc
drwxr-xr-x  2 root root 4096 Nov  3 15:22 home
lrwxrwxrwx  1 root root    7 Nov  3 15:22 lib -> usr/lib
lrwxrwxrwx  1 root root    9 Nov  3 15:22 lib64 -> usr/lib64
drwx------  2 root root 4096 Dec  4 17:37 lost+found
drwxr-xr-x  2 root root 4096 Nov  3 15:22 media
drwxr-xr-x  2 root root 4096 Nov  3 15:22 mnt
drwxr-xr-x  2 root root 4096 Nov  3 15:22 opt
dr-xr-xr-x 90 root root    0 Feb 22 01:15 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 15:22 sbin -> usr/sbin
drwxr-xr-x  2 root root 4096 Nov  3 15:22 srv
dr-xr-xr-x 13 root root    0 Feb 22 01:15 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
[root@iZbp1hz9x5a2zfv9fzc1wsZ dockerfile]# 

实战: Tomcat镜像

1.准备镜像文件 tomcat压缩包,jdk的压缩包

2.编写dockerfile文件,官方命名 Dockerfile,build会自动寻找这个文件,就不需要 -f 指定了!

vi Dockerfile

FROM centosMAINTAINER junge<1965355964@qq.com>COPY readme.txt /usr/local/readme.txtADD jdk-8u221-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-8.5.63-deployer.tar.gz /usr/local/RUN yum -y install vimENV MYPATH /usr/local
WORKDIR $MYPATHENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarENV CATALINA_HOME /usr/local/apache-tomcat-8.5.63-deployer
ENV CATALINA_BASH /usr/local/apache-tomcat-8.5.63-deployer
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/binEXPOSE 8080CMD /usr/local/apache-tomcat-8.5.63-deployer/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.63-deployer/bin/local/catalina.out
  1. 构建镜像

    # docker build -f DockerFile -t diytomcat .
    
    1. 启动镜像

      [root@iZbp1hz9x5a2zfv9fzc1wsZ tomcat]# docker run  -d -p 9090:8080 --name jungetomcat -v /home/tomcat/test:/usr/local/apache-tomcat-8.5.63-deployer/webapps/test -v /home/tomcat/tomcatlogs/:/usr/local/apache-tomcat-8.5.63-deployer/logs diytomcat
      
    2. 访问测试

    3. 发布项目(由于做了卷挂载,我们直接在本地编写项目就可以发布了!)

  <?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"version="2.5"></web-app>

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>hello,junge</title>
</head>
<body>
Hello World!<br/>
<%
System.out.println("-----my test logs-----");
%>
</body>
</html>

发布自己的镜像

DockerHub

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

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

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

[root@iZbp1hz9x5a2zfv9fzc1wsZ ~]# docker login --helpUsage:  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

4、登录完毕后就可以提交镜像了,

[root@iZbp1hz9x5a2zfv9fzc1wsZ ~]# docker login -u lujingyuandockerhub
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

5,就是一步docker push

# push自己的镜像到服务器上!
[root@iZbp1hz9x5a2zfv9fzc1wsZ ~]# docker push diytomcat
Using default tag: latest
The push refers to repository [docker.io/library/diytomcat]
56b0b08d8926: Preparing
602d6a4acb47: Preparing
f86f69ef9edf: Preparing
43b37abfd3f6: Preparing
2653d992f4ef: Preparing
denied: requested access to the resource is denied   # 拒绝  diytomcat要带上版本号# push镜像的问题?
[root@iZbp1hz9x5a2zfv9fzc1wsZ ~]# docker push junge/diytomcat:1.0
The push refers to repository [docker.io/junge/diytomcat]
An image does not exist locally with the tag: junge/diytomcat# 解决,增加一个 tag
[root@iZbp1hz9x5a2zfv9fzc1wsZ ~]# docker tag abeb3c7ac1ef junge/tomcat:1.0# docker psuh上去即可!自己发布的镜像尽量带上版本号
[root@iZbp1hz9x5a2zfv9fzc1wsZ ~]# docker push junge/tomcat:1.0
The push refers to repository [docker.io/junge/tomcat]
56b0b08d8926: Preparing
602d6a4acb47: Preparing
f86f69ef9edf: Preparing
43b37abfd3f6: Preparing
2653d992f4ef: Preparing

提交的时候也是按照镜像的层级来进行提交的!

阿里云镜像服务上

1.登录阿里云

2.找到容器镜像服务

3.创建命名空间

4.创建容器镜像

5.点击容器镜像名称 浏览详情教程

docker push registry.cn-hangzhou.aliyuncs.com/junge-docker/junge-tst:[镜像版本号]

仓库官方地址https://cr.console.aliyun.com/repository/cn-hangzhou/junge-docker/junge-tst/details

小结

*Docker 网络

理解Docker网络

三个网络

# 问题,docker是如何处理容器网络访问的?

[root@iZbp1hz9x5a2zfv9fzc1wsZ /]# docker run -d -P --name tomcat01 tomcat# 查看容器的内部网络地址 ip addr,发现容器启动的时候会得到一个eth0@if13 ip地址,docker分配的!
[root@iZbp1hz9x5a2zfv9fzc1wsZ /]# docker exec -it tomcat01 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
12: eth0@if13: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft forever# liunx 能不能 ping 通 容器内部?
[root@iZbp1hz9x5a2zfv9fzc1wsZ /]# 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.079 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.057 ms#liunx 可以ping通 docker容器内部

原理

1、我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0桥接模式,使用的技术是evth-pair技术!
再次测试ip addr

2、在启动一个容器测试,发现又多了一对网卡~!|

#我们发现这个容器带来网卡,都是一对对的
# evth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连
#正因为有这个特性,evth-pair 充当一个桥梁,连接各种虚拟网络设备的
#OpenStac,Docker容器之间的连接,ovs的连接,都是使用 evth-pair 技术

3、我们来测试下tomcat01和tomcat 02是否可以ping通

[root@iZbp1hz9x5a2zfv9fzc1wsZ /]# 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.048 ms# 结论容器和容器之间是可以互相ping通的!

绘制一个网络模型图:

结论:tomcat01 和 tomcat02 是公用的一个路由器,docker0;

所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用ip

小结

Docker使用的是liunx的桥接,宿主机中是一个Docker容器的网桥docker0.

Docker 中的所有的网络接口都是虚拟的。虚拟的转发效率高! (内网传递文件!)

只要容器删除,对应网桥一对就没了!

–link

思考一个场景,我们编写了一个微服务,database url=ip:,项目不重启,数据库ip换掉了,我们希望可以处理这个问题,可以名字来进行访问容器?

[root@iZbp1hz9x5a2zfv9fzc1wsZ ~]# docker exec -it tomcat02 ping tomcat01
ping: tomcat01: Name or service not known# 如何可以解决呢?通过--1ink指定容器名
#通过--link既可以解决了网络连通问题
[root@kuangshen /]# docker run -d -p --name tomcat03 --1ink tomcat02 tomcat
5ca72d80ebb048d3560df1400af03130f37ece244be2a54884336aace2106884
[root@kuangshen/]# docker exec -it tomcat03 ping tomcat02# 反向可以ping通吗?
[root@iZbp1hz9x5a2zfv9fzc1wsZ ~]# docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Name or service not known

探究:inspect

其实这个tomcat03就是在本地配置了tomcat02的配置?

# 查看hosts 配置,在这里原理发现!
[root@iZbp1hz9x5a2zfv9fzc1wsZ ~]# 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.3  tomcat02 25b48edba81f
172.17.0.4  27228e01e200

本质探究:–link就是我们在hosts配置中增加了一个172.17.0.3 tomcat02 25b48edba81f

我们现在玩Docker已经不建议使用–link 了 !

自定义网络!不适用dockerO !

docker0问题:他不支持容器名连接访问!

自定义网络

查看所有的docker网络

网络模式

bridge :桥接docker(默认,自己床架也使用bridge模式)

none: 不配置网络

host : 和宿主机共享网络

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

测试

# 我们直接启动的命令--net bridge,而这个就是我们的docker0docker run -d -P --name tomcat01 --net bridge tomcat# docker0特点,默认,域名不能访问,--link可以打通连接# 我们可以自定义一个网络
#  --driver bridge 桥接
# --subnet 192.168.0.0/16 子网的地址
# --gateway 192.168.0.1 网关,就是你家路由器的地址
[root@iZbp1hz9x5a2zfv9fzc1wsZ ~]# docker network ls
NETWORK ID     NAME                     DRIVER    SCOPE
712fe89e1c5a   bridge                   bridge    local
5042b832d7e1   gitlab-compose_default   bridge    local
900920c1a1fc   gitlab_default           bridge    local
b612077b0081   host                     host      local
b04b3677a1d4   none                     null      local
[root@iZbp1hz9x5a2zfv9fzc1wsZ ~]# docker network create --driver   --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
0f98244458a3dcdb1ef9b295db7d811c62769094e23d064beb07f5093e1c92a1
[root@iZbp1hz9x5a2zfv9fzc1wsZ ~]# docker network ls
NETWORK ID     NAME                     DRIVER    SCOPE
712fe89e1c5a   bridge                   bridge    local
5042b832d7e1   gitlab-compose_default   bridge    local
900920c1a1fc   gitlab_default           bridge    local
b612077b0081   host                     host      local
0f98244458a3   mynet                    bridge    local
b04b3677a1d4   none                     null      local

我们自己的网络就创建好了!

[root@iZbp1hz9x5a2zfv9fzc1wsZ ~]# docker network inspect mynet
[{"Name": "mynet","Id": "0f98244458a3dcdb1ef9b295db7d811c62769094e23d064beb07f5093e1c92a1","Created": "2021-03-02T09:36:08.016399937+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@iZbp1hz9x5a2zfv9fzc1wsZ ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat
07ee6e0bf134ceb4e91db656b41938a908fd543cb5630949b147ee4884018f20
[root@iZbp1hz9x5a2zfv9fzc1wsZ ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat
381845f6d4c0fd3a0a4f9b921b639955235802ab6e27c8eebd1072d02e298ee6
[root@iZbp1hz9x5a2zfv9fzc1wsZ ~]# docker network inspect mynet
[{"Name": "mynet","Id": "0f98244458a3dcdb1ef9b295db7d811c62769094e23d064beb07f5093e1c92a1","Created": "2021-03-02T09:36:08.016399937+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": {"07ee6e0bf134ceb4e91db656b41938a908fd543cb5630949b147ee4884018f20": {"Name": "tomcat-net-01","EndpointID": "adb3e5ac4b6e489a09e6e418d3e2bf4159f3d1e0d41fb6fb5ba25f5821a3bdf3","MacAddress": "02:42:c0:a8:00:02","IPv4Address": "192.168.0.2/16","IPv6Address": ""},"381845f6d4c0fd3a0a4f9b921b639955235802ab6e27c8eebd1072d02e298ee6": {"Name": "tomcat-net-02","EndpointID": "e453ebc17322881e2b6499f29105a597d9e84af2f69577f564bf9c683aa830ca","MacAddress": "02:42:c0:a8:00:03","IPv4Address": "192.168.0.3/16","IPv6Address": ""}},"Options": {},"Labels": {}}
]# 再次测试ping连接
[root@iZbp1hz9x5a2zfv9fzc1wsZ ~]# 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.123 ms
64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.075 ms
^C
--- 192.168.0.3 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.075/0.099/0.123/0.024 ms# 现在不使用--link也可以ping名字了!
[root@iZbp1hz9x5a2zfv9fzc1wsZ ~]# 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.063 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.072 ms64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.078 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=4 ttl=64 time=0.083 ms64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=5 ttl=64 time=0.075 ms
^C
--- tomcat-net-02 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 1003ms
rtt min/avg/max/mdev = 0.063/0.074/0.083/0.008 ms

我们自定义的网络docker都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络!

好处:

redis -不同的集群使用不同的网络,保证集群是安全和健康的

mysql -不同的集群使用不同的网络,保证集群是安全和健康的

网络联通

#  测试打通 tomcat01 - mynet
docker network connect mynet tomcat01
# 连通之后就是将tomcato1放到了mynet-网络下?# 一个容器两个ip地址!
# 阿里云服务:公网ip,私网ip

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

实战:部署Redis 集群

看视频去:https://www.bilibili.com/video/BV1og4y1q7M4?p=38&spm_id_from=pageDriver

SpringBoot微服务打包Docker镜像

1、构架springboot项目

2、打包应用

3、编写dockerfile

4、构建镜像

5、发布运行!|

参考视频:https://www.bilibili.com/video/BV1og4y1q7M4?p=39

ss, time 1000ms
rtt min/avg/max/mdev = 0.075/0.099/0.123/0.024 ms

现在不使用–link也可以ping名字了!

[root@iZbp1hz9x5a2zfv9fzc1wsZ ~]# 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.063 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.072 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.078 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=4 ttl=64 time=0.083 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=5 ttl=64 time=0.075 ms
^C
— tomcat-net-02 ping statistics —
5 packets transmitted, 5 received, 0% packet loss, time 1003ms
rtt min/avg/max/mdev = 0.063/0.074/0.083/0.008 ms


我们自定义的网络docker都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络!好处:redis -不同的集群使用不同的网络,保证集群是安全和健康的mysql -不同的集群使用不同的网络,保证集群是安全和健康的### 网络联通[外链图片转存中...(img-J9GKl9gE-1615893159046)][外链图片转存中...(img-mOUoZx9J-1615893159047)]```shell
#  测试打通 tomcat01 - mynet
docker network connect mynet tomcat01
# 连通之后就是将tomcato1放到了mynet-网络下?# 一个容器两个ip地址!
# 阿里云服务:公网ip,私网ip

[外链图片转存中…(img-TzC1MQIm-1615893159048)]

[外链图片转存中…(img-apl2yGhy-1615893159049)]

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

实战:部署Redis 集群

[外链图片转存中…(img-RPxV7JGW-1615893159051)]

看视频去:https://www.bilibili.com/video/BV1og4y1q7M4?p=38&spm_id_from=pageDriver

SpringBoot微服务打包Docker镜像

1、构架springboot项目

2、打包应用

3、编写dockerfile

4、构建镜像

5、发布运行!|

[外链图片转存中…(img-l76m1bY5-1615893159051)]

参考视频:https://www.bilibili.com/video/BV1og4y1q7M4?p=39

docker命令入门到精通这一篇就够了相关推荐

  1. C#40000字全套精华教程,从入门到精通,一篇就够了:)

    C井(sharp) 程序结构 基本结构 本文摘选自菜鸟教程,csdn,以及本人学习的笔记资源,如果遇到显示或者格式其他问题可以直接查看pdf文件 一个 C# 程序主要包括以下部分: pdf下载地址,可 ...

  2. Redis从入门到精通:初级篇(转)

    原文链接:http://www.cnblogs.com/xrq730/p/8890896.html,转载请注明出处,谢谢 Redis从入门到精通:初级篇 平时陆陆续续看了不少Redis的文章了,工作中 ...

  3. 视频教程-SQL语句从入门到精通迅速提升篇视频课程(Oracle零基础版)-Oracle

    SQL语句从入门到精通迅速提升篇视频课程(Oracle零基础版) 某公司区域交付运营总监,丰富的项目管理经验,带过1个亿级项目,千万级项目10余个. 陈志文 ¥118.00 立即订阅 扫码下载「CSD ...

  4. MySQL零基础从入门到精通(函数篇)

    MySQL零基础从入门到精通(函数篇) 在MySQL中,为了提高代码重用性和隐藏实现细节,MySQL提供了很多函数.函数可以理解为别人封装好的模板代码. 分类 聚合函数 数学函数 字符串函数 日期函数 ...

  5. 视频教程-2019版抓包分析-Wireshark从入门到精通【进阶篇】-其他

    2019版抓包分析-Wireshark从入门到精通[进阶篇] G-LAB IT实验室创始人.知名讲师.同时拿到路由交换.网络安全.数据中心3个方向的CCIE专家级别认证.教学风趣幽默,广受学员好评 郭 ...

  6. 视频教程-30小时微信小程序从入门到精通课程-基础篇-微信开发

    30小时微信小程序从入门到精通课程-基础篇 8年IT开发经验,6年IT教育经验,喜欢把复杂逻辑用简单的表述传达给学生,传授编程知识,讲述生活故事 曹圣捷 ¥12.00 立即订阅 扫码下载「CSDN程序 ...

  7. Matplitlib绘图入门1,这一篇就够了

    Matplitlib绘图入门1,这一篇就够了 1. 绘制简单的图表(标题.标签轴.刻度轴.表说明) 2. 绘图辅助函数方法,绘制多个图(随机点绘制多个子图,点状.x状等) 3. 可交互式绘图(一图单线 ...

  8. python从入门到精通怎么样-Python 从入门到精通:一个月就够了

    毫无疑问,Python 是当下最火的编程语言之一.对于许多未曾涉足计算机编程的领域「小白」来说,深入地掌握 Python 看似是一件十分困难的事.其实,只要掌握了科学的学习方法并制定了合理的学习计划, ...

  9. python自学时间-Python 从入门到精通:一个月就够了!

    原标题:Python 从入门到精通:一个月就够了! 毫无疑问,Python 是当下最火的编程语言之一.对于许多未曾涉足计算机编程的领域「小白」来说,深入地掌握 Python 看似是一件十分困难的事.其 ...

最新文章

  1. 设置访问权限_一项一项教你测等保2.0——Windows访问控制
  2. python 打包egg_将Python程序打包到egg或WHL安装包或exe包中,把,python,成,或者,whl
  3. PHP教程:WebService最常用的两种方法
  4. 区别和认识四个判等函数
  5. 关于控件Visible属性的说明
  6. PHP中遍历关联数组的方法
  7. 《守望先锋》中的末日铁拳是怎么摧毁玩家体验的?
  8. c++ mysql 存储图片路径_3.用ADO实现图片在数据库中存储
  9. Halcon:手眼标定——眼在手外与眼在手上
  10. 两数之和,输入有序数组 leetcode C++
  11. 网际风全推数据接口_智能风控系统设计与实践
  12. 13款宝马x5质量到底怎么样_2020款宝马X5价格新变化 都市越野绝佳之选_搜狐汽车...
  13. JSON parse error: No suitable constructor found for type
  14. 【OpenCV学习笔记】【教程翻译】三( 车牌检测之区域分割)
  15. HDU 4289 Control
  16. Linux内核模块(一)
  17. 七个不放过和四项原则
  18. python做马尔科夫模型预测法_Python 3 爬虫学习笔记 8 马尔科夫模型
  19. html感应手机陀螺仪,详解手机上的光线感应器、三轴陀螺仪等各传感器
  20. 模拟器和服务器共享文件夹,mumu模拟器如何跟电脑共享文件?导入文件到mumu模拟器共享文件夹教程...

热门文章

  1. 一款FPGA时序电路数据画图软件
  2. 和菜鸟一起学产品之产品经理的自我管理能力
  3. LTE -UL_grant中RIV的编码和解码
  4. 坑 | NIO - [AsynchronousFileChannel + CompletionHandler]
  5. 开什么玩笑?股票价格如何经得起AI的推敲?| 技术头条
  6. M: Mysterious Conch(哈希表)
  7. XSS(Cross-site Script,跨站脚本)漏洞笔记
  8. 双枢轴快速排序与 Arrays.sort()
  9. 信息学竞赛OI 常用OJ
  10. 【Box3引擎摄像机扩展】Box3CameraLag Box3CameraBessel