热门标签 | 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的配置和使用方法。 ... [详细]
  • Linux下安装免费杀毒软件ClamAV及使用方法
    本文介绍了在Linux系统下安装免费杀毒软件ClamAV的方法,并提供了使用该软件更新病毒库和进行病毒扫描的指令参数。同时还提供了官方安装文档和下载地址。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • Windows 7 部署工具DISM学习(二)添加补丁的步骤详解
    本文详细介绍了在Windows 7系统中使用部署工具DISM添加补丁的步骤。首先需要将光驱中的安装文件复制到指定文件夹,并进行挂载。然后将需要的MSU补丁解压并集成到系统中。文章给出了具体的命令和操作步骤,帮助读者完成补丁的添加过程。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 本文介绍了在CentOS 6.4系统中更新源地址的方法,包括备份现有源文件、下载163源、修改文件名、更新列表和系统,并提供了相应的命令。 ... [详细]
  • 本文介绍了在Ubuntu下制作deb安装包及离线安装包的方法,通过备份/var/cache/apt/archives文件夹中的安装包,并建立包列表及依赖信息文件,添加本地源,更新源列表,可以在没有网络的情况下更新系统。同时提供了命令示例和资源下载链接。 ... [详细]
  • Centos7搭建ELK(Elasticsearch、Logstash、Kibana)教程及注意事项
    本文介绍了在Centos7上搭建ELK(Elasticsearch、Logstash、Kibana)的详细步骤,包括下载安装包、安装Elasticsearch、创建用户、修改配置文件等。同时提供了使用华为镜像站下载安装包的方法,并强调了保证版本一致的重要性。 ... [详细]
  • 本文介绍了5个基本Linux命令行工具的现代化替代品,包括du、top和ncdu。这些替代品在功能上进行了改进,提高了可用性,并且适用于现代化系统。其中,ncdu是du的替代品,它提供了与du类似的结果,但在一个基于curses的交互式界面中,重点关注占用磁盘空间较多的目录。 ... [详细]
  • 本文介绍了在Ubuntu系统中清理残余配置文件和无用内容的方法,包括清理残余配置文件、清理下载缓存包、清理不再需要的包、清理无用的语言文件和清理无用的翻译内容。通过这些清理操作可以节省硬盘空间,提高系统的运行效率。 ... [详细]
  • 通过Anaconda安装tensorflow,并安装运行spyder编译器的完整教程
    本文提供了一个完整的教程,介绍了如何通过Anaconda安装tensorflow,并安装运行spyder编译器。文章详细介绍了安装Anaconda、创建tensorflow环境、安装GPU版本tensorflow、安装和运行Spyder编译器以及安装OpenCV等步骤。该教程适用于Windows 8操作系统,并提供了相关的网址供参考。通过本教程,读者可以轻松地安装和配置tensorflow环境,以及运行spyder编译器进行开发。 ... [详细]
  • 本文介绍了在无法联网的情况下,通过下载rpm包离线安装zip和unzip的方法。详细介绍了如何搜索并下载合适的rpm包,以及如何使用rpm命令进行安装。 ... [详细]
  • LINUX学习之centos7营救模式
    今天卸载软件的时候,不小心把GNOME的一些组件给卸了,导致桌面无法正常开启,会卡在启动过程中,而我的开机启动模式又是设置为图形界面,所以一开LINUX就卡住了,进入不了命令行界面 ... [详细]
  • 三、查看Linux版本查看系统版本信息的命令:lsb_release-a[root@localhost~]#lsb_release-aLSBVersion::co ... [详细]
  • systemd-nspawn可以创建最轻量级的容器(ns的意思就是namespace),本文的实验平台是Ubuntu16.04,x86_64机器。本文的目的是:在Ubuntu中用syst ... [详细]
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社区 版权所有