菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
139
0

docker精髓

原创
05/13 14:22
阅读数 53877

笔记

docker精髓

1.容器数据卷
什么是容器数据卷?
数据,如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化
MySql,容器删了,删库跑路!需求,MySQL数据可以存储在本地!
容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!
这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux上面!
 
总结:容器的持久化和同步操作!容器间也是可以数据共享的!
 
使用数据卷
docker run -it -v /home/ceshi:/home centos /bin/bash

 

docker inspect 镜像id

 

 

 

数据卷技术    ==数据共享(双向)==

容器内
[root@87f99907bc64 /]# cd home/
[root@87f99907bc64 home]# ls
[root@87f99907bc64 home]# touch test.java
[root@87f99907bc64 home]# ls
test.java

主机
[root@iZwz9h33ok2v27xzrcdv8hZ ceshi]# ls
test.java

主机中
vim test.java
容器中
cat test.java

 

好处:修改只需要在本地服务器修改,容器内会自动同步.
 
实战:安装MySQL
思考:MySQL的数据持久化的问题

 

# 运行容器 需要做数据挂载
# 安装启动mysql,需要配置密码
docker run -d -p 3344: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

-d 后台运行
-p 端口运行
-v 卷挂载
-e 环境配置
--name 容器名字 命名


# navicat本地连接到服务器mysql成功

 

本地navicat创建一个数据库,服务器查看是否同步

 

 

 

删除容器,挂载到本地的数据卷依旧没有消失,实现了容器数据持久化功能

 

具名和匿名挂载

# 匿名挂载
-v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx

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

[root@iZwz9h33ok2v27xzrcdv8hZ ~]# docker volume ls
DRIVER    VOLUME NAME
local     af44a34cd0e01786de0d715da74c655702fc1925e556fa46e1d2c85a8eb82fcd

# 这种就是匿名挂载,我们在 -v 只写了容器内的路径,没有写容器名字

===================================================

# 具名挂载
[root@iZwz9h33ok2v27xzrcdv8hZ ~]# docker volume ls
DRIVER    VOLUME NAME
local     af44a34cd0e01786de0d715da74c655702fc1925e556fa46e1d2c85a8eb82fcd
local     juming-nginx

# 查看一下这个卷
[root@iZwz9h33ok2v27xzrcdv8hZ ~]# docker volume inspect juming-nginx
[
    {
        "CreatedAt": "2021-02-24T10:12:47+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/juming-nginx/_data
 
如果确定是具名挂载还是匿名挂载,还是指定路径挂载!
-v 容器内路径        # 匿名挂载
-v 卷名:容器内路径     # 具名挂载
-v /宿主机路径:容器内路径 # 指定路径挂载
 
# 通过 -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就说明这个路径只能通过宿主机来操作,容器内部无法操作!

 

2.DockerFile
Dockerfile就是用来构建docker镜像的构建文件!命令脚本.
通过脚本可以生成镜像,镜像是一层一层的,脚本是一个一个命令
 
创建一个dockerfile1文件
文件中的内容 指令(大写) 参数
FORM centos

VOLUME ["volume01","volume02"]

CMD echo "===end==="

CMD /bin/bash


docker build -f /root/home/docker-test-volume/dockerfile1 -t gg/centos .

 

查看自己生成的镜像

[root@iZwz9h33ok2v27xzrcdv8hZ docker-test-volume]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
gg/centos    latest    6d6cb0588226   25 seconds ago   209MB

 

数据卷容器
 
实现容器间的数据共享
docker run -it --name docker01 gg/centos
docker run -it --name docker02 --volumes-from docker01 gg/centos

[root@iZwz9h33ok2v27xzrcdv8hZ ~]# docker attach f6b818c01c98
[root@f6b818c01c98 /]# ls
bin  etc   lib      lost+found  mnt  proc  run   srv  tmp  var       volume02
dev  home  lib64  media       opt  root  sbin  sys  usr  volume01
[root@f6b818c01c98 /]# cd volume01/
[root@f6b818c01c98 volume01]# touch docker01
[root@f6b818c01c98 volume01]# ls
docker01

docker attach 00446efc421d
[root@00446efc421d /]# ls   
bin  etc   lib      lost+found  mnt  proc  run   srv  tmp  var       volume02
dev  home  lib64  media       opt  root  sbin  sys  usr  volume01
[root@00446efc421d /]# cd volume01/
[root@00446efc421d volume01]# ls
docker01

删除了docker01容器,docker03的数据依旧在

 

结论:容器之间配置信息的传递,数据卷容器的声明周期一直持续到没有容器使用为止.
但是一旦持久化到了本地,本地的数据是不会删除的.
 
 
 
DockerFile构建过程
 
1.编写一个dockerfile文件
2.docker build 构建成为一个镜像
3.docker run 运行镜像
4.docker push 发布镜像(DockerHub,阿里云镜像仓库)
 

 

 

 

DockerFile的指令

 

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

 

 

 

实战
创建一个组件的centos
 

1.编写dockerfile文件

FROM centos
MAINTAINER gg<1183681129@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 mydockerfile-centos -t mycentos:0.1 .

 

3.测试运行镜像
 
查看镜像更新历史
[root@iZwz9h33ok2v27xzrcdv8hZ dockerfile]# docker history dbc92c21d09b
IMAGE          CREATED         CREATED BY                                      SIZE      COMMENT
dbc92c21d09b   4 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B        
d4e0717081e0   4 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
13c33ae5a948   4 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
697c58c32c53   4 minutes ago   /bin/sh -c #(nop)  EXPOSE 80                    0B        
6dab71e85922   4 minutes ago   /bin/sh -c yum -y install net-tools             23.3MB    
64f7dc23a764   4 minutes ago   /bin/sh -c yum -y install vim                   58MB      
0f72ceef7077   5 minutes ago   /bin/sh -c #(nop) WORKDIR /usr/local            0B        
14ee2c54b9e3   5 minutes ago   /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B        
8b3005407366   5 minutes ago   /bin/sh -c #(nop)  MAINTAINER gg<1183681129@…   0B        
300e315adb2f   2 months ago    /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B        
<missing>      2 months ago    /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B        
<missing>      2 months ago    /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7…   209MB  

 

 

CMD和ENTRYPOINT的区别
CMD    # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
 
测试cmd
FROM centos

CMD ["ls","-a"]


docker build -f docker-cmd-test -t cmdtest .
docker run id

CMD命令被覆盖,报错
[root@iZwz9h33ok2v27xzrcdv8hZ dockerfile]# docker run fb0fc261ebee -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:370: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
ERRO[0000] error waiting for container: context canceled
[root@iZwz9h33ok2v27xzrcdv8hZ dockerfile]# docker run fb0fc261ebee ls -al

 

实战:Tomcat镜像
1.准备镜像文件tomcat压缩包,jdk压缩包
 
2.编写Dockerfile文件(文件命名为Dockerfile不用添加-f参数指定文件)
[root@iZwz9h33ok2v27xzrcdv8hZ dockerTest]# cat Dockerfile
FROM centos
MAINTAINER gg<1183681129@qq.com>


COPY README.txt /usr/local/README.txt


ADD apache-tomcat-9.0.41.tar.gz /usr/local/
ADD jdk-8u162-linux-x64.tar.gz /usr/local/


RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH


ENV JAVA_HOME /usr/local/jdk1.8.0_162
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.41
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.41
ENV PATH $PATH:$JAVA_HOME/bin:$CATLINA_HOME/lib:$CATALINA_HOME/bin


EXPOSE 8080


CMD /usr/local/apache-tomcat-9.0.41/bin/startup.sh && tail -F /url/local/apache-tomcat-9.0.41/bin/logs/catalina.out

 

3.构建镜像

docker build -t diytomcat .

 

4.启动镜像

docker run -d -p 9090:8080 --name ggtomcat1 -v /root/dockerTest1/tomcat/test:/usr/local/apache-tomcat-9.0.41/webapps/test -v /root/dockerTest1/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.41/logs diycomcat

 

5.访问测试

 

6.发布项目

在本地目录下发布项目
/root/dockerTest1/tomcat/test

 

 

 

 

 

 

 

 

 

 

 

发表评论

0/200
139 点赞
0 评论
收藏