docker快速入门

1.没使用docker之前存在哪些问题

软件开发最麻烦的一件事就是环境问题,对于一个程序来说,它可能依赖一些环境,只有机器有这些环境的前提下它才能正常运转。拿个最简单的案例,就是我们编写java代码的时候,要求我们的机器有JDK环境,那么就会出现我的程序在我的电脑上能跑,但是放到一个没有JDK环境的机器上就无法正常运行了。

那么基于这个原因,有人就想软件可不可以带环境安装?也就是在安装的时候,把原始环境一模一样地复制过来?

2. 什么是docker

百度百科
docker是一个开源的应用容器引擎,让开放者可以打包他们的应用以及依赖到一个可移植的镜像中,然后发布到任何流行的Linux或Window机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

提炼关键点:

  • docker可以将应用程序及依赖的环境一起打包到一个镜像中。 解决环境配置难题
  • docker是一个虚拟化技术
  • docker使用完全沙箱机制,及容器之间是互相隔离的

3. docker与虚拟化技术比较

那么既然docker容器是一个虚拟化技术,我们自然而然的就会想到虚拟机。那docker的虚拟化技术和虚拟机的虚拟化技术有什么不同呢?

如下图分别是虚拟机与docker的实现框架。docker快速入门_第1张图片
简单解释一下俩者之间的区别:

  • 每个虚拟机都拥有一个完整的操作系统,应用程序以及必要的二进制文件和库,至少占用10GB以上的空间。所以虚拟机的启动速度较为缓慢
  • docker将代码以及依赖打包到了同一个容器上,多个容器可以在同一个跑在同一个宿主机上,并共享同一个操作系统内核,每个容器在用户空间中作为隔离的进程执行。容器的大小一般在10MB左右,远远小于虚拟机的大小,所以容器的启动速度也较快

一句话概括:每个虚拟机都需要一个独立完成的操作系统,而docker容器共享宿主机的操作系统内核。

如果想详细了解,可以参考文章:docker与虚拟机的区别

用表格展示docker和虚拟机的区别:

特性 docker容器 虚拟机
启动 秒级 分钟级
硬盘使用 一般为MB 一般为GB
性能 接近原生(宿主机) 弱于原生
系统支持量 单机支持上千个容器 一般几十个

4. docker能用来做什么

Docker 的主要用途,目前有三大类。

(1)提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。

(2)提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。

(3)组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。


5. docker的架构

docker架构图:
docker快速入门_第2张图片

  • Docker daemon(Docker守护进程)
    Docker daemon是一个运行在宿主机的守护进程,负责监听Docker的API请求以及管理docker的objects如镜像、容器、网络等。

  • Docker client(docker客户端)
    docker客户端是docker的用户界面,可以接受用户命令和配置标识,并与Docker daemon通信。如图中,docker build、docker run都是Docker相关的命令。

  • images(docker镜像)
    Docker镜像是一个只读模板,它包含创建Docker容器的说明。与系统安装光盘有点像,使用系统安装关盘可以安装系统,同理,使用Docker镜像可以运行Docker镜像中的程序。

  • container(容器)
    容器是镜像可运行的实例。容器与镜像的关系类似于面向对象中,类与对象的关系。可通过docker API或者CLI命令启动、移动和删除容器。

  • Docker registries
    docker registry是一个集中存储和分发镜像的服务。Docker hub是一个公共的registry可供任何人使用,我们使用docker pull拉取镜像时,默认拉取的就是Docker hub中的镜像。你也可以创建自己的private registry。这与maven仓库有点像,只不过maven中放的是jar包,而docker hub中放的是镜像。

接下来举例说明执行docker pull和docker run在这个docker架构图中的流程是怎样的。

docker pull nginx执行流程图如下:
docker快速入门_第3张图片
当在客户端docker pull nginx命令的时候,如果本地中没有nginx镜像或者不是最新的,那么他会去Registry中拉取最新的镜像(因为我们这里并没有指定版本号,所以他默认拉取最新的)

docker run Ubuntu流程图如下:
docker快速入门_第4张图片

6. docker的安装

看官网吧:docker安装

7. 快速入门docker

这里以安装nginx为例

# 拉取镜像
[root@localhost ~]# docker pull nginx
[root@localhost ~]# docker run --name nginx-test -p 81:80 -d nginx

参数说明:

  • –name nginx-test:容器名称。
  • -p 8180:导入进行映射,将本地81映射到容器内部的80端口。
  • -d nginx:设置容器在后台一直运行。
    在这里插入图片描述
    在本机中访问nginx,查看是否启动成功:
    docker快速入门_第5张图片

至此,就成功安装并启动了nginx了。而且,如果你自己手动安装过Nginx的话,你应该知道安装Nginx前,我们应该先安装Nginx的依赖环境如:GCC、PCRE、OpenSSL等。

但是使用了docker之后,在安装nginx的时候,他已经把依赖的环境一起安装了,所以我们只需要直接运行容器即可,这就是docker的一大好处。

8. docker常用命令

镜像相关的命令

1、搜索镜像

可使用 docker search命令搜索存放在 Docker Hub中的镜像。执行该命令后, Docker就会在Docker Hub中搜索含有 java这个关键词的镜像仓库。

​ docker search java

docker快速入门_第6张图片

以上列表包含五列,含义如下:

- NAME:镜像仓库名称。

- DESCRIPTION:镜像仓库描述。

- STARS:镜像仓库收藏数,表示该镜像仓库的受欢迎程度,类似于 GitHub的 stars0

- OFFICAL:表示是否为官方仓库,该列标记为[0K]的镜像均由各软件的官方项目组创建和维护。

- AUTOMATED:表示是否是自动构建的镜像仓库。

注意:如果执行搜索命令报错,需要配置镜像加速器

​ docker search java

Error response from daemon: Get https://index.docker.io/v1/search?q=java: read tcp 52.200.132.201:443: i/o timeout

我们可以借助阿里云的镜像加速器,登录阿里云(https://cr.console.aliyun.com/#/accelerator)

可以看到镜像加速地址如下图:
docker快速入门_第7张图片


cd /etc/docker

查看有没有 daemon.json。这是docker默认的配置文件。

如果没有新建,如果有,则修改。

vim daemon.json

{
  "registry-mirrors": ["你的阿里云加速地址"]
}

保存退出。

重启docker服务

sudo systemctl daemon-reload sudo systemctl restart docker

成功!

2、下载镜像

使用命令docker pull命令即可从 Docker Registry上下载镜像,执行该命令后,Docker会从 Docker Hub中的 java仓库下载最新版本的 Java镜像。如果要下载指定版本则在java后面加冒号指定版本,例如:docker pull java:8

docker pull java:8

docker快速入门_第8张图片

3、列出镜像

使用 docker images命令即可列出已下载的镜像

docker images

0

以上列表含义如下

- REPOSITORY:镜像所属仓库名称。

- TAG:镜像标签。默认是 latest,表示最新。

- IMAGE ID:镜像 ID,表示镜像唯一标识。

- CREATED:镜像创建时间。

- SIZE: 镜像大小。

4、删除本地镜像

使用 docker rmi命令即可删除指定镜像,强制删除加 -f

docker rmi java

删除所有镜像

docker rmi $(docker images -q)

容器相关的命令

1、新建并启动容器

使用以下docker run命令即可新建并启动一个容器,该命令是最常用的命令,它有很多选项,下面将列举一些常用的选项。

-d选项:表示后台运行

-P选项:随机端口映射

-p选项:指定端口映射,有以下四种格式。

-- ip:hostPort:containerPort 

-- ip::containerPort

-- hostPort:containerPort 

-- containerPort

–net选项:指定网络模式,该选项有以下可选参数:

--net=bridge:默认选项,表示连接到默认的网桥。

--net=host:容器使用宿主机的网络。

--net=container:NAME-or-ID:告诉 Docker让新建的容器使用已有容器的网络配置。

--net=none:不配置该容器的网络,用户可自定义网络配置。

docker run -d -p 91:80 --name nginx nginx

这样就能启动一个 Nginx容器。在本例中,为 docker run添加了两个参数,含义如下:

-d 后台运行

-p 宿主机端口:容器端口 #开放容器端口到宿主机端口

–name:指定容器名称

访问 http://Docker宿主机 IP:91/,将会看到nginx的主界面如下:

docker快速入门_第9张图片

需要注意的是,使用 docker run命令创建容器时,会先检查本地是否存在指定镜像。如果本地不存在该名称的镜像, Docker就会自动从 Docker Hub下载镜像并启动一个 Docker容器。

2、列出容器

用 docker ps命令即可列出运行中的容器

docker ps

0

如需列出所有容器(包括已停止的容器),可使用-a参数。该列表包含了7列,含义如下

- CONTAINER_ID:表示容器 ID。

- IMAGE:表示镜像名称。

- COMMAND:表示启动容器时运行的命令。

- CREATED:表示容器的创建时间。

- STATUS:表示容器运行的状态。UP表示运行中, Exited表示已停止。

- PORTS:表示容器对外的端口号。

- NAMES:表示容器名称。该名称默认由 Docker自动生成,也可使用 docker run命令的–name选项自行指定。

3、停止容器

使用 docker stop命令,即可停止容器
docker stop f0b1c8ab3633

其中f0b1c8ab3633是容器 ID,当然也可使用 docker stop容器名称来停止指定容器

4、强制停止容器

可使用 docker kill命令发送 SIGKILL信号来强制停止容器
docker kill f0b1c8ab3633

5、启动已停止的容器

使用docker run命令,即可新建并启动一个容器。对于已停止的容器,可使用 docker start命令来启动
docker start f0b1c8ab3633

6、查看容器所有信息

docker inspect f0b1c8ab3633

可以查看到contain中使用的ip哦。

7、查看容器日志

docker container logs f0b1c8ab3633

8、查看容器里的进程

docker top f0b1c8ab3633

9、容器与宿主机相互复制文件
  • 从容器里面拷文件到宿主机:

​docker cp 容器id:要拷贝的文件在容器里面的路径 宿主机的相应路径 。如:docker cp 7aa5dc458f9d:/etc/nginx/nginx.conf /mydata/nginx

  • 从宿主机拷文件到容器里面:

docker cp 要拷贝的宿主机文件路径 容器id:要拷贝到容器里面对应的路径

10、进入容器

使用docker exec命令用于进入一个正在运行的docker容器。如果docker run命令运行容器的时候,没有使用-it参数,就要用这个命令进入容器。一旦进入了容器,就可以在容器的 Shell 执行命令了

docker exec -it f0b1c8ab3633 /bin/bash (有的容器需要把 /bin/bash 换成 sh)

11、容器内安装vim、ping、ifconfig等指令

apt-get update

1、安装vim
apt-get install vim

2、安装ping
apt-get install iputils-ping

3、安装ifconfig
apt-get install net-tools

12、删除容器

使用 docker rm命令即可删除指定容器

docker rm f0b1c8ab3633

该命令只能删除已停止的容器,如需删除正在运行的容器,可使用-f参数

强制删除所有容器

docker rm -f $(docker ps -a -q)

13、容器开机自启动

1)在使用docker run启动容器时,使用–restart参数来设置:

–restart具体参数值详细信息:

  • no - 容器退出时,不重启容器;
  • on-failure - 只有在非0状态退出时才从新启动容器;
  • always - 无论退出状态是如何,都重启容器;

还可以在使用on - failure策略时,指定Docker将尝试重新启动容器的最大次数。默认情况下,Docker将尝试永远重新启动容器。

docker run --restart=on-failure:10 redis

2)如果创建时未指定 --restart=always ,可通过update 命令
docker update --restart=always xxx


9. dockerfile

什么是dockerfile

Dockerfile是一个用来构建镜像的文本文件,里面包含了一条条构建镜像所需要的指令和说明。

使用dockerfile构建自己的镜像

接下来以nginx为例,我们将构建属于我们自己的Nginx镜像。

1、首先在一个空的目录下创建一个名为Dockerfile的文件

FROM nginx
RUN echo 'hello my nginx' > /usr/share/nginx/html/index.html

这是一个非常简单的Dockerfile,其中FROM和RUN都是Dockerfile的指令。FROM用于指定基础镜像,RUN用于执行命令。

2、开始构建镜像
在Docker所在路径下执行命令:

docker build -t nginx:my_nginx .

其中my_nginx是镜像的标签。最后还有一个.别忘了,.代表本次执行的上下文路径。
docker快速入门_第10张图片
以上显示,表示构建成功

3、用我们自己创建的镜像启动一个docker容器

 docker run -d -p 80:80 nginx:my_nginx

4、访问看看结果
docker快速入门_第11张图片

dockerfile常见指令

命令 用途
FROM 基础镜像文件
RUN 构建镜像阶段执行命令
ADD 添加文件,从src目录复制文件到容器的dest,其中 src可以是 Dockerfile所在目录的相对路径,也可以是一个 URL,还可以是一个压缩包
COPY 拷贝文件,和ADD命令类似,但不支持URL和压缩包
CMD 容器启动后执行命令
EXPOSE 声明容器在运行时对外提供的服务端口
WORKDIR 指定容器工作路径
ENV 指定环境变量
ENTRYPINT 容器入口, ENTRYPOINT和 CMD指令的目的一样,都是指定 Docker容器启动时执行的命令,可多次设置,但只有最后一个有效。
USER 该指令用于设置启动镜像时的用户或者 UID,写在该指令后的 RUN、 CMD以及 ENTRYPOINT指令都将使用该用户执行命令。
VOLUME 指定挂载点,该指令使容器中的一个目录具有持久化存储的功能,该目录可被容器本身使用,也可共享给其他容器。当容器中的应用有持久化数据的需求时可以在 Dockerfile中使用该指令。格式为: VOLUME["/data"]。

注意:RUN命令在 image 文件的构建阶段执行,执行结果都会打包进入 image 文件;CMD命令则是在容器启动后执行。另外,一个 Dockerfile 可以包含多个RUN命令,但是只能有一个CMD命令。

你可能感兴趣的:(docker,java)