天天看點

SpringBoot與Docker:簡介,核心概念,安裝,使用

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主機(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:簡介,核心概念,安裝,使用

​​類似這樣​​

SpringBoot與Docker:簡介,核心概念,安裝,使用
鏡像的拉取:
docker pull 鏡像名:tag
  :tag是可選的,tag表示标簽,多為軟體的版本,預設是latest      
SpringBoot與Docker:簡介,核心概念,安裝,使用
檢視所有本地鏡像:      

容器操作

有了軟體鏡像後,然後運作鏡像,然後産生一個容器      
對應的操作有:
  搜尋鏡像: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:簡介,核心概念,安裝,使用
運作的代碼      
[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;      
一些其他的操作      
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)      
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