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系统的话)。