热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

第一个Docker化Java应用(Docker学习笔记)

第一个Docker化Java应用

第一个Docker化Java应用

文章目录

  • 第一个Docker化Java应用
    • 1.安装Docker应用
    • 2.Docker初识
    • 3.Docker网络
    • 4.第一个Docker中的Java应用
      • 1.写Dockerfile
      • 2.构建Docker镜像
    • 5.Docker 命令小结
    • 6.Dockerfile语法小结
    • 7.Docker进阶知识
      • 1.Volume
      • 2.Registry
      • 3.docker-compose.yml
      • 4.docker-compose命令

1.安装Docker应用

首先,在Linux中安装Docker是有一个先决条件的,那就是必须是内核版本大于3.10的64位系统

所以我们安装docker的第一步首先应该检查内核版本是否大于3.10

[root@localhost ~]# uname -r
3.10.0-514.26.2.el7.x86_64

这里可以看到,版本刚好能够符合.

然后我们可以切换到root权限,登录终端

[root@localhost ~]$ su

这里我默认登录的是root权限所以不用切换

如果我们安装过旧版本的话,还需要卸载掉旧版本

[root@localhost ~]# yum remove docker
[root@localhost ~]# yum remove docker-common
[root@localhost ~]# yum remove docker-selinux
[root@localhost ~]# yum remove docker-engine

这里我没有安装过,所以这一步也可以省略了.

然后我们需要准备Linux上边需要的软件包

#yum-util提供yum-config-manager功能
#另外两个是devicemapper驱动依赖的
[root@localhost ~]# yum install -y yum-utils
[root@localhost ~]# yum install -y device-mapper-persistent-data
[root@localhost ~]# yum install -y lvm2

然后设置yum源

[root@localhost ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

那么,好了,做完上边几步,我们已经做好了安装Docker的准备工作,可以开始安装Docker了.

这里我们可以安装两种:

  1. 安装最新版本

[root@localhost ~]# yum install -y docker-ce

  1. 安装指定版本

#查询版本列表
[root@localhost ~]# yum list docker-ce --showduplicates | sort -r
Loading mirror speeds from cached hostfile
Loaded plugins: fastestmirror
Installed Packages
docker-ce.x86_64 3:18.09.3-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.3-3.el7 @docker-ce-stable
#指定版本安装(这里的例子是安装上面列表中的第二个)
$ yum install -y docker-ce-3:18.09.3-3.el7

这里安装完之后启动docker

[root@localhost ~]# systemctl start docker.service
[root@localhost ~]# docker version
Client:
Version: 18.09.3
API version: 1.39
Go version: go1.10.8
Git commit: 774a1f4
Built: Thu Feb 28 06:33:21 2019
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 18.09.3
API version: 1.39 (minimum version 1.12)
Go version: go1.10.8
Git commit: 774a1f4
Built: Thu Feb 28 06:02:24 2019
OS/Arch: linux/amd64
Experimental: false

这里若果显示了client和service两部分表示docker安装启动都已经完成了

2.Docker初识

学习编程的应该都知道,不论学习什么知识,上来先弄一个HelloWorld,那么我们学习Docker也从HelloWorld开始好了.

首先,我们需要学习Docker的第一条命令

拉取命令

docker pull [OPTIONS] NAME[:TAG]

这里用括号括起来的表示可选内容.其中docker pull为命令主体,NAME这里需要填写Docker仓库中镜像的名字,TAG填写镜像的版本,OPTIONS填写执行命令的选项.

查看本机镜像列表

docker images [OPTIONS] [REPOSITORY[:TAG]]

这里括起来的也是可选内容,OPTIONS是执行命令的选项,REPOSITORY可以指定一个镜像的名称,TAG指定镜像的版本.

示例:这里我们用上述命令拉取一个镜像仓库,并查看本机镜像列表

[root@localhost ~]# docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:2557e3c07ed1e38f26e389462d03ed943586f744621577a99efb77324b0fe535
Status: Downloaded newer image for hello-world:latest
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest fce289e99eb9 2 months ago 1.84kB

注意这里可能会有一个疑惑,为什么我在上边拉取镜像的时候直接指定的是hello-world镜像的名字,但是没有指定镜像的地址,这个如果前边没有指定地址的话就会默认到Docker的官方仓库去拉取镜像,这里也可以写成docker pull hub.c.163.com/library/hello-world:latest就是去到网易云的镜像中心拉取镜像了.

这里我们拉取下来镜像之后,要做什么用呢?

当然是开始运行镜像.所以这里我们可以学习一个新的命令.

镜像运行命令

docker run [OPTIONS] IMAGE[TAG] [COMMAND] [ARG...]

这里其他的都和上边相同,IMAGE填的是镜像的名字,COMMAND命令表示执行镜像的同时,镜像需要执行什么命令.ARG表示执行COMMAND的时候的一些参数.

这里我们可以试着运行一下上边拉取下来的镜像.

[root@localhost ~]# docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/

3.Docker网络

这里虽然上边已经试着对Docker进行了一些基础的操作,但是毕竟Hello-world不是实际使用到的项目,所以这里试着在Docker中运行一个Nginx的镜像.

首先,还是需要拉取一个Nginx的镜像.

这里可以去网易镜像中心去查看nginx的镜像地址,这里可以发现有两个nginx的地址,这里两个都是可以使用的,但是前边带有library并且图标上有一个鲸鱼图案的表示时Docker官方镜像同步过来的,所以一般都使用这个.

在这里插入图片描述

这里在镜像中心找到地址,并执行拉取命令.并且可以看到本地已经多了一个nginx的镜像.

[root@localhost ~]# docker pull hub.c.163.com/library/nginx:latest
latest: Pulling from library/nginx
5de4b4d551f8: Pull complete
d4b36a5e9443: Pull complete
0af1f0713557: Pull complete
Digest: sha256:f84932f738583e0169f94af9b2d5201be2dbacc1578de73b09a6dfaaa07801d6
Status: Downloaded newer image for hub.c.163.com/library/nginx:latest
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest fce289e99eb9 2 months ago 1.84kB
hub.c.163.com/library/nginx latest 46102226f2fd 23 months ago 109MB

这里我们执行一下nginx镜像.

[root@localhost ~]# docker run hub.c.163.com/library/nginx

可以看到运行之后没有反应,这时候我们就需要学习一个新命令:

查看当前运行镜像

docker ps

这里我们新建一个终端,执行查看命令.

[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ded3f4d65764 hub.c.163.com/library/nginx "nginx -g 'daemon of…" 2 minutes ago Up 2 minutes 80/tcp trusting_khorana

这里我们已经能够看到,nginx已经执行起来了,但是我们这样用会很不方便,前台运行之后,我们就不能在终端上执行其他命令了,尤其是像我这种Xshell登录的用户,每次新建窗口会很难受,所以这里Docker也提供了后台运行的命令.

可以通过docker run --help命令进行查看,发现后台运行的选项是-d

所以这里可以通过ctrl+C停止刚才的前端运行,然后执行一下后台运行的命令试试看.

[root@localhost ~]# docker run -d hub.c.163.com/library/nginx
fa8f0d3d2a9d457fa67ebc7902f7082f5caecaf176c7b24669d27f113dfe3bc4
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fa8f0d3d2a9d hub.c.163.com/library/nginx "nginx -g 'daemon of…" 23 seconds ago Up 21 seconds 80/tcp musing_kowalevski

这里可以看到,后台运行不会影响到我们的后续操作,同时也能后运行nginx.

进入运行的镜像执行命令

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

这里的的内容大多和之前的相同,CONTAINER表示容器名称,但是有两个重要的选项需要强调.

  1. -i 没有输入命令的时候,保证命令有效
  2. -t 可以创建一个虚拟终端,供我们进行操作

所以我们可以进行nginx的容器中执行操作

[root@localhost ~]# docker exec -it fa bash
root@fa8f0d3d2a9d:/#

这里我们就相当于在一个linux的虚拟机进行操作:

可以查看一下nginx所在位置.

root@fa8f0d3d2a9d:/# which nginx
/usr/sbin/nginx

可以查看运行了哪些进程

root@fa8f0d3d2a9d:/# ps -ef

exit退出进程

root@fa8f0d3d2a9d:/# exit
exit

Docker网络类型

  • Bridge桥接 docker容器拥有自己独立的端口和ip
  • Host 与主机使用相同的ip和端口
  • None 不联网,docker不能与外界通信

这里当选择网络类型是桥接的时候,就需要进行端口映射

  • -p 主机端口:容器端口 将主机端口与容器端口一对一映射
  • -P 将所有容器端口都映射到随机的主机端口

停止容器

docker stop name

这里可以通过这条命令在启动的同时进行端口映射,这里表示将主机的8080端口映射到容器的80端口.

[root@localhost ~]# docker run -d -p 8080:80 hub.c.163.com/library/nginx
5725e57b7a2b51f348399884151d6bfdf9da9b7aa027fef0517cfb1480321361

可以在linux中通过netstat命令查看端口是否开放

[root@localhost ~]# netstat -na | grep 8080

4.第一个Docker中的Java应用

1.写Dockerfile

首先我们需要书写我们的Dockerfile

[root@localhost ~]# vi Dockerfile

Dockerfile内容

from hub.c.163.com/library/tomcat ##这里告诉docker我要做一个自己的镜像,这个镜像基于Tomcat
MAINTAINER chriszj xxx@163.com ##这里是告诉所有者的信息,名字和邮箱
COPY XXX.war /usr/local/tomcat/webapps ## 将我们想要运行的jar包拷贝到tomcat下

2.构建Docker镜像

docker build Dockerfile位置

这里由于在当前目录,可以这样构建

docker build -t 镜像名字:TAG . ## .代表当前目录

然后通过run执行就可以了.

5.Docker 命令小结

  • docker pull 从远端获取image
  • docker build 创建image
  • docker images 列出当前容器所有images
  • docker run 运行当前容器
  • docker ps 列出当前正在运行的容器
  • docker rm 删除一个容器
  • docker rmi 删除image
  • docker cp 在主机与容器间拷贝文件
  • docker commit 保存容器中的改动为新的image

6.Dockerfile语法小结

  • FROM 指定基础镜像(base image)
  • RUN 执行命令
  • ADD 添加文件
  • COPY 拷贝文件
  • CMD 执行命令
  • EXPOSE 暴露端口
  • WORKDIR 指定路径
  • MAINTAINER 维护者,或者说是创建人
  • ENV 设定环境变量
  • ENTRYPOINT 容器的入口
  • USER 指定用户
  • VOLUME mount point

这里需要注意,Dockerfile中的每一行都会产生一个新层.

7.Docker进阶知识

1.Volume

用于提供独立于容器之外的持久化存储.

docker的这个特性可以用于在容器中的数据共享.

有三种方式:

  1. docker run -v /usr/share/nginx/html nginx 这个命令可以用于将本地的主机命令挂载到nginx下的/usr/share/nginx/html目录下,用于将docker容器中的数据与主机共享.可以通过docker inspect 容器名检查主机中挂载到容器中的目录位置.
  2. docker run -v $PWD/code:/var/www.html nginx 这个命令用于将主机当前目录下的code目录挂载到容器下的/var/www/html下,这里的$PWD是linux中的环境变量,代表当前目录,同时这里的两个目录中的文件可以做到数据共享,主机目录下的文件改变,容器的文件也会改变,容器文件改变,主机文件也会相应修改.
  3. docker run --volumes-from 数据容器 这里主要将一个仅有数据的容器挂载到当前容器中,可以做到两个容器数据共享.

2.Registry

docker中的术语

  • host 宿主机
  • image 镜像
  • container 容器
  • registry 镜像仓库
  • daemon 守护进程
  • client 客户端

对镜像仓库进行的操作

  • docker search 镜像名 可以从镜像仓库搜索想要的目标镜像
  • docker pull 镜像名 可以从镜像仓库拉取想要的镜像
  • docker push myname/镜像名 可以将自己构建的镜像上传到仓库

3.docker-compose.yml

  • build 本地创建镜像
  • command 覆盖缺省命令
  • depends_on 连接容器
  • ports 暴露端口
  • volumes 挂载点,目录
  • image pull镜像

4.docker-compose命令

  • up 启动服务
  • stop 停止服务
  • rm 删除服务中的各个容器
  • logs 观察各个容器的日志
  • ps 列出服务相关的容器

最后,能力不足,水平有限,欢迎指正.


推荐阅读
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • MACElasticsearch安装步骤及验证方法
    本文介绍了MACElasticsearch的安装步骤,包括下载ZIP文件、解压到安装目录、启动服务,并提供了验证启动是否成功的方法。同时,还介绍了安装elasticsearch-head插件的方法,以便于进行查询操作。 ... [详细]
  • 通过Anaconda安装tensorflow,并安装运行spyder编译器的完整教程
    本文提供了一个完整的教程,介绍了如何通过Anaconda安装tensorflow,并安装运行spyder编译器。文章详细介绍了安装Anaconda、创建tensorflow环境、安装GPU版本tensorflow、安装和运行Spyder编译器以及安装OpenCV等步骤。该教程适用于Windows 8操作系统,并提供了相关的网址供参考。通过本教程,读者可以轻松地安装和配置tensorflow环境,以及运行spyder编译器进行开发。 ... [详细]
  • Oracle另一台电脑访问的问题
    参考:https:www.cnblogs.comsand-tinyp3797087.html首先,两台电脑需要在同一个网络,然后安装Oracle的电脑上找到listener.ora ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 本文介绍了在多平台下进行条件编译的必要性,以及具体的实现方法。通过示例代码展示了如何使用条件编译来实现不同平台的功能。最后总结了只要接口相同,不同平台下的编译运行结果也会相同。 ... [详细]
  • Windows 7 部署工具DISM学习(二)添加补丁的步骤详解
    本文详细介绍了在Windows 7系统中使用部署工具DISM添加补丁的步骤。首先需要将光驱中的安装文件复制到指定文件夹,并进行挂载。然后将需要的MSU补丁解压并集成到系统中。文章给出了具体的命令和操作步骤,帮助读者完成补丁的添加过程。 ... [详细]
  • phpcomposer 那个中文镜像是不是凉了 ... [详细]
  • 嵌入式处理器的架构与内核发展历程
    本文主要介绍了嵌入式处理器的架构与内核发展历程,包括不同架构的指令集的变化,以及内核的流水线和结构。通过对ARM架构的分析,可以更好地理解嵌入式处理器的架构与内核的关系。 ... [详细]
  • 如何在php文件中添加图片?
    本文详细解答了如何在php文件中添加图片的问题,包括插入图片的代码、使用PHPword在载入模板中插入图片的方法,以及使用gd库生成不同类型的图像文件的示例。同时还介绍了如何生成一个正方形文件的步骤。希望对大家有所帮助。 ... [详细]
  • Centos7搭建ELK(Elasticsearch、Logstash、Kibana)教程及注意事项
    本文介绍了在Centos7上搭建ELK(Elasticsearch、Logstash、Kibana)的详细步骤,包括下载安装包、安装Elasticsearch、创建用户、修改配置文件等。同时提供了使用华为镜像站下载安装包的方法,并强调了保证版本一致的重要性。 ... [详细]
  • 负载均衡_Nginx反向代理动静分离负载均衡及rewrite隐藏路径详解(Nginx Apache MySQL Redis)–第二部分
    nginx反向代理、动静分离、负载均衡及rewrite隐藏路径详解 ... [详细]
author-avatar
东张西望
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有