Docker容器部署项目记录

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
部署 Laravel 使用 Docker,您可以按照以下步骤进行操作: 1. 首先确保您的系统已经安装了 Docker,可以参考中提供的官方安装文档进行安装。 2. 然后,需要创建一个 `docker-compose.yml` 文件来定义您的 Docker 环境。在该文件中,您需要包含 Laravel 应用程序所需的各个服务,比如 Nginx、PHP 和数据库等。您可以参考和提供的引用内容中的命令来构建和启动这些服务。 3. 在 `docker-compose.yml` 文件中,您需要指定一个工作目录,将 Laravel 项目复制到容器中运行。这通常可以通过在 Dockerfile 中使用 `COPY` 命令来实现。确保将 Laravel 项目放置在正确的目录下,并在 Dockerfile 中进行相应的设置。 4. 在 Dockerfile 中,您还需要安装 Laravel 应用程序所需的依赖项和扩展。这可以通过在 Dockerfile 中使用适当的包管理器(如 apt、yum 或 composer)来实现。 5. 另外,您还可以使用 Docker 网络和卷来与其他容器进行通信和数据共享。这将有助于将 Laravel 与其他服务(如数据库)进行集成。 6. 最后,您可以使用 `docker-compose up` 命令来启动整个 Docker 环境,并确保 Laravel 应用程序能够正常运行。 综上所述,通过使用 Docker 和适当的配置,您可以轻松地部署 Laravel 应用程序。请按照上述步骤进行操作,并根据您的实际需求进行相应的调整。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [docker部署laravel](https://blog.csdn.net/flamevip/article/details/130018594)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [Laravel项目线上服务器docker部署实战全过程记录指导(转 2021-04-02)](https://blog.csdn.net/ccpit2b2c/article/details/115393605)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值