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

第一个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官方镜像同步过来的,所以一般都使用这个.

第一个Docker化Java应用(Docker学习笔记)_第1张图片

这里在镜像中心找到地址,并执行拉取命令.并且可以看到本地已经多了一个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 [email protected]  ##这里是告诉所有者的信息,名字和邮箱

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

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

你可能感兴趣的:(学习)