Docker进阶实战大全

Docker进阶实战

学习推荐 哔哩哔哩 狂神说java

容器数据卷

什么是容器数据卷

docker的理念回顾

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

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

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

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

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

在这里插入图片描述

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

使用数据卷

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

#启动容器,设置挂在地址
docker run -it -v 主机目录:容器内目录  -p 主机端口:容器内端口
#1、启动centos测试
docker run -it -v /home/test:/home centos
#2、通过 docker inspect 容器id 查看

在这里插入图片描述[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UfVrIvMX-1589897960098)()]

#inspect 查看详细信息,查看挂在地址
docker inspect 容器id

在这里插入图片描述

  • 测试

测试在容器内创建test.java文件,在宿主机也有对应的文件,相反在宿主机创建容器内也是会存在
在这里插入图片描述
在这里插入图片描述

再来测试!

1、停止容器

2、宿主机修改文件

3、启动容器

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

只要你的容器存在没有被删除挂在目录的文件会一直被同步

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

实战:安装MySQL

思考:MySQL的数据持久化的问题

#1、拉取Mysql镜像
docker pull mysql:8.0.20
#2、启动Mysql镜像 挂在配置 数据文件夹
docker run -p 3306:3306 --name mysql -v $PWD/home/conf:/etc/mysql/conf.d -v $PWD/home/logs:/logs -v $PWD/home/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0.20
#启动我们得
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
-- name 容器名字
#3、启动成功用Mysql客户端连接测试,连接成功查看挂在目录是否成功。我这边测试成功就不贴不出来了!
  • 错误

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

  • 解决方案
#1、进入容器
docker exec -it 容器ID /bin/bash
#2、进入mysql
mysql -uroot -p
#3、授权
GRANT ALL ON *.* TO 'root'@'%';
#4、刷新权限
flush privileges;
#5、更新加密规则
ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;
#6、更新root用户密码
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'xxxxxx';
#7、刷新权限
flush privileges;

具名和匿名挂载

# 三种挂载: 匿名挂载、具名挂载、指定路径挂载
-v 容器内路径				#匿名挂载
-v 卷名:容器内路径			  #具名挂载
-v /宿主机路径:容器内路径 	#指定路径挂载 docker volume ls 是查看不到的
匿名挂载
# 匿名挂载
docker run -d -P --name nginx01 -v /etc/nginx nginx
# 查看所有的volume的情况
docker volume ls

DRIVER              VOLUME NAME
local               5ff2a5b7a733cf6c93d0b520f2d9530dbc77fabbb65dc9ef34e46ff2592dbdd2
# 这里发现,这种就是匿名挂载,我们在 -v只写了容器内的路径,没有写容器外的路径!
具名挂载
# 具名挂载
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
# 查看所有的volume的情况
docker volume ls

DRIVER              VOLUME NAME
local               juming-nginx
# 通过 -v 卷名:容器内路径
# 查看一下这个卷

在这里插入图片描述

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

具体目录挂载

如果指定了目录,docker volume ls 是查看不到的

#1、挂载到具体目录
docker run -d -P --name nginx3 -v /home/nginx:/etc/nginx/conf.d nginx
#如果采用的具体目录挂载ls查看的时候是看不到的
拓展ro rw读写权限
# 通过 -v 容器内路径: ro rw 改变读写权限
ro #readonly 只读
rw #readwrite 可读可写
docker run -d -P --name nginx05 -v juming:/etc/nginx:ro nginx
docker run -d -P --name nginx05 -v juming:/etc/nginx:rw nginx
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作!

初始DockerFile

Dockerfile 就是用来构建docker镜像的构建文件并挂载目录!命令脚本!先体验一下!

通过这个脚本可以生成镜像,镜像

#1、创建dockerfile文件
vim dockerfile
#2、 创建一个dockerfile文件,名字可以随便 建议Dockerfile
# 文件中的内容 指令(大写) 参数
FROM centos

VOLUME ["volume01","volume02"]#匿名挂载,这个容器内路径

CMD echo "----end----"
CMD /bin/bash
#3、制作镜像 镜像制作成功
docker build -f /home/dockerfile -t test/centos:1.0 .

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5qRq7eny-1589982167916)(C:\Users\MAXIAO~1\AppData\Local\Temp\1589977868391.png)]

#4、启动我们制作的镜像 查看挂载目录
docker run -it bb1e9587fda4

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AJnoscKm-1589982167917)(C:\Users\MAXIAO~1\AppData\Local\Temp\1589978017651.png)]

#5、创建文件测试
cd volume01/
vi test.java
#6、切换另一个窗口查看容器信息 找到挂载地址查看文件是否挂载出来
docker inspect 9f759aa345ef

在这里插入图片描述

挂载成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LNow0mGH-1589982167920)(C:\Users\MAXIAO~1\AppData\Local\Temp\1589978405184.png)]

数据卷容器挂载

多个Mysql同步数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3NqBZICX-1589982167921)(C:\Users\MAXIAO~1\AppData\Local\Temp\1589978540741.png)]

#1、启动一个新的Mysql,使用--volumes-from mysql 将启动这个Mysql 数据卷同步,也就是启动的这个mysql1容器离会存在mysql这个容器的内容
# --volumes-from 容器名称 相当于子类使用父类
docker run -d -p 3307:3306 --name mysql1 -e MYSQL_ROOT_PASSWORD=root --volumes-from mysql mysql:8.0.20

结论:

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

但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!

DockerFile

DockerFile介绍

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

构建步骤:

1、 编写一个dockerfile文件

2、 docker build 构建称为一个镜像

3、 docker run运行镜像

4、 docker push发布镜像(DockerHub 、阿里云仓库)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sP7ULcTM-1590222884662)(C:\Users\MAXIAO~1\AppData\Local\Temp\1590215688462.png)]

点击后跳到一个Dockerfile

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m8aDwjkg-1590222884663)(C:\Users\MAXIAO~1\AppData\Local\Temp\1590215711238.png)]

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

官方既然可以制作镜像,那我们也可以!

DockerFile构建过程

基础知识:

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

2、执行从上到下顺序

3、#表示注释

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0MKml8Gu-1590222884663)(C:\Users\MAXIAO~1\AppData\Local\Temp\1590215747793.png)]

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

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

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

DockerImages:通过DockerFile构建生成的镜像,最终发布和运行产品。

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

DockerFile的指令

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

实战测试

创建一个自己的centos

  • 编写Dockerfile
# 1.编写Dockerfile文件
vim mydockerfile-centos
  • Dockerfile内容
FROM centos
MAINTAINER zhang<604809590@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 文件路径 -t 镜像名:[tag] .
docker build -f mydockerfile-centos -t mycentos:0.1 .
  • history变更历史
# docker history 镜像ID
docker history 80b97bbc4a6c

测试

查看镜像的构建过程、暴露端口、构建步骤、安装命令等!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pSc2K5iP-1590222884665)(C:\Users\MAXIAO~1\AppData\Local\Temp\1590217450813.png)]

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

CMD 和 ENTRYPOINT区别


  • 测试CMD

1、编写dockerfile文件

vim dockerfile-test-cmd

2、dockerfile内容

FROM centos
CMD ["ls","-a"]

3、构建镜像

docker build  -f dockerfile-test-cmd -t cmd-test:0.1 .

4、运行镜像

docker run cmd-test:0.1

5、测试结果

.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

# 想追加一个命令  -l 成为ls -al
$ docker run cmd-test:0.1 -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.
ERRO[0000] error waiting for container: context canceled 
# cmd的情况下 -l 替换了CMD["ls","-l"]。 -l  不是命令所有报错
  • 测试ENTRYPOINT

1、编写dockerfile文件

vim dockerfile-test-entrypoint

2、内容

FROM centos
ENTRYPOINT ["ls","-a"]

3、构建镜像

docker build -f dockerfile-test-entrypoint -t entrypoint-test:0.1 .

4、运行

docker run entrypoint-test:0.1

5、结果

.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found ...

6、追加参数ENTRYPOINT

docker run entrypoint-test:0.1 -l


total 56
drwxr-xr-x   1 root root 4096 May 16 06:32 .
drwxr-xr-x   1 root root 4096 May 16 06:32 ..
-rwxr-xr-x   1 root root    0 May 16 06:32 .dockerenv
lrwxrwxrwx   1 root root    7 May 11  2019 bin -> usr/bin
drwxr-xr-x   5 root root  340 May 16 06:32 dev
drwxr-xr-x   1 root root 4096 May 16 06:32 etc
drwxr-xr-x   2 root root 4096 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 ....

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

实战:Tomcat镜像

1、准备镜像文件

​ 准备tomcat 和 jdk到当前目录,编写好README

2、编写dokerfile

FROM tomcat
MAINTAINER zhang<604809590@qq.com>
#复制文件
COPY README /usr/local/README
#复制解压jdk
ADD jdk-8u181-linux-x64.tar.gz /usr/local/
#复制解压tomcat
ADD apache-tomcat-9.0.35.tar.gz /usr/local/
#安装vim
RUN apt-get update && apt-get install vim -y
#设置环境变量
ENV MYPATH /usr/local
#设置工作目录
WORKDIR $MYPATH
#设置环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_231 
#设置环境变量
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.35 
#设置环境变量 分隔符是:
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib 
#设置暴露的端口
EXPOSE 8080 
# 设置默认命令
CMD /usr/local/apache-tomcat-9.0.35/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.35/logs/catalina.out

3、构建镜像

# 因为dockerfile命名使用默认命名 因此不用使用-f 指定文件
docker build -t mytomcat:0.1 .

4、run镜像

docker run -d -p 8080:8080 --name tomcat01 -v /home/zhang/build/tomcat/test:/usr/local/apache-tomcat-9.0.35/webapps/test -v /home/zhang/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.35/logs mytomcat:0.1

5、访问测试

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

发现:项目部署成功,可以直接访问!

我们以后开发的步骤:需要掌握Dockerfile的编写!我们之后的一切都是使用docker镜像来发布运行!

发布镜像DockerHub

Dockerhub

1、地址 https://hub.docker.com/

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

3、登录

#1、登录命令
docker login
#2、输入账号密码,登录成功
Username:xxxx
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、提交 push镜像

#1、发布Mysql镜像到dockerHub mysql:5.6.48本地Mysql:版本xxxDockerHub用户名
docker tag mysql:5.6.48 xxx/mysql
#2、上床镜像xxx 是tag 起的名字,慢慢等我用的阿里云也很慢
docker push xxx/mysql

发布镜像阿里云

阿里云镜像服务

1、登录阿里云

2、找到容器镜像服务

3、创建命名空间

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4i2tAPwc-1590415176146)(C:\Users\MAXIAO~1\AppData\Local\Temp\1590413983949.png)]

4、创建容器镜像

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-40hNmVM3-1590415176148)(C:\Users\MAXIAO~1\AppData\Local\Temp\1590414051503.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ocfLmZQ1-1590415176148)(C:\Users\MAXIAO~1\AppData\Local\Temp\1590414078964.png)]

阿里云操作步骤

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Bv9Cxmj-1590415176148)(C:\Users\MAXIAO~1\AppData\Local\Temp\1590414172488.png)]

#1、登录阿里云
docker login --username=xxx registry.cn-hangzhou.aliyuncs.com
#2、tag命名
docker tag 镜像ID registry.cn-hangzhou.aliyuncs.com/xxx/xxx-test:[镜像版本号]
#3、push 有点慢,慢慢等吧!
docker push 重命名的镜像[版本号]

发布成功查看版本号

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IftgxEOh-1590415176150)(C:\Users\MAXIAO~1\AppData\Local\Temp\1590415160380.png)]
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冒险的梦想家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值