美文网首页
云服务器部署 JavaWeb 环境(基于 docker)

云服务器部署 JavaWeb 环境(基于 docker)

作者: MrDcheng | 来源:发表于2020-04-25 09:25 被阅读0次

1 切换镜像数据源

前往阿里云开通容器镜像服务,进入控制台后进入镜像加速器,按照流程操作即可。操作文档摘录如下,有删减:

1.1 Ubuntu/CentOS

(1)安装/升级 Docker 客户端

推荐安装 1.10.0 以上版本的 Docker 客户端。

(2)配置镜像加速器

Docker 客户端版本大于 1.10.0 的用户,可以通过新建或修改 daemon 配置文件 /etc/docker/daemon.json 来使用加速器。添加以下内容:

{
  "registry-mirrors": ["https://58rf2fw7wp0u.mirror.aliyuncs.com"]
}

注意:以上地址仅供参考,应依据实际账户提供的为准

(3)重启服务

systemctl daemon-reload
systemctl restart docker

1.2 Mac/Windows

登录阿里云后,详见:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

2 JDK 容器

(1)在 https://hub.docker.com/_/amazoncorretto?tab=tags 下载镜像

docker pull amazoncorretto:11.0.6

(2)Dockerfile 内容如下:

FROM amazoncorretto:11.0.6
MAINTAINER clxering <clxering@xx.com>
# 将jar包添加到容器中的目录
ADD demo.jar /usr/src/
# 运行jar包
ENTRYPOINT ["java","-jar","/usr/src/demo.jar"]

(3)上传 jar 到 Dockerfile 所在目录,假设为 /usr/src/tmp

(4)制作镜像,参数 -t 表示不需要缓存;指定镜像名称为 springbootapp

docker build -t springbootapp:test .

注:末尾有一个点号

以下为成功生成镜像的提示信息:

Sending build context to Docker daemon  24.18MB
Step 1/4 : FROM amazoncorretto:11.0.6
 ---> 2acf862bb8fb
Step 2/4 : MAINTAINER clxering <clxering@gmail.com>
 ---> Running in 166531df6339
Removing intermediate container 166531df6339
 ---> a299bd5fb85a
Step 3/4 : ADD demo.jar /usr/src/
 ---> bcddaeffe8ce
Step 4/4 : ENTRYPOINT ["java","-jar","/usr/src/demo.jar"]
 ---> Running in 95f3f84fda5e
Removing intermediate container 95f3f84fda5e
 ---> dcf0f6acf7d8
Successfully built dcf0f6acf7d8
Successfully tagged springbootapp:latest

(5)启动镜像并连接到 MySQL

在 application.yml 配置的连接相关内容如下:

spring:
  profiles:
    active: product
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://mysqlroot:3306/databasename?
    username: xxxx
    password: xxxx

则启动容器命令如下:

docker run -d -p 7077:7077 --link <MySQL容器别名>:mysqlroot springbootapp:test

3 MySQL 容器案例

3.1 常规配置步骤

3.1.1 获取镜像

https://hub.docker.com/_/mysql?tab=tags 下载镜像

docker pull mysql:8.0.19

3.1.2 挂载配置文件 my.cnf

配置文件的挂载仅为了便于修改,非必须步骤。

(1)为获取挂载路径,建立一个测试容器

docker run --name testmysql \
-p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:8.0.19

注:用宿主 3307 端口做测试容器的映射

(2)进入测试容器

docker exec -it testmysql bash

(3)在测试容器中查找配置文件位置。可用 cat 命令依次查看给出的路径是否存在配置文件,最后发现正确路径为 /etc/mysql/my.cnf

root@f088aa76bc6f:/# mysql --help | grep my.cnf
                      order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf

注:上述 1-3 步骤仅供参考,若有其他方式可获知配置文件路径,可忽略这些步骤。

(4)在宿主上创建配置文件路径 mkdir -p /usr/src/mysql/conf

(5)复制测试容器中的配置文件到上述目录。以后如果要改配置,在挂载路径的配置文件上修改即可。

docker cp testmysql:/etc/mysql/my.cnf /usr/src/mysql/conf

3.1.3 挂载数据库数据

容器在关闭或重启后会清空数据,宜用挂载的方式启动 MySQL,保存数据库数据。

(1)查找数据路径。在测试容器执行 docker inspect testmysql,在显示内容中找到 Mount 属性,其中的 Destination 值即为路径

...
"Mounts": [
    {
        "Type": "volume",
        "Name": "20b889c7bf0ee13f654f588e158a840b3feeedac0f35f0d1fca47b4c4617809e",
        "Source": "/var/lib/docker/volumes/20b889c7bf0ee13f654f588e158a840b3feeedac0f35f0d1fca47b4c4617809e/_data",
        "Destination": "/var/lib/mysql",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
],
...

(2)在宿主上创建数据件路径 mkdir -p /usr/src/mysql/data

注:若删除旧容器,新建容器时要清空原挂载数据目录,除非更换路径,否则新建的容器将无法启动。

(3)启动正式容器并挂载配置文件和数据

docker run --name mysqlroot \
-p 3306:3306 -e MYSQL_ROOT_PASSWORD=root \
--restart=always \
--mount type=bind,src=/usr/src/mysql/conf/my.cnf,dst=/etc/mysql/my.cnf \
--mount type=bind,src=/usr/src/mysql/data,dst=/var/lib/mysql \
-d mysql:8.0.19

参数释义:

  • --name,给容器取一个别名为 mysqlroot
  • -p,映射端口号,将 mysql 的端口号 3306 映射为 3306
  • -e,MYSQL_ROOT_PASSWORD : 设置 root 密码为 123456
  • --mount,挂载文件或目录
  • -d,后台运行容器,并返回容器 ID
  • mysql:8.0.19,镜像名称
  • --restart=always,重新启动 docker 后,带该参数的容器将自行启动

注:如果 --restart=always 参数位置放在最后,会报错:

docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"--restart=always\": executable file not found in $PATH": unknown.

附加内容:为已经创建的容器添加 --restart=always 参数

docker container update --restart=always <容器ID>

附加内容:重启服务器后执行 docker 命令时报错:Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?,此时重启 daemon 及 docker 即可,执行如下命令:

systemctl daemon-reload
service docker restart

执行 service docker status 查看状态,输出信息有 Active: active (running) 提示则说明成功重启

3.2 Docker 创建运行多个 mysql 容器

假设 3306 端口已经运行一个容器,现在使用宿主机的 3307 端口新开一个容器。执行如下命令:

docker run --name newone \
-p 3307:3306 -e MYSQL_ROOT_PASSWORD=root \
--restart=always \
-d mysql:8.0.19

3.3 docker 容器访问宿主机的 MySQL

使用 ifconfig 命令可以看到,有一个 docker0 和 eth0,在 docker 容器中可以通过 eth0 的 IP 地址加上端口号(3306)这样就可以连接宿主机的 MySQL。另外,nginx 可以通过 docker0 的 IP 地址加上构建容器时指定的端口号进行访问容器。

相关文档:https://dev.mysql.com/doc/refman/8.0/en/docker-mysql-getting-started.html

4 Nginx 部署

4.1 获取镜像

https://hub.docker.com/_/nginx?tab=tags 获取稳定版镜像

docker pull nginx:stable

4.2 核心文件挂载

(1)建立测试容器

docker run --name nginxtest -d nginx:stable

(2)进入测试容器,根据系统实际情况 定位核心文件路径

docker exec -it nginxtest bash

(3)定位配置文件路径

  • /etc/nginx/nginx.conf
  • /etc/nginx/conf.d/

注:使用整个 conf.d 目录可便于增加虚拟主机配置文件

(3)定位首页目录路径

  • /usr/share/nginx/html

(4)定位日志文件路径

  • /var/log/nginx

(5)在宿主机新建对应目录,并拷贝对应目录

docker cp nginxtest:/etc/nginx/nginx.conf /usr/src/nginxdir/
docker cp nginxtest:/etc/nginx/conf.d/default.conf /usr/src/nginxdir/conf.d/
docker cp nginxtest:/usr/share/nginx/html /usr/src/nginxdir/
docker cp nginxtest:/var/log/nginx /usr/src/nginxdir/log/

4.3 启动容器

docker run --name nginx \
-p 80:80 \
--restart=always \
--mount type=bind,src=/usr/src/nginxdir/nginx.conf,dst=/etc/nginx/nginx.conf \
--mount type=bind,src=/usr/src/nginxdir/conf.d/,dst=/etc/nginx/conf.d/ \
--mount type=bind,src=/usr/src/nginxdir/html,dst=/usr/share/nginx/html \
--mount type=bind,src=/usr/src/nginxdir/log/nginx,dst=/var/log/nginx \
-d nginx:stable

注:如果 --restart=always 参数位置放在最后,会报错:

docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"--restart=always\": executable file not found in $PATH": unknown.

5 其他命令

  • 使服务自动启动,systemctl enable docker
  • 使服务不自动启动,systemctl disable docker
  • 检查服务状态(服务详细信息),systemctl status docker
  • 检查服务状态(仅显示是否 Active),systemctl is-active docker
  • 显示所有已启动的服务,systemctl list-units --type=service
  • 启动服务,systemctl start docker
  • 停止服务,systemctl stop docker
  • 重启服务,systemctl restart docker
  • 查看已下载的镜像,docker images
  • 删除指定容器,docker rm <容器ID>docker container rm <容器ID>
  • 显示当前运行的容器,dock ps [-a]docker container ls [-a],添加参数 -a 则显示所有容器,包括停止的
  • 使用指定 ID 的镜像,以交互模式启动一个容器,在容器内执行 /bin/bash 命令 docker run -itd <镜像ID> /bin/bash
  • 进入容器,docker exec -it <容器 ID> bash,ID 不必全部填写,可辨别即可。如果不指定 /bin/bash,容器运行后会自动停止
  • 查看磁盘剩余空间信息,df -hl

相关文章

网友评论

      本文标题:云服务器部署 JavaWeb 环境(基于 docker)

      本文链接:https://www.haomeiwen.com/subject/kydhwhtx.html