在docker中使用MySQL
alpine中没有bash,只有sh
进入容器内
docker exec -it 容器的ID bash
官方MySQL镜像的使用
https://hub.daocloud.io/repos/fa51c1d6-9dc2-49d9-91ac-4bbfc24a1bda
1.从私服下载镜像,私服地址为(docker-registry:5000/mysql:5.7.26)
docker pull docker-registry:5000/mysql:5.7.26
2.创建/root/docker/mysql目录并进入
3.创建三个文件:
config:存放配置文件----用于映射—>/etc/mysql/conf
data:存放数据内容-----用于映射---->/var/lib/mysql
initdb:存放初始化脚本–用于映射—>docker-entrypoint-initdb.d
4.上传spring-cloud-01上传到initdb中
5. 在 config 中创建 my.conf 并填入以下内容
设置MySQL的编码格式为utf-8
[client]
default-character-set=utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
[mysql]
default-character-set=utf8mb4
6.启动容器
docker run -d --net=host -p 3306:3306 -v /root/docker/mysql/config/my.conf:/etc/mysql/conf.d/my.conf -v /root/docker/mysql/data:/var/lib/mysql -v /root/docker/mysql/initdb:/docker-entrypoint-initdb.d -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_ROOT_HOST=% docker-registry:5000/mysql:5.7.26
后台执行:
网络链接方式:–net=host 容器的IP设置为宿主机的IP(CONTAINER_IP = DOCKER_HOST_IP)
一个端口映射:
3306:3306
三个目录映射:
/root/docker/mysql/config/my.conf:/etc/mysql/conf.d/my.conf
/root/docker/mysql/data:/var/lib/mysql
/root/docker/mysql/initdb:/docker-entrypoint-initdb.d
两个环境变量:
MYSQL_ROOT_PASSWORD=123456
-e MYSQL_ROOT_HOST=%
镜像名字
docker-registry:5000/mysql:5.7.26
7. 制作 eureka-server 和 auth 镜像并启动
docker run -d --net=host -p 8761:8761 eureka-server
docker run -d --net=host -p 8904:8904 auth
查看内存
free -m
依次启动所有服务,会发现每一个服务所占的内存都非常大,接下来我们删除所有镜像进行优化(mysql除外)
docker中的网络:
docker network ls查看所有网络配置
[root@master config]# docker network ls
NETWORK ID NAME DRIVER SCOPE
a8101a2dc549 bridge bridge local
be5432c37489 host host local
c651f87a1f84 none null local
bridge | 每个容器使用独立的网络,默认–link NAMES1:NAMES2 指定当前容器需要和 NAMES1 容器通信在当前容器内使用 NAMES2 代替 NAMES1 容器的 IP |
---|---|
host | 每个容器共享宿主机的网络 |
none | 无网络 |
构建使用宿主机 jdk 软件的镜像:
1. 在宿主机安装 jdk 软件
2. 制作 zhangfan/jdk 镜像
创建并进入cd zhangfan/jdk/
创建Dockerfile文件,并编辑文件如下:
#基于alpine-glibc进行二次开发
FROM docker-registry:5000/alpine-glibc
#维护者和联系方式
MAINTAINER ZhangFan 2868508839@ww.com
#使用root用户执行命令
USER root
#设置需要映射到宿主机的目录
VOLUME ["usr/local/jdk"]
#配置JAVA_HOME环境变量
ENV JAVA_HOME=/usr/local/jdk
#配置PATH环境变量
ENV PATH $PATH:$JAVA_HOME/bin
#在容器启动时输出jdk版本号
ENTRYPOINT java -version
3. 使用 zhangfan/jdk 生成新的镜像名字叫做 docker-registry:5000/zhangfan/jdk
docker tag zhangfan/jdk docker-registry:5000/zhangfan/jdk
4. 推送镜像到仓库
docker push docker-registry:5000/zhangfan/jdk
5. 查看仓库镜像列表,验证是否推送成功
使用 maven 插件打包镜像:
- 开启 docker 的远程访问
1.1 编辑配置文件:
vi /usr/lib/systemd/system/docker.service
将 ExecStart 这一行后面加上-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
如:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
1.2. 刷新配置文件,重启 docker
systemctl daemon-reload
systemctl restart docker
1.3使用宿主机 IP 验证是否配置成功 (宿主机IP访问网址)
http://DOCKER_HOST_IP:2375/info
-
为 windows 添加系统环境变量
key: DOCKER_HOST
value: tcp://DOCKER_HOST_IP:2375
-
重启 idea 使用新的环境变量
因为每个项目都要打包,所在要在项目最外层的 POM 文件进行配置
-
在最外层 POM中的properties 标签中添加打包后镜像的仓库
<!--打包到服务器后,仓库名的前缀-->
<docker.image.prefix>teacher/spring-cloud-01</docker.image.prefix>
- 在最外层 plugins 标签中添加 docker 打包插件
<!--添加打包插件(打包到服务器)-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.13</version>
<executions>
<execution>
<id>default</id>
<goals>
<goal>build</goal>
<goal>push</goal>
</goals>
</execution>
</executions>
<configuration>
<!--自己设置的前缀/项目名-->
<repository>${docker.image.prefix}/${project.artifactId}</repository>
<!--默认版本号-->
<tag>${project.version}</tag>
<buildArgs>
<JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
-
reimoprt 下载插件
-
在每一个子项目根目录下创建 Dockerfile 文件
FROM docker-registry:5000/zhangfan/jdk
MAINTAINER ZhangFan 2868508839@ww.com
USER root
EXPOSE 8904
ADD ./target/auth-1.0-SNAPSHOT.jar /root
ENTRYPOINT java -jar /root/auth-1.0-SNAPSHOT.jar
- 使用 package 打包镜像
映射到镜像
运行镜像
docker run -d --net=host -v /usr/local/jdk:/usr/local/jdk teacher/spring-cloud-01/eureka-server:1.0-SNAPSHOT