Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
一个完整的Docker有以下几个部分组成:
1.DockerClient客户端
2.Docker Daemon守护进程
3.Docker Image镜像
4.DockerContainer容器
博主对使用Docker好处的认知仅限于他可以很方便的对繁重的项目进行迁移,而解决了环境需要重新配置的麻烦。所以有了这篇理解Docker文章
安装docker之前,最好的系统当然是linux,这是因为docker是用go语言开发的,博主在这里介绍也是基于linux的centos8(目前centos8以下yum源被阿里云禁止且不被linux官方所维护,不建议使用)服务器来探究Docker
查看电脑上是否已经安装docker软件
yum list installed | grep docker
如果确认已经安装过docker,先卸载已安装的docker,执行如下命令:
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
安装所需的软件包,yum-utils提供了yum-config-manager应用,并device-mapper-persistent-data和lvm2由需要devicemapper存储驱动程序
sudo yum install -y yum-utils device-mapper-persistent-data lvm2 # 环境配置,安装docker依赖于yum-utils、device-mapper-persistent-data lvm2
等待下载完成
因为docker是海外服务器,所以国内访问海外服务器网络状态极不稳定。所以需要添加国内的镜像源,关于docker的国内镜像源,可以百度有几家,博主认为最靠谱的还是阿里云。毕竟阿里云立志打造世界互联网龙头企业之一。所以提供的互联网服务或者说能够提供最为稳定的镜像源。
使yum配置国内docker镜像源(阿里云)执行以下命令
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 安装docker国内镜像源
确认有没有添加成功
因为刚刚为yum添加了阿里云镜像源。所以要想让配置生效,必须执行以下命令
sudo yum makecache fast # 使yum为最新配置源
忘了交代一句,安装docker需要linux系统内核在3.10以上(包含3.10)。所以请查看当前的系统内核版本
uname -r #查看centos内核版本如果大于或等于3.10可以安装docker
执行了以上命令以后,就可以达到来安装docker了。docker官方提供了docker三种版本。博主这里介绍一个免费版本(完全开源免费)docker社区版docker-ce
yum -y install docker-ce # 安装docker-ce社区版免费版本
查看是否docker-ce是否安装成功,执行以下命令
docker -v # 查看docker版本,验证docker是否成功
可以使用docker help命令查看docker内置了那些命令
docker --help # 查看docker内置了那些命令
这里罗列了一些常用的命令
systemctl start docker # 启动docker systemctl status docker # 查看docker状态 systemctl stop docker # 停止运行docker systemctl restart docker # 重启docker systemctl enable docker # 将docker设置为自启动(开机就立即启动) systemctl disable docker # 禁止将docker自启动
通常情况下,需要将docker设置成自启动(服务器一开机马上启动docker)
systemctl enable docker # 将docker设置为自启动(开机就立即启动)
好了目前docker已经被我们启动了,现在我们可以让docker发挥作用了。docker工作的原理分为docker客户端,存放这docker run create pull命令。docker 服务端,存放这镜像和创建号的容器,还有一个部分是docker的仓库,存放着镜像资源。怎么更好的理解这三者之间的关系呢,就好比镜像相当于php或者java的一个类,而容器相当于new这个类的对象,我们就需要操作这个对象也就是容器。
docker的远程仓库默认在海外服务器,国内访问网络状态极不稳定。所以推荐使用阿里云容器镜像仓库。如何添加呢?接着看
配置docker远程仓库地址为阿里云拉取仓库资源
首先在百度上打开阿里云 https://www.aliyun.com/benefit?utm_content=se_1015363098,支付宝扫码登陆。阿里云为每一个用户都生成了docker的仓库地址
点击控制台
回到服务器,配置docker的阿里云远程仓库地址https://gkfraxai.mirror.aliyuncs.com(这里再提一嘴,https://gkfraxai.mirror.aliyuncs.com是博主自己的地址。你请记好你的仓库地址)
请在且一定要在服务器/etc/docker/下面创建一个文件,取名为daemon.json
创建好了以后,编辑这个daemon.json这个文件。编辑以下内容
{ "registry-mirrors": ["https://gkfraxai.mirror.aliyuncs.com"] }
cat /etc/docker/daemon.json # 验证配置是否完成,打开该文件如果出现你设置配置的仓库地址则说明配置完成
配置完成后,要让配置生效,需重新启动服务
sudo systemctl daemon-reload # 加载配置 sudo systemctl restart docker # 重启docker
以下是docker安装镜像
容器的获取方式
一、可以去docker的默认仓库(hub.docker.com)上搜索你所需要的镜像。该地址因为是国外服务器,访问速度特别慢,因此博主不推荐
二、在终端命令行中进行搜索需要的镜像,这是博主推荐的。这里罗列对于镜像的一些常用命令
docker search tomcat # 搜索tomcat镜像 docker pull tomcat:latest # 拉取最新的tomcat版本(根据镜像名下载镜像) docker pull tomcat:9 # 拉取tomcat V9版本 docker images # 获取docker已经下载好的镜像 docker images -a # -a代表all 获取docker所有的本地镜像 docker images -q # -q表示展示下载到本地镜像的镜像ID docker rmi tomcat:7 # 删除tomcat 7版本的(根据镜像名称删除镜像) docker rmi 镜像ID # 根据镜像ID删除镜像 docker rmi -f 镜像ID # 强制删除镜像,(镜像正在被其他进程所访问)
这里博主带你们去仓库搜寻一下tomcat镜像并且拉取他
docker search tomcat # 搜索tomcat镜像
咱们使用docker pull拉取一下这个tomcat镜像
# 命令格式
docker pull 镜像名称:版本号
:号跟着是确定拉取这个镜像的版本号。如果给latest就是最新版本的镜像
docker pull tomcat:latest # 拉取最新的tomcat版本(根据镜像名下载镜像)
使用以下命令,查看已经拉取的所有镜像,看看是不是存在刚刚拉取的tomcat最新版镜像
docker images # 获取docker已经下载好的镜像
那么好,tomcat最新版镜像被我们从仓库拉取到本地了,现在进行根据镜像创建一个容器。这里对docker run 命令做一个介绍
docker run 参数 镜像名称 # 创建并运行一个容器
这里面的参数有以下几个:
1.-i 以交互的方式运行容器,通常与-t同时使用
2.-t 为容器重新分配一个伪输入终端,通常与-i同时使用
3.-d 后台运行容器,并返回容器ID
4.-P 随机端口映射,容器内部端口随机映射到主机的端口
5.-p 指定端口映射,格式为:主机端口:容器端口
6.--name="nginx-lb" 为容器指定一个名称
这里罗列一些命令
docker run -itd tomcat:latest # 以-i -t -d 模型启动容器 返回一大串的随机字符6672046a26fc8e71254729e30bda056322e0dd8c02550bffa23c2780f370c4ce
docker run --name="nginx-lb" -itd tomcat:latest # 以当前指定的名字启动指定的容器
docker ps # 当前docker启动了那些容器
docker ps -a # -a代表all,查看docker所有容器(包括运行、死亡、迁移、等等状态的容器)
docker stop 容器ID/容器名称 # 以容器ID/容器名称停止运行
docker run -itd --name="yx-tomcat" tomcat:latest # 使用tomcat:latest镜像,以-i -t -d 模式取名为yx-tomcat创建并且启动容器 返回一大串的随机字符6672046a26fc8e71254729e30bda056322e0dd8c02550bffa23c2780f370c4ce
使用 docker ps 查看是否创建并且运行容器成功
docker ps # 当前docker启动了那些容器
咱们是要让容器发挥作用的,有时候创建的容器需要配置文件,这就需要登陆容器内部了。那咱们如何登陆容器内部进行访问呢?
docker为我们提供了一个登陆容器内部的命令:
docker exec 参数 容器ID/容器名称 /bin/bash # docker根据容器ID或者容器名称,登陆一个容器
参数说明:
-d # 分离模式,指明在后台运行
-i # 即使没有附加也保持STDIN打开,保持和docker容器的交互。启动容器时,运行的命令结束后,容器依然存活,而没有退出(默认会退出,等同于停止该容器)
-t # 分配一个伪终端
什么是伪终端,大家自行百度。博主就不赘述了。接着往下讲:
使用容器ID命令来让我们登陆yx-tomcat容器内部,并打开一个伪终端:
docker exec -it 5960f357a78c /bin/bash # 以分离模式并请求docker分配一个伪装短来打开一个容器ID为6672046a26fc的容器 表示登陆并进入了该容器的内部
使用exit命令退出当前登陆的伪装短,返回真正的linux终端
下面介绍一下docker cp 称之为docker 的拷贝命令
命令格式:
docker cp 宿主主机目录 容器ID:容器ID目录 # 用户容器与宿主主机之间的数据拷贝,该命令的作用是吧宿主主机目录上的文件拷贝到容器内部目录下。那个目录靠近cp,则那个目录是拷贝数据源
噢,这里忘了给你们稍微解释一下什么叫宿主主机。这是一个相对的概念。相对于容器来讲。我们的服务器就是宿主主机。容器是作为寄生虫一样寄存在咱们的服务器上。所以我们的服务器相对于容器来讲就是宿主主机
比如博主这里在/usr/local/目录下创建一个宿主主机上的目录/abc/yx
# 该行的命令作用是把宿主主机上的/usr/local/abc/yx yx文件夹下的所有文件拷贝给容器ID为5960f357a78c的/usr/local/tomcat下,确保该容器是不是存在/usr/local/tomact这个目录 docker cp /usr/local/abc/yx 5960f357a78c:/usr/local/tomcat
咱们登陆进yx-tomcat容器看看是不是在/usr/local/tomcat文件夹下有了yx这个文件夹
docker exec -it 5960f357a78c /bin/bash # 以分离模式登陆容器ID为5960f357a78c
咱们使用exit命令退出伪终端(即退出容器内部)
咱们接着探究docker
咱们探究一下docker如何查看容器的元数据(元数据是java提出的一个概念,不理解的简单可以理解为情况,咱们看一看容器内部的情况或者数据)
docker inspect 容器ID # 查看容器元数据 docker inspect 6672046a26fc # 查看容器ID为6672046a26fc的相关元数据
接着咱们探究一下docker删除容器的命令
命令格式为:
docker rm 参数 容器ID # 删除容器 参数说明: -f # 通过SIGKILL信号强制删除一个运行中的容器 -l # 移除容器间的网络连接,而非容器本身 -v # 删除与容器相关的卷 docker rm ${docker ps -a -q} # 删除(查询处非运行状态的)所有容器
这里博主就不演示了。因为这里我的容器就只有一个yx-tomcat,删除了之后,就没法演示接下来的内容,再创建,挺麻烦的。你们了解一下删除命令即可,相信大家可以看得懂
咱们探究一下如何使用docker logs来查看容器输出的log信息
命令格式:
docker logs 参数 容器ID # 查看某个容器的日志信息
参数说明:
--since # 指定输出日期开始日期
-f # 查看实时日志
-t # 查看日志生成的日期
--tail # 查看日志最后的n条日志
来,咱们使用一下命令
docker logs --since=2024-02-27 --tail=90 6672046a26fc # 查看容器ID为6672046a26fc的日志文件,log日志开始日期为2024-02-27,最后90条日志文件
接着咱们探究一下docker的数据卷功能
数据卷是一个共给容器使用的特殊文件目录,位于容器中,可以将宿主机的目录挂载到数据卷上,对数据卷的修改立刻可见,并且更新数据卷不会影响到容器的使用,从而实现数据在主机和容器之间共享。
有以下特点和作用
1、数据卷是宿主机中的一个目录或文件
2、当容器目录和数据卷目录绑定后,对方的修改会立即同步
3、一个数据卷可以被多个容器同时挂载
4、一个容器也可以挂载多个数据卷
咱们使用docker volume create 来创建一个数据卷
命令格式:
docker volume create 数据卷名称 # 创建一个数据卷
咱们尝试创建一个取名为yx-vol的数据卷,默认存放的位置在/var/lib/docker/volumes/下面
docker volume create yx-vol # 创建一个名为yx-vol的数据卷,默认存放的位置在/var/lib/docker/volumes/下面
docker volume ls # 获取被创建的所有数据卷
docker volume inspect 数据卷名称 # 查看某个数据卷
docker volume rm yx_vol # 删除名为yx-vol的数据卷
# 创建并运行一个名为yx_tomcat的容器,并且以-itd模式打开,指定端口映射主机端口8080:映射容器端口8080,并指定数据卷yx_vol挂载在该容器的/usr/local/tomcat/webapps下
# 多个数据卷请设置书写多个-v进行挂载
docker run --name=yx_tomcat -itd -p 8081:8080 -v yx_vol:/usr/local/tomcat/webapps tomcat:latest
咱们尝试在/var/lib/docker/volumes/yx_vol/_data上创建一个index.html文件,并且编辑该文件为以下内容
<h1>这是测试一下在宿主主机上编辑这个文件是不是容器内部对应的目录上也会看到该文件内容的输出</h1>
docker exec -it 容器ID /bin/bash # 登陆容器内部 docker exec -it 63dbf780aa23 /bin/bash # 登陆容器ID为63dbf780aa23的容器内部
下面介绍一下docker安装mysql
docker pull mysql:latest # 拉取mysql最新版本镜像
docker images # 获取docker拉取的所有镜像,验证mysql镜像是否被拉取
# 创建并运行一个取名为yx-mysql的容器。-e表示给这个容器设置配置文件 -p 表示端口映射, 表示将宿主主机上的3308端口映射至容器里面的3306端口 docker run -itd --name=yx-mysql -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:latest
docker ps # 验证yx-mysql容器是否创建成功
docker exec -it 65418b6cbf18 /bin/bash # 使用docker exec命令登陆容器id为65418b6cbf18的容器内部
下面讲讲docker安装nginx
docker search nginx # 查看nginx可用的镜像
docker pull nginx:latest # 拉取nginx最新版本镜像
# 创建并运行一个取名为yx-nginx的容器 -p 表示端口映射,表示将宿主主机上的82端口映射至容器里面的80端口
# -v /usr/local/docker/nginx表示将/usr/local/docker/nginx目录挂载在容器/usr/share/nginx/html目录上(创建了一个数据卷)
# /usr/share/nginx/html 这个目录表示容器目录,nginx官网存在静态资源的目录
docker run -itd --name=nginx -p 82:80 -v /usr/local/docker/nginx/html:/usr/share/nginx/html nginx:latest
docker ps # 查看刚刚创建的容器名为nginx
咱们在/usr/local/docker/nginx/html目录上创建一个index.html文件,添加内容如下
<h1>这是nginx默认首页</h1>
保存
下面再探究一下docker如何安装redis
docker pull redis:latest # 拉取redis最新版本镜像
# 创建并运行一个取名为yx-redis的容器 -p 表示端口映射,表示将宿主主机上的6379端口映射至容器里面的6379端口 docker run -itd --name=yx-redis -p 6379:6379 redis:latest
docker exec -it yx-redis /bin/bash # 铜鼓yx-redis容器名字登陆redis容器(进入了该容器内部)
redis-cli # 打开redis命令行工具
下面探究一下docker如何实现项目迁移与备份(这里补充docker实现项目备份的原理是通过将容器做成镜像从而实现项目的备份与迁移)
命令行格式:
docker commit 参数 容器ID 镜像名称 # 把容器做成新的镜像
参数说明
-a # 提交的镜像作者
-c # 使用DockerFile指令来创建镜像
-m # 提交时的说明文字
-p # 在commit时,将容器暂停
docker ps # 咱们查看一下当前正在运行着的容器
docker commit -a 'DurkBlue' -m '这是我根据容器制作的redis镜像' e0ff5e978aa8 yx-redis-v1.0 # 将容器ID为e0ff5e978aa8制作成一个镜像,把这个镜像取名为yx-redis-v1.0
docker images # 验证一下刚才制作的yx-redis-v1.0镜像是否制作成功
下面介绍一下如何将镜像保存到宿主主机上(这里提一嘴,只支持设置保存成.tar格式的压缩包,方便为后来命令的读取)
命令行格式:
docker save 参数 # 将指定镜像保存成tar归档文件,即备份本地仓库的镜像
参数说明:
-o # 输出到新的文件,注意:是小写字母o不是数字0
docker save -o /usr/local/redis/my/yx-redis.tar yx-redis-v1.0 # 将指定镜像yx-redis-v1.0压缩保存成/usr/local/redis/my/目录下的yx-redis.tar压缩包文件
下面探究一下如何根绝本地的压缩包文件还原成docker的镜像
命令行格式:
docker load 参数 # 导入使用docker save 命令导出的镜像,即将本地目录下的镜像备份文件导入到本地docker仓库。针对.tar的压缩包备份文件
参数说明:
--input或-i # 指定导入的文件,代替STDIN
--quiet或-q # 精简输出信息
# 有了yx-redis.tar压缩包,用docker load命令解压缩文件 # 因为之前已经有了取名为yx-redis-v1.0的镜像了,如果盲目解压缩还原成镜像会导致异常。股先将现有取名为yx-redis-v1.0的镜像移除 docker rmi yx-redis-v1.0
docker images # 获取拉取到本地的镜像列表,验证刚刚的yx-redis-v1.0镜像是否删除成功
docker load -i /usr/local/abc/yx-redis.tar # 将刚刚保存在宿主主机上的/usr/local/abc目录下的yx-redis.tar文件还原成镜像
docker images # 获取本地的镜像列表,验证是否还原成功
docker run -itd --name my-redis -p 6380:6379 yx-redis-v1.0 # 尝试将刚刚生成的yx-redis-v1.0镜像生成yx-redis容器并运行
下面再给大家探究一下docker关于网络的部分
下面博主罗列一下命令:
firewall-cmd --list-ports # 查看防火墙开放的端口号 firewall-cmd --zone=public --add-port=8081/tcp --permanent # 增加开放8081tcp协议端口 firewall-cmd --reload # 使防火墙所做的修改立即生效 firewall-cmd --zone=public --remove-port=8081/tcp --permanent # 关闭8081tcp协议端口 systemctl status firewalld # 查看防火墙状态 systemctl start firewalld # 启动防火墙 systemctl stop firewalld # 停止防火墙 systemctl restart firewalld # 重启防火墙 systemctl disable firewalld # 开机自启动防火墙 ifconfig # 查看服务器网络使用信息 ip addr # 查看服务器网络使用信息,重点关注docker0的网络数据并理解
docker network --help # 查看docker网络内置了那些命令 docker network ls # 查看docker那些容器使用了网络(含有网络ID networkID) docker network rm 网络名称/网络ID # 根据网络名称或者网络ID删除某个网络连接 docker network create 网络名称 # 创建一个网络连接 docker network create yx-network # 创建一个取名为yx-network的网络连接 docker network ls # 使用ls查看网络连接yx-network是否创建成功 docker network inspect yx-network # 查看yx-network网络连接元数据
研究到docker的网络模块的话,补充以下知识点,如果想详细了解请到docker官网上了解
docker的网络模式分为
brige模式: 自动分配IP、PORT
host模式: 和宿主主机共享IP、PORT
none模式: 不会分配任何网络配置,只有自身的IO网络(本地环回网络127.0.0.1)不会被外界所访问到
container模式: 在网络上共享其他容器的IP、PORT
#设置容器的网络模式 # 利用redis:latest镜像,创建并运行取名为yx-redis-v1.0,并设置网络模式为container模式共享其他容器ID网络 docker run -itd --name=yx-redis-v1.0 --network-container:其他容器ID redis:latest
# 自定义网络配置 docker network create ytx_network 创建一个取名为 ytx_network 的网络连接 docker network ls # 查看docker那些容器使用了网络(含有网络ID networkID),查看刚刚是否创建了名为ytx_network的网络连接 # 使用redis:latest镜像创建并运行一个使用ytx_network网络,取名为ytx_network_redis的容器 docker run -itd --network=ytx_network --name=ytx_network_redis redis:latest docker ps # 查看ytx_network_redis是否创建成功并且已运行 docker exec -it 容器ID /bin/bash # 登陆指定容器ID的容器内部 docker exec -it 9ec16d261559 /bin/bsh # 登陆指定容器ID为9ec16d261559的容器内部 ip addr # 查看该容器的网络情况,查看是不是有了刚才创建的网络ytx_network分配的ip。以eth开通