Fork me on GitHub

linux下使用docker部署第一个Java应用

前言

Docker是一个划时代的开源项目,它彻底的释放了计算虚拟化的威力,极大的提高了应用的运算效率,降低了云计算资源供应的成本!无论是应用开发者、运维人员、还是其他信息技术从业人员,都有必要认识和掌握 Docker,节约有限的时间。
来自于:Docker —— 从入门到实践

根据自己的学习和记录,我就讲自己使用docker过程当中遇到的问题以及技巧记录下来,以便自己日后学习温故,同时也可以方便大家共同进步。

安装docker

安装前的检查

  1. 系统要求
    • 64位系统
    • 内核版本3.10+
  2. 检查内核版本,返回值大于3.10就行,若不是自行升级系统

    1
    2
    [root@iZj1fkye8uu7o0Z ~]# uname -r
    3.10.0-693.2.2.el7.x86_64
  3. 使用sudo或者root权限的用户登入终端

  4. 确保yum是最新的 yum update

开始安装docker

  1. 使用yum安装docker,yum install -y docker 安装详细过程如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    [root@iZj1fkye8uu7o0Z ~]# yum install -y docker
    Loaded plugins: fastestmirror
    Loading mirror speeds from cached hostfile
    Resolving Dependencies
    --> Running transaction check
    ---> Package docker.x86_64 2:1.12.6-61.git85d7426.el7.centos will be installed
    --> Processing Dependency: docker-common = 2:1.12.6-61.git85d7426.el7.centos for package: 2:docker-1.12.6-61.git85d7426.el7.centos.x86_64
    --> Processing Dependency: docker-client = 2:1.12.6-61.git85d7426.el7.centos for package: 2:docker-1.12.6-61.git85d7426.el7.centos.x86_64
    --> Running transaction check
    ---> Package docker-client.x86_64 2:1.12.6-61.git85d7426.el7.centos will be installed
    ---> Package docker-common.x86_64 2:1.12.6-61.git85d7426.el7.centos will be installed
    --> Finished Dependency Resolution
    Dependencies Resolved
    ================================================================================================================================================
    Package Arch Version Repository Size
    ================================================================================================================================================
    Installing:
    docker x86_64 2:1.12.6-61.git85d7426.el7.centos extras 15 M
    Installing for dependencies:
    docker-client x86_64 2:1.12.6-61.git85d7426.el7.centos extras 3.4 M
    docker-common x86_64 2:1.12.6-61.git85d7426.el7.centos extras 80 k
    Transaction Summary
    ================================================================================================================================================
    Install 1 Package (+2 Dependent packages)
    Total download size: 18 M
    Installed size: 63 M
    Downloading packages:
    (1/3): docker-client-1.12.6-61.git85d7426.el7.centos.x86_64.rpm | 3.4 MB 00:00:00
    (2/3): docker-common-1.12.6-61.git85d7426.el7.centos.x86_64.rpm | 80 kB 00:00:00
    (3/3): docker-1.12.6-61.git85d7426.el7.centos.x86_64.rpm | 15 MB 00:00:01
    ------------------------------------------------------------------------------------------------------------------------------------------------
    Total 12 MB/s | 18 MB 00:00:01
    Running transaction check
    Running transaction test
    Transaction test succeeded
    Running transaction
    Installing : 2:docker-common-1.12.6-61.git85d7426.el7.centos.x86_64 1/3
    Installing : 2:docker-client-1.12.6-61.git85d7426.el7.centos.x86_64 2/3
    Installing : 2:docker-1.12.6-61.git85d7426.el7.centos.x86_64 3/3
    Verifying : 2:docker-1.12.6-61.git85d7426.el7.centos.x86_64 1/3
    Verifying : 2:docker-common-1.12.6-61.git85d7426.el7.centos.x86_64 2/3
    Verifying : 2:docker-client-1.12.6-61.git85d7426.el7.centos.x86_64 3/3
    Installed:
    docker.x86_64 2:1.12.6-61.git85d7426.el7.centos
    Dependency Installed:
    docker-client.x86_64 2:1.12.6-61.git85d7426.el7.centos docker-common.x86_64 2:1.12.6-61.git85d7426.el7.centos
    Complete!
  2. 查看上面使用yum安装docker是否成功并且已经启动了,查看docker version 显示dockerclientserver的信息如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@iZj1fkye8uu7o0Z ~]# docker version
Client:
Version: 1.12.6
API version: 1.24
Package version: docker-1.12.6-61.git85d7426.el7.centos.x86_64
Go version: go1.8.3
Git commit: 85d7426/1.12.6
Built: Tue Oct 24 15:40:21 2017
OS/Arch: linux/amd64
Server:
Version: 1.12.6
API version: 1.24
Package version: docker-1.12.6-61.git85d7426.el7.centos.x86_64
Go version: go1.8.3
Git commit: 85d7426/1.12.6
Built: Tue Oct 24 15:40:21 2017
OS/Arch: linux/amd64

如果显示以上信息 ,说明已经成功安装docker,同时dockerclientserver都已经成功运行了。

那么问题来了,成功运行了docker,但是里面没有镜像,我们如何才能够在其中运行自己的应用程序呢。下面就来介绍如何使用网易蜂巢的镜像中心来安装我们的软件。

也可以使用docker镜像中心,只不过在国内使用这个速度非常慢,我是用的是网易镜像中心,读者们也可以使用阿里镜像中心或者其他的都行。

安装镜像

使用网易蜂巢镜像中心安装所需镜像

安装Tomcat

  1. 安装Tomcat,我们只需要在里面搜索tomcat就行了。其实我们平时使用的过程中就知道,如果想让tomcat跑起来就必须安装Java环境。但是在这里使用docker镜像安装Tomcat就已经包含Java环境了,无需另外安装。

  2. 按照上面的网址进入网易蜂巢镜像中心后,需要登录才会进入到入口,然后搜索Tomcat就行了。
    image
    在镜像中心上搜索Tomcat会发现第一个tomcat会有一个docker鲸鱼的标志,这说明这个镜像资源和官方docker镜像保持同步的。那我们点进去,在右边就会有一个下载地址的链接。

    1
    docker pull hub.c.163.com/library/tomcat:latest

这个就是我们需要在终端上面进行git拉取的仓库地址。docker命令标志,pullgit命令熟悉的话知道这是下载拉取的意思,hub.c.163.com/library/仓库地址,tomcat是镜像名称,:后面的latesttag标签,表示当前拉取的是最新版本,如果需要其他版本的也可以在这个页面的下方寻找tomcat镜像的其他版本。

  1. 根据上面的地址镜像下载tomcat进项,操作命令记录如下:
    • 下载镜像
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      [root@iZj1fkye8uu7o0Z ~]# docker pull hub.c.163.com/library/tomcat:latest
      Trying to pull repository hub.c.163.com/library/tomcat ...
      latest: Pulling from hub.c.163.com/library/tomcat
      9af7279b9dbd: Pull complete
      31816c948f2f: Pull complete
      c59a1cdf83d3: Pull complete
      232c7a75d568: Pull complete
      de412d312979: Pull complete
      80315ba34693: Pull complete
      5d3f97bd90e8: Pull complete
      dc8dc63f6baa: Pull complete
      f6c6e2d67f03: Pull complete
      9123b340aa92: Pull complete
      76abaea2279d: Pull complete
      4476602e3346: Pull complete
      12e1fda011bd: Pull complete
      Digest: sha256:db1a8ca2fe44449d265e5505f300be6f34fc63211a5506400a0a8c24653af91f

最后面的这个sha256:db1a8ca2fe44449d265e5505f300be6f34fc63211a5506400a0a8c24653af91f表示改镜像在仓库当中的地址编号。

  • 查看当前docker当中的镜像 docker images,操作记录如下:
    1
    2
    3
    [root@iZj1fkye8uu7o0Z ~]# docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    hub.c.163.com/library/tomcat latest 72d2be374029 3 months ago 292.4 MB
  1. 运行下载的镜像
1
2
3
4
5
[root@iZj1fkye8uu7o0Z ~]# docker run -d -p 80:8080 hub.c.163.com/library/tomcat
80e53db67f4bfb711ab3491f49dece1f7f9aa782e7c8d95153f36e39b6940e65
[root@iZj1fkye8uu7o0Z ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
80e53db67f4b hub.c.163.com/library/tomcat "catalina.sh run" 16 seconds ago Up 15 seconds 0.0.0.0:80->8080/tcp evil_leakey

上面这个运行命令 docker run -d -p 80:8080 hub.c.163.com/library/tomcat 说明如下
docker run表示运行, -d表示后台运行docker 分为前台运行,后台运行,前台运行可以通过Ctrl+C进行停止 -p表示制定宿主机和容器之间的端口映射,在这里-p 80:8080表示将宿主机80端口映射到容器的8080端口。

这里也可以使用-P大写来分配端口,表示宿主机将随机分配端口映射到容器端口,容器端口不变。操作如下:

1
2
3
4
5
6
[root@iZj1fkye8uu7o0Z ~]# docker run -d -P hub.c.163.com/library/tomcat
965a99cdb70730716aa466ddefe28c55fb7161e9030f8d42d0055711b26c7b25
[root@iZj1fkye8uu7o0Z ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
965a99cdb707 hub.c.163.com/library/tomcat "catalina.sh run" 4 seconds ago Up 3 seconds 0.0.0.0:32768->8080/tcp kickass_swirles
80e53db67f4b hub.c.163.com/library/tomcat "catalina.sh run" 5 minutes ago Up 5 minutes 0.0.0.0:80->8080/tcp evil_leakey

上面通过命令docker ps查看当前正在运行的容器,可以看出 Tomcat正在运行的有两个,而且两个的端口号还不一样,80是我们上面-p指定的,32768是通过-P随机分配的。而且localhost:80localhost:32768都是可以访问到tomcat的首页的。

  1. 暂停容器

在上面提到了使用命令docker ps可以查看当前正在运行的容器。那么我们可以使用 docker stop CONTAINER ID进行停止正在运行的容器,比如上面的80端口的容器的CONTAINER ID80e53db67f4b,现在想将其停止就可以使用docker stop命令了,而且这个CONTAINER ID还可以简写,操作记录如下:

1
2
3
4
5
[root@iZj1fkye8uu7o0Z ~]# docker stop 80
80
[root@iZj1fkye8uu7o0Z ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
965a99cdb707 hub.c.163.com/library/tomcat "catalina.sh run" 6 minutes ago Up 6 minutes 0.0.0.0:32768->8080/tcp kickass_swirles

通过docker ps可以很清楚的看到当前只剩下端口号为32768的正在运行。同时地址栏当中也已经无法使用localhost:80进行访问Tomcat的首页了。

到现在为止,我们就已经在docker当中安装好了我们的第一个应用, 并且成功运行了。有了Tomcat我们就可以运行自己的Web应用了,那么问题来了,数据库怎么办呢?下面我就来说说怎么安装数据库吧,其实答题的操作都差不多,镜像中心找到MySQL的拉取地址,然后终端运行下载镜像,运行,映射端口。

安装MySQL

  1. 同样进入网易蜂巢镜像中心,搜索MySQL,找到其下载地址。docker pull hub.c.163.com/library/mysql:latest

  2. 进入linux终端,输入上面下载地址的命令,详细过程如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    [root@iZj1fkye8uu7o0Z ~]# docker pull hub.c.163.com/library/mysql:latest
    Trying to pull repository hub.c.163.com/library/mysql ...
    latest: Pulling from hub.c.163.com/library/mysql
    42cb69312da9: Pull complete
    e2cf5467c4b5: Pull complete
    871ec0232f66: Pull complete
    3c0ae7ec690d: Pull complete
    d39b43089b70: Pull complete
    aa0e7cb4b67c: Pull complete
    738db9902d06: Pull complete
    ae333863ac05: Pull complete
    6d014992204a: Pull complete
    09aeca0c9a82: Pull complete
    0162083b2de0: Pull complete
    Digest: sha256:b2bce1a792237ac5df78877d583f34b09ab023a77130921a6bcce67ce2d24ff0
  3. docker run命令运行下载好的MySQL镜像。可能运行MySQLTomcat不太一样,在这里我们不止需要制定映射端口,还需要为MySQL指定访问的用户名和密码。

1
2
[root@iZj1fkye8uu7o0Z ~]# docker run --name root -e MYSQL_ROOT_PASSWORD=123456 -d -p 3306:3306 hub.c.163.com/library/mysql
0e00273b42da6c30ca21798c0fed807cc91d758b08087324668338172b6eb62d

如上面命令所示,用户名为root,密码为123456,我们可以用navicate测试是否连接上。
上面命令参数的说明详细见网易蜂巢镜像文档当中。详细说明 关于如何创建用户名,如何跨容器连接MySQL等

1
2
3
4
5
6
7
8
How to use this image

Start a mysql server instance

Starting a MySQL instance is simple:

$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
... where some-mysql is the name you want to assign to your container, my-secret-pw is the password to be set for the MySQL root user and tag is the tag specifying the MySQL version you want. See the list above for relevant tags.

使用镜像

进入容器

在刚刚我们创建了TomcatMySQL的容器,那么如何进入到这些正在运行的容器当中呢。可以使用命令docker ps查看正在运行的容器。然后使用命令docker exit -it [NAMES] bash 指定需要进入的具体容器是哪一个。这个参数-it表示使用交互模式运行,同时返回一个可以操作的终端,这里的NAMES就是docker ps查看到的容器运行时候最后一个名字。操作记录如下:

1
2
3
4
5
[root@iZj1fkye8uu7o0Z ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5fea4d975b62 hub.c.163.com/library/tomcat "catalina.sh run" 16 seconds ago Up 15 seconds 0.0.0.0:8080->8080/tcp hungry_noether
ed96dabaff1f hub.c.163.com/library/mysql "docker-entrypoint.sh" 7 minutes ago Up 7 minutes 0.0.0.0:3306->3306/tcp root
8c93f7088b22 my-nginx "nginx -g 'daemon off" 46 minutes ago Up 46 minutes 0.0.0.0:80->80/tcp adoring_hopper

上面很清楚的显示MySQLNAMESroot,那么我们就可以使用命令docker exec -it root bash来进入容器,记录如下

1
docker exec -it root bash

但是此时只是进入了容器,还需要进入MySQL怎么操作呢,跟我们平常在Linux上一样操作,mysql -uroot -p操作记录如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@iZj1fkye8uu7o0Z ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b7ae64383c2c tomcat:mydocs2 "catalina.sh run" 6 days ago Up 6 days 0.0.0.0:80->8080/tcp prickly_borg
87680cea7eb4 hub.c.163.com/library/mysql "docker-entrypoint.sh" 6 days ago Up 6 days 0.0.0.0:3306->3306/tcp root
[root@iZj1fkye8uu7o0Z ~]# docker exec -it root bash
root@87680cea7eb4:/# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 108
Server version: 5.7.18 MySQL Community Server (GPL)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

现在就可以愉快的玩耍了。

退出容器

  1. 如果使用上面docker exec -it NAMES bash方式进入容器,可以直接使用exit,退出容器,而不会将其停止。

后记

通过学习linux上部署docker,平时需要独立安装的各种环境变得简单,同时也可以自行通过Dockerfile文件来build自己的镜像,然后pash到仓库,或者厂商的镜像中心当中,以便日后再用,都是非常方便的。同时也可以在一台宿主机当中部署多个docker,实现集群服务也是可以的。当然我们也可以使用Web端的工具来管理docker,相应的工具名称大家可以自行搜索使用。

联系

聪聪的独立博客 ,一个喜欢技术,喜欢钻研的95后。如果你看到这篇文章,千里之外,我在等你联系。

坚持原创技术分享,您的支持将鼓励我继续创作!