简介
Docker是一种容器化平台,它可以用来轻松地创建、部署和运行应用程序和服务。Docker使用容器技术来管理应用程序的运行环境,它将应用程序和服务打包到一个易于移植的容器中,然后在任何地方运行这个容器,无需担心不同环境之间的差异。使用Docker,您可以轻松地构建、测试、部署和扩展应用程序,从而大大提高了开发和部署的效率。Docker的核心是Docker引擎,它是一个轻量级的运行时环境,可以在任何操作系统上运行。Docker还提供了一系列命令行工具和API,使开发人员和系统管理员可以轻松地管理Docker容器和镜像。
核心
Docker的核心是Docker引擎(Docker Engine),它是一个开源的容器化技术,能够简化应用程序的开发、部署和管理。
Docker Engine包括以下几个核心组件:
1. Docker守护进程(Docker daemon):Docker守护进程是运行在主机上的长期运行的进程,用于管理Docker容器、镜像、网络、数据卷等资源。
2. Docker客户端(Docker client): Docker客户端是Docker命令行工具,用于与Docker守护进程进行通信,同时也是用户与Docker交互的主要方式。
3. Docker镜像(Docker image): Docker镜像是一个只读的模板,它包含了用于创建Docker容器的文件系统和应用程序。
4. Docker容器(Docker container): Docker容器是由Docker镜像创建的运行实例,可以运行应用程序及其依赖项,同时具有隔离和可移植性。
5. Docker仓库(Docker registry): Docker仓库是用于存储Docker镜像的中央存储库,可以是公共的或私有的,用户可以从中拉取Docker镜像来创建和运行容器。
以上组件结合在一起就形成了Docker的整体架构,帮助用户快速、高效地构建、发布和管理软件应用程序。
实战
docker安装
linux自动安装
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
或者
curl -sSL https://get.daocloud.io/docker | sh
或者通过宝塔控制面板
......
linux离线安装
离线安装包下载
Index of linux/static/stable/x86_64/
你可以先找一个顺眼些的包下载(结合实际情况,不建议使用最新版本,相对不稳定)
可以直接下载到你本地电脑再上传到测试机,也可以直接在你的测试机上下载
wget https://download.docker.com/linux/static/stable/x86_64/docker-17.12.1-ce.tgz
解压
tar -zxvf docker-17.12.1-ce.tgzcp docker/* /usr/bin/cd /etc/systemd/system/vi docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target[Service]
Type=notify
ExecStart=/usr/bin/dockerd --selinux-enabled=false --insecure-registry=127.0.0.1
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinityTimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s[Install]
WantedBy=multi-user.target
保存并退出:wq
然后授权
chmod +x /etc/systemd/system/docker.service
# 重新加载配置文件(每次有修改docker.service文件时都要重新加载下)
systemctl daemon-reload
# 启动
systemctl start docker
# 设置开机启动
systemctl enable docker.service
如果出现意外情况,请自行百度吧,很多情况就不说了哈,这里只讲成功的情况
控制面板
当然有很多这个控制面板,我这里就直接选择了SimpleDocker,当然你也可以忽略直接使用命令
docker pull registry.cn-hangzhou.aliyuncs.com/seven-tao/simple-docker:0.0.7.1
创建一个进入某个文件夹创建docker-compose.yaml
然后编辑
version: '3'
services:redis:image: redis:latestrestart: alwaysweb:image: registry.cn-hangzhou.aliyuncs.com/seven-tao/simple-docker:0.0.7.1restart: alwaysports:- "9091:4050"volumes:- /tmp/simple-docker/back:/tmp/back- /var/run/docker.sock:/var/run/docker.sockdepends_on:- redis
然后在该文件所在文件夹执行
docker compose up -d
我这里有很多,你们先忽略哈哈,你们应该只有最后两条
docker常见命令
pull | 拉取镜像 | |
push | 推送镜像 | |
search | 查询镜像 | |
run | 创建并运行 | |
start/stop/restart | 启动已被停止的容器/停止容器/重启 | |
kill | 杀死运行中的某个进程 | |
rm | 删除一个或多个容器 | |
rmi | 删除一个或多个镜像 | |
pause | 暂停容器中的所有进程 | |
unpause | 恢复所有进程 | |
create | 创建一个信容器但不启动 | |
exec | 容器中执行 | |
images | 镜像 | |
ps | 列出运行中的容器 | |
stop | 停止 | |
inspect | 查看容器或镜像的详细信息。 | |
build | 使用Dockerfile文件构建一个新的Docker镜像。 | |
docker-compose | 使用docker-compose.yml文件管理多个容器的运行和停止 | |
以上就是比较常见的命令了,相对不常见我就不列出来了
配置加速器
linux
/etc/docker/daemon.json
{"registry-mirrors" : ["https://hub-mirror.c.163.com"]
}
windows
找到你的docker安装目录进入\.docker,我这里装的是docker desktop
它不让选择地址,默认就是我的C:\Users\Administrator\.docker这个位置
编辑它就对了
我这里地址不一样哈
例子
安装软件
docker ps
可以看到我现在没有运行中的容易,好的
那我加一个容器
就拿redis来做例子吧
可以看到仓库中存在这些redis镜像
你可以选择某一个镜像进行下载,可以拉取
docker pull ~~~~~~~
我这里就直接一点直接运行
docker run -d -p 6379:6379 --name redis redis:latest
可以看到redis直接给跑起来了,实际上你直接用docker run 它会检测你本地存不存在这个镜像,不存在它会pull拉取到你所指定的版本,存在就直接创建容器运行
目录挂载
volume挂载数据卷
我创建了一个为redis的数据卷
然后查询了这个数据卷的信息
docker run -d -p 6379:6379 --name redis-2 -v redis:/data redis:latest --appendonly yes --requirepass zkb.com
然后用可视化工具连接这个redis试试
可以看到连接成功,但是没有什么数据,数据卷里面肯定也是空的,那我们造点数据
docker exec -it redis-2 bashredis-cliauth zkb.comset zxs 123456get zxs
bind mount挂载主机目录
可以看到我们的宿主机是window操作系统
我在宿主机里面创建了 conf与data两个文件夹
conf里面创建了redis.conf配置文件
这个配置你们可以使用默认的也可以根据自己的实际情况配置
docker run -p 6379:6379 --name redis -v /E/docker/redis/conf:/etc/redis/redis.conf -v /E/docker/redis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes
这样我们的宿主机挂载就成功了
这里主要说明一下,如果宿主机挂载的宿主机为window则需要把 你的盘符修改为 /你的盘名/~~
例如我挂载的目录在E盘 那么我的挂载路径应为
/E/docker/redis/conf:/etc/redis/redis.conf -v /E/docker/redis/data:/data
Dockerfile 编写
我们经常download别人工程是不是总是看到别人带了一个Dockerfile文件,是不是不明白它是干嘛的,别着急我来说说
我这边就随便写个访问计数吧
然后我这个demo需要发布到docker里面,怎么搞
创建Dockerfile
# 设置基础镜像
FROM adoptopenjdk/openjdk11# 将JAR文件添加到镜像中
ADD target/demo1-0.0.1-SNAPSHOT.jar demo.jar# 定义容器启动命令
ENTRYPOINT ["java", "-jar", "/demo.jar"]
这边我就在本地pack了,那怎么执行这个Dockerfile呢
创建镜像
docker build -t demo-image .
注意最后面的 “ .” 这个是不能忽略的
已经做成镜像放到docker里面了哈
执行
docker run -d -p 6333:6333 demo-image
测试
已经ok了,当然我这里写的是最简单的Dockerfile
Docker-compose
当我们有多个服务,依赖又非常多,那么我们需要把这些服务聚合到一起,就需要写一个
docker-compose.yml
就如之前我们的控制面板,依赖了redis。。。。,那我们要把它集合到一起,就写了一个docker-compose.yml,当然也可以分开,你得提前做好容器直接的通讯,我这里只做例子
制作docker-compose.yml
version: '3'
services:redis:image: redis:latestrestart: alwaysweb:image: registry.cn-hangzhou.aliyuncs.com/seven-tao/simple-docker:0.0.7.1restart: alwaysports:- "9091:4050"volumes:- /tmp/simple-docker/back:/tmp/back- /var/run/docker.sock:/var/run/docker.sockdepends_on:- redis
执行docker-compose.yml
docker compose up -d
容器间通讯
都知道docker容器直接都是互相隔离的,应此容器之间无法ping信息,那么这些容器之间维护一套网络模式,是不是可以通讯呢
创建网络
docker network create zxs-net
docker run -d --name redis --network zxs-net --network-alias redis redis:latest