目录

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为例

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

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

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

是否是官方提供

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

是否是自动化构建

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

大于多少星的

docker search --filter starts=100 image_name

下载镜像

docker pull image_name

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

Linux位置:

/etc/docker/daemon.json

Windows位置:

%programdata%\docker\config\daemon.json

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

{

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

}

改完以后需要重启dockers服务

查看本地存在的镜像

docker images

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

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

删除本地镜像

docker rmi image_name

这里我就不进行执行了

0x03 容器基本操作

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

创建容器

docker run -itd --name=container_name image_name

PS:

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

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

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

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

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

查看运行中的容器

docker ps

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

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

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

docker ps -a

停止容器

docker stop container_name/container_id

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

启动容器

docker start container_name/container_id

重启容器

docker restart container_name/container_id

删除容器

docker rm container_name/container_id

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

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

0x04 容器的修改与保存

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

进入容器

docker exec -it container_name/container_id command

退出容器

exit

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

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

重启后:

删除后:

提交修改

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

PS:

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

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

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

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

首先先进行一系列的修改

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

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

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

可以发现内容都是存在的

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

端口映射

为什么要进行端口映射?

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

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

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

文件挂载

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

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

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

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

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

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

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

容器互联

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

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

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

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

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

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

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

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

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

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

然后就可以正常登陆了

然后进行简单的数据插入

然后启动PHP容器

然后和MySQL建立连接

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

然后我们更改一下php代码

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

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

然后再次进入docker进行执行

0x05 使用Dockerfile定制镜像

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

内容结构

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

运行Dockerfile

docker build -t image_name:tag_name

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

docker build -f /path/Dockerfile

命令详解

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

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

FROM

FROM :

FROM @

例:

FROM centos:7.0

MAINTAINER:维护者信息

MAINTAINER

例:

MAINTAINER wuxin

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

RUN

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 "test"

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

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

例:

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

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

LABEL ==

LABEL version="1.0" description="balabala"

ENV:设置环境变量

ENV

例:

ENV name wuxin

ENV names balabala

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

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

EXPOSE []

例:

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 [=]

例:

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)

扫码关注即可

docker搭建java测试环境_基于docker构建测试环境相关推荐

  1. docker redis 删除集群_基于Docker的Redis集群实践

    单机版的Redis相信大家都比较熟悉了,这里介绍几种Redis的集群模式,并结合Docker来进行实践操作 abstract.png 准备工作 通过Docker下载最新的Redis镜像 # 获取red ...

  2. Docker——使用docker工具管理软件/组件的运行,镜像、容器、数据卷的基本概念,常用指令,使用docker搭建Java微服务运行环境

    Docker--使用docker工具管理软件/组件的运行,镜像.容器.数据卷的基本概念,常用指令,使用docker搭建Java微服务运行环境 一.docker的安装和卸载 1.卸载 2.安装 3. 导 ...

  3. Docker最全教程之使用Docker搭建Java开发环境(十八)

    前言 Java是一门面向对象的优秀编程语言,市场占有率极高,但是在容器化实践过程中,发现官方支持并不友好,同时与其他编程语言的基础镜像相比(具体见各语言镜像比较),确实是非常臃肿. 本篇仅作探索,希望 ...

  4. Docker最全教程之使用Docker搭建Java开发环境

    前言 Java是一门面向对象的优秀编程语言,市场占有率极高,但是在容器化实践过程中,发现官方支持并不友好,同时与其他编程语言的基础镜像相比(具体见各语言镜像比较),确实是非常臃肿. Java [Jav ...

  5. docker $PWD路径_基于Docker搭建Nacos集群

    准备机器3台 192.168.1.160 192.168.1.161 192.168.1.162 docker安装 CentOS 7下安装Docker及基础操作 安装 mysql 基于docker安装 ...

  6. 二氧化碳传感器CCS811简单的测试驱动_基于Arduino

    二氧化碳传感器CCS811简单的测试驱动_基于Arduino 目的 简单介绍 由于MOX Sensor材料特性在使用过程中要注意的问题 IC的初始化过程 IC的读数据过程 可配置参数 完整程序代码 数 ...

  7. docker redis 配置文件_基于Docker搭建Redis一主两从三哨兵

    点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 作者:oscarwin juejin.im/post/5d26b03de51d454fa3 ...

  8. 使Docker搭建Java Web运行环境

    Docker 是 2014 年最为火爆的技术之一,几乎所有的程序员都听说过它.Docker 是一种"轻量级"容器技术,它几乎动摇了传统虚拟化技术的地位,现在国内外已经有越来越多的公 ...

  9. ubuntu docker慢_基于docker搭建MulVAL攻击图

    拥抱docker,经常做了一些好玩的东西,想在别人的电脑上运行,都发现一堆问题,不是少一个依赖,就是缺一个环境变量,好不郁闷.于是,将目光锁定在了docker上,只要大家都有docker,自己本地能跑 ...

最新文章

  1. Opencv各版本Release下载
  2. [BZOJ 2734] 集合选数
  3. 大数据架构如何做到流批一体?【对于Flink等流批一体的概念做了很好的澄清!】
  4. 数学--数论--中国剩余定理+扩展中国剩余定理(孙子定理)
  5. 我的第一个安卓应用程序_今天,我启动了我的第一个移动应用程序。 这是我学到的...
  6. 批量导入时间oracle excel,读取Excel数据、批量导入到Oracle数据库
  7. 八爪鱼,国内领先的爬虫云采集工具平台,为许多大型公司,政府,提供数据服务
  8. c语言求英文字母编号,菜鸟求助,写一个随机输出26个英文字母的程序
  9. yii2分页的基本使用及其配置详解 1
  10. 直线端点画垂线lisp_利用lisp给cad直线取整?
  11. Java---(SpringBlade框架)后台从数据库读取所有点的经度和纬度,传输到前端显示在地图上
  12. 【Rust 笔记】08-枚举与模式
  13. java stl 模型 切片_使用 Materialise magics 对 STL文件进行切片
  14. Java POI 导出 Excel 单元格 合并单元格 相邻的相同值 合并
  15. windows系统redis部署配置(IP端口服务)配置
  16. qevent 事件的accept()和ignore()
  17. c语言上交源代码怎么交啊,C语言问题在线等啊作业提交上交的的内容必须由以下两个部分组成,缺 爱问知识人...
  18. 爬虫第一弹:安居客房地产数据爬虫
  19. webim 实现实时通讯的 4 种方式
  20. php框架symfony,Symfony框架配置

热门文章

  1. java判断按钮已选择的值_如何获取buttonGroup的选定单选按钮的值 - java
  2. fopen函数和fwrite、fread、fseek函数的配套使用
  3. C#毕业设计——基于C#+asp.net+sqlserver的汽车销售管理系统设计与实现(毕业论文+程序源码)——汽车销售管理系统
  4. ArcGIS Engine开发(1)
  5. 数据结构和算法笔记(3)
  6. vue 选取某月、当月第一天和最后一天处理
  7. 大数据开发之数仓建模
  8. AP RFC介绍:关于sRFC,aRFC,tRFC,qRFC和bgRFC
  9. Threejs系列--18游戏开发--沙漠赛车游戏【loading资源加载进度条】
  10. ChatGPT 与AI大模型发展简要综述