docker全解
一、docker的基本概念
-
什么是docker?
-
docker是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的鏡像中,然后發布到任何流行的Linux或Windows機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口。
-
docker的英文翻譯是“搬運工”的意思,他搬運的東西就是我們常說的集裝箱Container,Container里面裝的是任意類型的App,我們的開發人員可以通過docker將App變成一種標準化的、可移植的、自管理的組件,我們可以在任何主流的操作系統中開發、調試和運行。
-
-
docker與VMware的比較
Docker VMware 虛擬化 輕量級虛擬化(只虛擬出來容器所需要的資源,軟件層面) 完全虛擬化(虛擬化硬件) 啟動速度 秒級 分鐘級 運行性能 接近原生 5%左右損失 磁盤占用 MB GB 數量 成百上千 一般幾十臺 隔離性 進程級別 系統級(更徹底) 操作系統 主要支持Linux 幾乎所有 封裝程度 只打包項目代碼和依賴關系,共享宿主機內核 完整的操作系統 -
docker架構
docker架構主要由以下幾個組件組成:
- Docker Client(docker客戶端):用戶使用Docker命令行工具與Docker Daemon交互,發送命令來構建、運行和管理容器。
- Docker Daemon(docker守護進程):運行在主機上,負責管理容器的生命周期,處理容器的創建、啟動、停止等操作。它還負責與Docker Registry交互,從Registry中下載鏡像并在本地保存。
- Docker Registry(docker鏡像倉庫):用戶與存儲和分享docker鏡像。docker官方提供了公共的Registry,稱為Docker Hub,也可以在本地搭建私有的Registry。
- Docker Image(docker鏡像):是容器的基礎,包含了運行容器所需的所有文件、配置和依賴。Docker鏡像可以通過Dockerfile文件來構建,也可以從Docker Registry中獲取。
- Docker Container(docker容器):是docker鏡像的運行實例,可以被創建、啟動、停止、刪除和暫停。它是輕量級的,可以在幾毫秒內啟動和停止。
總之,Docker 架構是一個客戶端-服務器架構,客戶端通過 Docker 命令行工具與 Docker Daemon 交互,Docker Daemon 負責管理容器的生命周期,Docker Registry 用于存儲和分享 Docker 鏡像,Docker 鏡像是容器的基礎,Docker 容器是 Docker 鏡像的運行實例。
二、docker的安裝
- 檢查之前是否安裝過docker,如果有使用yum remove docker卸載
[root@woniu ~]# yum remove docker \
> docker-client \
> docker-client-latest \
> docker-common \
> docker-latest \
> docker-latest-logrotate \
> docker-logrotate \
> docker-engine
-
安裝yum工具
[root@woniu ~]# yum -y install yum-utils
-
配置阿里云鏡像,添加docker引擎的yum源
[root@woniu ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
-
更新CentOS
[root@woniu ~]# yum update
-
列出docker源
[root@woniu ~]# yum list docker-ce —showduplicates | sort -r
-
安裝docker
[root@woniu ~]# yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
-
檢查docker版本號
[root@woniu ~]# docker -v Docker version 24.0.7, build afdd53b
-
啟動docker,并設置自啟
[root@woniu ~]# systemctl start docker [root@woniu ~]# systemctl enable docker
三、docker容器配置
-
配置本地鏡像庫
從默認網絡獲取docker鏡像太慢,為了提高速度,可以配置國內的鏡像庫,可同時配置多個
[root@woniu ~]# vim /etc/docker/daemon.json
{"registry-mirrors":["https://ung2thfc.mirror.aliyuncs.com","https://docker.mirrors.ustc.edu.cn","https://registry.docker-cn.com","http://hub-mirror.c.163.com","https://mirror.ccs.tencentyun.com"] }
配置完成之后重啟docker
[root@woniu ~]# systemctl restart docker
-
設置docker的靜態ip
目的:解決docker運行過程中ip的固定。
docker容器的ip地址在每次啟動后啟動順序設置ip地址,為解決ip地址變動的問題,我們有必要設置docker內部ip地址固定。
-
創建自定義網絡(network)
docker network create —driver bridge —subnet=自定義網絡ip/16 —gateway=網關值 自定義網絡名稱
[root@woniu ~]# docker network create --driver bridge --subnet=172.18.12.0/16 --gateway=172.18.1.1 wn_docker_net
查看創建的網絡
[root@woniu ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 70fe2b91dc9a bridge bridge local dc8dac7cdeb4 host host local ab24c1a95ddc none null local 88dee123076b ssc-replication_default bridge local b948a39c4ea9 test_default bridge local 4bb015285e05 wn_docker_net bridge local
[root@woniu ~]# docker inspect wn_docker_net [{"Name": "wn_docker_net","Id": "4bb015285e05f57ab4b59e30f2eb9c0b76818c850680a3910aca6201aac9bdaa","Created": "2023-09-25T15:33:43.398740767+08:00","Scope": "local","Driver": "bridge","EnableIPv6": false,"IPAM": {"Driver": "default","Options": {},"Config": [{"Subnet": "172.18.12.0/16","Gateway": "172.18.1.1"}]},"Internal": false,"Attachable": false,"Ingress": false,"ConfigFrom": {"Network": ""},"ConfigOnly": false,"Containers": {},"Options": {},"Labels": {}} ]
-
docker常見問題IPv4 forwarding disabled的解決方案
docker run創建運行容器可能出現警告WARNING: IPv4 forwarding is disabled. Networking will not work.解決方案為開啟路由轉發功能,方式如下
[root@woniu ~]# vim /etc/sysctl.conf
在末尾追加net.ipv4.ip_forward=1,保存退出(:wq)
查看是否修改成功
[root@woniu ~]# sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 1
重啟network和docker服務
[root@woniu ~]# systemctl restart network [root@woniu ~]# systemctl restart docker
四、docker創建運行容器
以mysql為例,步驟如下
-
查詢mysql鏡像
[root@woniu ~]# docker search mysql
-
拉取mysql鏡像
[root@woniu ~]# docker pull mysql
-
查看下載好的鏡像
[root@woniu ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE ... mysql latest 99afc808f15b 3 months ago 577MB
-
創建一個簡單的運行容器(創建成功會自動啟動)
[root@woniu ~]# docker run -it --name mysql_test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123 -d mysql 3f315b1897133652129196a2dcb5bb0ef5e107d5f0d3019bc5e520a4c54348bf
參數解釋
- -it: 這個參數表示要分配一個交互式(-i)的終端(-t)(tty),通常用于需要交互的容器,比如運行一個 shell。
- –name mysql_test: 用來指定容器的名稱,這里將容器命名為 mysql_test。
- -p 3306:3306: 這個參數表示將容器的 3306 端口映射到宿主機的 3306 端口,這樣可以通過宿主機的 3306 端口訪問到容器中運行的 MySQL 服務。
- -e MYSQL_ROOT_PASSWORD=123: 通過這個參數可以設置 MySQL 的 root 用戶的密碼為 123。這是通過環境變量的方式傳遞給 MySQL 容器的。
- -d: 這個參數表示以守護進程(后臺)模式運行容器,容器啟動后會在后臺持續運行。
- mysql: 這是指定要運行的鏡像,即在這個容器中運行的應用程序。
-
查看運行中的容器
[root@woniu ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3f315b189713 mysql "docker-entrypoint.s…" About a minute ago Up About a minute 3306/tcp, 33060/tcp mysql_test
-
進入容器內部
[root@woniu ~]# docker exec -it mysql_test bash bash-4.4#
-
進入mysql
bash-4.4# mysql -uroot -p123
-
查看mysql中的數據庫
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec)
這樣我們就創建好了一個簡單mysql容器了
-
使用Navicat連接mysql進行測試
為了讓外界能連docker內部的mysql,我們需要開放防火墻的3306端口或者是直接關閉防火墻(二選一)
-
開放防火墻的3306端口
[root@woniu ~]# firewall-cmd --zone=public --add-port=3306/tcp --permanent [root@woniu ~]# firewall-cmd --reload
查看已開放的端口
[root@localhost conf]# firewall-cmd --zone=public --list-ports 3306/tcp
-
關閉并禁用防火墻(不會自啟了)
[root@woniu ~]# systemctl stop firewalld [root@woniu ~]# systemctl disable firewalld
這時候我們發現還是連不上,需要做一些處理,進入容器內的mysql,我們發現mysql8.x版使用的是caching_sha2_password 身份驗證機制,而客戶端不支持這種新的加密方式,需要進行修改
mysql> select host,user,plugin,authentication_string from mysql.user; +-----------+------------------+-----------------------+--------------------------------- | host | user | plugin | authentication_string +-----------+------------------+-----------------------+--------------------------------- | % | root | caching_sha2_password | $A$005$w(nn{]>%Gz;5^u:9wu3vTHopW | localhost | mysql.infoschema | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVAL | localhost | mysql.session | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVAL | localhost | mysql.sys | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVAL | localhost | root | caching_sha2_password | $A$005$1,Zq#1:OAK0Y&aSg6C/LCydGb +-----------+------------------+-----------------------+--------------------------------- 5 rows in set (0.00 sec)
修改加密規則,更新用戶密碼并刷新權限
mysql> ALTER USER 'root'@'%' IDENTIFIED BY '123' PASSWORD EXPIRE NEVER; Query OK, 0 rows affected (0.02 sec)mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123'; Query OK, 0 rows affected (0.01 sec)mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.01 sec)
退出容器,重啟mysql服務
[root@woniu ~]# docker restart mysql_test
現在的話,就可以連接成功了
-
五、docker常用命令及參數
- 容器管理:
- docker run: 創建、運行一個新的容器
- -d: 以守護進程(后臺)模式運行容器
- -it: 分配一個交互式的終端
- –name: 指定容器的名稱
- -p: 端口映射
- –network:指定容器連接的網絡。比如指定為我們之前自定義的網絡–network wn_docker_net
- –ip:指定容器內部ip,配合–network使用,如–ip 172.18.12.2
- -v:用于掛載數據卷,如-v /usr/local/softwares/mysql/3306/conf/my.cnf:/etc/mysql/my.cnf,冒號左邊的是外面宿主機的文件路徑,冒號右邊的是容器內的文件路徑,這樣我們可以修改外面的文件,容器內部的文件會被自動修改,非常方便
- -e:用于設置環境變量
- –restart:設置容器的重啟策略。可以使用該參數來指定容器在退出時的重啟策略,如
--restart=always
表示容器退出時總是重啟。能夠使我們在啟動docker時,自動啟動docker內的各種容器。 - –rm:容器退出時自動刪除。使用該參數可以在容器退出后自動刪除容器,適用于臨時性任務的容器。
- docker start: 啟動已經停止的容器
- docker stop: 停止正在運行的容器
- docker restart: 重啟容器
- docker rm: 刪除容器
- docker ps: 查看正在運行的容器
- docker ps -a: 查看所有容器(包括已停止的)
- docker logs: 查看容器的日志,如果在配置文件設置了自定義的日志路徑則失效,此時應該把日志掛載到外面查看
- docker run: 創建、運行一個新的容器
- 鏡像管理:
- docker pull: 下載鏡像
- docker build: 構建鏡像
- docker push: 推送鏡像到倉庫
- docker images: 查看本地的鏡像列表
- docker rmi: 刪除鏡像
- 網絡管理:
- docker network ls: 列出 Docker 網絡
- docker network create: 創建一個新的 Docker 網絡
- docker network connect: 將容器連接到網絡
- docker network disconnect: 將容器從網絡斷開
- 倉庫管理:
- docker login: 登錄到 Docker 倉庫
- docker logout: 退出 Docker 倉庫
- docker search: 在 Docker 倉庫中搜索鏡像
- 其他常用命令:
- docker exec: 在運行的容器中執行命令,一般使用docker exec -it 容器名 bash進入容器內部
- docker info: 顯示 Docker 系統信息
- docker version: 顯示 Docker 版本信息
- docker-compose: 使用 Docker Compose 來定義和運行多個容器的應用程序
- docker inspect:用于獲取有關 Docker 對象(如容器、鏡像、網絡等)的詳細信息,可以配合管道|grep "x"進行過濾輸出結果搜索包含x的指定行
以上是一些常用的 Docker 命令及其參數,當然 Docker 還有更多的命令和選項,具體使用時可以通過docker --help/-h或者 docker [command] --help 來查看詳細的幫助信息。
六、Dockerfile
-
簡介
Dockerfile 是一個用來構建鏡像的文本文件,文本內容包含了一條條構建鏡像所需的指令和說明。
-
結構
-
常用指令
- FROM:指定基礎鏡像
- MAINTAINER:指定維護者信息
- ADD:復制文件
- ENTRYPOINT:入口點
- EXPOSE:指定暴露出去的端口號
- VOLUME:指定掛載點
-
我的第一個Dockerfile
-
創建文件hello,編輯內容,:wq保存退出
[root@woniu abc]# vim hello FROM mysql:5.7 MAINTAINER XZX
-
使用docker build構建鏡像(-t給構建的鏡像指定標簽,-f指定 Dockerfile 的路徑,.表示當前目錄)
[root@woniu abc]# docker build -t mysql:5.7 -f hello .
-
查看構建好的鏡像
[root@woniu abc]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE ... mysql 5.7 ddb3dd52c6a0 23 months ago 448MB
一般使用Dockerfile是用來構建自己的項目容器的,使用springboot整合Dockerfile文件,具體可以參考我之前寫的博客(springboot整合Dockerfile-CSDN博客)
FROM anapsix/alpine-java MAINTAINER xzx EXPOSE 9090 ADD target/hello-docker-1.0-SNAPSHOT.jar /app.jar ENTRYPOINT ["java","-jar","/app.jar"]
- FROM:指定基礎鏡像為java,也就是jdk,java項目需要jdk(或jre)運行
- MAINTAINER:指定維護者信息為xzx
- EXPOSE:指定暴露出去的端口號為9090
- ADD:復制文件,將jar復制到容器的根目錄下,命名為app.jar
- ENTRYPOINT:入口點,容器一旦創建運行,將會自動執行java -jar命令啟動項目
-
七、docker compose
-
簡介
docker compose是一個編排多容器分布式部署的工具,提供命令集管理容器化應用的完整開發周期,包括服務構建、啟動和停止。簡單來說,它可以幫你一次性同時創建并啟動多個docker容器。
-
下載(https://github.com/docker/compose/releases?page=3)
這里我選擇了2.14.2版本
下載完成后上傳到你的虛擬機里的/usr/local/bin/目錄下,放到這個目錄下可以全局使用,對它添加可執行權限,修改名字簡化使用
[root@woniu abc]# cd /usr/local/bin [root@woniu bin]# chmod u+x docker-compose-linux-x86_64 [root@woniu bin]# mv docker-compose-linux-x86_64 docker-compose
查看版本
[root@woniu ~]# docker-compose --version Docker Compose version v2.14.2
-
簡單使用
通過使用命令docker-compose up就可以按照當前目錄下docker-compose.yml的配置內容進行構建
隨便進入一個目錄,創建docker-compose.yml文件,編輯里面的內容
version: '2' networks:wn_docker_net:external: true services:hello-compose01:build: .image: rediscontainer_name: redis_6399ports:- "6399:6379"networks:wn_docker_net:ipv4_address: 172.18.12.102hello-compose02:build: .image: mysqlcontainer_name: mysql_3320environment:- "MYSQL_ROOT_PASSWORD=123"ports:- "3320:3306"networks:wn_docker_net:ipv4_address: 172.18.12.101
build: .指的是會在當前目錄下找一個Dockerfile文件來構建鏡像,這個就和之前docker run配合參數構建運行容器一樣,只不過可以一次性構建多個,之后可以配合Dockerfile來構建分布式項目。
使用docker-compose up執行
[root@woniu test]# docker-compose up [+] Running 2/2? Container mysql_3320 Created 0.1s? Container redis_6399 Created 0.1s Attaching to mysql_3320, redis_6399 mysql_3320 | 2023-12-03 11:14:26+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.1.0-1.el8 started. redis_6399 | 1:C 03 Dec 2023 11:14:26.959 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo ...
Ctrl+C終止
^CGracefully stopping... (press Ctrl+C again to force) [+] Running 2/2? Container mysql_3320 Stopped 1.8s? Container redis_6399 Stopped 0.3s canceled
docker-compose restart重新啟動,這次是后臺啟動,可以做其他操作
[root@woniu test]# docker-compose restart [+] Running 2/2? Container redis_6399 Started 0.4s? Container mysql_3320 Started 0.5s [root@woniu test]#
docker ps查看已啟動的容器
[root@woniu test]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e0594171516b mysql "docker-entrypoint.s…" 4 minutes ago Up About a minute 33060/tcp, 0.0.0.0:3320->3306/tcp, :::3320->3306/tcp mysql_3320 b3d8853bea34 redis "docker-entrypoint.s…" 4 minutes ago Up About a minute 0.0.0.0:6399->6379/tcp, :::6399->6379/tcp redis_6399
docker-compose stop關閉構建的多個容器
[root@woniu test]# docker-compose stop [+] Running 2/2? Container mysql_3320 Stopped 1.4s? Container redis_6399 Stopped 0.2s
-
Spring Boot整合docker compose(還加了Dockerfile配合)
編寫Dockerfile
編寫docker-compose.yml
點擊docker-compose.yml里面services:左邊綠色的按鈕運行并進行訪問測試,測試成功
當中可能出現報錯,說需要Docker Desktop才能運行,那就去下好了,地址為docker.com/products/docker-desktop/,下載Windows版的(如果你電腦是Windows系統的話)。