5.容器数据卷
1.什么是容器数据卷
docker理念回顾
将应用和环境打包成一个镜像!
数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化
MySQL,容器删了,删库跑路!需求:MySQL数据可以存储在本地!
容器之间可以有一个数据共享技术!Docker容器中产生的数据,同步到本地!
这就是卷技术,目录的挂载,将我们容器内的目录挂载到linux目录上面!
总结:容器的持久化和同步操作!容器间数据也是可以共享的!
2.使用数据卷
方式一:直接使用命令来挂载 -v
docker run -it -v 主机目录:容器目录
[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker run -it -v /home/ceshi:/home centos /bin/bash
启动之后新开一个窗口,通过 docker inspect 容器id 查看具体挂载的内容
测试文件的同步(在主机上改动,观察容器变化)
再来测试
-
1.停止容器,然后在主机上修改文件
-
2.启动并进入容器,查看容器内数据,容器内的数据依旧是同步的!
好处:我们以后修改只需要在本地修改即可,容器内会自动同步!
1.实战:mysql
思考:MySQL的数据持久化的问题!
# 获取镜像
[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# 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@iZ2zeg4ytp0whqtmxbsqiiZ 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=000000 --name mysql01 mysql:5.7
4e380de478d6ce69e23c4253e03c2beb9482ac2c300be9a9bc6f499b94882c7e
- 1.启动成功之后,将阿里云服务器打开安全组3310端口
- 2.我们在本地使用navicat链接测试一下
- 3.查看本地目录和myql目录
[root@iZ8vbgi1zpv4do6camhur3Z home]# ls
ceshi kuangshen mysql redis www
[root@iZ8vbgi1zpv4do6camhur3Z home]# cd mysql
[root@iZ8vbgi1zpv4do6camhur3Z mysql]# ls
conf data
[root@iZ8vbgi1zpv4do6camhur3Z mysql]# cd data
[root@iZ8vbgi1zpv4do6camhur3Z data]# ls
auto.cnf ca.pem client-key.pem ibdata1 ib_logfile1 mysql private_key.pem server-cert.pem sys
ca-key.pem client-cert.pem ib_buffer_pool ib_logfile0 ibtmp1 performance_schema public_key.pem server-key.pem
- 4.在本地测试创建一个数据库,查看下我们的路径是否ok!
2.删除容器
问题:那我们将mysql容器删除,卷还在嘛?
[root@iZ8vbgi1zpv4do6camhur3Z home]# docker ps #查看正在运行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4e380de478d6 mysql:5.7 "docker-entrypoint.s…" 40 minutes ago Up 40 minutes 33060/tcp, 0.0.0.0:3310->3306/tcp, :::3310->3306/tcp mysql01
[root@iZ8vbgi1zpv4do6camhur3Z home]# docker stop 4e380de478d6 #停止容器
4e380de478d6
[root@iZ8vbgi1zpv4do6camhur3Z home]# docker rm -f mysql01 #删除容器
mysql01
[root@iZ8vbgi1zpv4do6camhur3Z home]# docker ps -a #查看容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e6836cef1437 centos "/bin/bash" About an hour ago Exited (0) 56 minutes ago friendly_hugle
删除之后,去主机的data目录查看
[root@iZ8vbgi1zpv4do6camhur3Z home]# ls
ceshi kuangshen mysql redis www
[root@iZ8vbgi1zpv4do6camhur3Z home]# cd mysql
[root@iZ8vbgi1zpv4do6camhur3Z mysql]# ls
conf data
[root@iZ8vbgi1zpv4do6camhur3Z mysql]# cd data
[root@iZ8vbgi1zpv4do6camhur3Z data]# ls
auto.cnf ca.pem client-key.pem ibdata1 ib_logfile1 performance_schema public_key.pem server-key.pem test
ca-key.pem client-cert.pem ib_buffer_pool ib_logfile0 mysql private_key.pem server-cert.pem sys
发现,我们加载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能!
3.匿名和具名挂载
匿名挂载
-v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx # -P 随机指定端口
# 查看所有volume(卷)的情况
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker volume ls
DRIVER VOLUME NAME
local 561b81a03506f31d45ada3f9fb7bd8d7c9b5e0f826c877221a17e45d4c80e096
local 36083fb6ca083005094cbd49572a0bffeec6daadfbc5ce772909bb00be760882
# 这里发现,这种情况就是匿名挂载,我们在-v 后面只写了容器内的路径,没有写容器外的路径!
具名挂载
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
26da1ec7d4994c76e80134d24d82403a254a4e1d84ec65d5f286000105c3da17
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
26da1ec7d499 nginx "/docker-entrypoint.…" 3 seconds ago Up 2 seconds 0.0.0.0:32769->80/tcp nginx02
486de1da03cb nginx "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 0.0.0.0:32768->80/tcp nginx01
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker volume ls
DRIVER VOLUME NAME
local 561b81a03506f31d45ada3f9fb7bd8d7c9b5e0f826c877221a17e45d4c80e096
local 36083fb6ca083005094cbd49572a0bffeec6daadfbc5ce772909bb00be760882
local juming-nginx
# 通过-v 卷名:容器内的路径
# 查看一下这个卷
# docker volume inspect juming-nginx
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker volume inspect juming-nginx
[
{
"CreatedAt": "2020-08-12T18:15:21+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
所有docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxxxx/_data
我们通过具名挂载可以方便的找到我们的一个卷,大多数情况下使用的是具名挂载
# 如何确定是具名挂载还是匿名挂载,还是指定路径挂载!
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /主机路径:容器内路径 # 指定路径挂载
拓展
默认的权限是rw
# 通过 -v 容器内容路径 ro rw 改变读写权限
ro readonly # 只读
rw readwrite # 可读可写
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内容无法操作
3.DockerFile
DockerFile就是用来构建docker镜像的构建文件!命令脚本!
[root@iZ8vbgi1zpv4do6camhur3Z home]# mkdir docker-test-colume
[root@iZ8vbgi1zpv4do6camhur3Z home]# ls
ceshi docker-test-colume kuangshen mysql redis www
[root@iZ8vbgi1zpv4do6camhur3Z home]# cd docker-test-colume/
[root@iZ8vbgi1zpv4do6camhur3Z docker-test-colume]# clear
[root@iZ8vbgi1zpv4do6camhur3Z docker-test-colume]# pwd
/home/docker-test-colume
通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层!
# 创建一个dockerfile文件
vim dockerfile1
# 文件的内容 指定(大写) 参数
#按i进入编辑模式,输入
FROM centos
VOLUME ["volume01", "volume02"]
CMD echo "----end----"
CMD /bin/bash
#按esc,退出编辑模式
:wq
# 这里的每一个命令都是镜像的一层!
构建并查看镜像
[root@iZ8vbgi1zpv4do6camhur3Z docker-test-colume]# cat dockerfile1 #查看文件
FROM centos
VOLUME ["volume01", "volume02"]
CMD echo "----end----"
CMD /bin/bash
[root@iZ8vbgi1zpv4do6camhur3Z docker-test-colume]# docker build -f dockerfile1 -t shuangma/contos:1.0 . #构建
[+] Building 0.1s (5/5) FINISHED
=> [internal] load build definition from dockerfile1 0.0s
=> => transferring dockerfile: 121B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/centos:latest 0.0s
=> [1/1] FROM docker.io/library/centos 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:0282d836c4f5ab8268cf4ebcf33ca7109bd03217f82358c4fa764466139852f2 0.0s
=> => naming to docker.io/shuangma/contos:1.0 0.0s
[root@iZ8vbgi1zpv4do6camhur3Z docker-test-colume]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 c20987f18b13 14 months ago 448MB
shuangma/contos 1.0 0282d836c4f5 17 months ago 231MB
centos latest 5d0da3dc9764 17 months ago 231MB
这个卷和外部一定有一个同步的目录!
- 在volume01里创建一个文件
[root@iZ8vbgi1zpv4do6camhur3Z docker-test-colume]# docker run -it 0282d836c4f5 /bin/bash
[root@d5ffb179942a /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume01 volume02
[root@d5ffb179942a /]# cd volume01
[root@d5ffb179942a volume01]# ls
[root@d5ffb179942a volume01]# touch container.txt
[root@d5ffb179942a volume01]# ls
container.txt
- 查看容器信息,寻找卷挂载的路径
[root@iZ8vbgi1zpv4do6camhur3Z ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d5ffb179942a 0282d836c4f5 "/bin/bash" 2 minutes ago Up 2 minutes infallible_villani
[root@iZ8vbgi1zpv4do6camhur3Z ~]# docker inspect d5ffb179942a
进入到匿名挂载卷里的文件是否同步
[root@iZ8vbgi1zpv4do6camhur3Z ~]# cd /var/lib/docker/volumes/f49d8938103d318672f59bf34cf7c840bb920cb20ceffc0ce263c971d0973e4f/_data
[root@iZ8vbgi1zpv4do6camhur3Z _data]# ls
container.txt
4.数据卷容器
多个mysql同步数据!
启动3个容器,通过我们刚才自己写的镜像启动
- 1.启动docker01
[root@iZ8vbgi1zpv4do6camhur3Z home]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 c20987f18b13 14 months ago 448MB
centos latest 5d0da3dc9764 17 months ago 231MB
shuangma/contos 1.0 0282d836c4f5 17 months ago 231MB
[root@iZ8vbgi1zpv4do6camhur3Z home]# docker run -it --name docker01 0282d836c4f5
[root@2ce5e311bb81 /]# ls -l
- 2.ctrl+p+q退出并不关闭容器docker01,然后启动docker02(这里继承并挂载docker01)
[root@40980c48f0f4 /]# [root@iZ8vbgi1zpv4do6camhur3Z ~]# clear
[root@iZ8vbgi1zpv4do6camhur3Z ~]# docker run -it --name docker02 --volumes-from docker01 0282d836c4f5
- 3.新开一个会话进入docker01容器,在volume01里创建一个文件夹,然后查看docker02容器的colume01里有没有,发现有的
[root@iZ8vbgi1zpv4do6camhur3Z /]# docker attach 40980c48f0f4
[root@40980c48f0f4 /]# cd volume01
[root@40980c48f0f4 volume01]# ls
[root@40980c48f0f4 volume01]# touch docker01
[root@40980c48f0f4 volume01]# ls
docker01
- 4.再新建一个容器docker03继承挂载docker01容器查看
- 5.docker03新建一个文件查看docke01和02的内容,发现也是存在的
- 6.这里想一下,docker02和03都挂载在docker01上,如果把docker01给删掉,那里面的内容还会不会在呢,结果是还是会在的
多个mysql实现数据共享
[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker run -d -p 3344:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker run -d -p 3344:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
结论
容器之间配置信息的传递, 数据卷容器的声明周期一直持续到没有容器使用为止。
但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!
6.DockerFile
1.DockerFile介绍
dockerFile是用来构建docker镜像的文件!命令参数脚本!
构建步骤:
- 1. 编写一个dockerFile文件
- 2.docker build 构建成为一个镜像
- 3. docker run 运行镜像
- 4. docker push 发布镜像(DockerHub、阿里云镜像)
查看一下官方是怎么做的?
很多官方镜像都像是基础包,很多功能都不具备,我们通常会自己搭建自己的镜像!
官方既然可以制作镜像,那我们一样可以!
2.DockerFile的构建过程
基础知识:
- 每个保留关键字(指令)都是必须大写字母
- 执行从上到下顺序执行
#
表示注释- 每个指令都会创建提交一个新的镜像层,并提交!
dockerFile是面向开发的, 我们以后要发布项目, 做镜像, 就需要编写dockefile文件, 这个文件十分简单!
Docker镜像逐渐成为企业的交互标准,必须要掌握!
步骤:开发,部署, 运维..... 缺一不可!
DockerFile:构建文件, 定义了一切的步骤,源代码
DockerImages:通过DockerFile构建生成的镜像, 最终发布和运行的产品!
Docker容器:容器就是镜像运行起来提供服务器
3.DockerFile指令
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的, 姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤, tomcat镜像, 这个tomcat压缩包!添加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 声明端口配置
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令, 可以追加命令
ONBUILD # 当构建一个被继承DockerFile 这个时候就会运行 ONBUILD 的指令,触发指令
COPY # 类似ADD, 将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量!
1.创建一个自己的centos
- 1.创建一个文件夹,然后编写Dockerfile文件
[root@iZ8vbgi1zpv4do6camhur3Z home]# mkdir dockerfile
[root@iZ8vbgi1zpv4do6camhur3Z home]# cd dockerfile/
[root@iZ8vbgi1zpv4do6camhur3Z dockerfile]# vim mydockerfile-centos
[root@iZ8vbgi1zpv4do6camhur3Z dockerfile]# cat mydockerfile-centos
FROM centos:7
MAINTAINER shuangma<21212121212@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash
- 2. 通过这个文件构建镜像
# 命令 docker build -f dockerfile文件路径 -t 镜像名:[tag] .
docker build -f mydockerfile-centos -t mycentos:0.1 .
- 3.测试运行
查看镜像,使用原生centos的命令,使用自己镜像里下载的命令
[root@iZ8vbgi1zpv4do6camhur3Z dockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 0.1 7a745cbdcbc3 2 minutes ago 630MB
mysql 5.7 c20987f18b13 14 months ago 448MB
centos latest 5d0da3dc9764 17 months ago 231MB
shuangma/contos 1.0 0282d836c4f5 17 months ago 231MB
[root@iZ8vbgi1zpv4do6camhur3Z dockerfile]# docker run -it centos
[root@50ecddf32722 /]# pwd
/
[root@50ecddf32722 /]# vim
bash: vim: command not found
[root@50ecddf32722 /]# exit
exit
[root@iZ8vbgi1zpv4do6camhur3Z dockerfile]# docker run -it mycentos:0.1
[root@118b7117b6ea local]# pwd
/usr/local
[root@118b7117b6ea local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.18.0.3 netmask 255.255.0.0 broadcast 172.18.255.255
ether 02:42:ac:12:00:03 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@118b7117b6ea local]# vim test
[root@118b7117b6ea local]# cat test
1
- 4.查看构建历史
docker history 容器id
2.CMD和ENTRYPOINT区别
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效 可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令, 可以追加命令
测试CMD
- 1.创建一个dockerfile文件,编写然后构建,然后运行
[root@iZ8vbgi1zpv4do6camhur3Z dockerfile]# vim dockerfile-cmd-test
[root@iZ8vbgi1zpv4do6camhur3Z dockerfile]# cat dockerfile-cmd-test
FROM centos:7
CMD ["ls","-a"]
[root@iZ8vbgi1zpv4do6camhur3Z dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest .
[root@iZ8vbgi1zpv4do6camhur3Z dockerfile]# docker run d53776618e7ca21294bf0d76a1042fa5976f2b0992727c1122ede2900cd8ba93
- 2.这里想追加一个命令,但是报错了,cmd的情况下 -l替换了CMD["ls", "-a"]命令, -l不是命令,所以报错了
[root@iZ8vbgi1zpv4do6camhur3Z dockerfile]# docker run d53776618e7ca21294bf0d76a1042fa5976f2b0992727c1122ede2900cd8ba93 -l
docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "-l": executable file not found in $PATH: unknown.
测试ENTRYPOINT
- 1.创建一个dockerfile文件,编写然后构建,然后运行
[root@iZ8vbgi1zpv4do6camhur3Z dockerfile]# vim dockerfile-cmd-entrypoint
[root@iZ8vbgi1zpv4do6camhur3Z dockerfile]# cat dockerfile-cmd-entrypoint
FROM centos:7
ENTRYPOINT ["ls","-a"]
[root@iZ8vbgi1zpv4do6camhur3Z dockerfile]# docker build -f dockerfile-cmd-entrypoint -t entrypoint-test .
- 2.这里添加一个l查看与cmd的区别,并不会报错,并且直接追加到句子里面了
4.Dockerfile制作tomcat镜像
- 1.准备镜像文件 tomcat压缩包,jdk的压缩包!
这里我直接xftp工具了,因为之前在学习linux的时候下载过tomcat和jdk的包,直接复制一份到一个新文件夹中
- 2.编写Dockerfile文件,官方命名
Dockerfile
, build会自动寻找这个文件,就不需要-f指定了!
[root@iZ8vbgi1zpv4do6camhur3Z tomcat]# touch readme.txt
[root@iZ8vbgi1zpv4do6camhur3Z tomcat]# vim Dockerfile
[root@iZ8vbgi1zpv4do6camhur3Z tomcat]# cat Dockerfile
FROM centos:7
MAINTAINER shuangma<4042@qq.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u361-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.69.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_361
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.69
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.69
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.69/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.69/bin/logs/catalina.out
- 3.构建镜像
docker build -t diytomcat .
- 4.启动镜像
docker run -d -p 3344:8080 --name shuangmatomcat1 -v /home/kuangshen/build/tomcat/test:/usr/local/apache-tomcat-9.0.69/webapps/test -v /home/kuangshen/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.69/logs diytomcat
- 5.去宿主机进行本地访问测试,发现没问题,然后再去使用阿里云服务器开启的3344端口的地址也发现没问题
curl localhost:3344
-
6.发布项目(由于做了卷挂载, 我们直接在本地编写项目就可以发布了)
[root@iZ8vbgi1zpv4do6camhur3Z test]# mkdir WEB-INF
[root@iZ8vbgi1zpv4do6camhur3Z test]# ls
WEB-INF
[root@iZ8vbgi1zpv4do6camhur3Z test]# cd WEB-INF/
[root@iZ8vbgi1zpv4do6camhur3Z WEB-INF]# vim web.xml
[root@iZ8vbgi1zpv4do6camhur3Z WEB-INF]# cat web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
</web-app>
[root@iZ8vbgi1zpv4do6camhur3Z WEB-INF]# cd ..
[root@iZ8vbgi1zpv4do6camhur3Z test]# vim index.jsp
[root@iZ8vbgi1zpv4do6camhur3Z test]# cat index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>hello. xiaofan</title>
</head>
<body>
Hello World!<br/>
<%
System.out.println("-----my test web logs------");
%>
</body>
</html>
发现:项目部署成功, 可以直接访问ok!
我们以后开发的步骤:需要掌握Dockerfile的编写! 我们之后的一切都是使用docker进行来发布运行的!
- 7.查看日志
[root@iZ8vbgi1zpv4do6camhur3Z test]# cd ..
[root@iZ8vbgi1zpv4do6camhur3Z tomcat]# ls
apache-tomcat-9.0.69.tar.gz Dockerfile jdk-8u361-linux-x64.tar.gz readme.txt test tomcatlogs
[root@iZ8vbgi1zpv4do6camhur3Z tomcat]# cd tomcatlogs/
[root@iZ8vbgi1zpv4do6camhur3Z tomcatlogs]# ll
total 24
-rw-r----- 1 root root 6707 Mar 7 19:33 catalina.2023-03-07.log
-rw-r----- 1 root root 6763 Mar 7 19:39 catalina.out
-rw-r----- 1 root root 0 Mar 7 19:18 host-manager.2023-03-07.log
-rw-r----- 1 root root 408 Mar 7 19:18 localhost.2023-03-07.log
-rw-r----- 1 root root 1217 Mar 7 19:39 localhost_access_log.2023-03-07.txt
-rw-r----- 1 root root 0 Mar 7 19:18 manager.2023-03-07.log
[root@iZ8vbgi1zpv4do6camhur3Z tomcatlogs]# cat catalina.out
5.发布到docker hub
docker hub 地址:https://hub.docker.com/
- 1.自行注册一个账号并登陆
- 2.在阿里云服务器查看登陆相关的命令
[root@iZ8vbgi1zpv4do6camhur3Z tomcat]# docker login --help
Usage: docker login [OPTIONS] [SERVER]
Log in to a 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
- 3.登陆,输入登陆的账号后回车,会出现password: 这里的密码是隐藏的,登陆成功就会出现以下结果
[root@iZ8vbgi1zpv4do6camhur3Z tomcat]# docker login -u shuangma
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
4.在我们的服务器上提交自己的镜像
[root@iZ8vbgi1zpv4do6camhur3Z tomcat]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
diytomcat latest 78d382d52e5a 57 minutes ago 815MB
mycentos 0.1 7a745cbdcbc3 3 hours ago 630MB
mysql 5.7 c20987f18b13 14 months ago 448MB
cmdtest latest d53776618e7c 17 months ago 204MB
entrypoint-test latest dbcf4f99ed1c 17 months ago 204MB
centos latest 5d0da3dc9764 17 months ago 231MB
shuangma/contos 1.0 0282d836c4f5 17 months ago 231MB
[root@iZ8vbgi1zpv4do6camhur3Z tomcat]# docker tag 78d382d52e5a shuangma/diytomcat:1.0
[root@iZ8vbgi1zpv4do6camhur3Z tomcat]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
diytomcat latest 78d382d52e5a 57 minutes ago 815MB
shuangma/diytomcat 1.0 78d382d52e5a 57 minutes ago 815MB
mycentos 0.1 7a745cbdcbc3 3 hours ago 630MB
mysql 5.7 c20987f18b13 14 months ago 448MB
cmdtest latest d53776618e7c 17 months ago 204MB
entrypoint-test latest dbcf4f99ed1c 17 months ago 204MB
centos latest 5d0da3dc9764 17 months ago 231MB
shuangma/contos 1.0 0282d836c4f5 17 months ago 231MB
[root@iZ8vbgi1zpv4do6camhur3Z tomcat]# docker push shuangma/diytomcat:1.0
提交也是按照镜像的层级进行提交的
6.发布到阿里云镜像服务上
- 1.登录阿里云
- 2.找到容器镜像服务,设置Registry登录密码
- 3.创建命名空间
- 4.创建镜像仓库
- 5.点击仓库名称,参考官方文档
- 6.登录阿里云Docker Registry
[root@iZ8vbgi1zpv4do6camhur3Z tomcat]# docker login --username=jsm18678940958 registry.cn-zhangjiakou.aliyuncs.com
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
- 7.推送
[root@iZ8vbgi1zpv4do6camhur3Z tomcat]# docker tag 78d382d52e5a shuangma/diytomcat:1.0
[root@iZ8vbgi1zpv4do6camhur3Z tomcat]# docker push shuangma/diytomcat:1.0