Java架構師必備技能:docker使用大全

福隆苑居士發表於2022-02-18

前言

  java工程師成長為架構師是一個艱難且耗費心力的過程,不僅僅需要熟悉java體系內相關的技術,同時要掌握許多運維相關的操作技能,隨著k8s逐漸成為微服務持續整合開發難以越過的基礎設施之後,docker就成為跨進門檻必備的技能之一。


  雖然前兩年kubernetes宣佈v1.20開始棄用docker直到v1.23徹底排除,但這不意味著我們就要放棄學習docker,相反,國內諸多企業尤其是中小企業和事業單位存在大量用docker部署的既有專案,一些非網際網路公司更是對升級版本十分審慎,大部分甚至還停留在v1.18之前,就比如居士的公司,雖然是網際網路行業,但依然使用v1.15。


  所以,學習docker依然是未來幾年軟體工程師躲不開的一環,成為架構師必備的核心技能之一併非掌握技術,而是強大的適應能力和學習動力。


安裝

1、檢查核心

檢視核心:uname -r
如果不是3.10以上,升級核心版本:yum update


2、解除安裝舊版本

1)、列出你安裝過的包
$ yum list installed | grep docker
docker-engine.x86_64
1.7.1-1.el7 @/docker-engine-1.7.1-1.el7.x86_64.rpm

2)、刪除安裝包,remove後面就是上個命令查出來的。
$ sudo yum -y remove docker-engine.x86_64

3)、刪除映象/容器等
$ rm -rf /var/lib/docker


3、安裝需要的軟體包

$ yum install -y yum-utils \

  device-mapper-persistent-data \

  lvm2


4、設定yum源

$ yum-config-manager \
      --add-repo \
      http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

PS:果這個yum源已經不存在了,可以百度一下重新找一個,這樣做的目的是為了yum安裝時速度更快。

阿里雲yum源: http://down.wbvip.cn/huanjing/yum/Centos-7.repo
163yum源: http://down.wbvip.cn/huanjing/yum/CentOS7-Base-163.repo


5、安裝最新版本

$ yum install -y docker-ce


6、安裝指定版本

查詢版本列表,會列出當前存在的版本。
$ yum list docker-ce --showduplicates | sort -r

指定版本安裝
$ yum install -y 上面查出來的版本
如:yum install -y docker-ce-19.03.2


7、檢查版本

docker -v


8、啟動docker

systemctl start docker


9、開機啟動docker

systemctl enable docker


10、停止docker

systemctl stop docker


11、映象加速

vim /etc/docker/daemon.json 
{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}

國內幾個較快的加速源:
Docker 官方中國區: https://registry.docker-cn.com
網易: http://hub-mirror.c.163.com
中科大: https://docker.mirrors.ustc.edu.cn
阿里雲:https://ou9izn87.mirror.aliyuncs.com
(PS:自己阿里雲控制檯上獲取到的,每個人不一樣,推薦使用阿里雲的,更快。)


常用命令

1、更新軟體包
 yum -y update
2、 安裝Docker虛擬機器
 yum install -y docker
3、執行、重啟、關閉Docker虛擬機器
 service docker start
 service docker start
 service docker stop
4、搜尋映象
 docker search 映象名稱
5、下載映象
 docker pull 映象名稱
6、檢視映象
 docker images
7、刪除映象
 docker rmi 映象名稱
8、執行容器
 docker run 啟動引數  映象名稱
9、檢視容器列表
 docker ps -a
10、停止、掛起、恢復容器
 docker stop 容器ID
 docker pause 容器ID
 docker unpase 容器ID
11、 檢視容器資訊
 docker inspect 容器ID
12、刪除容器
 docker rm 容器ID
13、檢視容器日誌
 docker logs 容器名稱或容器ID
14、資料卷管理
 docker volume create 資料卷名稱  #建立資料卷
 docker volume rm 資料卷名稱  #刪除資料卷
 docker volume inspect 資料卷名稱  #檢視資料卷
15、網路管理
 docker network ls 檢視網路資訊
 docker network create --subnet=網段 網路名稱
 docker network rm 網路名稱
16、避免VM虛擬機器掛起恢復之後,Docker虛擬機器斷網
 1)、vi /etc/sysctl.conf
 在檔案中新增 net.ipv4.ip_forward=1 這個配置

 2)、重啟網路服務
 systemctl  restart network

實戰案例

1、docker啟動MySQL
1)、搜尋MySQL
 docker search mysql
2)、拉取MySQL
 # 建議不要拉取最新版,而是加上版本號如:docker pull mysql:5.7
 docker pull mysql
3)、啟動MySQL

參考官網

image.png

 docker run --name mysql01 -e MYSQL_ROOT_PASSWORD=123456 -d mysql

發現啟動成功了,但是通過客戶端還是連線不到MySQL,這是因為沒有做埠對映。

 # 停止MySQL
 docker stop 容器id

 # 埠對映
 docker run --name mysql01 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
3)、可能的錯誤

如果報類似“authentication plugin 'caching_sha2_password'”這樣的錯誤,這是因為通過docker pull mysql預設下載的是最新版8.0(所以前面說最好自己加版本號),已經改變了以前的密碼認證方式,用的caching_sha2_password,可以use msql; 然後查select * from user表去看。

image.png

解決方法:
首先,進入docker容器MySQL:docker exec -it mysql bash
然後,登入MySQL:mysql -u root -p
接著,執行下面的命令:
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
然後再連線發現就可以了!

image.png

4)、高階用法

a)、使用自定義的配置檔案、資料目錄、日誌目錄
docker run ‐‐name mysql03 ‐v /conf/mysql:/etc/mysql/conf.d -v /conf/mysql/datadir:/var/lib/mysql MYSQL_ROOT_PASSWORD=123456 ‐d mysql:tag
含義:
i、把主機的/conf/mysql資料夾下的配置檔案掛載到 mysqldocker容器的/etc/mysql/conf.d資料夾裡面
改mysql的配置檔案就只需要把mysql配置檔案放在自定義的資料夾下(/conf/mysql)
ii、把主機的/conf/mysql/datadir資料目錄掛載到docker容器的/var/lib/mysql下

b)、指定mysql的一些配置引數
docker run ‐‐name some‐mysql ‐e MYSQL_ROOT_PASSWORD=123456 ‐d mysql:tag ‐‐character‐set‐server=utf8mb4 ‐‐collation‐server=utf8mb4_unicode_ci
含義:指定mysql的編碼為utf8m64


2、docker啟動Redis
1)、搜尋
 docker search redis
2)、拉取
 docker pull redis
 # 帶版本
 docker pull redis:4.0
3)、檢視容器
 docker images
4)、啟動一個容器
 docker run --name redis -p 6379:6379 --restart=always -d redis

 ############ 說明
 --name 命名
 -p 對映埠
 --restart 重啟後狀態,always表示重啟後自動啟動容器
 -d 後臺執行
 redis 容器原名稱
5)、啟動容器,載入配置檔案並持久化資料
 docker run -p 6379:6379 \ 
   --name redis \ 
   --privileged=true \ 
   -v /data/software/redis/data:/data \
   -v /data/software/redis/conf/redis.conf:/etc/redis/redis.conf \ 
   -d redis:4.0.11 redis-server /etc/redis/redis.conf \
   --requirepass "fly0228" \ 
   --appendonly yes

 ############ 說明
 -d -> 以守護程式的方式啟動容器 
 -p 6379:6379 -> 繫結宿主機埠 
 --name myredis -> 指定容器名稱 
 --restart always -> 開機啟動 
 --privileged=true -> 提升容器內許可權 
 -v /root/docker/redis/conf:/etc/redis/redis.conf -> 對映配置檔案 
 -v /root/docker/redis/data:/data -> 對映資料目錄 
 --appendonly yes -> 開啟資料持久化

備份和遷移

1、備份和遷移docker映象
1)、先從一個有網路的電腦下載docker映象
 docker pull centos
2)、儲存映象到本地檔案
 docker save -o centos_image.tar centos

儲存mysql容器為映象:
如:docker save -o /data/software/project/mysql5.7.tar mysql5.7(儲存到/data/software/project/目錄下名稱為mysql5.7.tar,被儲存的映象為mysql5.7)

如果一次儲存多個:
docker save -o images.tar postgres:9.6 mongo:3.4 redis3.0

3)、拷貝和載入映象
 # 把映象拷貝到無網路的電腦,然後通過docker載入映象即可。
 docker load -i centos_image.tar

2、備份和遷移docker容器
1)、查詢正在執行的容器id
 docker ps -a
2)、匯出docker容器
 docker export 70c74ebbfac4 > ubuntu_sshd.tar
3)、檢視大小
 du -sh ubuntu_sshd.tar
4)、上傳和匯入
 # 把這個ubuntu_sshd.tar傳到別的伺服器上,並匯入容器。
 # docer export 對應匯入的命令是cat xxx | docker import – name ,我這裡用的是niubi:latest。
 cat ubuntu_sshd.tar | sudo docker import - niubi:latest

3、save和export的區別

1)、save是針對映象images,export是針對當前容器的快照;

2)、save可以回滾以前的配置,因為保留了歷史記錄;

3)、save比較大,export要小一些。

備份遷移的方式自己選,推薦用export,畢竟save太大了,對於歷史也沒啥用處 !


4、儲存mysql容器為映象

1、把當前mysql容器作為映象,可通過docker images檢視。

docker commit -p 4e79d91d76bb mysql_backup

2、把這個映象儲存到指定目錄

docker save -o /data/software/project/mysql5.7.tar mysql5.7

3、拷貝到其他宿主機上,載入這個映象

docker load -i mysql5.7.tar


5、備份MySQL資料,匯入到另一個mysql容器。

1、使用mysqldump命令備份匯出資料庫中的所有表結構和資料
docker exec -it mysql01 mysqldump -uroot -proot demo > /home/bak/demo.sql

2、只匯出資料不匯出表結構
docker exec -it mysql01 mysqldump --opt -t -uroot -proot demo > /home/bak/demo2.sql

3、只匯出表結構不匯出資料
docker exec -it mysql01 mysqldump --opt -d -uroot -proot demo > /home/bak/demo1.sql

4、使用mysqldump匯出特定表的結構
docker exec -it mysql01 mysqldump -uroot -proot -B demo --table playmath_user > /home/bak/playmath_user.sql

5、docker執行匯入(恢復)資料庫命令
docker exec -i mysql01 mysql -uroot -proot playmath_sso < /home/bak/playmath_sso.sql


總結

  根據居士本人這些年的工作經驗,初中級工程師只需瞭解docker命令即可,因為大部分公司中是不需要你來操作的,都有專門的整合工程師來搭建和維護,但對於正在往架構師方向前進的工程師而言,熟練掌握docker的安裝、命令、具體使用以及整合springboot打包、docker高階用法等都是必備的技能,需要花時間實操。


  其實不用想那麼複雜,這種偏運維性質的技能,你會百度會做文件就行,在一個公司頂多也就搭建一次,之後就是做好文件留痕,以後也不會有那麼麻煩了。



本人原創文章純手打,覺得有一滴滴幫助的話,就請伸出芊芊玉手點個推薦吧~~


相關文章