Ubuntu↑Docker | Docker ↑MySQL 笔记

Ubuntu ↑ Docker

1 Ubuntu 初始配置

sudo su
 ufw allow ssh
 ufw allow 22
 apt update 
 apt install openssh-server -y #安装ssh  # -y 确认安装
 apt install vim -y #安装Vim

# 首先备份源列表
 cp /etc/apt/sources.list /etc/apt/sources.list_backup
# 打开sources.list文件
 vim /etc/apt/sources.list

阿里云源(18TLS)

#  阿里源
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse

刷新列表

sudo su
 apt-get update
 apt-get upgrade
 apt-get install build-essential

2 Ubuntu 安装 Docker

ubuntu server 安装 docker

sudo su
apt install docker.io -y
systemctl start docker 	#启动
systemctl enable docker	 #开机启动

3 Dockerfile 部署 SpringBoot

把 打包好的 jar文件(maven --> install), 放入以下文件中. (idea 右键jar–>Deployment–>上传) (Tools–>Deployment–>Configuration中配置 Deployment)

cd /home/springboot

mv -f /root/target/miaosha.jar /home/springboot/e

vim Dockerfile #如下 ↓ , 只需要修改 作者 和 SNAPSHOT.jar 部分. springboot由docker下载, 极速部署

# 基础镜像
FROM java:8

# 作者信息
MAINTAINER ngp1848e

# 将当前目录下的jar包复制到容器里(crm-0.0.1-SNAPSHOT.jar修改为你的jar包名字)
COPY crm-0.0.1-SNAPSHOT.jar  /springboot.jar

# 提示当前项目在容器运行的端口
CMD ["========server.port = 8080=========="]

# 暴露运行的端口
EXPOSE 8080

# 执行jar包
ENTRYPOINT ["java","-jar","/springboot.jar"]

docker build -t springboot . #Dockerfile 生成镜像

  • –tag, -t,镜像的名字及tag,通常name:tag或者name格式;可以在一次构建中为一个镜像设置多个tag

docker run -d -p 8090:8090 --name miaosha springboot

#端口号最好与程序内设置的端口一致, 内部写死了部分 链接, 很可能 跨域, 以后可能不是个问题. (以后进一步学习, 应该能够动态配置, 目前先这样)

Centos ↑ Docker

Centos 安装 Docker(可选)

yum install docker -y

附: docker 直接安装 MySQL(有数据卷的话, 重启没丢过数据, 生产环境目前不推荐此种简便方式)

如果 vmware中的ubuntu重启会丢失 docker所有镜像和容器, 是因为 ubuntu为live版server.iso 应换成普通server.iso

docker pull mysql:5.7

★ docker compose 启动 mysql容器

–> 替代 --> 修改docker中的MySQL的my.cnf

version: '3'
services:
  mysql:
    container_name: mysql57_main
    image: mysql:5.7
    restart: always
    ports:
      - 3306:3306
    command:
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1  
      --max_allowed_packet=1024M
      --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:
      - $PWD/mysql57/data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: "123456"
#版本5.7 挂载my.cnf配置文件, 就不能启动, 莫名... 算了先用着
version: '3'
 
services:
  mysql8.0:
    # 镜像名
    image: mysql:8.0.21
    # 容器名(以后的控制都通过这个)
    container_name: mysql8.0_main
    # 重启策略
    restart: always
    environment:
      # 时区上海
      TZ: Asia/Shanghai
      # root 密码
      MYSQL_ROOT_PASSWORD: 123456
      # 初始化数据库(后续的初始化sql会在这个库执行)
      MYSQL_DATABASE: nacos_config
      # 初始化用户(不能是root 会报错, 后续需要给新用户赋予权限)
      MYSQL_USER: nacos
      # 用户密码
      MYSQL_PASSWORD: nacos
      # 映射端口
    ports:
      - 3306:3306
    volumes:
      # 数据挂载
      - /root/mysql/data/:/var/lib/mysql/
      # 配置挂载
      - /root/mysql/conf/:/etc/mysql/conf.d/
      # 初始化目录挂载
      - /root/mysql/init/:/docker-entrypoint-initdb.d/
    command:
      # 将mysql8.0默认密码策略 修改为 原先 策略 (mysql8.0对其默认策略做了更改 会导致密码无法匹配)
      --default-authentication-plugin=mysql_native_password
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
# 版本8.0

然后同目录下 docker-compose up -d

其配置简单, 替代频繁写入my.cnf

上传至服务器, 准备好镜像的情况下, 在 docker-compose.yml 同目录下, 命令: docker-compose up (即可启动, 自定义配置的mysql)

多个services则是 docker-compose all

命令行启动 mysql容器

# 推荐用 docker-compose.yml 启动容器, 因为手写or复制很容易出错, 且不便于改动/备份版本
# docker run --name mysql5.7  \
# $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql 
# -v /mysql/conf:/etc/mysql/conf.d -v /mysql/logs:/logs -v /mysql/data:/var/lib/mysql  \
# -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7  # 目前来说这个稳妥

推荐docker-compose 方式

-id–>交互式容器,

–name–>容器名字,

-p host_port:container_port -->[宿主机端口] 映射到 [容器端口],

-e–>指定参数

-v : 指定数据卷,意思就是将mysql容器中的/var/lib/mysql(这个是数据库所有数据信息文件)映射到宿主机/data/mysql里面

附: 解决跨域

Chrome 查看 Application/Cookies(即Session?)时, JSESSIONID 服务器端 不存在, 而本地存在, 判断是跨域问题.

  • 但之前视频里用 前后端所有交互的页面 Credentials 设置一遍解决了呀.

  • 后来, 想用redis替代session失败, 需要一段时间学习, 待补充知识点

  • 后来, 仔细看 Network中的 list请求 爆红, 仔细看 url 不对, ip好像在前段部分写死了, 端口 因为我docker里映射了一道所以也不一样, 之前偶尔能跑偶尔不能, 是请求的本地而不是服务器, 所以我调试的时候就能跑.

  • 总结: 计算机网络 知识不熟练, 急待补充.

附: linux debug工具

yum install telnet

telnet localhost 8090 #可以测试端口通不通

pring localhost #ping可以测试ip

★★★ 常用 Docker 命令

命令 功能
docker logs [container id] 查看某个容器的日志
docker search mysql:5.7 搜索 mysql:5.7 可以 pull 的版本
docker pull mysql:5.7 下载 msyql:5.7 镜像
docker run mysql:5.7 -p 3306:3306 -d 启动 msyql:5.7 镜像 , -p映射宿主机3306端口到 mysql容器3306端口, -d 后台执行 (另外还有很多 参数, 可自行查阅) 配置复杂最好写成 docker-compose.yml 例如
docker ps 显示所有运行容器
docker ps -a 显示所有容器 (包括已暂停的)
docker stop <container name/id> 停止容器
docker rm <container name/id> 删除容器, 必须先 stop
docker kill <container name/id> 删除容器, 不必先 stop
docker rm -f <container name/id> 删除容器, 不必先 stop
docker stop $( docker ps -aq) 关闭对应 docker 容器
docker-compose up 启动对应 docker 容器 条件:当前目录存在docker-compose.yml文件
docker-compose down 关闭对应 docker 容器 并删除对应容器条件:当前目录存在docker-compose.yml文件
docker-compose start start对应stop的 docker 容器
docker-compose stop stop对应 docker 容器
docker exec -it <container name/id> /bin/bash 进入容器-t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, -i 则让容器的标准输入保持打开。docker attach 命令 进入, 如果输入exit会导致容器停止
docker images 显示所有镜像
docker commit ubuntu docker_ubuntu 打包镜像
docker save -o target_tar_name.tar docker_images_name 宿主机 sftp ftp 下载到本地时, 如果permission deny , chmod -R 777 $PWD/… 即可
docker import target_tar_name.tar docker_images_name
docker cp /home/ngp/mysql…tar.gz docker_container_name:/ 复制宿主机文件到 docker
docker rmi -f docker_images_name 删除镜像

Docker 教程推荐

Docker 常见概念解读,可以看这篇 Github 上开源的这篇《Docker 基本概念解读》 ,从零到上手实战可以看《Docker 从入门到上手干事》这篇文章,内容非常详细!

另外,再给大家推荐一本质量非常高的开源书籍《Docker 从入门到实践》 ,这本书的内容非常新,毕竟书籍的内容是开源的,可以随时改进。

遇到的问题

1 oci runtime error: container_linux.go:235: starting container process caused “container init exited prematurely”

docker-compose.yml 的 volumes 中, 有 路径找不到

上一篇:Compose概述


下一篇:常用 Maven 插件总结