Docker入门
Docker
Docker的基本组成


Docker的安装(CentOS7)
-
删除旧的
sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine -
需要的安装包
sudo yum install -y yum-utils -
设置镜像仓库
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软件包索引
yum makecache fast -
安装Docker
sudo yum install docker-ce docker-ce-cli containerd.io # ce 社区版 ee 企业版 -
启动docker
sudo systemctl start docker # 使用 docker version 查看docker是否安装成功 -
运行helloword
sudo docker run hello-world![]()
-
查看下载的helloword镜像
[hazy@aliyun ~]$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest bf756fb1ae65 8 months ago 13.3kB -
了解删除docker
# 1、卸载依赖 sudo yum remove docker-ce docker-ce-cli containerd.io # 2、删除资源 sudo rm -rf /var/lib/docker # /var/lib/docker docker的默认工作路径
阿里云镜像加速
-
登录阿里云找到容器镜像服务
![]()
-
找到镜像加速地址
![]()
-
配置使用
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://mql30vec.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
回顾HelloWorld的流程

docker run会发生什么

底层原理
-
docker是怎么工作的?
Docker是一个Client—Server结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问,DockerServer接收到Client的指令,就会执行该指令
![]()
-
Docker为什么比VM快
-
Docker有着比虚拟机更少的抽象层
-
docker利用的是宿主机的内核,vm 需要是Guest OS
![]()
-
Docker的常用命令
1. 帮助命令
docker version # 显示docker的版本信息
docker info # 显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help #万能命令
帮助文档:https://docs.docker.com/reference/
2. 镜像命令
-
docker images查看本地所有镜像[hazy@aliyun ~]$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest bf756fb1ae65 8 months ago 13.3kB # 解释 `REPOSITORY`:镜像的仓库源 `TAG`:镜像的标签 `IMAGE ID`:镜像的id `CREATED`:镜像的创建时间 `SIZE`:镜像的大小 # 可选项 -a, --all # 显示所有的镜像 -q, --quiet # 只显示镜像的id -
docker search搜索镜像[hazy@aliyun ~]$ sudo docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 9973 [OK] mariadb MariaDB is a community-developed fork of MyS… 3649 [OK] # 可选项,通过STARS过滤 --filter=STARS=3000 # 搜索出stars大于3000的镜像 [hazy@aliyun ~]$ sudo docker search mysql --filter=STARS=3000 NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 9973 [OK] mariadb MariaDB is a community-developed fork of MyS… 3649 [OK] -
docker pull下载镜像# 下载镜像docker pull 镜像名[:tag] [hazy@aliyun ~]$ sudo docker pull mysql Using default tag: latest # 如果不写tag,默认就是lastest latest: Pulling from library/mysql d121f8d1c412: Pull complete # 分层下载,docker image的核心 联合文件系统 f3cebc0b4691: Pull complete 1862755a0b37: Pull complete 489b44f3dbb4: Pull complete 690874f836db: Pull complete baa8be383ffb: Pull complete 55356608b4ac: Pull complete dd35ceccb6eb: Pull complete 429b35712b19: Pull complete 162d8291095c: Pull complete 5e500ef7181b: Pull complete af7528e958b6: Pull complete Digest: sha256:e1bfe11693ed2052cb3b4e5fa356c65381129e87e38551c6cd6ec532ebe0e808 # 签名 Status: Downloaded newer image for mysql:latest docker.io/library/mysql:latest # 真实地址,等价于 docker pull mysql # 指定下载版本 [hazy@aliyun ~]$ sudo docker pull mysql:5.7 5.7: Pulling from library/mysql d121f8d1c412: Already exists f3cebc0b4691: Already exists 1862755a0b37: Already exists 489b44f3dbb4: Already exists 690874f836db: Already exists baa8be383ffb: Already exists 55356608b4ac: Already exists 277d8f888368: Pull complete 21f2da6feb67: Pull complete 2c98f818bcb9: Pull complete 031b0a770162: Pull complete Digest: sha256:14fd47ec8724954b63d1a236d2299b8da25c9bbb8eacc739bb88038d82da4919 Status: Downloaded newer image for mysql:5.7 docker.io/library/mysql:5.7![]()
-
docker rmi删除镜像[hazy@aliyun ~]$ sudo docker rmi -f 容器id # 删除指定镜像 [hazy@aliyun ~]$ sudo docker rmi -f 容器id1 容器id2 容器id # 删除多个镜像 [hazy@aliyun ~]$ sudo docker rmi -f $(sudo docker images -aq) # 删除全部的镜像
3. 容器命令
说明:下载了镜像才可以创建容器,下载centos测试学习
sudo docker pull centos
-
docker run新建容器并启动docker run [可选参数] image # 参数说明 --name="Name" 容器名字,用来区分容器 -d 以后台方式运行 -it 使用交互方式运行,进入容器查看内容 -p 指定容器的端口 -p ip:主机端口:容器端口 -p 主机端口:容器端口(常用) -p 容器端口 容器端口 -P 随机指定端口 # 测试,启动并进入容器 [hazy@aliyun ~]$ sudo docker run -it centos /bin/bash [root@d42c8e91c211 /]# ls # 查看容器内的centos,基础版本,很多命令都不完善 bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var [root@d42c8e91c211 /]# exit # 从容器中退回主机 exit [hazy@aliyun ~]$ ls derby.log metastore_db wa.txt -
docker ps列出所有运行的容器# 参数 -a # 列出当前正在运行的容器及其以前运行过的容器 不加 # 列出当前运行的容器 -n=? # 显示最近运行的容器 -q # 只显示容器的编号 [hazy@aliyun ~]$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [hazy@aliyun ~]$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d42c8e91c211 centos "/bin/bash" 3 minutes ago Exited (0) About a minute ago musing_chatelet 152448dee633 bf756fb1ae65 "/hello" 4 days ago Exited (0) 4 days ago romantic_lederberg -
退出容器
exit # 直接退出容器并停止 ctrl + P + Q # 退出容器,但容器不停止 -
删除容器
docker rm 容器id # 删除指定的容器,不能删除正在运行的容器,如果要强制删除 rm -f docker rm -f $(docker ps -aq) # 删除所有的容器 docker ps -aq | xargs docker rm # 删除所有的容器 -
启动和停止容器
docker start 容器id # 启动容器 docker restart 容器id # 重启容器 docker stop 容器id # 停止当前正在运行容器 docker kill 容器id # 强制停止当前容器
常用其他命令
-
后台启动容器
# 命令 docker run -d 镜像名 [hazy@aliyun ~]$ sudo docker run -d centos # 问题:docker ps查看,发现centos停止了 # docker容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止 # nginx,容器启动后,发现没有提供的服务,就会立即停止 -
查看日志
docker logs -tf --tail 要显示的条数 容器id # 自己编写一段脚本 [hazy@aliyun ~]$ sudo docker run -d centos /bin/bash -c "while true;do echo wangshen;sleep 1;done" # 显示日志 -tf # 显示日志 --tail number # 显示日志条数 [hazy@aliyun ~]$ sudo docker logs -tf --tail 10 26685dc21434 -
查看容器中的进程
# 命令 docker top 容器id [hazy@aliyun ~]$ sudo docker top 26685dc21434 UID PID PPID C STIME TTY TIME CMD root 31331 31294 0 22:12 ? 00:00:00 /bin/bash -c while true;do echo wangshen;sleep 1;done root 31797 31331 0 22:18 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1 -
查看镜像的元数据
# 命令 docker inspect 容器id # 测试 [hazy@aliyun ~]$ sudo docker inspect 26685dc21434 [ { "Id": "26685dc21434faa126cdfe6fac3c09a018657ee82c7ae1a7cc7b142ae33dda37", "Created": "2020-09-19T14:12:38.280342318Z", "Path": "/bin/bash", "Args": [ "-c", "while true;do echo wangshen;sleep 1;done" ], "State": { "Status": "running", "Running": true, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 31331, "ExitCode": 0, "Error": "", "StartedAt": "2020-09-19T14:12:38.543177605Z", "FinishedAt": "0001-01-01T00:00:00Z" }, "Image": "sha256:0d120b6ccaa8c5e149176798b3501d4dd1885f961922497cd0abef155c869566", "ResolvConfPath": "/var/lib/docker/containers/26685dc21434faa126cdfe6fac3c09a018657ee82c7ae1a7cc7b142ae33dda37/resolv.conf", "HostnamePath": "/var/lib/docker/containers/26685dc21434faa126cdfe6fac3c09a018657ee82c7ae1a7cc7b142ae33dda37/hostname", "HostsPath": "/var/lib/docker/containers/26685dc21434faa126cdfe6fac3c09a018657ee82c7ae1a7cc7b142ae33dda37/hosts", "LogPath": "/var/lib/docker/containers/26685dc21434faa126cdfe6fac3c09a018657ee82c7ae1a7cc7b142ae33dda37/26685dc21434faa126cdfe6fac3c09a018657ee82c7ae1a7cc7b142ae33dda37-json.log", "Name": "/eloquent_antonelli", "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/6b658735467d3515bfc2e860695501c07fdec1c88335840ab82d7b6143d89272-init/diff:/var/lib/docker/overlay2/1c71dacf8277362d85bbeb318f6ec84c2cde7768dddc40b31a50eadfd840c694/diff", "MergedDir": "/var/lib/docker/overlay2/6b658735467d3515bfc2e860695501c07fdec1c88335840ab82d7b6143d89272/merged", "UpperDir": "/var/lib/docker/overlay2/6b658735467d3515bfc2e860695501c07fdec1c88335840ab82d7b6143d89272/diff", "WorkDir": "/var/lib/docker/overlay2/6b658735467d3515bfc2e860695501c07fdec1c88335840ab82d7b6143d89272/work" }, "Name": "overlay2" }, "Mounts": [], "Config": { "Hostname": "26685dc21434", "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/bash", "-c", "while true;do echo wangshen;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": "a875bd48cf0c83e5e46a6a6f885b3e4e1000c28c38fdef278451ec2a21ff128c", "HairpinMode": false, "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "Ports": {}, "SandboxKey": "/var/run/docker/netns/a875bd48cf0c", "SecondaryIPAddresses": null, "SecondaryIPv6Addresses": null, "EndpointID": "c313fa22351ea555b068d1084fabf329ec08762736f6b795248211f6139a9027", "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": "b342722d27a3261011938cb70388ce8d29ef932ef37b54df4ed329eabbed6b64", "EndpointID": "c313fa22351ea555b068d1084fabf329ec08762736f6b795248211f6139a9027", "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 # 测试 [hazy@aliyun ~]$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 26685dc21434 centos "/bin/bash -c 'while…" 16 minutes ago Up 16 minutes eloquent_antonelli [hazy@aliyun ~]$ sudo docker exec -it 26685dc21434 /bin/bash [root@26685dc21434 /]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 14:12 ? 00:00:00 /bin/bash -c while true;do echo wangshen;sleep 1;done root 1025 0 0 14:29 pts/0 00:00:00 /bin/bash root 1044 1 0 14:29 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep root 1045 1025 0 14:29 pts/0 00:00:00 ps -ef # 方式二 docker attach 容器id # 测试 [hazy@aliyun ~]$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 26685dc21434 centos "/bin/bash -c 'while…" 21 minutes ago Up 21 minutes eloquent_antonelli [hazy@aliyun ~]$ sudo docker attach 26685dc21434 正在执行当前的代码... # 区别 # docker exec # 进入容器后开启一个新的终端 # docker attach # 进入容器正在运行的终端,不会启动新的进程 -
从容器内拷贝文件到主机
# 命令 docker cp 容器id:容器内的文件路径 要拷贝到的本机路径 # 查看当前主机路径下的文件 [hazy@aliyun home]$ ls hazy [hazy@aliyun home]$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 26685dc21434 centos "/bin/bash -c 'while…" 31 minutes ago Up 31 minutes eloquent_antonelli # 进入容器内创建文件并退出 [hazy@aliyun home]$ sudo docker exec -it 26685dc21434 /bin/bash [root@26685dc21434 /]# cd home [root@26685dc21434 home]# touch test.java [root@26685dc21434 home]# ls test.java [root@26685dc21434 home]# exit exit # 拷贝容器中的文件到主机 [hazy@aliyun home]$ sudo docker cp 26685dc21434:/home/test.java ./ [hazy@aliyun home]$ ls hazy test.java
可视化
-
portainer(先使用这个)
Docker的图形化管理工具,提供一个后台面板供我们操作Docker
docker run -d -p 8088:9000 \ --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer访问测试:http://39.99.151.61:8089/
创建用户:
![]()
选择红框:
![]()
管理界面:
![]()
备注:平时不会使用 -
Rancher(CI/CD再使用)
Docker镜像讲解
镜像是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需要的所有内容,包括代码、运行时、库、环境变量和配置文件。
所有的应用可直接打包成Docker镜像,直接运行
如何获取镜像:
- 从远程仓库下载
- 从他人那拷贝
- 自己制作一个镜像DockerFile
Docker镜像加载原理
UnionFS(联合文件系统)
联合文件系统:联合文件系统是一种分层、轻量级的高性能文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同的目录挂载到同一个虚拟文件系统下。联合文件系统是Docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外表看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
Docker镜像加载原理


分层理解





commit镜像
docker commit 提交容器成为一个新的副本
# 命令
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
实战测试:
# 1、启动一个默认的tomcat
# 2、发现这个默认的tomcat是没有webapps应用,官方的镜像默认webapps下是没有文件的
# 3、自己拷贝基本的文件进去
# 4、将我们操作过的容器通过commit提交为一个镜像,我们以后就使用我们修改过的镜像即可

容器数据卷
什么是容器数据卷
docker理念回顾
将应用和环境打包成一个镜像
如果数据在容器中,我们把容器删除了,数据就会丢失;需求:数据可以持久化
容器间可以有一种数据共享的技术,让Docker容器中产生的数据可以同步到本地,这就是卷技术!目录的挂载,我们将容器内的目录挂载到linux上!

总结:容器中数据的持久化和同步操作,容器间也是可以数据共享的
使用数据卷
方式一:直接使用命令来挂载 -v
docker run -it -v 主机目录:容器内目录
# 测试
[hazy@aliyun ~]$ sudo docker run -it -v /home/ceshi:/home centos /bin/bash
# 启动起来之后可以通过 docker inspect 容器id 查看挂载是否成功

测试文件的同步:

再来测试:
1、 停止容器
2、宿主机上修改文件
3、启动容器
4、容器内的数据依旧是同步的

好处:我们以后需要修改配置文件时,只需在本地修改,容器内会自动同步
实战:安装MySQL
思考:MySQL数据持久化的问题!
# 拉取镜像
[hazy@aliyun ~]$ sudo docker pull mysql:5.7
# 启动容器,需要做数据挂载,注意:安装启动mysql需要配置密码
# 官方测试:docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
# 启动
-d 后台运行
-p 端口映射
-v 卷挂载
--name 容器名字
[hazy@aliyun ~]$ sudo docker run -d -p 3301:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name=mysql01 mysql:5.7
# 启动成功后,在本地进行测试连接

将容器删除后,同步到本地的数据也不会删除
具名和匿名挂载


初识DockerFile






数据卷容器(容器与容器间的数据同步)

DockerFile
DockerFile介绍
dockerfile是用来构建docker镜像的文件,命令参数脚本!
构建步骤:
-
编写一个dockerfile文件;
-
docker build 构建成一个镜像;
-
docker run 运行一个镜像;
-
docker push 发布一个镜像(Docker Hub,阿里源镜像仓库);
DockerFile构建过程
- 每个保留关键字都必须是大写的;
- 执行从上到下顺序执行;
- # 表示注释;
- 每个指令都会创建提交一个新的镜像层,并提交;

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


实战测试
Docker Hub中99%的镜像都是从基础镜像scratch开始的,然后配置所需要的软件和文件来进行构建!

创建一个centos
# 1、编写dockerfile文件
[hazy@aliyun mydockerfile]$ cat mydockerfile
FROM centos
MAINTAINER wang<23456732@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD $MYPATH
CMD echo "---end---"
CMD /bin/bash
# 2、通过文件构建镜像
# docker build -f dockerfile文件路径 -t 镜像名:[tag] .
Successfully built 50e2cbb62c9d
Successfully tagged mycentos:1.0
# 3、测试运行
对比:官方的centos

增加后的镜像:

列出本地进行的变更历史:

CMD和ENTRYPOINT的区别




实战:Tomcat镜像
-
准备tomcat的压缩包,jdk的压缩包
![]()
-
编写dockerfile文件,官方命名
Dockerfile,build时会自动寻找该文件,不需要 -f 来指定FROM centos MAINTAINET wang<23456765432@qq.com> COPY readme.txt /usr/local/readme.txt ADD jdk-8u144-linux-x64.tar.gz /usr/local/ ADD apache-tomcat-9.0.38.tar.gz /usr/local/ RUN yum -y install vim ENV MYPATH /usr/local WORKDIR $MYPATH ENV JAVA_HOME /usr/local/jdk1.8.0_144 ENV CLASSPATH $JAVA_HOME/lib/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 $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin EXPOSE 8080 CMD /usr/local/apache-tomcat-9.0.38/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.38/bin/logs/catalina.out -
构建镜像
# docker build -t diytomcat . -
启动容器
sudo docker run -d -p 9090:8080 --name diytomcat01 -v /home/tomcat/test:/usr/local/apache-tomcat-9.0.38/webapps/test -v /home/tomcat/logs/:/usr/local/apache-tomcat-9.0.38/bin/logs diytomcat -
访问测试
-
发布项目(由于做了卷挂载,我们直接在本地编写项目就可以发布了)
<!--web.xml--> <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>db</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> </web-app><!--index.jsp--> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <!DOCTYPE html PUBLIC "-//W3C//DTD//XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"/> <title>九九乘法表</title> </head> <body> <br/> <form id="form1" name="form1" method="post" action="result.jsp"> <p align="center">请输入两个自然数给您打印乘法表</p> <p align="center">要求:startNumber <endNumber <br/></p> <table width="350" border="1" align="center" cellpadding="0" cellspacing="0" bgcolor="#aaccdd" bordercolor="#cccccc"> <tr> <td width="101">startNumber:</td> <td width="113"> <label> <input name="s" type="text" id="textfield" size="15" maxlength="8" height="20"/> </label> </td> <td width="68"> <br/></td> </tr> <tr> <td>endNumber</td> <td> <label> <input name="e" type="text" id="textfield2" size="15" maxlength="8" height="20"/> </label> </td> <td> <br/></td> </tr> <tr> <td> </td> <td> <label> <input type="submit" name="button" id="button" value="submit"/> <input name="button2" type="reset" id="button2" value="reset"/> </label> </td> <td> </td> </tr> </table> </form> </body> </html>
发布镜像
-
在DockerHub上注册自己的账号,地址:https://hub.docker.com/
-
在服务器上提交自己的镜像
[hazy@aliyun logs]$ sudo docker login --help Usage: docker login [OPTIONS] [SERVER] Log in to a Docker registry. If no server is specified, the default is defined by the daemon. Options: -p, --password string Password --password-stdin Take the password from stdin -u, --username string Username![]()
-
登录完毕后提交镜像,使用
docker push命令![]()
发布到阿里云镜像服务上


小结:

Docker网络
理解Docker0


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

2、在启动一个容器:


3、测试发现tomcat01和tomcat02可以ping通


小结

Docker中所有的网络接口都是虚拟的,虚拟的转发效率高!
自定义网络
查看所有的docker网络

网络模式
- bridge:桥接模式(自定义网络也使用桥接模式)
- none:不配置网络
- host:仅主机模式,和宿主机共享网络
- container:容器网络联通(用得少,局限性大)
测试
# 直接启动命令 --net bridge
sudo docker run -d -P --name tomcat01 tomcat
sudo docker run -d -P --name tomcat01 --net bridge(默认) tomcat
# docker0 的特点:默认,域名不能访问,--link可以打通连接
# 自定义网络
[hazy@aliyun ~]$ sudo docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
de1d06de975d7b96ceef2e68edeb8443775fc7e1520cae31c1de43d04a2b9390
[hazy@aliyun ~]$ sudo docker network ls
NETWORK ID NAME DRIVER SCOPE
b342722d27a3 bridge bridge local
79a3e22287f2 host host local
de1d06de975d mynet bridge local
14b0c6356a89 none null local
自定义网络创建成功:

[hazy@aliyun ~]$ sudo docker network inspect mynet
[
{
"Name": "mynet",
"Id": "de1d06de975d7b96ceef2e68edeb8443775fc7e1520cae31c1de43d04a2b9390",
"Created": "2020-09-26T16:48:00.573838029+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": {
"15bbeaaffa449e8da673a3c50807910622601430f1b367ee3150d7630e6e0369": {
"Name": "tomcat-net-02",
"EndpointID": "c05556431fb1c0b1e20b3f9777a0eed6e57ab374d70a8c2b805a38160cb3e1e3",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
},
"8eac1f2b5d05af82bd2f79b4d075550902f96b4433865432b3d6dcc7179dafb2": {
"Name": "tomcat-net-01",
"EndpointID": "3f0aa0dfeeb8b34732d1c37cbe57cf632dabfb086352d69eeecd62802210626b",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
# 测试ping连接
[hazy@aliyun ~]$ sudo 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.082 ms
64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.049 ms
64 bytes from 192.168.0.3: icmp_seq=3 ttl=64 time=0.051 ms
^C
--- 192.168.0.3 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.049/0.060/0.082/0.017 ms
# 现在不使用--link也可通过名字ping通
[hazy@aliyun ~]$ sudo 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.046 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.051 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.050 ms
^C
--- tomcat-net-02 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.046/0.049/0.051/0.002 ms

网络连通


# 测试打通tomcat01 - mynet
# 结果,直接将tomcat01放到 mynet网络下
# 一个容器两个ip

# 01 ping通
[hazy@aliyun ~]$ sudo docker exec -it tomcat01 ping tomcat-net-01
PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.066 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.053 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.050 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=4 ttl=64 time=0.052 ms
^C
--- tomcat-net-01 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.050/0.055/0.066/0.008 ms
# 02 未ping通
[hazy@aliyun ~]$ sudo docker exec -it tomcat02 ping tomcat-net-01
ping: tomcat-net-01: Name or service not known
结论:若要跨网络访问,就需要使用docker network connect 网络 容器命令连通!













浙公网安备 33010602011771号