Docker简介

Docker是一个开源的应用容器引擎;是一个轻量级容器技术;
下面举个例子来说明它的用处:
比如A需要使用电脑,在原生电脑里面从Windows官网里面下载了windows原生系统
然后在电脑里面安装,他还需要安装电脑的驱动,还有需要常用的软件,比如桌面软件
还需要安装一些其他的个人使用的个性化软件之类的,安装好之后A就可以使用了
然后B又想使用电脑,需要重复A的步骤安装东西
现在就有Windows镜像系统,这个镜像系统就是A将它安装好的所有东西整套进行
打包,将它打包成一个镜像文件系统,然后如果其他人想安装Windows系统,
就直接拿这个Windows镜像系统来进行安装就行,A配置好的东西都会有

Docker就是类似上面的镜像系统
比如我们需要在Linux上面安装配置MySQL,如果没有Docker,
就需要从官网上下载这个安装程序,安装好后还需要配置
如果想在另外一台电脑安装配置MySQL,也需要上面的步骤
如果使用Docker就不一样了,在一台电脑安装了MySQL,将它打包
成MySQL-Docker镜像,如果另外一台电脑想安装MySQL,
只需要它安装了Docker然后运行MySQL-Docker镜像,就会产生MySQL容器
如果需要Redis或者Tomcat,都只需要运行镜像文件就产生对应的容器
而且容器之间是完全使用沙箱机制,相互之间不会有任何接口,
更重要的是容器性能开销极低。

Docker是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。
支持将软件编译成一个镜像;然后在镜像中各种软件做好配置,
将镜像发布出去,其他使用者可以直接使用这个镜像;
运行中的这个镜像称为容器,容器启动是非常快速的。

SpringBoot与Docker:简介,核心概念,安装,使用_docker

Docker核心概念

docker主机(Host):安装了Docker程序的机器(Docker直接安装在操作系统之上);
docker客户端(Client):连接docker主机进行操作;
docker仓库(Registry):用来保存各种打包好的软件镜像;
docker镜像(Images):软件打包好的镜像;放在docker仓库中;
docker容器(Container):镜像启动后的实例称为一个容器;容器是独立运行的一个或一组应用

使用Docker的步骤:
1)、安装Docker
2)、去Docker仓库找到这个软件对应的镜像;
3)、使用Docker运行这个镜像,这个镜像就会生成一个Docker容器;
4)、对容器的启动停止就是对软件的启动停止;

安装docker

如果需要使用Linux虚拟机,使用VirtualBox
使用客户端连接Linux
使用ip addr查看Linux的ip地址然后进行连接
安装之前先检查
1.使用uname ‐r 检查,查看centos版本,Docker 要求 CentOS 系统的内核版本高于 3.10
2.如果版本不够,就使用yum update进行升级软件包及内核
3.安装docker,使用yum install docker
4.安装完成后启动docker,使用systemctl start docker
还可以使用docker -v来查看docker的版本,查看是否启动成功
5.开机启动docker,使用systemctl enable docker
6.停止docker,使用systemctl stop docker

我出现这样的错误

使用docker

镜像操作

就是想要安装打包的软件
检索命令:docker search 关键字 eg:docker search mysql
这就是我们经常去docker hub上检索镜像的详细信息

SpringBoot与Docker:简介,核心概念,安装,使用_docker_02


​类似这样​

SpringBoot与Docker:简介,核心概念,安装,使用_docker_03

镜像的拉取:
docker pull 镜像名:tag
:tag是可选的,tag表示标签,多为软件的版本,默认是latest

SpringBoot与Docker:简介,核心概念,安装,使用_5e_04

查看所有本地镜像:

容器操作

有了软件镜像后,然后运行镜像,然后产生一个容器
对应的操作有:
搜索镜像:docker search tomcat
拉取镜像:docker pull tomcat
根据镜像启动容器:docker run ‐‐name mytomcat ‐d tomcat:latest
--name是运行的容器的名称,-d是后台运行,后面的镜像的名称和版本号或者id
查看运行中的容器:docker ps
停止运行中的容器:docker stop 容器的id
查看所有的容器:docker ps ‐a
启动容器:docker start 容器id
删除一个容器:docker rm 容器id
启动一个做了端口映射的容器:docker run ‐d ‐p 8888:8080 tomcat
‐d:后台运行
‐p: 将主机的端口映射到容器的一个端口 主机端口:容器内部的端口
查看容器的日志:docker logs container‐name/container‐id

上面的做端口映射的容器需要关闭防火墙或者设置好防火墙
service firewalld status ;查看防火墙状态
service firewalld stop:关闭防火墙

其他的操作参考​​官网文档​

MySQL安装示例

首先拉取MySQL镜像:docker pull mysql
然后想像之前那样启动
docker run ‐‐name mysql01 ‐d mysql
发现这样启动不了,容器无法启动,具体报错如下
报错无法运行的代码
想启动mysql
[root@MiWiFi-R4AC-srv ~]# docker run --name mysql01 -d mysql
98cba5e091e5cc7caea0f7b67676bf55ff98a390a351ab476613524b261fa624
查看容器状态,发现mysql退出了
[root@MiWiFi-R4AC-srv ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
98cba5e091e5 mysql "docker-entrypoint..." 55 seconds ago Exited (1) 54 seconds ago mysql01
然后查看MySQL的输出日志
说这三个参数必须指定一个
[root@MiWiFi-R4AC-srv ~]# docker logs 98cba5e091e5
2021-02-13 14:45:32+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started.
2021-02-13 14:45:32+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2021-02-13 14:45:32+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started.
2021-02-13 14:45:32+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD
[root@MiWiFi-R4AC-srv ~]#
然后参考了官网的说法
https://hub.docker.com/_/mysql

SpringBoot与Docker:简介,核心概念,安装,使用_mysql_05

运行的代码
[root@MiWiFi-R4AC-srv ~]# docker run --name mysql02 -e MYSQL_ROOT_PASSWORD=123 -d mysql
d84a81a8d0dfd883daf1175049c16410442ee6254f1d0a9cdb22966140cb7190
[root@MiWiFi-R4AC-srv ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d84a81a8d0df mysql "docker-entrypoint..." 12 seconds ago Up 11 seconds 3306/tcp, 33060/tcp mysql02
98cba5e091e5 mysql "docker-entrypoint..." 11 minutes ago Exited (1) 11 minutes ago mysql01
[root@MiWiFi-R4AC-srv ~]#
但是上面的运行方法没有讲端口暴露出来,所以在外面是无法访问的
下面将端口进行映射
做端口映射的代码
[root@MiWiFi-R4AC-srv ~]# docker run -p 3307:3306 --name mysql03 -e MYSQL_ROOT_PASSWORD=123 -d mysql
7cf6c4b1b5c1754b5ed6fb13cd18535ea53b721da61ef234e121916c2a3dea66
[root@MiWiFi-R4AC-srv ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7cf6c4b1b5c1 mysql "docker-entrypoint..." 5 seconds ago Up 5 seconds 33060/tcp, 0.0.0.0:3307->3306/tcp mysql03
d84a81a8d0df mysql "docker-entrypoint..." 2 minutes ago Up 2 minutes 3306/tcp, 33060/tcp mysql02
98cba5e091e5 mysql "docker-entrypoint..." 14 minutes ago Exited (1) 14
我出现了一小点错误
1251-Client does not support authentication protocol
requested by server;consider upgrading MySQL client
这个就是客户端不支持服务端的原因,
要么升级客户端,要么将容器镜像不要下载latest
网上说原因是:
mysql8 之前的版本中加密规则是mysql_native_password,
而在mysql8之后,加密规则是caching_sha2_password,
要么:
升级navicat驱动;
要么
把mysql用户登录密码加密规则还原成mysql_native_password.
先进入mysql容器
docker exec -it mysql01 bash
进入mysql
mysql -u root -p
更改加密方式
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;
更改密码
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123';
刷新权限
mysql> FLUSH PRIVILEGES;
一些其他的操作

SpringBoot与Docker:简介,核心概念,安装,使用_mysql_06

docker run ‐‐name mysql1 ‐v /conf/mysql:/etc/mysql/conf.d 
‐e MYSQL_ROOT_PASSWORD=my‐secret‐pw
‐d mysql:tag
把主机的/conf/mysql文件夹挂载到 mysqldocker容器的/etc/mysql/conf.d文件夹里面
改mysql的配置文件就只需要把mysql配置文件放在自定义的文件夹下(/conf/mysql)

SpringBoot与Docker:简介,核心概念,安装,使用_docker_07

docker run ‐‐name some‐mysql ‐e MYSQL_ROOT_PASSWORD=my‐secret‐pw ‐d mysql:tag 
‐‐character‐set‐server=utf8mb4
‐‐collation‐server=utf8mb4_unicode_ci
指定mysql的一些配置参数,现在是无配置文件的启动,将编码设置成utf-8