docker,学习

数据卷

删除容器后本地数据不会丢失

-v 主机目录:docker目录

# 测试
root@ubuntu:~# docker run -it -v /home/centos:/home --name centos01 centos /bin/bash
[root@8640d11f67d9 /]# cd /home/
[root@8640d11f67d9 home]# ls
[root@8640d11f67d9 home]# touch 1.java
[root@8640d11f67d9 home]# root@ubuntu:~# cd /home/
root@ubuntu:/home# ls
centos  longdaiquan  test.java
root@ubuntu:/home# cd centos/
root@ubuntu:/home/centos# ls
1.java
root@ubuntu:/home/centos#

具名和匿名挂载

# 匿名挂载:不指定主机路径,直接写docker路径
-v 容器内路径
docker run -d -P --name nginx001 -v /etc/nginx nginx


# 具名挂载
-v 卷名:容器内路径
docker run -d -P --name nginx002 -v juming-nginx:/etc/nginx nginx


# 查看所有的volume的情况
docker volume ls

root@ubuntu:/home/centos# docker volume ls
DRIVER    VOLUME NAME
local     fc7c38ab1337c4a262e42bab8621e29b236ad2797c8397a17b369fa0bfc45b44
local     juming-nginx


# 查看具体位置
root@ubuntu:/home/centos# docker volume inspect juming-nginx
[
    {
        "CreatedAt": "2022-10-13T09:11:39Z",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
        "Name": "juming-nginx",
        "Options": null,
        "Scope": "local"
    }
]

未指定挂载路径,所有卷都挂载在/var/lib/docker/volumes/xxx/_data

image-20221013171832660

拓展

# 通过-v 容器内路径:ro  rw改变读写权限
ro    readonly    #只读
rw    readwrite   #可读可写

# 一旦设置了容器权限,容器对我们挂载出来的内容就有权限了
# ro 只能通过宿主机操作,容器内部无法操作
通过Docker File 来添加

DockerFile 是用来构建Docker镜像的构建文件,是由一些列命令和参数构成的脚本

# 1、我们在宿主机 /home 目录下新建一个 docker-test-volume文件夹 
[root@kuangshen home]# mkdir docker-test-volume 
\# 说明:在编写DockerFile文件中使用 VOLUME 指令来给镜像添加一个或多个数据卷 
VOLUME["/dataVolumeContainer1","/dataVolumeContainer2","/dataVolumeContainer 
3"] 
# 出于可移植和分享的考虑,我们之前使用的 -v 主机目录:容器目录 这种方式不能够直接在 
DockerFile中实现。 
# 由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有宿主机上都存在这样的特定目录. 
# 2、编写DockerFile文件 
[root@kuangshen docker-test-volume]# pwd 
/home/docker-test-volume 
[root@kuangshen docker-test-volume]# vim dockerfile1 
[root@kuangshen docker-test-volume]# cat dockerfile1 
# volume test 
FROM centos 
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"] 
CMD echo "-------end------" 
CMD /bin/bash 
# 3、build后生成镜像,获得一个新镜像 kuangshen/centos 
docker build -f /home/docker-test-volume/dockerfile1 -t kuangshen/centos . # 注意最后有个.

image-20221014150121168

# 4、启动容器 
[root@kuangshen docker-test-volume]# docker run -it 0e97e1891a3d /bin/bash # 启动容器 
[root@f5824970eefc /]# ls -l 
total 56 
lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin 
drwxr-xr-x 2 root root 4096 May 11 11:55 dataVolumeContainer1 # 数据卷目录 
drwxr-xr-x 2 root root 4096 May 11 11:55 dataVolumeContainer2 # 数据卷目录 
drwxr-xr-x 5 root root 360 May 11 11:55 dev 
drwxr-xr-x 1 root root 4096 May 11 11:55 etc 
drwxr-xr-x 2 root root 4096 May 11 2019 home 
..... 
# 问题:通过上述步骤,容器内的卷目录地址就已经知道了,但是对应的主机目录地址在哪里呢? 

# 5、我们在数据卷中新建一个文件 
[root@f5824970eefc dataVolumeContainer1]# pwd 
/dataVolumeContainer1 
[root@f5824970eefc dataVolumeContainer1]# touch container.txt 
[root@f5824970eefc dataVolumeContainer1]# ls -l 
total 0 
-rw-r--r-- 1 root root 0 May 11 11:58 container.txt 

# 6、查看下这个容器的信息 
[root@kuangshen ~]# docker inspect 0e97e1891a3d 
# 查看输出的Volumes 
"Volumes": { 
"/dataVolumeContainer1": {}, 
"/dataVolumeContainer2": {} 
},

# 7、这个卷在主机对应的默认位置

image-20221014150423560

注意:如果访问出现了 cannot open directory: Permission denied

解决办法:在挂载目录后多加一个 --privileged=true参数即可

数据卷容器

命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。

--volumes-from

image-20221014144118119

# 例如:
docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7

Dockerfile

用来构建docker镜像的构建文件 命令脚本
构建步骤:

1、编写一个dockerfile文件

2、docker build 构建成一个镜像

3、docker run 运行镜像

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

image-20221014160034532

image-20221014160106679

dockerfile构建过程

基础知识:

1、每条保留字指令都必须为大写字母且后面要跟随至少一个参数

2、指令按照从上到下,顺序执行

3、# 表示注释

4、每条指令都会创建一个新的镜像层,并对镜像进行提交

流程:

1、docker从基础镜像运行一个容器

2、执行一条指令并对容器做出修改

3、执行类似 docker commit 的操作提交一个新的镜像层

4、Docker再基于刚提交的镜像运行一个新容器

5、执行dockerfile中的下一条指令直到所有指令都执行完成!

说明:

从应用软件的角度来看,DockerFile,docker镜像与docker容器分别代表软件的三个不同阶段。

DockerFile 是软件的原材料 (代码)

Docker 镜像则是软件的交付品 (.apk)

Docker 容器则是软件的运行状态 (客户下载安装执行)

DockerFile 面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可!

dockerfile指令

FROM         # 基础镜像,当前新镜像是基于哪个镜像的 
MAINTAINER   # 镜像是谁写的,姓名+邮箱 
RUN          # 镜像构建时需要运行的命令 
EXPOSE       # 当前容器对外保留出的端口 
WORKDIR      # 指定在创建容器后,终端默认登录的进来工作目录,一个落脚点 
ENV          # 用来在构建镜像过程中设置环境变量 
ADD          # 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包 
COPY         # 类似ADD,拷贝文件和目录到镜像中! 
VOLUME       # 容器数据卷,用于数据保存和持久化工作 
CMD          # 指定一个容器启动时要运行的命令,dockerFile中可以有多个CMD指令,但只有最后一个生效! 
ENTRYPOINT   # 指定一个容器启动时要运行的命令!和CMD一样 
ONBUILD      # 当构建一个被继承的DockerFile时运行命令,父镜像在被子镜像继承后,父镜像的ONBUILD被触发 

实战:构建自己的centos

Docker Hub 中99% 的镜像都是通过在base镜像(Scratch)中安装和配置需要的软件构建出来的(空镜像)

image-20221014163304698

创建一个自己的centos

下官方默认的CentOS的情况:

image-20221014172625850

1、编写DockerFlie文件

[root@kuangshen home]# mkdir dockerfile-test 
[root@kuangshen home]# ls 
ceshi dockerfile-test docker-test-volume f1 
[root@kuangshen home]# 
[root@kuangshen home]# vim mydockerfile-centos # 编辑文件 
[root@kuangshen home]# cat mydockerfile-centos 
FROM centos 
MAINTAINER kuangshen<24736743@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 .

[root@kuangshen home]# docker build -f mydockerfile-centos -t mycentos:0.1 .

3、运行

docker run -it 新镜像名字:TAG

image-20221014174236355

可以看到,我们自己的新镜像已经支持 vim/ifconfifig的命令,扩展OK!

4、列出镜像地的变更历史

docker history 镜像名

image-20221014174319285

CMD和ENTRYPOINT的区别

CMD:Dockerfifile 中可以有多个CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数

替换!

ENTRYPOINT:docker run 之后的参数会被当做参数传递给 ENTRYPOINT,之后形成新的命令组合!

dockerfile制作tomcat镜像

1、 mkdir -p kuangshen/build/tomcat

2、在上述目录下 touch read.txt

3、将 JDK 和 tomcat 安装的压缩包拷贝进上一步目录

4、在 /kuangshen/build/tomcat 目录下新建一个Dockerfifile文件

# vim Dockerfile 

FROM centos 
MAINTAINER kuangshen<24736743@qq.com> 

#把宿主机当前上下文的read.txt拷贝到容器/usr/local/路径下 
COPY read.txt /usr/local/cincontainer.txt 

#把java与tomcat添加到容器中 
ADD jdk-8u11-linux-x64.tar.gz /usr/local/ 
ADD apache-tomcat-9.0.22.tar.gz /usr/local/ 

#安装vim编辑器 
RUN yum -y install vim 

#设置工作访问时候的WORKDIR路径,登录落脚点 
ENV MYPATH /usr/local 
WORKDIR $MYPATH 

#配置java与tomcat环境变量 
ENV JAVA_HOME /usr/local/jdk1.8.0_11 
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22 
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.22 
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin 

#容器运行时监听的端口 
EXPOSE 8080 

#启动时运行tomcat 
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.22/bin/startup.sh" ] 
# CMD ["/usr/local/apache-tomcat-9.0.22/bin/catalina.sh","run"] 
CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.22/bin/logs/catalina.out

当前文件状态

image-20221014213021624

5、构建镜像

[root@kuangshen tomcat]# docker build -t diytomcat . 
..... 
Successfully built ffdf6529937d 
Successfully tagged diytomcat:latest # 构建完成 

# 查看确定构建完毕! 
[root@kuangshen tomcat]# docker images 
REPOSITORY TAG IMAGE ID CREATED 
SIZE 
diytomcat latest ffdf6529937d 20 seconds ago 
636MB 

6、运行启动 run

docker run -d -p 9090:8080 --name mydiytomcat -v 
/home/kuangshen/build/tomcat/test:/usr/local/apache-tomcat- 
9.0.22/webapps/test -v 
/home/kuangshen/build/tomcat/tomcat9logs/:/usr/local/apache-tomcat- 
9.0.22/logs --privileged=true diytomcat 

image-20221014213238296

备注:Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied

解决办法:在挂载目录后多加一个--privileged=true参数即可

7、验证测试访问! curl localhost:9090

image-20221014213319103

发布镜像

DokerHub
# 1、查看登录命令 
[root@kuangshen tomcat]# docker login --help 
Usage: docker login [OPTIONS] [SERVER] 

# 2、登录 
[root@kuangshen tomcat]# docker login -u kuangshen 
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 

# 3、将镜像发布出去 
[root@kuangshen tomcat]# docker push kuangshen/diytomcat:1.0 
The push refers to repository [docker.io/library/diytomcat] 
0f02399c6fdf: Preparing 
e79ea0c3a34e: Preparing 
09281fa8fe38: Preparing 
b56a902b0aef: Preparing 
0683de282177: Preparing 

# 拒绝:请求的资源访问被拒绝 
denied: requested access to the resource is denied 

# 问题:本地镜像名无帐号信息,解决加 tag即可 
docker tag 251ca4419332 kuangshen/diytomcat:1.0 

# 再次 push, ok 

[root@kuangshen tomcat]# docker push kuangshen/diytomcat:1.0 
The push refers to repository [docker.io/kuangshen/diytomcat] 
0f02399c6fdf: Pushing [========> ] 
9.729MB/59.76MB 
e79ea0c3a34e: Pushing [==========> ] 
3.188MB/15.41MB 
09281fa8fe38: Pushing [> ] 
3.823MB/324MB 
b56a902b0aef: Pushed 
0683de282177: Pushing [=> ] 
5.997MB/237.1MB 
阿里云

参考官方文档

总结

image-20221014215749435

微信支付

微信支付

支付宝支付

支付宝支付

评论

This is just a placeholder img.