Docker-基于java8构建java项目镜像
下载 JDK8
https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
image-20201027185030923
创建镜像的构建目录 base_jdk8,并且将 JDK8 上传到服务器
image-20201027185401601
编辑创建 Dockerfile
-
# Using Centos for base image
-
FROM centos:7
-
-
# author label
-
LABEL maintainer="Aron.li"
-
-
# install timezone gcc
-
ENV ENVIRONMENT DOCKER_PROD
-
RUN cd / && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
-
&& yum makecache \
-
&& yum install -y wget aclocal automake autoconf make gcc gcc-c++ python-devel mysql-devel bzip2 libffi-devel epel-release \
-
&& yum clean all
-
-
# cd /opt
-
WORKDIR /opt
-
-
# copy jdk8 to /opt, and decompression
-
ADD jdk-8u271-linux-x64.tar.gz /opt
-
-
# set jdk8 env
-
ENV JAVA_HOME=/opt/jdk1.8.0_271
-
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
-
ENV PATH=$JAVA_HOME/bin:$PATH
-
-
# exec java -version
-
CMD ["java","-version"]
构建镜像
docker build -f Dockerfile -t base_jdk8:v1.0 .
执行如下:
image-20201027191035881
生成镜像如下:
image-20201027191212996
启动镜像,测试java环境
编写一个启动镜像的脚本 restart_service.sh
-
basedir=`pwd`
-
-
name='base_jdk8'
-
image='base_jdk8:v1.0'
-
docker stop $name
-
docker rm $name
-
docker run -it --privileged=true --name $name $image /bin/bash
测试如下:
image-20201027191259441
基于 JDK8 的镜像,构建SpringBoot服务
上传 SpringBoot 的 jar 包
image-20201027193505484
编辑创建 Dockerfile
-
# Using JDK8 for base image
-
FROM base_jdk8:v1.0
-
-
# author label
-
LABEL maintainer="Aron.li"
-
-
# install timezone gcc
-
ENV ENVIRONMENT DOCKER_PROD
-
RUN cd / && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
-
-
# cd /opt
-
WORKDIR /opt
-
-
# copy jar to /opt, and decompression
-
ADD autotest-0.0.1-SNAPSHOT.jar /opt
-
-
# exec java -jar autotest-0.0.1-SNAPSHOT.jar
-
CMD ["java","-jar","autotest-0.0.1-SNAPSHOT.jar"]
构建镜像
docker build -f Dockerfile -t autotest:v1.0 .
启动镜像服务
编写一个启动镜像的脚本 restart_service.sh
-
#!/bin/bash
-
basedir=$(cd `dirname $0`;pwd)
-
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])"`
-
-
-
name='autotest'
-
image='autotest:v1.0'
-
docker stop $name
-
docker rm $name
-
#docker run -it --name $name $image /bin/bash
-
-
docker run -d --name $name -p 8080:8080 -h $name \
-
--add-host=mysql_host:$host_ip \
-
--add-host=mongo_host:$host_ip \
-
--add-host=redis_host:$host_ip \
-
$image
需求:基于openjdk:8-jdk-alpine镜像,将一个java项目构建为镜像
实现步骤:
- 在linux系统检查有无openjdk:8-jdk-alpine镜像
docker images
- 如果没有,需要去镜像仓库拉取镜像,比如DockerHub
- 复制命令到linux系统控制台
docker pull openjdk:8-jdk-alpine
运行成功
- 在linux系统新建一个空目录,然后在目录中新建一个文件,命令为Dockerfile,拷贝java项目的jar包docker-demo.jar到这个目录中
- 编写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"]
- 进入到当前文件夹目录,然后使用docker build命令构建镜像
docker build -t docker-demo .
-t:是给镜像起名,格式依然是repository:tag的格式,不指定tag时,默认为latest;
. :是指定Dockerfile所在目录,如果就在当前目录,则指定为“.”;
- 此时再用docker images命令可查看构建出来的镜像
- 使用docker run创建容器并运行
docker run -d --name dd -p 8090:8090 docker-demo
运行成功!
10. 使用docker logs -f [容器名称]命令在控制台打印日志
docker logs -f dd
- 在浏览器输入访问地址及接口信息即可访问项目
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部署的几种方式,避免以后忘记,不过这种手动的方式应用应该不多!
现在微服务大多数采用集群部署方式,使用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 进入编辑模式 修改内容为:
-
{
-
"registry-mirrors": ["https://5pfmrxk8.mirror.aliyuncs.com"]
-
}
按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服务
-
docker run -p 3306:3306 --name myData \
-
-v /usr/local/docker/mysql/conf:/etc/mysql \
-
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-
-e MYSQL_ROOT_PASSWORD=123456 \
-
-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
然后插入以下配置
-
[client]
-
default-character-set=utf8
-
-
[mysql]
-
default-character-set=utf8
-
-
[mysqld]
-
init_connect='SET collation_connection = utf8_unicode_ci'
-
init_connect='SET NAMES utf8'
-
character-set-server=utf8
-
collation-server=utf8_unicode_ci
-
skip-character-set-client-handshake
-
skip-name-resolve
然后重启mysql容器即可
执行命令:docker restart mysql (容器名称) 进行重启
2.2.3 开放服务器3306端口
-
systemctl start firewalld
-
firewall-cmd --zone=public --add-port=3306/tcp --permanent
-
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
-
mkdir -p /docker/redis
-
mkdir -p /docker/redis/data
-
touch /docker/redis/redis.conf
编辑配置文件
vim /docker/redis/redis.conf
-
# 不开启守护进程
-
daemonize no
-
# 指定Redis端口为6379(默认)
-
port 6379
-
# 不要绑定的主机地址,那样无法在容器外部访问
-
bind 0.0.0.0
-
#需要密码则打开
-
requirepass 123456
-
# 持久化
-
appendonly yes
-
12345678910
启动Redis
-
docker run \
-
-p 6379:6379 \
-
--name redis \
-
-v /docker/redis/redis.conf:/etc/redis/redis.conf \
-
-v /docker/redis/data:/data \
-
--restart=always \
-
-d redis:5 redis-server /etc/redis/redis.conf
启动成功返回id
开放服务器6379端口
-
systemctl start firewalld
-
firewall-cmd --zone=public --add-port=6379/tcp --permanent
-
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 作为目录创建 , 这并不是我们想要的结果 。
-
# 创建挂载目录
-
mkdir -p /home/nginx/confmkdir -p /home/nginx/logmkdir -p /home/nginx/html
容器中的nginx.conf文件和conf.d文件夹复制到宿主机
-
# 生成容器
-
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容器
-
# 关闭该容器
-
docker stop nginx
-
# 删除该容器d
-
docker rm nginx
-
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
命令 |
描述 |
–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