Docker学习2

1- docker容器数据卷

1)什么是容器卷?

docker容器理念的回顾:将应用和环境打包成一个镜像!

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

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

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

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

   

为什么要使用容器卷总结为一句话:容器的持久化和同步操作。容器间也是可以数据共享的。

2)使用数据卷

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

-v,--volume list                    Bind mount a volume
docker run -it -v 主机目录:容器内目录  -p 主机端口:容器内端口

# 测试
[root@VM-0-17-centos /]# docker run -it -v /home/test:/home centos /bin/bash
# 启动起来之后,我们可以通过 docker inspect 容器id 查看容器的详细信息

测试具体效果(同步)

再来测试(停止容器后,从主机地址里修改文件内容)!

  1、停止容器

  2、宿主机修改文件

  3、启动容器

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

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

2 - docker实战安装MySQL

# 获取镜像
[root@VM-0-17-centos /]# docker pull mysql:5.7
# 运行容器,需要做数据挂载,安装启动mysql,需要配置密码的,这是要注意点!
# 官方推荐的命令格式
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

# 启动mysql
[root@VM-0-17-centos 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=123456 --name mysql01 mysql:5.7

# 参数说明
    -d 后台运行
    -p 端口映射
    -v 卷挂载
    -e 环境配置
    -- name 容器名字

# mysql启动成功后,我们使用mysql workbench 测试连接
# mysl workbench -连接到服务器的3306--和容器内的3306映射 ,我们就可以连接上了
# 在在本地测试创建一个数据库,查看以下我们映射的路径是否ok!

# 假设我们将容器删除 :
# 发现,我们挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能

3 - docker具名挂载和匿名挂载

# 匿名挂载
# 命令:-v 容器内路径
[root@VM-0-17-centos /]# run -d -P --name nginx01 -v /etc/nginx nginx

# 查看所有的 volume 情况 
[root@VM-0-17-centos /]# docker volume ls
DRIVER              VOLUME NAME
local               8b51eb28de9206205d52c13ec7254de24c6bdd84a6cb4dfbc808a30e03d3e8b8
local               679ed601d34df98c118916b8606a5c857989c59bae98203875cfbc7cb8ff2be5

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

具名挂载
[root@VM-0-17-centos /]# docker run -d -P --name nginx02 -v myngix:/etc/nginx nginx
[root@VM-0-17-centos /]# docker volume ls
DRIVER              VOLUME NAME
local               8b51eb28de9206205d52c13ec7254de24c6bdd84a6cb4dfbc808a30e03d3e8b8
local               679ed601d34df98c118916b8606a5c857989c59bae98203875cfbc7cb8ff2be5
local               myngix # 此处显示了具体的名字

# 通过 -v 卷名:容器内路径
# 查看以下这个卷
[root@VM-0-17-centos /]# docker volume inspect myngix
[
    {
        "CreatedAt": "2020-10-04T10:04:37+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/myngix/_data",
        "Name": "myngix",
        "Options": null,
        "Scope": "local"
    }
]

# 所有的docker容器内的卷,没有指定目录的情况下都是
# 在/var/lib/docker/volumes/xxxx/_data下
# 我们通过具名挂载,可以方便的找到我们的一个卷,大多数情况都要使用 具名挂载

如何确定是具名挂载还是匿名挂载,还是指定路径挂载?

# 三种挂载: 匿名挂载、具名挂载、指定路径挂载
-v 容器内路径            #匿名挂载
-v 卷名:容器内路径        #具名挂载
-v /宿主机路径:容器内路径     #指定路径挂载 docker volume ls 是查看不到的

扩展:

# 通过 -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就说明这个路径只能通过宿主机来操作,容器内部是无法操作!

4 - 体验命令脚本生成镜像

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

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

# 新建一个文件夹 /home/docker-test-volume/dockerfile1
# vim dockerfile1 编辑为如下内容

FROM centos

VOLUME ["volume01","volume02"]

CMD echo "----end----"
CMD /bin/bash

# 这里的每个命令,就是镜像的一层!

# 启动构建镜像命令
[root@VM-0-17-centos docker-test-volume]# docker build -f dockerfile1 -t howie/centos .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
 ---> 0d120b6ccaa8
Step 2/4 : VOLUME ["volume01","volume02"]
 ---> Running in 5b470fc55b38
Removing intermediate container 5b470fc55b38
 ---> 2ef45869dbd0
Step 3/4 : CMD echo "---end---"
 ---> Running in 37f11842749f
Removing intermediate container 37f11842749f
 ---> 4e9c91df5d1d
Step 4/4 : CMD /bin/bash
 ---> Running in f68378bdf07e
Removing intermediate container f68378bdf07e
 ---> 4dbc0a61c216
Successfully built 4dbc0a61c216
Successfully tagged howie/centos:latest

# 可通过 docker images 查看自己构建的docker 镜像

启动自己写的容器

这个卷(匿名挂载)和外部一定有一个同步的目录

查看一下卷挂载的路径

docker inspect 容器id

测试一下刚才的文件是否同步出去了!

这种方式使用的十分多,因为我们通常会构建自己的镜像!

假设构建镜像时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径!

5 - 容器数据卷

# 先创建一个容器docker01,并运行。
[root@VM-0-17-centos /]# docker run -it --name docker01 howie/centos(镜像名)
# 在创建一个容器docker02,docker02 "继承" docker01 。并运行
[root@VM-0-17-centos /]# docker run -it --name docker02 --volumes-from docker01 howie/centos

# 此时在docker服务器中,以运行了两个容器,分别是docker01和docker02
# 测试
"""
当我们进入容器docker01(容器数据卷)里的数据卷目录volume01或volume02,添加一个文件[root@8ddddf92b64f volume01]# touch docker01    
此时这个文件也会同步到容器docker02里。容器数据卷可以被多个容器继承,此时他们都是通过 --volumes-from 这个选项实现多个容器之间数据共享和数据同步
""" # 测试:可以删除docker01,查看一下docker02和docker03是否可以访问这个文件测试依旧可以访问

多个mysql实现同步数据

[root@VM-0-17-centos home]# 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

[root@VM-0-17-centos home]# docker run -d -p 3311:3307 -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的构建过程

  基础知识:

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

    2、执行从上到下顺序

    3、#表示注释

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

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

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

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

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

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

3)dockerfile的指令

以前我们都是用别人的镜像,现在可以自己写一个镜像了

# DockerFile常用指令

FROM    # 基础镜像,一切从这里开始构建,例如centos
MAINTAINER    # 镜像是谁写的。姓名+邮箱
RUN    # 镜像构建时,需要 运行的命令
ADD    # 需要添加的镜像(copy文件,会自动解压),如tomcat镜像。添加内容
WORKDIR    # 镜像的工作目录
VOLUME    # 挂载的目录
EXPOSE    # 暴露端口
CMD    # 指定这个容器启动时要运行的命令,如 echo "hello world",只有最后一个会生效,可被代替
ENTRYPOINT    # 指定这个容器启动时要运行的命令,可以追加命令
ONBUILD    # 当构建一个被继承 DockerFile 这个时候就会 运行 ONBUILD
COPY     # 类似ADD,将文件拷贝到镜像中
ENV    # 构建的时候设置环境变量,如mysql的密码,内存分配等

4)实战(创建一个自己的centos)

说明:Docker Hub 中99%的镜像都是从这个镜像过来的 FROM scratch,然后配置需要的软件和配置来构建

创建一个自己的centos

# home目录下,新建文件夹 dockerfile
# 在dockerfile文件夹里 vim mydockerfile
# 编辑如下内容
FROM centos

MAINTAINER howie<3299447929@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

# 通过这个文件构建镜像
# 命令:docker build -f mydockerfile -t mycentos:1.0 .
Successfully built 345905ce5091
Successfully tagged mycentos:1.0

# 测试运行。
[root@VM-0-17-centos dockerfile]# docker run -it mycentos:1.0
[root@4389dad5672f local]# ls
bin  etc  games  include  lib  lib64  libexec  sbin  share  src
[root@4389dad5672f local]# pwd
/usr/local

# 这时。我们发现很多命令都可以使用,例如:vim pwd ifconfig等

我们可以查看镜像构建历史

# 命令:docker history 镜像id
[root@VM-0-17-centos dockerfile]# docker history 345905ce5091
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
345905ce5091        18 minutes ago      /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B                  
c182e9ad4d42        18 minutes ago      /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B                  
049344759f3d        18 minutes ago      /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B                  
c4f938e1db40        18 minutes ago      /bin/sh -c #(nop)  EXPOSE 80                    0B                  
985814362cdd        18 minutes ago      /bin/sh -c yum -y install net-tools             22.8MB              
7e7ce70b0f95        18 minutes ago      /bin/sh -c yum -y install vim                   57.2MB              
5a035193d8c5        18 minutes ago      /bin/sh -c #(nop) WORKDIR /usr/local            0B                  
b329c2c4ab52        18 minutes ago      /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B                  
23d9cb244a42        18 minutes ago      /bin/sh -c #(nop)  MAINTAINER howie<32994479…   0B                  
0d120b6ccaa8        7 weeks ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B                  
<missing>           7 weeks ago         /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B                  
<missing>           7 weeks ago         /bin/sh -c #(nop) ADD file:538afc0c5c964ce0d…   215MB   

4)CMD和ENTRYPOINT的区别

  CMD  # 指定这个容器启动时要运行的命令,如 echo "hello world",只有最后一个会生效,可被代替,不可以追加命令

  ENTRYPOINT  # 指定这个容器启动时要运行的命令,可以追加命令

CMD的测试

# 测试CMD
# 编写 dockerfile文件
[root@VM-0-17-centos dockerfile]# vim docker-cmd-test

# 文件内容如下
FROM centos
CMD ["ls","-a"]

# 构建镜像
[root@VM-0-17-centos dockerfile]# docker build -f docker-cmd-test -t cmdtest:1.0 .
# 通过 run 运行,发现 CMD ["ls","-a"] 命令生效了
[root@VM-0-17-centos dockerfile]# docker run -it cmdtest:1.0
.   .dockerenv    dev  home  lib64       media  opt   root  sbin    sys  usr
..  bin        etc  lib   lost+found  mnt    proc  run   srv    tmp  var

# 想追加一个命令 -l ,ls -al
[root@VM-0-17-centos dockerfile]# docker run 4d3cb544dd66 -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.

#cmd 的清理下 -l 替换了  CMD ["ls","-a"] 命令。-l 不是命令所以报错!

# 所以此时,要想替换命令,必须写全命令
[root@VM-0-17-centos dockerfile]# docker run 4d3cb544dd66 ls -al

ENTRYPOINT的测试

# 编写dockerfile文件
$ vim dockerfile-test-entrypoint
FROM centos
ENTRYPOINT ["ls","-a"]
$ docker run entrypoint-test:0.1
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found ...
# 我们的命令,是直接拼接在我们得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中很多命令都十分的相似,我们需要了解它们的区别,我们最好的学习就是对比他们然后测试效果!

7 - 使用dockerfile构建Tomcat镜像

1、准备镜像文件

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

 2、编写 Dockerfile 文件(官方命名Dockerfile,build时会自动寻找此文件,就不需要再指定 -f)

FROM centos

MAINTAINER howie<3299447929@qq.com>
COPY readme.txt /usr/local/readme.txt    # 复制文件

ADD apache-tomcat-9.0.37.tar.gz /usr/local/    # 复制解压
ADD jdk-8u261-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_261    # 设置环境变量
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar    # 设置环境变量,分隔符是:

ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.37
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.37

ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:$CATALINA_HOME/lib

EXPOSE 8080    # 设置暴露端口
 
CMD /usr/local/apache-tomcat-9.0.37/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.37/logs/catalina.out 

3、构建镜像

# 因为dockerfile命名使用默认命名 因此不用使用-f 指定文件
[root@VM-0-17-centos tomcat]# docker build -t mytomcat:1.0 .

4、启动镜像(卷挂载),并测试

# 启动镜像,并测试
[root@VM-0-17-centos tomcat]# docker run -d -p 8080:8080 --name mytomcat -v /home/test:/usr/local/apache-tomcat-9.0.37/webapps/test -v /home/mytomcatlogs/:/usr/local/apache-tomcat-9.0.37/logs mytomcat:1.0

5、访问测试

# 内网
[howie@VM-0-17-centos test]$ curl localhost:8080

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

本地挂载的目录(/home/test),我们往test目录里添加如下内容

[root@VM-0-17-centos test]# vim index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8" contentType="text/html; utf-8" %>
<html>
<head><title>Hello World</title></head>
<body>
Hello World!<br/>
<%
System.out.println("hello world!");
%>
<h2>这是我的第一个Tomcat镜像!</h2>
</body>
</html>

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

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

8 - 发布自己的镜像

1、地址 https://hub.docker.com/,注册自己的账号

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

3、在服务器上登录账号

[root@VM-0-17-centos /]# 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

4、登录完毕后就可以提交镜像了,就是一步 docker push

[root@VM-0-17-centos /]# docker login -u laizhenghua
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@VM-0-17-centos /]# docker push mytomcat
The push refers to repository [docker.io/library/mytomcat]
d8ce94351a78: Preparing 
e770990f5f72: Preparing 
3d41247a2ea2: Preparing 
3e54d69aa1bd: Preparing 
291f6e44771a: Preparing 
denied: requested access to the resource is denied    # 拒绝,提交失败

# 增加一个tag
# 命令:docker tag 镜像id 作者(自己登录的用户名)/镜像名:镜像版本
[root@VM-0-17-centos /]# docker tag 4623fe809b76 laizhenghua/mytomcat:1.0

# 再次提交
[root@VM-0-17-centos /]# docker push laizhenghua/mytomcat:1.0

5、小结

 

posted @ 2020-10-03 22:14  赖正华  阅读(75)  评论(0编辑  收藏  举报