• 基于docker构建测试环境


    目录

    0x01介绍

    0x02 镜像基本操作

    0x03 容器基本操作

    0x04 容器的修改与保存

    0x05 使用Dockerfile定制镜像

    0x01介绍

    Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源,它可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化;容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低,通过docker我们可以快速搭建起比vm轻便很多的测试环境。

    镜像:是用于创建 Docker 容器的模板

    容器:独立运行的一个或一组应用

    仓库:镜像的集中存放地,可以理解为代码控制中的代码仓库,Docker Hub(https://hub.docker.com)提供了庞大的镜像集合供使用

    这里使用的是Ubuntu18来进行实践的

    0x02 镜像基本操作

    docker的安装不细说了,网上有大量的内容。

    从仓库中获取镜像

    搜索镜像

    docker search image_name
    

    这里以nginx为例

    file

    可以看到查询后有5列内容,依次是:

    名字、描述、获得的star数、是否官方提供、镜像是否是通过自动化构建生成的

    如果要对搜索结果进行过滤的话,可以通过以下的命令来进行

    是否是官方提供

    docker search --filter "is-official=true" image_name
    

    file

    是否是自动化构建

    docker search --filter "is-automated=true" image_name
    

    file

    大于多少星的

    docker search --filter starts=100 image_name
    

    file

    下载镜像

    docker pull image_name
    

    file

    这块就完全取决于网速了,我们可以通过更换国内的源来加快速度

    Linux位置:
    /etc/docker/daemon.json
    Windows位置:
    %programdata%dockerconfigdaemon.json
    

    在配置文件中加入以下配置内容即可

    {
    "registry-mirrors": ["http://hub-mirror.c.163.com"]
    }
    

    改完以后需要重启dockers服务

    file

    查看本地存在的镜像

    docker images
    

    file

    同样也有5列内容,它们依次是:

    名字、标签、ID、镜像的创建时间、镜像的大小

    删除本地镜像

    docker rmi image_name
    

    file

    这里我就不进行执行了

    0x03 容器基本操作

    上面我们获取了镜像,现在就可以通过镜像来创建容器了

    创建容器

    docker run -itd --name=container_name image_name
    

    PS:

    -i:以交互模式运行容器

    -d:后台运行容器并返回容器ID

    -t:容器重新分配一个伪输入终端

    --name:为容器自定义一个名字

    file

    这里返回的信息就是容器的ID,后面查看运行容器时候的容器ID也是这一串,不过是前几位,但是已经足够表示它的唯一性了

    查看运行中的容器

    docker ps
    

    file

    有7列内容,它们依次是:

    容器ID、采用镜像、容器启动后执行的命令、创建时间、状态、端口、自定义的名字

    查看所有的容器(包括已停止的)

    docker ps -a
    

    停止容器

    docker stop container_name/container_id
    

    file

    然后我们顺便尝试一下查看全部容器的命令结果

    file

    启动容器

    docker start container_name/container_id
    

    file

    重启容器

    docker restart container_name/container_id
    

    file

    删除容器

    docker rm container_name/container_id
    

    这里我们来使用容器ID来进行演示

    如果想要删除容器,必须先把容器关闭掉

    file

    0x04 容器的修改与保存

    为什么会要有保存操作,因为当你删除掉容器之后,重新再创建容器,你之前所修改的操作是不会保存的,所以我们就需要涉及到容器的保存操作

    进入容器

    docker exec -it container_name/container_id command
    

    file

    退出容器

    exit
    

    file

    上面的创建文件操作是为了验证一下

    停止容器后重启,所进行的更改是还存在的;如果删除掉后是不会存在的

    重启后:

    file

    删除后:

    file

    提交修改

    docker commit -a "author" -m "message" container_name/container_id new_image_name:tag_name
    

    PS:

    -a:可选参数,用于指定作者

    -m:可选参数,提交信息,表明自己所作的修改

    new_image_name:自定义新的镜像的名称

    tag_name:新的镜像的标签,默认为latest

    首先先进行一系列的修改

    file

    退出后,我们进行提交修改操作

    file

    可以发现提交后返回的值就是镜像的ID

    然后我们再通过这个新创建的镜像来启动一个容器看一下是否保存了之前的修改操作

    file

    file

    可以发现内容都是存在的

    PS:这里还有一个点大家需要注意一下tag_name默认是latest,如果你没有自定义tag_name的时候,在启动的时候可以不写,如果自定义过的话,在启动的时候需要加上tag_name的值

    端口映射

    为什么要进行端口映射?

    因为所有的运行都是在容器中的,而我们能提供服务的是我们的宿主机,所以只有进行端口映射才能从外部访问我们搭建好的容器系统。

    docker run -itd --name=container_name -p 宿主机端口号:容器端口号 image_name
    

    file

    然后访问本地的8080端口就可以访问到nginx容器的80端口了

    file

    文件挂载

    可以将本地的文件挂载到容器中,这里的目录需要写绝对路径

    docker run -itd --name=container_name -v /宿主机文件目录/文件名:/容器文件目录/文件名 image_name
    

    file

    然后我们再访问本地的8080端口看一下效果

    file

    PS:如果本地修改了文件,容器中的也会相应更改的

    在宿主机和容器之间复制文件

    docker cp 容器名:/容器文件目录/文件名 /宿主机文件目录/文件名
    docker cp /宿主机文件目录/文件名 容器名:/容器文件目录/文件名
    

    file

    容器互联

    可以在容器和容器之间进行操作,在docker中每一个容器只提供一个功能,如果需要进行组合工作的话,是需要同时启动多个容器来进行配合的。

    docker run -itd --name=container_name --link 要关联的容器名字:容器在被关联容器中的别名 image_name
    

    这里我们来演示PHP和MySQL两个容器配合工作

    首先我们先将PHP和MySQL的镜像下载回来

    file

    file

    file

    首先我们先启动一个MySQL的容器

    因为在这个组合中PHP的运行依赖于MySQL,所以我们先启动MySQL容器;而且因为数据库所产生的内容都将是非常重要的,而删除容器之后,里面的数据是不会保留下来的,所以我们使用挂载的方式将我们宿主机上的目录挂载到MySQL容器中

    这里我们还需要对MySQL的root密码进行初始化的操作,所以加上-e参数来对其进行初始化,-e参数是将环境变量信息传入容器中

    file

    由于MySQL8版本的特性,我们需要重新设置一下root密码

    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'wuxin';
    

    关于MySQL8的一些操作可以参考《MySQL8.0操作命令

    file

    然后就可以正常登陆了

    file

    然后进行简单的数据插入

    file

    然后启动PHP容器

    file

    然后和MySQL建立连接

    file

    发现没有pdo_mysql插件,需要自己进行安装,docker自己内置了下载方式

    file

    然后我们更改一下php代码

    file

    仔细观察应该可以发现,我们这里的数据库连接地址写的是mysql而不是IP地址,这里的mysql其实就是我们在关联容器的时候,所起的那个别名,如下图所画的那个直线所示的内容

    file

    这里是因为IP地址的话,会经常变化,如果使用别名的话就不会有任何的问题了。

    然后再次进入docker进行执行

    file

    0x05 使用Dockerfile定制镜像

    Dockerfile就是一个包含Linux命令的一个文件,docker会通过读取其中的命令来构建镜像。

    内容结构

    Dockerfile一般分为四个部分:
    基础镜像信息、维护者信息、镜像操作指令和容器启动时执行的指令

    运行Dockerfile

    docker build -t image_name:tag_name
    

    或者通过-f参数来指定文件位置来运行

    docker build -f /path/Dockerfile
    

    命令详解

    PS:如果多行内容都属于一个命令的话,在结尾使用 && 来表示换行

    FROM:指定基础镜像,必须是第一个命令

    FROM <image>
    FROM <image>:<tag>
    FROM <image>@<digest>
    例:
    FROM centos:7.0
    

    MAINTAINER:维护者信息

    MAINTAINER <name>
    例:
    MAINTAINER wuxin
    

    RUN:构建镜像时执行的命令

    RUN <command>
    RUN ["executable", "param1", "param2"]
    例:
    RUN yum install nginx
    RUN ["/bin/executable", "param1", "param2"]
    

    ADD:将本地文件添加到容器中,也可以访问网络资源,tar文件会自动解压

    ADD <宿主机文件路径><容器路径>
    例:
    ADD test* /test/  添加所有以test开头的文件
    ADD tes?.txt /test/  ?可以替代一个单个字符
    

    COPY:功能类似ADD,但是不能自动解压,也不能访问网络资源

    CMD:在容器启动时进行执行的内容,如果运行时指定了其他命令,这里的内容将会被覆盖

    CMD ["executable", "param1", "param2"]  执行可执行文件
    CMD command param1 param2  执行shell内部命令
    例:
    CMD ["/usr/bin/wc", "--help"]
    CMD echo "This is a test"
    

    PS:CMD用于指定在容器启动时要执行的命令,RUN用于指定镜像构建时所要执行的命令

    ENTRYPOINT:与CMD类似,配置容器启动时的执行命令,一定会被执行,即使运行 docker run时指定了其他命令

    例:
    ENTRYPOINT ["/bin/echo","Hello"]
    

    LABEL:用于为镜像添加元数据

    LABEL <key>=<value> <key>=<value>
    LABEL version="1.0" description="balabala"
    

    ENV:设置环境变量

    ENV <key> <value>
    例:
    ENV name wuxin
    ENV names balabala
    

    PS:key之后的内容均会被视为value,所以依次只能设置一个变量

    EXPOSE:指定与外界交互的端口

    EXPOSE <port> [<port>]
    例:
    EXPOSE 80 443
    EXPOSE 8888
    

    PS:EXPOSE不会让容器的端口访问到宿主机,需要在运行的时候使用-p参数来将所有的EXPOSE的端口导出

    VOLUME:用于指定持久化目录

    VOLUME ["/path/"]
    例:
    VOLUME ["/data"]
    VOLUME ["/var/www", "/var/log"]
    

    WORKDIR:工作目录

    WORKDIR /path/workdir
    例:
    WORKDIR /usr/local  此时的工作目录为/usr/local
    WORKDIR nginx  此时的工作目录为/usr/local/nginx
    

    PS:设置完成后,RUN、CMD等命令执行时都会在该目录下执行,在使用docker run运行时,可以通过-w参数覆盖此时的设置

    USER:指定容器运行时的用户名或UID,后续的RUN命令也会使用指定用户

    USER user
    USER user:group
    USER uid
    USER uid:gid
    USER user:gid
    USER uid:group
    例:
    USER wuxin
    

    ARG:用于指定传递给构建运行时的变量

    ARG <name>[=<default value>]
    例:
    ARG site
    ARG build_user=www
    

    ONBUILD:用于设置镜像触发器

    ONBUILD [INSTRUCTION]
    例:
    ONBUILD ADD ./app/src
    ONBUILD RUN /usr/local/bin/python-build –dir/app/src
    

    PS:当所构建的镜像被用作其他镜像的基础镜像,该镜像中的触发器将会被触发

    注意:Dockerfile是分层的,执行的时候也是分层来进行执行的

    • 文章首发于本人公众号:无心的梦呓(wuxinmengyi)
    • 扫码关注即可
    • file
  • 相关阅读:
    Vue实现添加、删除、关键字查询
    打开新页面 自定义方法并获取携带值
    unity3d 刷新速率
    unity3d AssetStore 下载的资源位置
    unity3d c# http 请求json数据解析
    unity3d 自定义载入条/载入动画
    课程改进意见
    梦断代码
    An internal error occurred during: "Launching MVC on Tomcat 7.x".
    n以内的1的个数
  • 原文地址:https://www.cnblogs.com/wuxinmengyi/p/11591816.html
Copyright © 2020-2023  润新知