一、安装MySQL
*注:实际开发中并不建议使用docker安装MySQL
搜索MySQL镜像
docker search mysql
直接pull拉取镜像会下载最新tag的镜像
可以访问以下地址查看mysql镜像的tag,然后选择一个自己所需的下载
https://registry.hub.docker.com/v1/repositories/mysql/tags
本文选择8.0.30的mysql,执行命令
docker pull mysql:8.0.30
接下来就要启动mysql
# docker run 创建一个新的容器
docker run -d -p 33060:3306 --name mysql \
-v /usr/dcoker-mysql/log:/var/log/mysql \
-v /usr/docker-mysql/data:/var/lib/mysql \
-v /usr/docker-mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 mysql:8.0.30
参数说明:
-d 后台运行
-p 33060:3306 端口映射,宿主机的33060端口映射到容器3306端口
--name mysql 容器名称,可以自定义
-v /usr/dcoker-mysql/log:/var/log/mysql 宿主机/usr/dcoker-mysql/log目录与容器的/var/log/mysql目录挂载,该目录保存了mysql的日志
-v /usr/docker-mysql/data:/var/lib/mysql 也是挂载,该目录是mysql数据储存的位置
-v /usr/docker-mysql/conf:/etc/mysql/conf.d 也是挂载,该目录放置配置文件的
-e MYSQL_ROOT_PASSWORD=123456 设置环境变量,该变量是设置root用户的密码,可自行修改
mysql:8.0.30 镜像名称以及tag
如果不挂载数据卷,容器被删掉之后,mysql数据库里面的数据都会消失
执行docker ps
命令查看是否启动成功
如果启动失败,可以执行docker log mysql
查看日志,找失败的原因
进入容器中的mysql,执行:
# docker exec 在运行的容器中执行命令
docker exec -it mysql mysql -uroot -p123456
参数说明:
-i 以交互模式运行容器
-t 为容器重新分配一个伪输入终端
mysql -uroot -p123456 容器执行的命令,直接进入容器中的mysql
*注意:安装的mysql是8.x版本的,默认的身份验证插件为caching_sha2_password,该插件不能使用旧版本的客户端来连接;本人所使用的Navicat版本较旧,需要修改身份验证插件才能登录。修改插件执行:ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
在navicat上创建表并插入数据
然后在容器中查看数据,发现中文出现了乱码
解决办法:修改配置文件
执行命令exit
退出容器,在宿主机中编写配置文件
执行:vim /usr/docker-mysql/conf/my.cnf
,这个目录就是上面创建容器时挂载的数据卷
[client]
default_character_set=utf8
[mysqld]
collation_server=utf8_general_ci
character_set_server=utf8
保存之后执行docker restart mysql
重启容器
然后在容器查询数据
停掉这个mysql容器,然后再创建一个mysql容器,看看是否能查询到插入的数据以及是否解决了中文乱码
停止容器命令:docker stop mysql
然后再创建一个容器
挂载的数据卷与之前的是一样的,之前的容器产生的数据,被新创建的容器读取
二、安装Redis
搜索Redis镜像
docker search redis
拉取镜像,本文下载最新的官方镜像
docker pull redis
下载完成
创建配置文件
在宿主机上创建一个文件redis.conf,路径可以自定义
这里提供一个配置文档,配置可根据自己的需求修改
本文配置文件路径:/usr/docker-redis/conf/redis.conf
# bind 127.0.0.1
protected-mode no
port 6379
tcp-backlog 511
#设置密码为123456,可注释掉
requirepass 123456
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""
databases 30
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-disable-tcp-nodelay no
replica-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
appendonly yes
appendfilename "appendonly.aof"
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
slowlog-max-len 128
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
*注意:daemonize no是关闭守护线程,如果开启的话容器会启动不起来
执行以下命令,启动容器
docker run -d -p 6379:6379 --name redis \
-v /usr/docker-redis/conf/redis.conf:/etc/redis/redis.conf \
-v /usr/docker-redis/data:/data \
redis redis-server /etc/redis/redis.conf
参数说明:
-d 后台运行
-p 6379:6379 端口映射,<宿主机端口>:<容器端口>
--name redis 容器名称,可以自定义
-v /usr/docker-redis/conf/redis.conf:/etc/redis/redis.conf 宿主机/usr/docker-redis/conf/redis.conf文件与容器的/etc/redis/redis.conf文件挂载
-v /usr/docker-redis/data:/data 也是挂载,该目录是redis数据持久化文件储存的位置
redis 镜像名称
redis-server /etc/redis/redis.conf 以上面redis.conf文件写的配置启动redis
启动redis容器之后,执行docker ps
查看是否启动成功
如果没有启动成功可以执行命令docker logs <容器名称或id>
查看日志;如果日志没有内容可能是配置中开启了守护线程的原因,关闭即可
启动成功后,执行docker exec -it redis redis-cli
命令进入容器
如果设置了密码,执行auth 123456
(123456配置中的密码,没有配置密码的直接跳过这步)
到这里redis就安装完成了
三、安装Java Web程序
用docker部署一个Java程序需要用Dockerfile构建镜像,这里先简单说明一下Dockerfile,下一章再详细说明
首先准备一个Java Web的程序(这里提供一个简单的程序 project-auto-deploy.jar)和适用于linux的jdk包(只是简单的部署用jre包也行)
将这Java程序和jdk包放在同一个目录下,然后在该目录下编写一个Dockerfile文件
vim dockerfile
文件内容(根据自己的实际情况更改):
# 指定基础镜像
FROM ubuntu
# 作者信息
MAINTAINER hxh
# 设置环境变量,这个变量是放置jdk包的目录
ENV JAVA_DIR=/usr/java
# 切换目录,相当于cd命令,如果目录不存在则会自动创建
WORKDIR $JAVA_DIR
# ADD将本地的文件添加到镜像中,这里的意思是将jdk包添加到镜像中的$JAVA_DIR/目录下,ADD指令会自动解压压缩文件
ADD jdk-8u341-linux-x64.tar.gz $JAVA_DIR/
# 功能和ADD相同,但是不会自动解压,这里表示将java程序添加到/app目录下并命名为java-app.jar,ADD和COPY都会自动创建目录
COPY project-auto-deploy.jar /app/java-app.jar
# 设置jdk的环境变量,jdk1.8.0_341是jdk包解压后的文件夹名称,不知道的话可以先把jdk包解压出来看下
ENV JAVA_HOME=$JAVA_DIR/jdk1.8.0_341
ENV PATH=$PATH:$JAVA_HOME/bin
# 暴露端口,8080是访问Java程序的端口,根据自己的程序端口修改
EXPOSE 8080
# 指定容器运行时执行的命令,/app/java-app.jar就是上面的java程序(这里要用双引号,不能用单引号)
ENTRYPOINT ["java","-jar","/app/java-app.jar"]
编写dockerfile文件后,执行以下命令创建镜像:
docker build -t java-app .
*注意:命令的最后是有一个空格和点“.”的,一定要加上;“.” 像上下文一样,就是dockerfile文件中使用ADD和COPY指令需要指定宿主机的文件,而“.”就表示dockerfile和宿主机的文件在同一个目录下
参数说明:
build 构建镜像
-t 给镜像加一个Tag,默认为latest
java-app 镜像名称,<镜像名称>:<Tag>,:<Tag>可以不写
这里是在dockerfile所在的目录执行命令的,不需要指定dockerfile文件的路径,如果文件名是自定义的或者不在dockerfile所在的目录执行,可以加上“-f”参数指定dockerfile所在的位置,例如:
docker build -f /xxx/xxx/xxx -t image-name .
因为要下载基础镜像,可能需要等待比较长的时间,如果基础镜像已经下载过则会直接使用
构建镜像之后看看日志是否成功,构建成功之后可以执行docker images
命令看到该镜像
运行容器,执行以下命令:
docker run -d -p 80:8080 --name java-app-container java-app
参数说明:
run 运行容器
-d 后台运行
-p 端口映射,该参数后面的80:8080就是映射的端口,<宿主机端口>:<容器端口>
--name 设置容器名称,该参数后面的java-app-container就是这个容器的名称
java-app 指定镜像
运行之后执行docker ps
查看是否启动成功,如果没有启动成功可以执行docker logs java-app-container
查看日志信息
运行成功之后,用浏览器访问
成功访问到,部署完成