热门标签 | 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 列出服务相关的容器

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


推荐阅读
  • 本文详细介绍了如何在Ubuntu系统中下载适用于Intel处理器的64位版本,涵盖了不同Linux发行版对64位架构的不同命名方式,并提供了具体的下载链接和步骤。 ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • 本文探讨了如何在日常工作中通过优化效率和深入研究核心技术,将技术和知识转化为实际收益。文章结合个人经验,分享了提高工作效率、掌握高价值技能以及选择合适工作环境的方法,帮助读者更好地实现技术变现。 ... [详细]
  • 本文详细探讨了Netty中Future及其子类的设计与实现,包括其在并发编程中的作用和具体应用场景。我们将介绍Future的继承体系、关键方法的实现细节,并讨论如何通过监听器和回调机制来处理异步任务的结果。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • andr ... [详细]
  • 汇编语言等号伪指令解析:探究其陡峭的学习曲线
    汇编语言以其独特的特性和复杂的语法结构,一直被认为是编程领域中学习难度较高的语言之一。本文将探讨汇编语言中的等号伪指令及其对初学者带来的挑战,并结合社区反馈分析其学习曲线。 ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • 本文详细介绍了如何在Debian系统中正确配置Locale,以确保多语言支持和避免常见的警告信息。 ... [详细]
  • 如何将本地Docker镜像推送到阿里云容器镜像服务
    本文详细介绍将本地Docker镜像上传至阿里云容器镜像服务的步骤,包括登录、查看镜像列表、推送镜像以及确认上传结果。通过本文,您将掌握如何高效地管理Docker镜像并将其存储在阿里云的镜像仓库中。 ... [详细]
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社区 版权所有