Docker-基于java8构建java项目镜像

下载 JDK8

https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html

image-20201027185030923

创建镜像的构建目录 base_jdk8,并且将 JDK8 上传到服务器

image-20201027185401601

编辑创建 Dockerfile

 
  1. # Using Centos for base image
  2. FROM centos:7
  3.  
  4. # author label
  5. LABEL maintainer="Aron.li"
  6.  
  7. # install timezone gcc
  8. ENV ENVIRONMENT DOCKER_PROD
  9. RUN cd / && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
  10. && yum makecache \
  11. && yum install -y wget aclocal automake autoconf make gcc gcc-c++ python-devel mysql-devel bzip2 libffi-devel epel-release \
  12. && yum clean all
  13.  
  14. # cd /opt
  15. WORKDIR /opt
  16.  
  17. # copy jdk8 to /opt, and decompression
  18. ADD jdk-8u271-linux-x64.tar.gz /opt
  19.  
  20. # set jdk8 env
  21. ENV JAVA_HOME=/opt/jdk1.8.0_271
  22. ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  23. ENV PATH=$JAVA_HOME/bin:$PATH
  24.  
  25. # exec java -version
  26. CMD ["java","-version"]
 

构建镜像

docker build -f Dockerfile -t base_jdk8:v1.0 .

执行如下:

image-20201027191035881

生成镜像如下:

image-20201027191212996

启动镜像,测试java环境

编写一个启动镜像的脚本 restart_service.sh

 
  1. basedir=`pwd`
  2.  
  3. name='base_jdk8'
  4. image='base_jdk8:v1.0'
  5. docker stop $name
  6. docker rm $name
  7. docker run -it --privileged=true --name $name $image /bin/bash
 

测试如下:

image-20201027191259441

基于 JDK8 的镜像,构建SpringBoot服务

上传 SpringBoot 的 jar 包

image-20201027193505484

编辑创建 Dockerfile

 
  1. # Using JDK8 for base image
  2. FROM base_jdk8:v1.0
  3.  
  4. # author label
  5. LABEL maintainer="Aron.li"
  6.  
  7. # install timezone gcc
  8. ENV ENVIRONMENT DOCKER_PROD
  9. RUN cd / && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  10.  
  11. # cd /opt
  12. WORKDIR /opt
  13.  
  14. # copy jar to /opt, and decompression
  15. ADD autotest-0.0.1-SNAPSHOT.jar /opt
  16.  
  17. # exec java -jar autotest-0.0.1-SNAPSHOT.jar
  18. CMD ["java","-jar","autotest-0.0.1-SNAPSHOT.jar"]
 

构建镜像

docker build -f Dockerfile -t autotest:v1.0 .

启动镜像服务

编写一个启动镜像的脚本 restart_service.sh

 
  1. #!/bin/bash
  2. basedir=$(cd `dirname $0`;pwd)
  3. host_ip=`python -c "import socket;print([(s.connect(('8.8.8.8', 53)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1])"`
  4.  
  5.  
  6. name='autotest'
  7. image='autotest:v1.0'
  8. docker stop $name
  9. docker rm $name
  10. #docker run -it --name $name $image /bin/bash
  11.  
  12. docker run -d --name $name -p 8080:8080 -h $name \
  13. --add-host=mysql_host:$host_ip \
  14. --add-host=mongo_host:$host_ip \
  15. --add-host=redis_host:$host_ip \
  16. $image
 

 

需求:基于openjdk:8-jdk-alpine镜像,将一个java项目构建为镜像
实现步骤:

  1. 在linux系统检查有无openjdk:8-jdk-alpine镜像
docker images
  1. 如果没有,需要去镜像仓库拉取镜像,比如DockerHub
    在这里插入图片描述
    在这里插入图片描述
  2. 复制命令到linux系统控制台
docker pull openjdk:8-jdk-alpine

运行成功
在这里插入图片描述

  1. 在linux系统新建一个空目录,然后在目录中新建一个文件,命令为Dockerfile,拷贝java项目的jar包docker-demo.jar到这个目录中
    在这里插入图片描述
  2. 编写Dockerfile文件
  • 基于openjdk:8-jdk-alpine作为基础镜像
  • 将xxx.jar拷贝到镜像中
  • 暴露端口
  • 编写入口ENTRYPOINT
    内容如下:
# 基础镜像
FROM openjdk:8-jdk-alpine
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY docker-demo.jar /tmp/app.jar
#开放端口
EXPOSE 8090
# 入口
ENTRYPOINT ["java", "-jar", "/tmp/app.jar"]
  1. 进入到当前文件夹目录,然后使用docker build命令构建镜像
docker build -t docker-demo .

在这里插入图片描述
-t:是给镜像起名,格式依然是repository:tag的格式,不指定tag时,默认为latest;
. :是指定Dockerfile所在目录,如果就在当前目录,则指定为“.”;

  1. 此时再用docker images命令可查看构建出来的镜像
    在这里插入图片描述
  2. 使用docker run创建容器并运行
docker run -d --name dd -p 8090:8090 docker-demo

在这里插入图片描述
运行成功!
10. 使用docker logs -f [容器名称]命令在控制台打印日志

docker logs -f dd

在这里插入图片描述

  1. 在浏览器输入访问地址及接口信息即可访问项目

docker-配置mysql+外置数据+连接另一个容器(ip法和network法)_docker mysql network-CSDN博客

 

拉取镜像

docker pull mysql:latest
docker run -itd --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=数据库密码 mysql

进入mysql的bash:

docker exec -it mysql bash

然后mysql -u root -p即可进入

中文自动变空格或其他字符的解决办法

首先检查数据库的编码:
在这里插入图片描述
utf8mb4是用4个字节表示完整utf8字符的编码方式,所以常见中文是肯定可以覆盖的。但是我如果在insert语句中放置中文字符串,中文部分就会消失,导致插入报错。另外,我的服务器也是支持中文的。那么,到底是Mysql不能显示中文,还是docker不能显示中文呢?答案是后者。
参考:https://cloud.tencent.com/developer/article/1500399

root@0c1ccec770ff:/# locale -a
C
C.UTF-8
POSIX

Docker使用的是POSIX字符集,POSIX字符集是不支持中文的,而C.UTF-8是支持中文的。因此,只要把系统中的环境 LANG 改为"C.UTF-8"格式即可解决问题。那么可以在进入容器时临时指定字符集:

docker exec -it mysql env LANG=C.UTF-8 bash

外置数据

假设打算在Path下放置Mysql相关数据,那么在Path下创建conf.d,data和log三个文件夹,再放一个文件,名为my.cnf,内容(自由发挥吧)为:

[mysqld]
user=mysql
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000

然后输入下面的命令。其中-d表示用的是哪个镜像,-v是挂载的文件夹。如果秒退,则可能是容器内某个路径缺失,比如我缺的是/var/log/mysql,那么新建一个,再保存就好了(所以我从mysql:latest另存为mysql:v1了)

docker run \
--restart=always \
--privileged=true \
-p 3306:3306 --name mysql \
-v /home/mysql/log:/var/log/mysql \
-v /home/mysql/data:/var/lib/mysql \
-v /home/mysql/my.cnf:/etc/mysql/my.cnf \
-v /home/mysql/conf.d:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=数据库密码 \
-d mysql:v1

如果这段语句有报错,记得检查 ** 前是否缺少空格!

与其他容器连接

方法1:ip法

docker inspect mysql

在这里插入图片描述
当前我搞了一个python3的容器C,所以在启动mysql后,在C里面访问mysql时应该用红圈的ip。
下面是用来测试的代码。

>>> import pymysql
>>> conn = pymysql.connect(host="172.17.0.3",user="root",password="root密码",database="mysql")

# 如果报错:RuntimeError: 'cryptography' package is required for sha256_password or caching_sha2_password auth methods
# pip3 install cryptography

>>> cursor=conn.cursor()
>>> cursor.execute("select host,user from user")
5
>>> data = cursor.fetchall()
>>> for i in data:
...     print(i)
... 
('%', 'root')
('localhost', 'mysql.infoschema')
('localhost', 'mysql.session')
('localhost', 'mysql.sys')
('localhost', 'root')
# 这说明连接成功了

方法2:加入network法

我有一个springboot2项目已打成war包,放在一个装了tomcat的容器A中。虽然我按方法1中的ip配置了数据库,在A中也可以ping通那个ip,但始终报错:

com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

因此我采用方法2,将mysql容器和A容器加入到一个网络中去。

docker network create -d bridge sgrna-net

docker run \
--network sgrna-net \
--restart=always \
···mysql的运行命令

docker run -itd --network sgrna-net ···容器A的运行命令

此时在容器A中ping mysql应该是通的。

最后,修改springboot项目的配置文件,例如application.yml
在这里插入图片描述
其中黑笔处是需要增加的,红笔处写的是mysql容器的名字。

docker部署jar包的几种方式-CSDN博客

前言

简单记录一下docker打包jar部署的几种方式,避免以后忘记,不过这种手动的方式应用应该不多!
现在微服务大多数采用集群部署方式,使用k8s或者swarm配合docker+jenkins等实现自动化部署集群及动态扩展等,后面再慢慢写相关的吧。没有服务器资源演示,懒得弄 !

使用Dockerfile手动打包jar

简单打包运行

docker安装和使用基础看这里:manjaro安装docker及基本命令(dokcer系列一)
我这里就用前几天写的SpringCloudAlibabaDemo做演示吧,需要演示工程的看这里:SpringCloudAlibaba项目搭建nacos+gateway
user模块已久打包成jar了,如下:
在这里插入图片描述
把jar上传到你的服务器,我这里就在本机演示,直接cp到/opt/java_app_docker目录下
在这里插入图片描述
在相同目录下创建Dockerfile
sudo vim Dockerfile
然后输入:

# 拉取jdk8作为基础镜像
FROM java:8
# 作者
MAINTAINER zbdemo <zbdemo@163.com>
# 添加jar到镜像并命名为user.jar
ADD user-0.0.1-SNAPSHOT.jar user.jar
# 镜像启动后暴露的端口
EXPOSE 8001
# jar运行命令,参数使用逗号隔开
ENTRYPOINT ["java","-jar","user.jar"]

然后使用docker命令打包:
docker build -t user .
user表示镜像名称
最后的.表示Dockerfile在当前目录
打包完成后使用docker images查看镜像
在这里插入图片描述
使用docker run命令创建并运行容器:
docker run -d --name user -p 8001:8001 user
命令解释如下:

命令 功能
docker run 创建并启动容器
–name 指定一个容器名称
-d 后台运行容器,并返回容器ID
-p 指定端口
user 需要启动的镜像(名称+版本)不指定版本默认最新版本
符号左边为宿主机,右边为容器空间

启动完成,查看启动日志:
docker logs -f -t user
jar日志启动成功,查看容器:
docker ps
在这里插入图片描述
访问一下,测试效果:
localhost:8001/hello/hello
在这里插入图片描述
没错,手动docker打包jar镜像并运行完成了,但是这样搞就显得有点呆,还不如直接java -jar运行呢!操作这么麻烦,每次更新还要删除容器,删除镜像重新创建,而且日志文件等重要信息也会丢失!当然如果你使用jenkins等shell自动化的工具当我没说

进化:可复用容器

首先停止并删除刚刚创建的容器和镜像
停止容器:
docker stop user
删除容器:
docker rm user
删除镜像:
docker rmi user

修改Dockerfile文件
sudo vim Dockerfile
修改后内容如下(给jar安排了一个目录,方便挂载到宿主机):

# 拉取jdk8作为基础镜像
FROM java:8
# 作者
MAINTAINER zbdemo <zbdemo@163.com>
# 添加jar到镜像并命名为user.jar
ADD user-0.0.1-SNAPSHOT.jar /app/user.jar
# 镜像启动后暴露的端口
EXPOSE 8001
# jar运行命令,参数使用逗号隔开
ENTRYPOINT ["java","-jar","/app/user.jar"]

然后在/opt/java_app_docker文件夹下面创建jar挂载目录
sudo mkdir app

把你的jar包cp一份到宿主机/opt/java_app_docker/app目录下并改名为user.jar 这里一定要在app目录下存放你的jar,不然容器启动会失败,找不到jar
在这里插入图片描述
打包镜像-创建并运行容器
打包镜像:
docker build -t user .
创建并运行容器:
docker run -d --name user -p 8001:8001 -v /opt/java_app_docker/app:/app user
命令解释如下:

命令 功能
docker run 创建并启动容器
–name 指定一个容器名称
-d 后台运行容器,并返回容器ID
-p 指定端口
user 需要启动的镜像(名称+版本)不指定版本默认最新版本
-v 挂载目录到宿主机
符号左边为宿主机,右边为容器空间

这样的方式启动完成之后,更新服务时只需要更换宿主机/opt/java_app_docker/app目录下的jar包,然后重启容器即可实现更新,省略了每次更新删除打包创建等过程

究极进化:jdk镜像直接创建可复用容器

上面的方式在单应用情况下是可行的,但是如果我是微服务架构呢?比如现在我要部署我的gateway网关服务,是不是还要重新走一遍流程?很呆!!!!!
首先停止并删除刚刚创建的容器和镜像
停止容器:
docker stop user
删除容器:
docker rm user
删除镜像:
docker rmi user
查看jdk版本
docker images
在这里插入图片描述
我这里是openjdk8
创建并运行容器(直接基于jdk镜像创建容器):
docker run -d --name user -p 8001:8001 -v /opt/java_app_docker/app:/app java:8 /usr/bin/java -jar /app/user.jar
或者(启动方式取决于jdk版本)
docker run -d --name user -p 8001:8001 -v /opt/java_app_docker/app:/app openjdk:8 java -jar /app/user.jar

命令解释如下:

命令 功能
docker run 创建并启动容器
–name 指定一个容器名称
-d 后台运行容器,并返回容器ID
-p 指定端口
-v 挂载目录到宿主机
java:8 需要启动的镜像(名称+版本)不指定版本默认最新版本
/usr/bin/java -jar /app/user.jar jar启动命令及jar所在位置,因为创建的容器挂在了宿主机/opt/java_app_docker/app目录,所以里面映射了我们上面放进去的user.jar
符号左边为宿主机,右边为容器空间

这样的方式省略了创建Dockerfile并把jar打包成镜像的操作,无论多少个服务,只要有jdk镜像,一条命令搞定!比如现在我需要增加gateway服务,那就把gateway.jar放在任意目录下,直接执行:
docker run -d --name user -p ${任意外部端口}😒{任意容器端口} -v ${你的gateway.jar存放目录}:/${任意容器内目录名称} java:8 /usr/bin/java -jar /${任意容器内目录名称}/gateway.jar
这种方式也是直接替换挂载目录下jar,然后docker restart 容器ID or 名称 就行

超究极进化:maven插件打包(不推荐)

为什么不推荐呢?首先是maven插件直接打包docker镜像的方式污染工程,反正就很奇怪的感觉,其次你的项目是要发布生产环境的,直接打包镜像给运维,太卷了吧?
所以综上所属,我就简单介绍下
pom添加docker打包方式

<!--docker 镜像插件-->
    <build>
        <plugins>
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.2.2</version>
                <configuration>
                    <imageName>${project.artifactId}</imageName>
                    <dockerDirectory>src/main/docker</dockerDirectory>
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>
        </plugins>
    </build>

创建Dockerfile文件
在这里插入图片描述
内容如下:

# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER zbdemo
# 将jar包添加到容器中并更名为app.jar
ADD gateway-0.0.1-SNAPSHOT.jar gateway.jar
EXPOSE 8000
ENTRYPOINT ["java","-jar","gateway.jar"]

命令方式
打包:
mvn package -Dmaven.test.skip=true docker:build


本机docker
保存镜像到本地docker:
docker save -o /gateway.jar gateway
查看镜像:
docker images
创建并运行容器:
docker run --name gateway -p 8000:8000 -d gateway


服务器docker
或者上传到服务器:
scp /gateway.jar root@ip:/opt/app
加载镜像:
docker load </opt/app/gateway.jar
查看镜像:
docker images
创建并运行容器:
docker run --name gateway -p 8000:8000 -d gateway.tar


或者这样
打包
在这里插入图片描述
推送
在这里插入图片描述

无聊的进化:maven打包自动推送镜像到指定服务器(不推荐,研发环境随便玩)

准备工作
开启服务器的docker远程访问权限:自行百度?反正我不想这样玩

pom修改如下:

<!--docker 镜像插件-->
    <build>
        <plugins>
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.2.2</version>
                <configuration>
                    <imageName>${project.artifactId}</imageName>
                    <dockerDirectory>src/main/docker</dockerDirectory>
                    <!-- docker容器地址 -->
                    <dockerHost>http://192.168.101.1:2375</dockerHost>
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

打包:
mvn package -Dmaven.test.skip=true docker:build
或者
在这里插入图片描述
完成!!!!!!!!!!!!!!!!!!!!!!去服务器docker images看一下应该有了

关于docker容器启动后注册到nacos的ip是docker容器ip问题!

1.可以在docker run的时候加 –network=host 参数解决(主机网络模式),这个时候我们无需-p 80:80指定服务端口运行,因为–network=host模式会使用服务本身启用的端口。
2.容器创建启动时动态指定ip和端口:-Dspring.cloud.nacos.discovery.ip=xx -Dspring.cloud.nacos.discovery.port=xxx
或者在yaml配置文件配置:

spring:
  cloud:
    nacos:
      discovery:
        ip: xx
        port: xx

总结

后面两种maven插件打包镜像的方式都不推荐,反正不要太卷了,哈哈!虽然在dev或者test环境用起来可能真的爽,但是你确定要手动吗?后续应该会写jenkins+k8s或者jenkins+swarm集群部署,你会发现你所谓的爽不过如此!!说这么多干啥呢,反正主要是写给自己看的
差点忘了,感谢大佬,参考地址:地址1地址2

Docker部署jar包运行的几种方式详解_docker 运行jar-CSDN博客

方式一:将打包jar直接创建镜像   直接启动对应的镜像即可

1.上传jar到服务器的指定目录(本人目录上传到 /opt/dockerTest目录下)  如下:

 

2.在该目录下创建Dockerfile 文件   命令  :touch  Dockerfile   然后编辑改文件  vim Dockerfile     然后将下面的内容复制到Dockerfile文件中

FROM java:8
    MAINTAINER hezhipeng
    ADD test.jar app.jar
    EXPOSE 8080
    ENTRYPOINT ["java","-jar","app.jar"]

 

from java:8 拉取一个jdk为1.8的docker image
maintainer 作者是dh,指令设置生成镜像的 Author 字段
test.jar 就是你上传的jar包,替换为jar包的名称
app.jar 是你将该jar包重新命名为什么名称,在容器中运行
expose 该容器暴露的端口是多少,就是jar在容器中以多少端口运行
entrypoint 容器启动之后执行的命令,java -jar app.jar 即启动jar

 

3.创建好Dockerfile文件之后,执行命令 构建镜像(注意最后的 . 表示 Dockerfile 文件在当前目录下   )

docker build -t test_java .

 

4.以上 test_java是构建之后镜像名称   查看构建后的镜像    docker  images

 

5.镜像构建成功之后,就可以运行容器了

docker run -d --restart=always --name demo -p 8080:8080 test_java

 

docker run -d --restart=always --name demo -p 8080:8080  test_java 这个表示docker容器在停止或服务器开机之后会自动重新启动 --restart=always     第一个为服务器8080端口,第二个8080为docker容器端口

6.然后docker ps 看看你的容器有没有在运行即可    (查看启动日志:docker logs --since 5m ec02923299cb)

7.访问项目中的接口:

 

方式二:将之前项目环境构建好的镜像打包 上传到本机下载该镜像即可

1.如 下  我将之前打包好后的镜像放到/opt/tools目录下   如下:

2.在本机构建该镜像  

docker load -i /opt/tools/lj_java14.tar

 

3.启动该镜像  

docker run -p 8080:8080 -d --restart=always -v /opt/dockerTest/log_files/test:/longjin/log_files/test   -v /etc/localtime:/etc/localtime:ro  -v /opt/dockerTest:/longjin -v /opt/dockerTest/test.jar:/longjin/app.jar  --name test lj_java:1.4

 

4.查询该镜像进程:

 

5.日志:docker logs --since 5m b968697a14e5

6.访问项目中的接口

docker run -d --restart=always --name demo -p 8080:8080 test_java

 

docker run -d --restart=always --name demo -p 8080:8080  test_java 这个表示docker容器在停止或服务器开机之后会自动重新启动 --restart=always     第一个为服务器8080端口,第二个8080为docker容器端口

2.在本机构建该镜像  

docker load -i /opt/tools/lj_java14.tarDocker部署jar包运行的几种方式详解_docker 运行jar-CSDN博客

docker exec -it my_mysql bash进入,这里不再贴代码了。
2、登录进入mysql ,使用 mysql -uroot -p123456登录mysql数据库

修改 user表root的host为%

flush privileges;

Docker配置MySQL容器+远程连接(全流程)_连接docker中的mysql-CSDN博客

使用Docker容器部署java运行环境(java8 + mysql5.7 + redis5.0 + nginx1.14.1_docker java8-CSDN博客

一.Docker环境安装

1.1 安装工具

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

1.2 为yum源添加docker仓库位置

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

1.3 将软件包信息提前在本地索引缓存

(非必要,建议执行,可以提升yum安装的速度,报错去掉fast试试)

sudo yum makecache fast

1.4 安装Docker

sudo yum install docker-ce docker-ce-cli containerd.io

傻瓜式安装 点击y

1.5 启动Docker

sudo systemctl start docker

1.6 设置开机自启动

systemctl enable docker

1.7 安装完成后可以测试一下,是否安装成功

docker run hello-world

1.8 配置Docker镜像加速器

配置加速器,否则下载镜像的时候回比较慢,默认是从docker hub下载

vi /etc/docker/daemon.json

按 i 进入编辑模式 修改内容为:

 
  1. {
  2. "registry-mirrors": ["https://5pfmrxk8.mirror.aliyuncs.com"]
  3. }
 

按esc推迟INSERT模式后,shift + zz 保存并退出

重新加载配置:

sudo systemctl daemon-reload

重启Docker:

sudo systemctl restart docker

二 基本项目运行环境搭建

2.1 安装jdk1.8

2.1.1通过DOCKER SEARCH命令查找远程镜像

docker search jdk

2.1.2、选择一个远程镜像下载到本地仓库

docker pull kdvolder/jdk8

注意:如果没指定版本号默认下载最新(latest)

2.1.3、查看镜像是否下载到本地仓库

docker images

2.1.4、在DOCKER容器中运行镜像

docker run -di --name=jdk1.8 kdvolder/jdk8

此时,运行成功返回一长串类型uuid的东东,表示docker容器已经运行了jdk。

2.1.5、查看DOCKER进程JDK是否启动成功

docker ps

2.1.6、进入容器查看JDK版本

进入容器

docker exec -it jdk1.8 /bin/bash

查看jsk版本

java -version

 

2.2 安装MySql

这里以5.7版本为例 其他版本只需要改一下版本号就行了

sudo docker pull mysql:5.7
2.2.1 启动MySql服务
 
  1. docker run -p 3306:3306 --name myData \
  2. -v /usr/local/docker/mysql/conf:/etc/mysql \
  3. -v /usr/local/docker/mysql/logs:/var/log/mysql \
  4. -v /usr/local/docker/mysql/data:/var/lib/mysql \
  5. -e MYSQL_ROOT_PASSWORD=123456 \
  6. -d mysql:5.7
 

-p 3306:3306 : 第一个3306是liunx的端口号,第二个3306 是Docker容器的端口号.要想远程访问这个数据库 就要先通过远程访问Linux的端口,再映射到docker容器的端口访问mysql

–name myData: myData是容器启动后的名字,可以自定义,但是建议见名知意

-e MYSQL_ROOT_PASSWORD=123456 : MySql启动需要的账户密码,默认root账户,我这里设置123456

-v /usr/local/docker/mysql/data:/var/lib/mysql : 设置数据存储路径 冒号左面的表示宿主机的挂载目录,冒号右边则表示容器内部的路径

-d : 表示后台启动该服务

mysql:5.7 : 安装的数据库的版本,我们拉取的是5.7版本

(注:复制的时候不要删除 \ )

启动成功后会返回一个容器id 如图所示:

2.2.2 配置MySql外网连接权限

想要远程连接数据库,需要配置MySql的外网连接权限

进入mysql容器 这里的名字就是刚才设置的name

docker exec -it myData /bin/bash

进入数据库 -u接用户名(默认root) -p接密码(刚才设置的密码)

mysql -uroot -p123456

设置外网访问授权

grant all privileges on *.* to root@'%' identified by "password"

刷新权限

flush privileges

授权后 更新一下密码,否则连接时候报错1045

alter user 'root'@'%' identified with mysql_native_password by '123456'

再次刷新权限

flush privileges

退出mysql

docker 安装mysql 以及redis 默认没有配置文件,有需要的需要自己挂在配置文件(非必要步骤)

vim /etc/my.cnf

然后插入以下配置

 
  1. [client]
  2. default-character-set=utf8
  3.  
  4. [mysql]
  5. default-character-set=utf8
  6.  
  7. [mysqld]
  8. init_connect='SET collation_connection = utf8_unicode_ci'
  9. init_connect='SET NAMES utf8'
  10. character-set-server=utf8
  11. collation-server=utf8_unicode_ci
  12. skip-character-set-client-handshake
  13. skip-name-resolve
 

然后重启mysql容器即可

执行命令:docker restart mysql (容器名称) 进行重启

 

2.2.3 开放服务器3306端口
 
  1. systemctl start firewalld
  2. firewall-cmd --zone=public --add-port=3306/tcp --permanent
  3. firewall-cmd --reload
 
2.2.4 如果是云平台,需要配置安全组,放行3306端口

(不配置报错2003)配置过程略

2.2.5 测试连接

2.3 安装Redis

拉取Redis5.0的docker镜像
docker pull redis:5
重启一下docker ,防止redis启动失败
sudo systemctl restart docker
重启后记得启动MySql
docker start myData
创建以下文件及文件夹,方便配置及管理redis
 
  1. mkdir -p /docker/redis
  2. mkdir -p /docker/redis/data
  3. touch /docker/redis/redis.conf
 
编辑配置文件
vim /docker/redis/redis.conf
 
  1. # 不开启守护进程
  2. daemonize no
  3. # 指定Redis端口为6379(默认)
  4. port 6379
  5. # 不要绑定的主机地址,那样无法在容器外部访问
  6. bind 0.0.0.0
  7. #需要密码则打开
  8. requirepass 123456
  9. # 持久化
  10. appendonly yes
  11. 12345678910
 
启动Redis
 
  1. docker run \
  2. -p 6379:6379 \
  3. --name redis \
  4. -v /docker/redis/redis.conf:/etc/redis/redis.conf \
  5. -v /docker/redis/data:/data \
  6. --restart=always \
  7. -d redis:5 redis-server /etc/redis/redis.conf
 

启动成功返回id

开放服务器6379端口
 
  1. systemctl start firewalld
  2. firewall-cmd --zone=public --add-port=6379/tcp --permanent
  3. firewall-cmd --reload
 
云平台配置安全组

测试连接

2.4安装Nginx

2.4.1 拉取镜像文件
docker pull nginx:1.14.1

2.4.2、创建Nginx配置文件

启动前需要先创建Nginx外部挂载的配置文件( /home/nginx/conf/nginx.conf)
之所以要先创建 , 是因为Nginx本身容器只存在/etc/nginx 目录 , 本身就不创建 nginx.conf 文件
当服务器和容器都不存在 nginx.conf 文件时, 执行启动命令的时候 docker会将nginx.conf 作为目录创建 , 这并不是我们想要的结果 。
 
  1. # 创建挂载目录
  2. mkdir -p /home/nginx/confmkdir -p /home/nginx/logmkdir -p /home/nginx/html
 
容器中的nginx.conf文件和conf.d文件夹复制到宿主机
 
  1. # 生成容器
  2. dockerrun --name nginx -p 9001:80 -d nginx# 将容器nginx.conf文件复制到宿主机docker cp nginx:/etc/nginx/nginx.conf /home/nginx/conf/nginx.conf# 将容器conf.d文件夹下内容复制到宿主机docker cp nginx:/etc/nginx/conf.d /home/nginx/conf/conf.d# 将容器中的html文件夹复制到宿主机docker cp nginx:/usr/share/nginx/html /home/nginx/
 

2.4.3.创建Nginx容器并运行

Docker 创建Nginx容器
 
  1. # 关闭该容器
  2. docker stop nginx
  3. # 删除该容器d
  4. docker rm nginx
 
 
  1. docker run \
  2. -p 9002:80 \
  3. --name nginx \
  4. -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
  5. -v /home/nginx/conf/conf.d:/etc/nginx/conf.d \
  6. -v /home/nginx/log:/var/log/nginx \
  7. -v /home/nginx/html:/usr/share/nginx/html \
  8. -d nginx:latest
 

命令

描述

–name nginx

启动容器的名字

-d

后台运行

-p 9002:80

将容器的 9002(后面那个) 端口映射到主机的 80(前面那个) 端口

-v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf

挂载nginx.conf配置文件

-v /home/nginx/conf/conf.d:/etc/nginx/conf.d

挂载nginx配置文件

-v /home/nginx/log:/var/log/nginx

挂载nginx日志文件

-v /home/nginx/html:/usr/share/nginx/html

挂载nginx内容

nginx:latest

本地运行的版本

\

shell 命令换行

单行模式启动
docker run -p 9002:80 --name nginx -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/conf/conf.d:/etc/nginx/conf.d -v /home/nginx/log:/var/log/nginx -v /home/nginx/html:/usr/share/nginx/html -d nginx:latest

2.4.4、修改内容进行展示

# 重启容器docker restart nginx

 

 

参考:https://blog.csdn.net/BThinker/article/details/123507820

https://blog.csdn.net/barry_yang3111/article/details/127099809

posted @ 2024-03-25 18:12  CharyGao  阅读(192)  评论(0编辑  收藏  举报