【Docker】Docker提升
狂神老师的视频地址:https://space.bilibili.com/95256449
1、容器数据卷
1.1、什么是容器数据卷?
当容器中的数据需要持久化,并且可以存储到本地,例如数据库中的数据,不能因为容器被删而丢失,卷技术主要解决的就是这个问题。
简单的来说就是目录的挂载,将容器内的目录,挂载到Linux上面!并且可以自动同步
总结一句话:容器的持久化和同步操作,容器间数据也是可以共享的
1.2、使用数据卷
方式一:直接使用命令来挂载 -v
# -v 主机路径 容器路径
[root@localhost ~]# docker run -it -v /home/test:/home centos /bin/bash
#查看容器inspect信息:
"Mounts": [
{
"Type": "bind",
"Source": "/home/test", #目标文件
"Destination": "/home", #源文件
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
当容器内目录挂载到主机上之后,两边文件就会同步更新,一边修改一遍对应更新,即使关闭容器后修改文件,再打开依旧是同步的。
有了这样的映射,就不用每次都进入容器内部修改文件了。
1.3、容器数据卷实战
#获取镜像
[root@localhost ~]# docker pull mysql:5.7
#运行容器,需要做数据挂载,#注意!安装启动mysql是需要配置密码
#官方测试例子:docker run ---name some-mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:tag
#我们启动mysql
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名字
[root@localhost ~]# 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
eeb23b628576391bb0707fa297e7e741bb801a3a5a5f454e7c0bfcfe0aed9cc7
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
eeb23b628576 mysql:5.7 "docker-entrypoint.s…" 7 seconds ago Up 6 seconds 33060/tcp, 0.0.0.0:3310->3306/tcp, :::3310->3306/tcp mysql01
这个时候就相当于对mysql的数据做了备份,可以在/home/mysql/data下面看到数据库的实时数据,即使删除了容器,这个文件依旧会存在,这就实现了持久化。
然后通过/home/mysql/conf.d下面又可以对数据库参数配置
1.4、具名挂载和匿名挂载
#匿名挂载,就是没有写容器内路径
[root@localhost data]# docker run -d --name nginx01 -v /etc/nginx nginx
d5c6e885e07236396254fe7dafd9352e46667dd7d47e63bb12527fc6fe657e4
# volume ls命令查看容器映射信息
[root@localhost data]# docker volume ls
DRIVER VOLUME NAME
local 3cf21ec8b28c95c392d9bff767af9d85810256c069c65c595d280bbf3c078ec3
# 这就是匿名挂载,没有写容器外的路径
#具名挂载,写了容器的路径(这里是没写绝对路径)
[root@localhost data]# docker run -d --name nginx02 -v juming-nginx:/etc/nginx nginx
aec8f679b02bcb4ae34d85bce640178fc0f89ad3304337d4c574d8e5b2d1c9a3
[root@localhost data]# docker volume ls
DRIVER VOLUME NAME
local juming-nginx
# volume inspect 文件名 查看具体挂载的信息
[root@localhost data]# docker volume inspect juming-nginx
[
{
"CreatedAt": "2022-06-09T11:21:12+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
所有的容器在没有指定目录的情况默认都是在:var/lib/docker/volumes/xxxx/_data
下的。
绝大多数情况都是使用具名挂载,方便找到卷。
#如果确定是具名挂载还匿名挂载
-v 容器路径 #匿名
-v 卷名:容器内路径 #具名
-v 容器外路径:容器内路径 #具名
拓展:
ro : 只读
rw : 可读可写
#容器内部只能对容器外部文件读
docker run -d --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
#容器内部能对容器外部文件读和写
docker run -d --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
2、Dockerfile
Dockerfile就是用来构建docker镜像的构建文件!命令脚本!先体验一下!
通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层的!
#文件中的内容,指令(大写) 参数
#这里的每一个命令相当于镜像的一层
FROM centos
VOLUME {"VOLUME01","VOLUME02"}
CMD ECHO "---end----"
CMD /bin/bash
这里贴老师的命令截图:
启动自己的镜像生成自己的容器
通过inspect查看容器匿名挂载的具体位置:
2.1、DockerFile的指令
FROM # 基础镜像,一切从这构建
MAINTAINER # 镜像是谁写的,姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤,tomcat镜像,这个tomcat压缩包!添加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 保留端口设置
CMD # 指定启动容器的时候运行的命令 (后面的命令会替代前面的命令只有最有一个生效)
ENTRYPOINT # 指定启动容器的时候运行的命令 (所有命令都执行,叠加)
ONBUILD # 当构建一个被继承的DockerFIle这个时候就会运行ONBUILD的指令。触发指令
ENV # 构建的时候设置环境变量
2.3、实战测试
Docker Hub 中99%的镜像都是从scratch这个基础镜像来的。
创建一个自己的centos
编写一个DockerFile文件
[root@localhost dockerfile]# cat mydockerfile
FROM centos
MAINTAINER wuchengyong<2213849145@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPORT 80
CMD echo $MYPATH
CMD echo "------end-----"
CMD /bin/bash
运行这个文件
#这里yum运行报错,和centos版本有关,就没运行yum
[root@localhost dockerfile]# docker build -f mydockerfile -t mycentos:01 .
Sending build context to Docker daemon 2.048kB
Step 1/8 : FROM centos
---> 5d0da3dc9764
Step 2/8 : MAINTAINER wuchengyong<2213849145@qq.com>
---> Using cache
---> 68e0ad4cde57
Step 3/8 : ENV MYPATH /usr/local
---> Using cache
---> c922f1fa2a8b
Step 4/8 : WORKDIR $MYPATH
---> Using cache
---> 90691023e356
Step 5/8 : EXPOSE 80
---> Running in bef88f9b2c48
Removing intermediate container bef88f9b2c48
---> 1660be64f6bd
Step 6/8 : CMD echo $MYPATH
---> Running in c63b64a645e0
Removing intermediate container c63b64a645e0
---> da596ce69f90
Step 7/8 : CMD echo "------end-----"
---> Running in de5775709e4a
Removing intermediate container de5775709e4a
---> c9be9cea614d
Step 8/8 : CMD /bin/bash
---> Running in c25fd16c8123
Removing intermediate container c25fd16c8123
---> 05706af3a30c
Successfully built 05706af3a30c
Successfully tagged mycentos:01
[root@localhost dockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 01 05706af3a30c 3 seconds ago 231MB
tomcat 9.0 bce48a218e94 2 weeks ago 680MB
tomcat latest c795915cb678 2 weeks ago 680MB
redis latest 53aa81e8adfa 2 weeks ago 117MB
nginx latest 0e901e68141f 2 weeks ago 142MB
mysql 5.7 2a0961b7de03 2 weeks ago 462MB
mysql latest 65b636d5542b 2 weeks ago 524MB
portainer/portainer latest 12b0b8dced14 5 weeks ago 75.4MB
hello-world latest feb5d9fea6a5 8 months ago 13.3kB
centos latest 5d0da3dc9764 9 months ago 231MB
[root@localhost dockerfile]# docker run -it mycentos:01
[root@e20e46f5c7b5 local]# pwd
/usr/local
查看镜像历史:
[root@localhost dockerfile]# docker history 05706af3a30c
IMAGE CREATED CREATED BY SIZE COMMENT
05706af3a30c 5 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
c9be9cea614d 5 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
da596ce69f90 5 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
1660be64f6bd 5 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
90691023e356 11 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
c922f1fa2a8b 11 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
68e0ad4cde57 11 minutes ago /bin/sh -c #(nop) MAINTAINER wuchengyong<22… 0B
5d0da3dc9764 9 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 9 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 9 months ago /bin/sh -c #(nop) ADD file:805cb5e15fb6e0bb0… 231MB
3、发布自己的镜像
DockerHub
1、确认https://hub.docker.com可以访问
2、确认账户可以登录
3、在我们的服务器上提交自己的镜像
[root@localhost dockerfile]# 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
[root@localhost dockerfile]# docker login -u wuchengyong
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
#这里给自己的镜像贴了标签,最好有标签,不然重命名可能性太大了
[root@localhost dockerfile]# docker tag 05706af3a30c wuchengyong/mycentos:01
[root@localhost dockerfile]# docker push wuchengyong/mycentos:01
The push refers to repository [docker.io/wuchengyong/mycentos]
74ddd0ec08fa: Pushed
阿里云镜像
1、登录阿里云
2、找到镜像服务
3、创建命名空间
4、创建个人仓库
5、浏览阿里云仓库信息