Docker简单使用教程https://www.tapme.top/blog/detail/2018-12-26-13-18/
Linux修改文件权限:https://www.cnblogs.com/cwwmmv/p/10535175.html
离线服务器中部署Docker下的MySQL,Tomcat,jdk,java系统,Web应用
一、docker安装
1.下载离线包
2.解压离线包tar -xzvf 离线包
3.在同级目录下建立三个文件,文件名和内容如下:
docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
install.sh
#!/bin/sh
echo '解压tar包...'
tar -xvf $1
echo '将docker目录移到/usr/bin目录下...'
cp docker/* /usr/bin/
echo '将docker.service 移到/etc/systemd/system/ 目录...'
cp docker.service /etc/systemd/system/
echo '添加文件权限...'
chmod +x /etc/systemd/system/docker.service
echo '重新加载配置文件...'
systemctl daemon-reload
echo '启动docker...'
systemctl start docker
echo '设置开机自启...'
systemctl enable docker.service
echo 'docker安装成功...'
docker -v
uninstall.sh
#!/bin/sh
echo '解压tar包...'
tar -xvf $1
echo '将docker目录移到/usr/bin目录下...'
cp docker/* /usr/bin/
echo '将docker.service 移到/etc/systemd/system/ 目录...'
cp docker.service /etc/systemd/system/
echo '添加文件权限...'
chmod +x /etc/systemd/system/docker.service
echo '重新加载配置文件...'
systemctl daemon-reload
echo '启动docker...'
systemctl start docker
echo '设置开机自启...'
systemctl enable docker.service
echo 'docker安装成功...'
docker -v
4.安装命令sh install.sh docker-17.03.2-ce.tgz
docker -v
二、部署MySql
1.从连接外网的电脑中拉取资源
docker pull mysql:5.6.22
2.从docker中导出MySQL 5.6.22 到自定义文件夹MySoft
docker save -o ./MySoft/mysql-5.6.22.tar mysql:5.6.22
由于这里的文件所有者为root所以需要更改到用户,使用命令:-R指文件及其子目录均改变
chown -R ghl MySoft
3.导入到离线服务器中,使用docker加载镜像,成功后可用docker images 查看
docker load -i mySoft/mysql-5.6.22.tar.gz
4.启动MySQL
docker run --name mysql -p 3306:3306 -v /mysql/data:/var/lib/mysql -v /mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -itd mysql:5.6.22
p 3306:3306 将容器的 3306 端口映射到主机的 3306 端口
--name mysql 启动后容器名为 mysql
-v $PWD/conf:/etc/mysql 将主机当前目录下的 conf/ 挂载到容器的 /etc/mysql (conf目录为mysql的配置文件,不挂载也没问题)
-v $PWD/logs:/logs 将主机当前目录下的 logs 目录挂载到容器的 /logs (logs目录为mysql的日志目录,不挂载也没影响)
-v $PWD/data:/var/lib/mysql 将主机当前目录下的data目录挂载到容器的 /var/lib/mysql (data目录为mysql配置的数据文件存放路径,这个还是建议挂载,是存储数据的,容器down掉,还能再次挂载数据。)
-e MYSQL_ROOT_PASSWORD=root 初始化 root 用户的密码
挂载数据库文件到container的目的是避免容器重启时数据丢失。
5.连接数据库 docker exec -it mysql /bin/bash
6.创建新用户
mysql> CREATE USER 'sa'@'%' IDENTIFIED BY 'DB_Admin123';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'sa'@'%' WITH GRANT OPTION;
遇到问题记录:
问题1:启动时docker:Error response from daemon:。。。server misbehaving.
解决:未在启动时增加版本5.6.22,默认取最新的,但是服务器离线,所以没反应。
问题2:run后返回容器标识,用docker ps -a查询全部容器,发现状态未EXITED(1)
解决:修改启动时run命令,当镜像名称后面加了其他内容时,会将其作为容器内的命令。
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
原错误命令:docker run -d mysql:5.6.22 --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root
正确命令:docker run --name mysql -p 3306:3306 -v /mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -itd mysql:5.6.22
-v 表示将原来容器中的MySQL数据挂载到外部虚拟机本地文件,使数据持久化
问题3:在用数据库工具初始化数据库时,总报错表不存在,原因是linux下mysql默认大小写敏感,而windows下库名表名默认是不区分大小写的。
解决方案:将容器内的数据库配置文件挂载到宿主机方便修改,具体操作如下(或者在run容器时就挂载好):
1.关闭docker服务:systemctl stop docker.service
2.sudo su切换到root身份,cd /var/lib/docker/containers/容器id/,进入对应容器目录
3.vi hostconfig.json,修改如下,将容器目录/etc/mysql绑定到主机/mysql/conf目录:
"Binds": ["/mysql/conf:/etc/mysql/conf.d"],
4.vi config.v2.json,修改如下,添加MountPoints:
"MountPoints": {
"/etc/mysql/conf.d": {
"Source": "/mysql/conf",
"Destination": "/etc/mysql/conf.d",
"RW": true,
"Name": "",
"Driver": "",
"Type": "bind",
"Propagation": "rprivate",
"Spec": {
"Type": "bind",
"Source": "/mysql/conf",
"Target": "/etc/mysql/conf.d"
},
"SkipMountpointCreation": false
}
}
5.启动docker:systemctl start docker.service
6.在宿主机/mysql/conf目录下建立文件mysql.cnf,添加(为0时大小写敏感):
[mysqld]
lower_case_table_names=1
7.启动容器:docker start mysql
问题4:mysql初始化时遇到incorrect string 'x9Dx9Dx9Dx9Dx9D'...
解决方法:数据库的编码格式不对,在宿主机mysql.cnf文件下加入编码设置:
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
lower_case_table_names=1
character-set-server = gbk
重启容器docker restart mysql
进入mysql后登录了查询编码show variables like 'character%';
结果如下则问题解决:
+-----------------------------+-------------------------+
| Variable_name | Value |
+-----------------------------+-------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | gbk |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | gbk |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets
总结:
a.镜像导出/导入命令:docker save / docker load
b.容器导出/导入命令:docker export / docker import
注意:
这两者的区别在于容 器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状 态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入 时可以重新指定标签等元数据信息。
三、部署JDK1.8.25和Tomcat7.0.92
JDK 这里直接搜索的含有JDK1.8.25的Ubuntu镜像,然后按上诉方式以容器运行即可
搜索方式:docker search jdk1.8.25
否则单独运行基础系统容器,再将JDK安装上去并配置环境。
设置java 环境变量
vi /etc/profile
在文件末尾加上
JAVA_HOME=/opt/jdk/
JAVA_BIN=/opt/jdk/bin
JRE_HOME=/opt/jdk/jre
CLASSPATH=/opt/jdk/jre/lib:/opt/jdk/lib:/opt/jdk/jre/lib/charsets.jar
export JAVA_HOME JAVA_BIN JRE_HOME PATH CLASSPATH
使得配置立马有效
source /etc/profile
vi ~/.bashrc在文件末尾加上
export JAVA_HOME=/opt/jdk
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
使得配置立马有效
source ~/.bashrc
参考https://www.jianshu.com/p/59e0a8828b3b
Tomcat 同理下载tar.gz文件后解压到基础系统容器。修改配置文件。
Web项目包tmaser也一并拷贝如/webapps目录下。
注意:在启动系统容器时要先挂载一个共享文件夹,方便移动文件.
docker run -itd -v /home/ghl/桌面/DeploymentEnv/mySoft:mySoft --name Ubuntu_JDK rsnair2/jdk1.8.0_25:latest
启动tomcat服务
方式一:直接启动 ./startup.sh
方式二:作为服务启动 nohup ./startup.sh &
方式三:控制台动态输出方式启动 ./catalina.sh run 动态地显示tomcat后台的控制台输出信息,Ctrl+C后退出并关闭服务
解释:
通过方式一、方式三启动的tomcat有个弊端,当客户端连接断开的时候,tomcat服务也会立即停止,通过方式二可以作为linux服务一直运行
通过方式一、方式二方式启动的tomcat,其日志会写到相应的日志文件中,而不能动态地查看tomcat控制台的输出信息与错误情况,通过方式三可以以控制台模式启动tomcat服务,
直接看到程序运行时后台的控制台输出信息,不必每次都要很麻烦的打开catalina.out日志文件进行查看,这样便于跟踪查阅后台输出信息。tomcat控制台信息包括log4j和System.out.println()等输出的信息。
2,关闭tomcat服务
./shutdown.sh
三、项目部署记录
1.安装Tmaster2000,到目录下运行:sh install.sh
2.安装完成后到Tools/DbLoader目录下进行数据库初始化,使用sh dbloader.sh运行数据库工具,连接数据库后进行初始化和更新。
3.
问题记录:
A.运行图形化界面时报错No X11 DISPLAY variable was set, but this program performed an operation which requires it.或者报错cannot connect to X window Server using ":0" as DISPLAY variables.原因是主要是linux的机制问题。 需要先确认是否接了显示器,有没有图形界面输出。然后正确指定输出位置才行。
解决方法:宿主机上需安装桌面系统(包含Xwindowserver)然后通过宿主机后容器共享套接字使容器内的GUI 程序显示到外界。参考博文https://www.csdn.net/article/2015-07-30/2825340
具体:由于X11服务默认只允许『来自本地的用户』启动的图形程序将图形显示在当前屏幕上。允许所有用户访问X11服务即可。这个事情可以用xhost命令完成。
$ sudo apt-get install x11-xserver-utils
$ xhost +
然后再使用如下命令启动容器
docker run -d \
-v /etc/localtime:/etc/localtime:ro \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-e DISPLAY=unix$DISPLAY \
-v $HOME/slides:/root/slides \
-e GDK_SCALE \
-e GDK_DPI_SCALE \
--name libreoffice \
其中的『-v /tmp/.X11-unix:/tmp/.X11-unix』参数就是将主机上X11的unix套接字共享到了容器里面。因为每个unix套接字实际上就是系统/tmp/.X11-unix目录下面依据套接字编号命名的一个特殊文件。
五/安装redis
1.下载安装包,tar.gz,解压命令tar -xzvf redis-X.X.XX.tar.gz
2.进入目录,cd /mysoft/redis-X.X.XX
3.安装redis,直接输入make
4.对redis.conf进行配置。vi redis.conf
配置项:
绑定连接redis的IP : bind 127.0.0.1 172.17.0.2
允许远程连接: protected-mode no
允许后台运行:daemonize yes
连接认证密码:requirepass 123456
4.指定配置文件启动Server,命令:src/redis-server redis.conf
5.启动客户端:src/redis-cli -h 172.17.0.2
认证密码:auth 123456,返回OK,启动成功
问题记录:
安装redis问题:
fatal error: sys/cdefs.h: No such file or directory
解决:安装libc-dev包,apt-get libc-dev
http://archive.ubuntu.com/ubuntu/pool/main/g/glibc/libc6-dev_2.23-0ubuntu11_amd64.deb
redis编译报致命错误:jemalloc/jemalloc.h:没有那个文件或目录
分配器allocator, 如果有MALLOC 这个 环境变量, 会有用这个环境变量的 去建立Redis。
而且libc 并不是默认的 分配器, 默认的是 jemalloc, 因为 jemalloc 被证明 有更少的 fragmentation problems 比libc。
但是如果你又没有jemalloc 而只有 libc 当然 make 出错。 所以加这么一个参数,运行如下命令:
make MALLOC=libc
参考链接:https://blog.csdn.net/honchou56/article/details/53994708