docker 生产运用

cat /etc/os-release 系统版本
uname -r
查看dokcer帮助文档 https://docs.docker.com/engine/install/centos/
3#yum安装gcc相关环境确保虚拟机可以上外网
1 yum -y install gcc
2 yum -y install gcc-c++

#1卸载旧版本dockers
yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-engine
#2需要的安装包
yum install -y yum-utils
#3设置镜像仓库(使用阿里云镜像地址)https://www.cnblogs.com/hui-shao/p/docker-ali.html
yum-config-manager
–add-repo
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#更新yum软件包索引
yum makecache fast
#4 安装docker相关内容(dokcer-ce社区)
yum install docker-ce docker-ce-cli containerd.io -y
#5 启动docker
systemctl start docker
#6 使用docker version 是否安装成功
#7 验证docker启动成功 hello-world
docker run hello-world
#8 查看一下下载这个hello-world镜像
docker images
了解 :卸载docker
#1 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
#2 删除资源
rm -rf /var/lib/docker
#/var/lib/docker docker默认工作路径

阿里云镜像加速
1 登录阿里云找到容器服务
2 找到镜像加速地址
3 配置使用
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-‘EOF’
{
“registry-mirrors”: [“https://26i07xnh.mirror.aliyuncs.com”]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

回顾HELLO WORD 运行流程
底层原理
docker怎么工作的?
docker是一个client-server 结构系统 dockers的守护进程运行在主机上,通过socket从客户端访问!
dockerserver接受到docker-client的指令,就会执行这个命令
docker为什么比虚拟机快?
1 docker有更少的抽象层
2 docker利用的是宿主机的内核,vm需要是guest os
新建一个容器的时候。docker不需要像虚拟机一样从新加载一个操作系统内核。避免引导,虚拟机加载guestos
docker利用宿主机内核

Docker的常用命令
帮助命令
docker version #显示dockers版本信息
docker info #显示更详细信息 包括镜像和容器的数量
docker 命令 --help #万能命令
帮助文档地址 https://docs.docker.com/reference/
镜像命令
docker images 查看本地主机上的镜像
#REPOSITORY 镜像的仓库源
#TAG 镜像的标签
#CREATED 经常创建时间
#SIZE 镜像的大小
可选项
-a #列出所有镜像
-q #只显示镜像id

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

docker pull 下载镜像
docker pull mysql
Using default tag: latest #如果不写tag. 默认就是latest
latest: Pulling from library/mysql
bb79b6b2107f: Pull complete #分层下载,docker images的核心 联合文件系统
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.io/library/mysql:latest

#指定版本下载
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 删除镜像
docker rmi -f 容器id #删除指定容器
docker rmi -f $(docker images -aq) # 删除全部容器

容器命令
说明:有了镜像才可以创建容器,Linux ,下载一个centos镜像来测试学习
docker pull centos
新建容器并启动
docker run [可选参数] images

#参数说明
–name=Name 容器名字 tomcat01 tomcat02 用来分区容器
-d 后台方式运行
-it 使用交互方式运行,进入容器察看内容
-p 指定容器端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口
-p 容器端口
-P 随机指定端口

测试,启动并进入容器
docker run -it centos /bin/bash
[root@centos7.7 ~]# docker run -it centos /bin/bash
[root@8232e2f878a0 /]#

#从容器中退出主机
[root@8232e2f878a0 /]# exit

列出所有在运行的容器
-a #列出当前正在运行的容器+带出历史运行过的容器
-n=? #显示最近创建的容器 显示个数
-q #只显示容器编号
docker ps
docker ps -a
[root@centos7.7 /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@centos7.7 /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@centos7.7 /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8232e2f878a0 centos “/bin/bash” 8 minutes ago Exited (0) 5 minutes ago modest_zhukovsky
d12129fb573b bf756fb1ae65 “/hello” 15 hours ago Exited (0) 15 hours ago infallible_goldwasser
[root@centos7.7 /]# docker ps -a -n=1
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8232e2f878a0 centos “/bin/bash” 12 minutes ago Exited (0) 8 minutes ago modest_zhukovsky

退出容器
exit #直接容器停止并退出
ctrl +P +Q # 容器不停止退出
删除容器
docker rm 容器id #删除指定容器,不能删除正在运行的容器,如果要强制删除 rm -f
docker rm -f $(docker ps -aq ) #删除所有的容器
docker ps -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 jackie;sleep 1;done”

[root@centos7.7 /]# docker ps
CONTAINER ID IMAGE
16b579dd46dd centos

显示日志
-f -t #显示日志
–tail number #要显示日志条数
[root@centos7.7 /]# docker logs -f -t --tail 10 16b579dd46dd

查看容器中进程信息 ps
#命令 docker top 容器id
[root@centos7.7 /]# docker top 16b579dd46dd
UID PID PPID C STIME TTY TIME CMD
root 12864 12848 0 09:15 ? 00:00:00 /bin/sh -c while true;do echo jackie;sleep 1;done
root 17228 12864 0 09:25 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
查看镜像的源数据
docker inspect 容器id
[root@centos7.7 /]# docker inspect 16b579dd46dd
[
{
“Id”: “16b579dd46dd43a5c963fbc2c1503344af618cb9eaea2f85a14145bf6487916d”,
“Created”: “2020-10-27T01:15:35.631718653Z”,
“Path”: “/bin/sh”,
“Args”: [
“-c”,
“while true;do echo jackie;sleep 1;done”
],
“State”: {
“Status”: “running”,
“Running”: true,
“Paused”: false,
“Restarting”: false,
“OOMKilled”: false,
“Dead”: false,
“Pid”: 12864,
“ExitCode”: 0,
“Error”: “”,
“StartedAt”: “2020-10-27T01:15:36.470675446Z”,
“FinishedAt”: “0001-01-01T00:00:00Z”
},
“Image”: “sha256:0d120b6ccaa8c5e149176798b3501d4dd1885f961922497cd0abef155c869566”,
“ResolvConfPath”: “/var/lib/docker/containers/16b579dd46dd43a5c963fbc2c1503344af618cb9eaea2f85a14145bf6487916d/resolv.conf”,
“HostnamePath”: “/var/lib/docker/containers/16b579dd46dd43a5c963fbc2c1503344af618cb9eaea2f85a14145bf6487916d/hostname”,
“HostsPath”: “/var/lib/docker/containers/16b579dd46dd43a5c963fbc2c1503344af618cb9eaea2f85a14145bf6487916d/hosts”,
“LogPath”: “/var/lib/docker/containers/16b579dd46dd43a5c963fbc2c1503344af618cb9eaea2f85a14145bf6487916d/16b579dd46dd43a5c963fbc2c1503344af618cb9eaea2f85a14145bf6487916d-json.log”,
“Name”: “/awesome_rosalind”,
“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,
“Capabilities”: null,
“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/27a02ab36dccc3fe7c92f47bca45aadfbd6dd495e0d64bd621700f6d17cc3abf-init/diff:/var/lib/docker/overlay2/646705c337634442c248925bb8adf637485944e30fdf37d17302dd50cc971335/diff”,
“MergedDir”: “/var/lib/docker/overlay2/27a02ab36dccc3fe7c92f47bca45aadfbd6dd495e0d64bd621700f6d17cc3abf/merged”,
“UpperDir”: “/var/lib/docker/overlay2/27a02ab36dccc3fe7c92f47bca45aadfbd6dd495e0d64bd621700f6d17cc3abf/diff”,
“WorkDir”: “/var/lib/docker/overlay2/27a02ab36dccc3fe7c92f47bca45aadfbd6dd495e0d64bd621700f6d17cc3abf/work”
},
“Name”: “overlay2”
},
“Mounts”: [],
“Config”: {
“Hostname”: “16b579dd46dd”,
“Domainname”: “”,
“User”: “”,
“AttachStdin”: false,
“AttachStdout”: false,
“AttachStderr”: false,
“Tty”: false,
“OpenStdin”: false,
“StdinOnce”: false,
“Env”: [
“PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin”
],
“Cmd”: [
“/bin/sh”,
“-c”,
“while true;do echo jackie;sleep 1;done”
],
“Image”: “centos”,
“Volumes”: null,
“WorkingDir”: “”,
“Entrypoint”: null,
“OnBuild”: null,
“Labels”: {
“org.label-schema.build-date”: “20200809”,
“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”: “3758e9c3c8347f3f789750fe8050fe8a47204b5d392e9bac8d66c79e45ab35b8”,
“HairpinMode”: false,
“LinkLocalIPv6Address”: “”,
“LinkLocalIPv6PrefixLen”: 0,
“Ports”: {},
“SandboxKey”: “/var/run/docker/netns/3758e9c3c834”,
“SecondaryIPAddresses”: null,
“SecondaryIPv6Addresses”: null,
“EndpointID”: “79279f3b95c3d7a0ff08f47e6efb85d38b7868e2ac9d578b11af9a5b48436548”,
“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”: “dd9309650043150f0688cdbcecc7e7eb8b55b135eced7f35ece2b9ce6fc8a0f7”,
“EndpointID”: “79279f3b95c3d7a0ff08f47e6efb85d38b7868e2ac9d578b11af9a5b48436548”,
“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@centos7.7 /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
16b579dd46dd centos “/bin/sh -c 'while t…” 20 minutes ago Up 20 minutes awesome_rosalind
[root@centos7.7 /]# docker exec -it 16b579dd46dd /bin/bash
[root@16b579dd46dd /]# ls
bin home lost+found opt run sys var
dev lib media proc sbin tmp
etc lib64 mnt root srv usr
#方式二
docker attch 容器id
测试
docker attch 16b579dd46dd
正在执行当前代码

#docker exec #进入容器开启一个新的终端,可以在里面操作(常用)
#docker attch #进入正在执行的终端,不会启动新的进程
从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 目的的主机路径
#查看当前主机目录下
[root@centos7.7 home]# ll
总用量 4
drwx------. 15 centos7.7 centos7.7 4096 10月 16 21:03 centos7.7
[root@centos7.7 home]# touch jackie.java
[root@centos7.7 home]# ll
总用量 4
drwx------. 15 centos7.7 centos7.7 4096 10月 16 21:03 centos7.7
-rw-r–r--. 1 root root 0 10月 27 09:49 jackie.java
[root@centos7.7 home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4178c4188b2c centos “/bin/bash” About a minute ago Up About a minute trusting_shaw
#进入docker容器内部
[root@centos7.7 home]# docker attach 4178c4188b2c
[root@4178c4188b2c /]# cd /home
[root@4178c4188b2c home]# ls
#在容器内新建一个文件
[root@4178c4188b2c home]# touch test.java
[root@4178c4188b2c home]# exit
exit
[root@centos7.7 home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@centos7.7 home]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4178c4188b2c centos “/bin/bash” 3 minutes ago Exited (0) 20 seconds ago trusting_shaw

#将文件拷贝出来到主机上
[root@centos7.7 home]# docker cp 4178c4188b2c:/home/test.java /home
[root@centos7.7 home]# ls
centos7.7 jackie.java test.java

#拷贝一个手动过程,未来我们使用-v卷的技术,可以实现,自动同步

作业练习
docker 安装nginx
#1 搜索镜像 search 建议大家去docker搜索,可以看帮助
#2 下载镜像 pull
#运行测试
[root@centos7.7 home]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f35646e83998 13 days ago 133MB
centos latest 0d120b6ccaa8 2 months ago 215MB

#-d 后台运行
#–name 给容器命名
#-p 宿主机端口3344 容器内端口80
[root@centos7.7 home]# docker run -d --name nginx01 -p:3344:80 nginx
3a20b4fb12c53e37f1f5be1e33de3977729abce3b98eefbda2b9b103f7034825
[root@centos7.7 home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3a20b4fb12c5 nginx “/docker-entrypoint.…” 4 minutes ago Up 4 minutes 0.0.0.0:3344->80/tcp nginx01
[root@centos7.7 home]# curl localhost:3344

Welcome to nginx!

Welcome to nginx!

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

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

Thank you for using nginx.

端口暴露的概念 思考问题:我们每次改动nginx配置文件,都需要进入容器内部?十分麻烦我们要是可以提供一个映射路径 ,达到在容器修改文件名,容器内部可以自动修改? -v 数据卷技术 作业: 部署es +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

#启动Linux就卡住了 docker stats 查看 cpu的状态

#es 是分好内存的1.G

#查看docker stats

#测试es是否成功了
curl localhost:9200
{
“name” : “522cc8bb3aa0”,
“cluster_name” : “docker-cluster”,
“cluster_uuid” : “58ifgugRRFSuqnBY28K-pg”,
“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”
}

#赶紧关闭,增加内存设置,修改配置文件-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

#查看docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
7afe97a1b9b6 elasticsearch 191.89% 265.9MiB / 1.777GiB 14.61% 656B / 0B 89.4MB / 0B 20

可视化
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图形化界面管理工具! 提供一个后台面板供我们操作!
访问测试:外网:8088http://10.0.0.134:8088/#/init/admin

如何得到镜像:
从远程仓库下载
朋友拷贝给你
自己制作一个镜像dockerfile

如何提交一个自己的镜像
commit镜像
docker commit 提交容器成为一个新的副本
docker commit -m=“提交的描述信息” -a=“作者” 容器id 目标镜像:[TAG]
docker commit -m=“add webapps app” -a=“jackie” 804b438e4c9c tomcat01:1.0

实战测试
#启动一个默认的tomcat
[root@centos7.7 ~]# docker run -it -p 9090:8080 tomcat

#发现这个默认的tomcat是没有webapps应用,镜像的原因,官方的镜像默认webapps下面没有文件的!

#我们自己拷贝一个基本文件
[root@centos7.7 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
804b438e4c9c tomcat “catalina.sh run” 31 seconds ago Up 29 seconds 0.0.0.0:9090->8080/tcp cool_pare
[root@centos7.7 ~]# docker exec -it 804b438e4c9c /bin/bash
root@804b438e4c9c:/usr/local/tomcat# cd webapps
root@804b438e4c9c:/usr/local/tomcat/webapps# ls
root@804b438e4c9c:/usr/local/tomcat/webapps# cd …
root@804b438e4c9c:/usr/local/tomcat# ls
BUILDING.txt RUNNING.txt temp
CONTRIBUTING.md bin webapps
LICENSE conf webapps.dist
NOTICE lib work
README.md logs
RELEASE-NOTES native-jni-lib
root@804b438e4c9c:/usr/local/tomcat# cd webapps
root@804b438e4c9c:/usr/local/tomcat/webapps# ls
root@804b438e4c9c:/usr/local/tomcat/webapps# cd …
root@804b438e4c9c:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@804b438e4c9c:/usr/local/tomcat# cd webapps
root@804b438e4c9c:/usr/local/tomcat/webapps# ls
ROOT docs examples host-manager manager
root@804b438e4c9c:/usr/local/tomcat/webapps# exit
exit
[root@centos7.7 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
804b438e4c9c tomcat “catalina.sh run” 8 minutes ago Up 8 minutes 0.0.0.0:9090->8080/tcp cool_pare
#4 将我们操作过的容器通过commit提交为一个新的镜像! 我们以后就使用我们修改过的镜像即可,这是
我们修改过的镜像
docker commit -m=“add webapps app” -a=“jackie” 804b438e4c9c tomcat01:1.0

容器数据卷
什么是容器数据卷
docker的理念回顾
将应用和环境打包成一个镜像
数据 如果数据都在容器中,那么我们容器删除,数据就会丢失! 需求:数据可以持久化
mysql, 容器删除了,删除跑路! 需求:mysql数据可以存储在本地!
容器之间可以有一个数据共享的技术! docker容器中产生的数据,同步到本地!
这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux上面!
总结一句话:容器的持久化和同步 操作!容器间数据共享!

使用数据卷
方式一:直接使用命令来挂载 -v
docker run -it -v 主机目录:容器目录

#测试
[root@centos7.7 home]# docker run -it -v /home/jackie:/home centos:latest /bin/bash

#启动起来时候我们可以通过docker inspect 容器id
“Name”: “overlay2”
},
“Mounts”: [
{
“Type”: “bind”,
“Source”: “/home/jackie”,
“Destination”: “/home”,
“Mode”: “”,
“RW”: true,
“Propagation”: “rprivate”
}
#测试文件的同步
[root@e3529c3b653d home]# ls
[root@e3529c3b653d home]# touch jackie.java
[root@e3529c3b653d home]# ls
jackie.java
[root@centos7.7 jackie]# ll
总用量 0
[root@centos7.7 jackie]# ls
jackie.java

再来测试!
1 停止容器
2宿主机上修改文件
3 启动容器
4 容器内的数据依旧同步
[root@centos7.7 jackie]# vim jackie.java
[root@centos7.7 home]# docker ps -aq
e3529c3b653d
[root@centos7.7 home]# docker start e3529c3b653d
e3529c3b653d
[root@centos7.7 home]# docker attach e3529c3b653d
[root@e3529c3b653d /]# cd /home
[root@e3529c3b653d home]# ls
jackie.java
[root@e3529c3b653d home]# cat jackie.java
jackie 2020
好处:以后我们修改只需要在本地修改即可,容器内会自动同步!

实战mysql
思考:MySQL的数据持久化的问题
#获取镜像
[root@centos7.7 home]# docker pull mysql:5.7

#运行容器,需要做数据挂载! #需要配置密码的,这是需要注意点! https://hub.docker.com/_/mysql
#官方测试 docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

#启动我们的
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置修改
–name 容器名字
[root@centos7.7 home]# 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
9105ce6f7b541acfb1d5634beb5a100f58eccaeceafe4685431f9cf09984a024

#启动成功之后,我们在本地使用sqlyog来连接测试一下
#sqlyog-连接到服务器的3310—3310和容器内的3306映射,这时候我们就可以连接上了!

#在本地测试创建一个数据库,查看一下映射的路径是否ok!
[root@centos7.7 ~]# docker exec -it 9105ce6f7b54 /bin/bash
root@9105ce6f7b54:
root@9105ce6f7b54:/# cd /var/lib
root@9105ce6f7b54:/var/lib# cd mysql
root@9105ce6f7b54:/var/lib/mysql# ls
auto.cnf ib_logfile0 performance_schema
ca-key.pem ib_logfile1 private_key.pem
ca.pem ibdata1 public_key.pem
client-cert.pem ibtmp1 server-cert.pem
client-key.pem jackie server-key.pem
ib_buffer_pool mysql sys
假设我们把容器删除,发现我们挂载的书籍依旧没有丢失,这就实现了容器数据持久化功能!

具名和匿名挂载
#匿名挂载
-v 容器内路径!
docker run -d --name nginx01 -p 8887:8080 -v /etc/nginx nginx
docker run -d --name nginx01 -P -v /etc/nginx nginx

#查看所有的volume的情况
[root@centos7.7 data]# docker volume ls
DRIVER VOLUME NAME
local 814484b27072440a08896963bda1b85a291b894c65f86556e72ca3437525f7b7
local bb255846318296f2ab2c16355ebae9c74e20f895efe02dc92ee10c58c722dcce

#这里发现,这种就是匿名挂载,我们在-v 只写了容器的路径,没写容器外的路径!

#具名挂载
[root@centos7.7 data]# docker run --name nginx02 -p 8886:8080 -v jackie-nginx:/etc/nginx nginx
[root@centos7.7 ~]# docker volume ls
DRIVER VOLUME NAME
local 814484b27072440a08896963bda1b85a291b894c65f86556e72ca3437525f7b7
local bb255846318296f2ab2c16355ebae9c74e20f895efe02dc92ee10c58c722dcce
local jackie-nginx

#通过 -v 卷名:容器内路径
#查看一下这个卷
[root@centos7.7 ~]# docker volume inspect jackie-nginx
[
{
“CreatedAt”: “2020-10-28T08:41:47+08:00”,
“Driver”: “local”,
“Labels”: null,
“Mountpoint”: “/var/lib/docker/volumes/jackie-nginx/_data”,
“Name”: “jackie-nginx”,
“Options”: null,
“Scope”: “local”
}
]
所有的docker容器内的卷,没有指定目录的情况下都在’/var/lib/docker/volumes/jackie-nginx/_data’
我们通过具名挂载可以方便的找到我们的一个卷,大多数情况在使用的’具名挂载’
#如何确定是具名挂载还是匿名挂载,还是指定路径挂载!
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径:容器内路径 #指定路径挂载
拓展:
#通过-v 容器内路径:ro rw 改变读写权限
ro rendonly #只读
rw readwrite #可读可写

#一旦这个设置了容器权限,容器对我们挂载出来的内容就有限定了!
docker run --name nginx02 -p 8886:8080 -v jackie-nginx:/etc/nginx:ro nginx
docker run --name nginx02 -p 8886:8080 -v jackie-nginx:/etc/nginx:rw nginx

#ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作!

初识Dockerfile
-t #生成
dockerfile就是用来构建docker镜像的构建文件! 命令脚本!
通过脚本生成镜像,镜像是一层一层,脚本一个个的命令,每个命令都是一层!
#创建一个dockerfile文件
FROM centos

VOLUME [“volume01”,“volume02”]

CMD echo “-----end-----”
CMD /bin/bash
~
#这里每个命令就是镜像的一层

[root@centos7.7 docker-volume]# docker build -f /home/docker-volume/dockerfile1 -t jackie/centos .
#启动一下自己写的容器
[root@centos7.7 docker-volume]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
jackie/centos latest 00e23a3b8de9 26 seconds ago 215MB
[root@centos7.7 docker-volume]# docker run -it 00e23a3b8de9
/bin/bash
[root@c1028520d244 /]# ls
bin home lost+found opt run sys var
dev lib media proc sbin tmp volume01
etc lib64 mnt root srv usr volume02
[root@c1028520d244 /]#
这个卷和外部一定有个同步的目录!
FROM centos

VOLUME [“volume01”,“volume02”] 匿名挂载

CMD echo “-----end-----”
查看一下卷挂载路径
“Mounts”: [
{
“Type”: “volume”,
“Name”: “7a213bf086e081aa203177118ceca2a9d7e7a1549b96efc0cdda7447f59468ea”,
“Source”: “/var/lib/docker/volumes/7a213bf086e081aa203177118ceca2a9d7e7a1549b96efc0cdda7447f59468ea/_data”,
“Destination”: “volume01”,
“Driver”: “local”,
“Mode”: “”,
“RW”: true,
“Propagation”: “”
},
{
“Type”: “volume”,
“Name”: “9232e92ed22b87fe691e7160a4498292c997260730b3a6d6b0886b84bd92f60a”,
“Source”: “/var/lib/docker/volumes/9232e92ed22b87fe691e7160a4498292c997260730b3a6d6b0886b84bd92f60a/_data”,
“Destination”: “volume02”,
“Driver”: “local”,
“Mode”: “”,
“RW”: true,
测试一下刚才的文件是否同步出去了!
这种方式我们未来使用的非常多。应为我们通常会构建自己的镜像!
假设构建镜像时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径!
[root@6ec5ee102182 /]# cd volume01
[root@6ec5ee102182 volume01]# ls
[root@6ec5ee102182 volume01]# touch container.txt
[root@6ec5ee102182 volume01]# ls
container.txt
[root@centos7.7 data]# cd /var/lib/docker/volumes/7a213bf086e081aa203177118ceca2a9d7e7a1549b96efc0cdda7447f59468ea/_data
[root@centos7.7 _data]# ls
container.txt

数据卷容器
多个MySQL同步数据!
#启动3个容器,通过我们刚才自己写的镜像启动
docker01 #数据卷容器
[root@centos7.7 ~]# docker run -it --name docker01 jackie/centos
[root@ea50ef8be1d7 /]# ls
bin home lost+found opt run sys var
dev lib media proc sbin tmp volume01
etc lib64 mnt root srv usr volume02
[root@ea50ef8be1d7 /]# cd volume01
[root@ea50ef8be1d7 volume01]# ls
[root@ea50ef8be1d7 volume01]# touch docker01

[root@centos7.7 ~]# docker run -it --name docker02 --volumes-from docker01 jackie/centos
[root@9d7442ba473e /]# ls
bin home lost+found opt run sys var
dev lib media proc sbin tmp volume01
etc lib64 mnt root srv usr volume02
[root@9d7442ba473e /]# cd volume01
[root@9d7442ba473e volume01]# ls
docker01

[root@centos7.7 ~]# docker run -it --name docker03 --volumes-from docker01 jackie/centos
[root@9a0998eb0947 /]# ls
bin home lost+found opt run sys var
dev lib media proc sbin tmp volume01
etc lib64 mnt root srv usr volume02
[root@9a0998eb0947 /]# cd volume01
[root@9a0998eb0947 volume01]# ls
docker01
#测试:可以删除docker01,查看一下docker02和docker03是否可以访问这个文件
#测试依旧可以访问

多个MySQL实现数据共享
[root@centos7.7 home]# 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

[root@centos7.7 home]# docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name
mysql02 --volumes-from mysql01 mysql:5.7

[root@centos7.7 home]# docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name
mysql03 --volumes-from mysql01 mysql:5.7
#这时候,可以实现两个容器数据同步!

#结论
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有人使用为止
但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!

dockerfile
dockerfile是用来构建docker镜像的文件!命令参数脚本!
构建步骤
1编写一个dockerfile文件
2 docker build 构建成为一个镜像
3 docker run 运行镜像
4 docker push 发布镜像(docker hub,阿里云镜像仓库)
查看官方是怎么做的
FROM scratch
ADD centos-7-x86_64-docker.tar.xz /

LABEL
org.label-schema.schema-version=“1.0”
org.label-schema.name=“CentOS Base Image”
org.label-schema.vendor=“CentOS”
org.label-schema.license=“GPLv2”
org.label-schema.build-date=“20200809”
org.opencontainers.image.title=“CentOS Base Image”
org.opencontainers.image.vendor=“CentOS”
org.opencontainers.image.licenses=“GPL-2.0-only”
org.opencontainers.image.created=“2020-08-09 00:00:00+01:00”

CMD ["/bin/bash"]
很多官方镜像都是个基础包,很多功能没有,我们通常会自己搭建自己的镜像!

dockerfile 构建过程
基础知识:
1 每个保留关键字都是必须是大写字母
2 执行从上到下顺序执行
3 表示注释
4 每个指令都会提交一个新的镜像层,并提交

dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单
docker镜像逐渐成为企业交付的标准,必须要掌握!
步骤:开发,部署,运维。。。缺一不可!
dockerfile:构建文件,定义了一切的步骤,源代码
dockerimages:通过dockerfile构成生成的镜像,最终发布和运行的产品!
docker 容器:容器就是镜像运行起来提供服务器

dockerfile指令
以前我们就是使用别人的,现在我们知道了这些指令后,我们练习自己写个镜像
FROM #基础镜像,一切从这里开始构建
MAINTAINER #镜像是谁写的,姓名+邮箱
RUN #镜像构建需要运行的命令
ADD #步骤,tomcat镜像,这个tomcat压缩包!添加内容
WORKDIR #镜像的工作目录
VOLUME #挂载的目录
ESPOSE #保留端口配置
CMD #指定这个容器要启动的时候运行的命令,只有一个会生效,可被替代
ENTRYPOINT #指定这个容器启动时候要运行的命令,可以追加命令
ONBUILD #当构建一个被继承dockerfile 这个时候就会运行onbuild的指令,触发指令
COPY #类似ADD,将我们文件拷贝到镜像中
ENV #构建的时候设置环境变量! mysql

实战测试
docker hub 中99%镜像都是从这个基础镜像过来的FROM scratch,然后配置需要的软件和配置经行构建
FROM scratch
ADD centos-7-x86_64-docker.tar.xz /

LABEL
org.label-schema.schema-version=“1.0”
org.label-schema.name=“CentOS Base Image”
org.label-schema.vendor=“CentOS”
org.label-schema.license=“GPLv2”
org.label-schema.build-date=“20200809”
org.opencontainers.image.title=“CentOS Base Image”
org.opencontainers.image.vendor=“CentOS”
org.opencontainers.image.licenses=“GPL-2.0-only”
org.opencontainers.image.created=“2020-08-09 00:00:00+01:00”

CMD ["/bin/bash"]

创建自己的centos
#1 编写dockerfile的文件
FROM centos
MAINTAINER JACKIE123456@qq.com

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum install vim -y
RUN yum install net-tools -y

EXPOSE 80

CMD echo $MYPATH
CMD echo “----end----”
CMD /bin/bash
#2 通过文件构建镜像
#命令 docker build -f dockerfile文件路径 -t 镜像名:[tag]
[root@centos7.7 home]# mkdir dockerfile
[root@centos7.7 home]# ls
centos7.7 docker-volume jackie.java test.java
dockerfile jackie mysql
[root@centos7.7 home]# cd dockerfile
[root@centos7.7 dockerfile]# ls
[root@centos7.7 dockerfile]# vim dockerfile
[root@centos7.7 dockerfile]# docker build -f /home/dockerfile/dockerfile -t
jackie/centos02 .
Sending build context to Docker daemon 2.048kB
Step 1/10 : FROM centos
—> 0d120b6ccaa8
Step 2/10 : MAINTAINER JACKIE123456@qq.com
—> Running in d802a08fc6d0
Removing intermediate container d802a08fc6d0
—> a3d0f24832d4
Step 3/10 : ENV MYPATH /usr/local
—> Running in 65c19d39479e
Removing intermediate container 65c19d39479e
—> 1697d0ec55df
Step 4/10 : WORKDIR $MYPATH
—> Running in 5deb3fbf8b2c
Removing intermediate container 5deb3fbf8b2c
—> ff55becde9fe
Step 5/10 : RUN yum install vim -y
—> Running in 3ff9077501d3


Successfully built 080dd704df42
Successfully tagged jackie/centos02:latest

#测试运行
对比:之前的原生的centos
[root@centos7.7 ~]# docker run -it centos
[root@33812cea0f0a /]# pwd
/
[root@33812cea0f0a /]# vim
bash: vim: command not found
[root@33812cea0f0a /]# ifconfig
bash: ifconfig: command not found
[root@33812cea0f0a /]# exit
exit
我们自己写的镜像
[root@centos7.7 ~]# docker run -it jackie/centos02:latest
[root@51cc2bd0ab98 local]# ls
bin games lib libexec share
etc include lib64 sbin src
[root@51cc2bd0ab98 local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 8 bytes 656 (656.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

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

[root@51cc2bd0ab98 local]# vim jackie
我们可以列出本地镜像的变更历史
[root@centos7.7 dockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
jackie/centos02 latest 080dd704df42 10 minutes ago 295MB
jackie/centos latest 00e23a3b8de9 14 hours ago 215MB
[root@centos7.7 dockerfile]# docker history 080dd704df42
IMAGE CREATED CREATED BY SIZE COMMENT
080dd704df42 10 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" “-c” “/bin… 0B
0092cf329e9b 10 minutes ago /bin/sh -c #(nop) CMD [”/bin/sh" “-c” “echo… 0B
fd934939de5f 10 minutes ago /bin/sh -c #(nop) CMD [”/bin/sh" “-c” “echo… 0B
588003b700ab 10 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
65a70a507143 10 minutes ago /bin/sh -c yum install net-tools -y 22.8MB
7d7308358aa0 20 minutes ago /bin/sh -c yum install vim -y 57.3MB
ff55becde9fe 22 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
1697d0ec55df 22 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
a3d0f24832d4 22 minutes ago /bin/sh -c #(nop) MAINTAINER JACKIE<123456@… 0B
0d120b6ccaa8 2 months ago /bin/sh -c #(nop) CMD [”/bin/bash"] 0B
2 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
2 months ago /bin/sh -c #(nop) ADD file:538afc0c5c964ce0d… 215MB
我们平时拿到一个镜像,可以研究一下它是什么做的了?

CMD和ENTRYPOINTentrypoint 区别

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

测试cmd
#编写dockerfile文件
[root@centos7.7 dockerfile]# vim dockerfile02
FROM centos
CMD [“ls”, “-a”]
#构建镜像
[root@centos7.7 dockerfile]# docker build -f /home/dockerfile/dockerfile02 -t jackie/centos03 .
Successfully built 3a8c54cd7700
Successfully tagged jackie/centos03:latest
#run运行,发现我们ls -a 生效
[root@centos7.7 dockerfile]# docker run 3a8c54cd7700


.dockerenv
bin
dev
etc
home
lib
lib64
#想在后面加一个命令 -l ls -al
[root@centos7.7 dockerfile]# docker run 3a8c54cd7700 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349:
starting container process caused “exec: “-l”: executable file not found in $PATH”: unknown.

#cmd的清理下 -l 替换CMD[“ls”,"-a"] 命令,-l 不是命令所以报错!
[root@centos7.7 dockerfile]# docker run 3a8c54cd7700 ls -al
drwxr-xr-x. 1 root root 6 Oct 28 16:01 .
drwxr-xr-x. 1 root root 6 Oct 28 16:01 …
-rwxr-xr-x. 1 root root 0 Oct 28 16:01 .dockerenv
lrwxrwxrwx. 1 root root 7 May 11 2019 bin -> usr/bin
drwxr-xr-x. 5 root root 340 Oct 28 16:01 dev
drwxr-xr-x. 1 root root 66 Oct 28 16:01 etc
drwxr-xr-x. 2 root root 6 May 11 2019 home
lrwxrwxrwx. 1 root root 7 May 11 2019 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 May 11 2019 lib64 -> usr/lib64

测试entryportENTRYPOINT

[root@centos7.7 dockerfile]# vim dockerfile03
FROM centos
CMD [“ls”, “-a”]
[root@centos7.7 dockerfile]# docker build -f /home/dockerfile/dockerfile03
-t jackie/centos04 .
Successfully built 0af14611a792
Successfully tagged jackie/centos04:latest
[root@centos7.7 dockerfile]# docker run 0af14611a792
.

.dockerenv
bin
dev
etc
home
lib
lib64
#我们追加命令,是直接拼接在我们的ENTRYPOINT 命令的后面!
[root@centos7.7 dockerfile]# docker run 0af14611a792 -l
total 0
drwxr-xr-x. 1 root root 6 Oct 28 16:12 .
drwxr-xr-x. 1 root root 6 Oct 28 16:12 …
-rwxr-xr-x. 1 root root 0 Oct 28 16:12 .dockerenv
lrwxrwxrwx. 1 root root 7 May 11 2019 bin -> usr/bin
drwxr-xr-x. 5 root root 340 Oct 28 16:12 dev
drwxr-xr-x. 1 root root 66 Oct 28 16:12 etc
drwxr-xr-x. 2 root root 6 May 11 2019 home
lrwxrwxrwx. 1 root root 7 May 11 2019 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 May 11 2019 lib64 -> usr/lib64

实战:tomcat镜像
1 准备镜像文件tomcat 压缩包,jdk的压缩包
[root@centos7.7 home]# ls
centos7.7 docker-volume jackie.java test.java
dockerfile jackie mysql
[root@centos7.7 home]# cd jackie
[root@centos7.7 jackie]# ls
jackie.java
[root@centos7.7 jackie]# mkdir build
[root@centos7.7 jackie]# cd build
[root@centos7.7 build]# mkdir tomcat
[root@centos7.7 build]# cd tomcat
[root@centos7.7 tomcat]# ls
apache-tomcat-9.0.38.tar.gz jdk-8u221-linux-x64.tar.gz
[root@centos7.7 tomcat]# vim Dockerfile
[root@centos7.7 tomcat]# vim read.txt
[root@centos7.7 tomcat]# ll
总用量 201528
-rw-r–r--. 1 root root 11264531 10月 29 09:01 apache-tomcat-9.0.38.tar.gz
-rw-r–r--. 1 root root 0 10月 29 09:01 Dockerfile
-rw-r–r--. 1 root root 195094741 10月 29 09:01 jdk-8u221-linux-x64.tar.gz
-rw-r–r--. 1 root root 0 10月 29 09:02 read.txt
2 编写dockerfile文件,官方命名Dockerfile,build 会自动寻找这个文件,就不需要-f指定了
FROM centos

MAINTAINER JACKIE123456@qq.com

COPY read.txt /usr/local/read.txt

ADD jdk-8u221-linux-x64.tar.gz /usr/local/

ADD apache-tomcat-9.0.38.tar.gz /usr/local/

RUN yum install vim -y

ENV MYPATH /usr/local

WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH J A V A H O M E / d t . j a r : JAVA_HOME/dt.jar: JAVAHOME/dt.jar:JAVA_HOME/lib/tools.jar

ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.38
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.38

ENV PATH P A T H : PATH: PATH:JAVA_HOME/bin: C A T A L I N A H O M E / l i b : CATALINA_HOME/lib: CATALINAHOME/lib:CATALINA_
HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.38/bin/startup.sh && tail
-F /url/local/apache-tomcat-9.0.38/bin/logs/catalina.out
3 构建镜像
[root@centos7.7 tomcat]# touch read.txt
[root@centos7.7 tomcat]# ls
apache-tomcat-9.0.38.tar.gz jdk-8u221-linux-x64.tar.gz
Dockerfile read.txt
[root@centos7.7 tomcat]# docker build -t jackietomcat .
[root@centos7.7 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
jackietomcat latest 74da8c3d9465 2 m
#docker build -f /home/jackie/build/tomcat/Dockerfile -t tomcat02 .
Successfully built 391792477137
Successfully tagged tomcat02:latest
[root@centos7.7 tomcat]# docker run -d --name tomcat03 -p 9090:8080 -v /home/jackie/build/tomcat/jackie:/url/local/apache-tomcat-9.0.38/webapps/jackie -v /home/jackie/build/tomcat/tomcatlogs/:/url/local/apache-tomcat-9.0.38/logs jackietomcat
39d053d3a046c0b9046719fc17c444df446059177875eafbb8b26195c2fc8527

自定义网络
查看所有的dockers网络
[root@centos7.7 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
7681949d6473 bridge bridge local
103a12656932 host host local
dc35ae4a7f27 none null local
网络模式
bridge: 桥接docker(默认,自己创建也使用桥接)
none:不配置网络
host: 和宿主机共享网络
container:容器网络联通!
测试
#我们直接启动的命令 --net bridge,而这个就是我们的docker01
docker run -d -P --name tomcat01 --net bridge tomcat

#docker特点,默认,域名不能访问, --link可以打通连接

#我们可以自定义一个网络!
#–driver bridge
#–subnet 192.168.0.0/16 子网
#–gateway 192.168.0.1 网关
[root@centos7.7 ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
3727777b105fe854f86ece8e95bf5b364d61511f57de53c1a053772a5a119818
[root@centos7.7 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
7681949d6473 bridge bridge local
103a12656932 host host local
3727777b105f mynet bridge local
dc35ae4a7f27 none null local
我们自己的网络就创建好了
[root@centos7.7 ~]# docker network inspect mynet
{
“Name”: “mynet”,
{
“Subnet”: “192.168.0.0/16”,
“Gateway”: “192.168.0.1”
}
[root@centos7.7 ~]# docker run -d -P --name tomcatnet01 --net mynet tomcat
e75d7b0f0adc8b0e37be91e3606bf373249e66c840533e63790dc2264a28168d
[root@centos7.7 ~]# docker run -d -P --name tomcatnet02 --net mynet tomcat
17faef326ea776afec1ecd2bfc4993b1c402cb5087a7a15a59cc275d5e6e27b9
[root@centos7.7 ~]# docker network inspect mynet
“Name”: “tomcatnet02”,
“EndpointID”: “7ffd265cbcf35f79665219d4ad1369e2d8cf77c94c58846c24013c7a6e89c7da”,
“MacAddress”: “02:42:c0:a8:00:03”,
“IPv4Address”: “192.168.0.3/16”,
“IPv6Address”: “”
},
“e75d7b0f0adc8b0e37be91e3606bf373249e66c840533e63790dc2264a28168d”: {
“Name”: “tomcatnet01”,
“EndpointID”: “5100b7de3669a8440f79a4c2c67ad1aa72a457a67194b4393a760bc620371ce5”,
“MacAddress”: “02:42:c0:a8:00:02”,
“IPv4Address”: “192.168.0.2/16”,
[root@centos7.7 ~]# 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.101 ms
64 bytes from tomcatnet02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.104 ms
64 bytes from tomcatnet02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.102 ms
[root@centos7.7 ~]# docker exec -it tomcatnet01 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.144 ms
64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.109 ms
我们自定义的网络docker都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络!

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

网络联通问题 tomcat01和tomcat02是连接的docker0网络
测试打通 tomcat01 - mynet
[root@centos7.7 ~]# docker network --help
connect Connect a container to a network
[root@centos7.7 ~]# docker run -d -P --name tomcat01 tomcat
83889afe9691e74b39295acc5daccec2bb91ea42b96c9190c4b7ac93db3245cd
[root@centos7.7 ~]# docker run -d -P --name tomcat02 tomcat
6fef15a9d7114bd9b4ce07f33d9070c6839156de81c261f471e9a5a666ee449b
#联通之后就是将tomcat01放进了mynet网络上
#一个容器两个ip地址!
#阿里云服务:公网IP 私网IP
[root@centos7.7 ~]# docker network connect mynet tomcat01
[root@centos7.7 ~]# docker network inspect mynet
{
“Name”: “tomcat01”,
“EndpointID”: “d83a8f0126a4e2dd76a67ff5e22f2410e565dbde37a52759f7ec53e21adcb5ba”,
“MacAddress”: “02:42:c0:a8:00:04”,
“IPv4Address”: “192.168.0.4/16”,
“IPv6Address”: “”
},
#01 是联通的ok
[root@centos7.7 ~]# 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.077 ms
64 bytes from tomcatnet01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.121 ms
64 bytes from tomcatnet01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.127 ms
[root@centos7.7 ~]# docker exec -it tomcat01 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.262 ms
64 bytes from tomcatnet02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.123 ms
64 bytes from tomcatnet02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.184 ms
#02 是依旧打不同的
[root@centos7.7 ~]# docker exec -it tomcat02 ping tomcatnet01
ping: tomcatnet01: Name or service not known
[root@centos7.7 ~]# docker exec -it tomcat02 ping tomcatnet02
ping: tomcatnet02: Name or service not known

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值