部署单体项目:

1.先把项目打包成war包并上传到服务器

2.创建Dockerfile文件

cd /usr/local/docker
mkdir tomcat
cd /usr/local/docker/tomcat
mkdir wang
cd /usr/local/docker/tomcat/wang
cd 到项目war包所在位置
mv 项目war名字 /usr/local/docker/tomcat/wang/test.war
cd /usr/local/docker/tomcat/wang
vi Dockerfile

3.编辑Dockerfile文件

FROM tomcat   # 此项目基于tomcat
MAINTAINET wang   # 编辑者
ADD test.war /usr/local/tomcat/webapps/test.war  # 在当前目录找test.war 添加到/usr/local/tomcat/webapps/下,并命名为test.war

4.构建镜像

docker build -t wang/tomcat .

5.启动容器

docker run --name tomcat -p 8080:8080 wang/tomcat

6.打开浏览器访问测试

ip:8080/test

数据卷简介:

数据卷是一个可以供一个或多个容器使用的特殊目录。 
可以达到以下目的: 
1. 绕过“拷贝写”系统,以达到本地磁盘IO的性能,(比如运行一个容器,在容器中对数据卷修改内容,会直接改变宿主机上的数据卷中的内容,所以是本地磁盘IO的性能,而不是先在容器中写一份,最后还要将容器中的修改的内容拷贝出来进行同步。) 
2. 绕过“拷贝写”系统,有些文件不需要在docker commit打包进镜像文件。 
3. 在多个容器间共享目录 
4. 在宿主和容器间共享目录 
5. 在宿主和容器间共享一个文件。

创建数据卷:

方法一:dockerfile中指定VOLUME后的目录,如 VOLUME /var/lib/test

方法二:docker run命令中加-v选项。如 :

docker run -d -P -v /webapp training/webapp python app.py

注意:这里定义的 /webapp 数据卷,但是不知道宿主机上与之对应的在哪里。我们需要仔细的观察docker inspect docker ps -q的结果,是非常长的一段东西。在这里我只摘出我们需要的部分

例子:

创建目录  mkdir -p /usr/local/docker/tomcat/share/webapps/ROOT
cd /usr/local/docker/tomcat/share/webapps/ROOT
vi index.html     hello share tomcat
cd /usr/local/docker/tomcat/share/webapps/
进入到该目录运行tomcat
docker run --name tomcat -d -p 8080:8080 -v $PWD:/usr/local/tomcat/webapps/ tomcat
$PWD 意思是基于当前目录
$PWD:/usr/local/tomcat/webapps/  把容器的目录映射到/usr/local/docker/tomcat/share/webapps/下
访问 ip:8080  即可看到效果  "hello share tomcat"
在启动一个tomcat
docker run --name tomcat2 -d -p 8081:8080 -v $PWD:/usr/local/tomcat/webapps/ tomcat
再次访问 ip:8081 可看到两次访问结果一样
这样就可以直接操作宿主机器的文件而不需要操作容器文件了,且达到了文件共享的目的
并且不管是删除容器还是停止容器,/usr/local/docker/tomcat/share/webapps/ROOT/index.html
文件都不会被删除,保证了数据的持久化

备份数据卷:

启动mysql测试

docker run -p 3306:3306 --name mysql \
 -v /usr/local/docker/mysql/conf:/etc/mysql/conf.d \
 -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
因为启动的时候是用的 
-v /usr/local/docker/mysql/conf:/etc/mysql/conf.d \
 -v /usr/local/docker/mysql/logs:/var/log/mysql \
 -v /usr/local/docker/mysql/data:/var/lib/mysql \ 即数据卷的形式,所以宿主机和容器共享了数据所以/usr/local/docker/mysql 这个目录就是mysql数据库的数据,备份数据卷只需要把这个目录下的东西给打包就可
如:
tar -zxvf backup_2018106.tar.gz .
即可做到备份的作用

还原数据卷:

重新克隆一台服务器,并把之前备份的数据放到一台安全的机器上,进入到新的服务器
创建mysql文件夹   mkdir -p /usr/local/docker/mysql
下拉mysql镜像  docker pull mysql
并把之前的数据压缩包移动到 /usr/local/docker/mysql目录下
如:
mv /home/backup_2018106.tar.gz /usr/local/docker/mysql/backup_2018106.tar.gz
然后解压缩 tar -zxvf backup_2018106.tar.gz
删除备份 rm -rf backup_2018106.tar.gz

重新启动mysql
docker run -p 3306:3306 --name mysql \
 -v /usr/local/docker/mysql/conf:/etc/mysql/conf.d \
 -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
 启动完毕,可以用远程工具连接测试

下载安装docker-compose

简介:

允许用户通过一个单独docker-comose.yml模版文件来定义一组相关联的应用容器为一个项目compose重要概念:服务:一个应用容器,实际可包括若干运行相同镜像的容器实例。项目:由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml文件中定义一个项目可以由多个服务(容器)关联而成,compose面向项目进行管理运行compose项目:docker-compose up
意思就是可以通过 docker-compose来启动docker镜像并减少每次启动所需要输入的大量参数

可以直接下载:

sudo curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

也可以进入https://github.com/docker/compose/releases/ 下载 选择是Latest release的不要用Pre-release

选择自己的操作系统进行选择,我这里用的是 docker-compose-Linux-x86_64 版本是1.22.0

把文件上传到服务器,如果用xftp上传没有权限可以创建一个目录并分配权限

chmod 777 文件名 即可上传成功

上传完毕后 mv docker-compose-Linux-86_64 docker-compose

并把此文件放到环境变量下,通过 cat /etc/environment 查看

root@ubuntu:/home/downloads# cat /etc/environment 
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"

root@ubuntu:/home/downloads# mv docker-compose /usr/bin

查看是否移动成功

root@ubuntu:/home/downloads# ls /usr/bin |grep docker-compose
docker-compose

此时的docker-compose没有可执行的权限所以我们需要修改他的用户组包括权限

root@ubuntu:/usr/bin# chown -R root:root docker-compose 
root@ubuntu:/usr/bin# chmod +x docker-compose 

查看所属用户组合权限

root@ubuntu:/usr/bin# ll |grep docker-compose
-rwxrwxr-x  1 root   root    11750136 Oct  6 11:28 docker-compose*

输入查看版本测试是否成功

root@ubuntu:/usr/bin# docker-compose version
docker-compose version 1.22.0, build f46880fe
docker-py version: 3.4.1
CPython version: 3.6.6
OpenSSL version: OpenSSL 1.1.0f  25 May 2017

测试第一个docker-compose文件

cd /usr/local/docker/tomcat
rm -rf /usr/local/docker/tomcat/
vi docker-compose.yml

创建一个docker-compose.yml配置文件(每一级用两个空格,不能直接用tab键)

version: '3'   # 对应版本
services:      # 设置服务
  tomcat:      # 服务名字可以任意起 
    restart: always   # 总是开机自启
    image: tomcat     # 使用的镜像
    container_name: tomcat  # 容器名称
    ports:     # 端口
      - 8080:8080

启动 docker-compose up 这种启动是占用主线程的启动。停止使用ctrl+c停止

并使用 docker-compose down删除使用过的镜像记录

打开浏览器访问测试 ip:8080

docker compose常用命令:

前台运行 : docker-compose up

后台运行 : docker-compose up -d

启动 : docker-compose start

停止 : docker-compose stop

停止并移除容器列表 : docker-compose down

tomcat的使用:

创建一个docker-compose.yml配置文件

version: '3'   # 对应版本
services:      # 设置服务
  tomcat:      # 服务名字可以任意起 
    restart: always   # 总是开机自启
    image: tomcat     # 使用的镜像
    container_name: tomcat  # 容器名称
    ports:     # 端口
      - 8080:8080
    volumes:    # 数据卷
      - /usr/local/docker/tomcat/webapps/:/usr/local/tomcat/webapps/
    environment:            # 环境变量
      TZ: Asia/Shanghai
      
mkdir -p /usr/local/docker/tomcat/webapps/ROOT
vi /usr/local/docker/tomcat/webapps/ROOT/index.html   hello docker compose

启动测试 docker-compose up -d 打开浏览器访问: ip:8080查看效果

测试mysql:

version: '3'   
services:      
  mysql:       
    restart: always  
    image: mysql    
    container_name: mysql 
    ports:     
      - 3306:3306
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123123
    command:   # 命令配置编码
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1   # 忽略数据库表大小写
      --max_allowed_packet=128M
      --sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
    volumes:    
      - mysql-date:/var/lib/mysql
volumes:
  mysql-date:
10-07 13:59