目录
1.Iaas Paas Saas (了解)
2.什么是dcoker
3.Docker 的网络模式有那些
4.Docker极速上手指南
1)配置docker源(用于安装docker)
2)docker下载镜像加速的配置
3)自动补全
4)载入镜像大礼包
5.Docker的镜像管理⭐
1)下载nginx:alpine镜像并查看
2)sl大法
3)删除镜像
4)镜像清理用的命令
prune 清除无效的镜像
5)给镜像设置标签
6)查看镜像详情信息
7)push上传镜像
8)build用于构建镜像
9)inspect用于检查信息
10)ls查看镜像
6.docker的容器管理⭐
1)run运行容器与查看容器信息
docker run背后的指令
编辑
2)删除容器(极其危险⚠)
3)进入到已经运行的容器中
4)exec与attch的区别
5)容器自启动
6)宿主机文件传输到容器中
7)保留对容器的修改(配置,代码)
8)其他容器指令
docker stats 查看所有容器的cpu,内存,磁盘,网络,进程信息.
6.端口映射
1)映射多个端口
2)把容器的端口随机映射到宿主机
3)ip绑定端口 ⭐
7.数据卷挂载
2)创建容器,如果关闭就自动删除.
3)挂载到数据卷空间
8.容器架构自动化部分
1) Dockerfil
2)Dockerfile中的指令
lass:基础设施及服务
Pass:平台及服务
Saas:软件及服务
Caas:容器及服务
docker 是一个开源容器,将应用程序及其依赖项打包成容器。
优点:轻量化、可移植性、环境一致性、快速部署和扩展、隔离性、资源利用率、持续集成与交付。docker容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、服务器等。
用途:应用程序的开发与测试、应用程序部署与交付、微服务架构、自动化测试与持续集成、资源隔离与安全性、云计算与扩展性
桥接模式:默认模式,容器使用桥接网络与主机通信,通过 NAT 访问外部网络。
主机模式:容器与主机共享网络。
容器模式:多个容器共用一个网络栈。
无网络模式:没有网络接口。
自定义网络接口:通过用户自定义网络连接容器。
--network 指定网络模式
通用的安装脚本
curl -fsSL https://get.docker.com/ -o install-docker.sh
#1.安装相关依赖.
sudo yum install -y yum-utils
#2.下载官方的docker yum源文件
yum-config-manager --add-repo
https://download.docker.com/linux/centos/docker-ce.repo
#3.替换yum源地址
sed -i
's+https://download.docker.com+https://mirrors.tuna.tsinghua.edu.cn/
docker-ce+' /etc/yum.repos.d/docker-ce.repo
#4.安装docker-ce
yum install docker-ce docker-ce-cli containerd.io docker-buildxplugin docker-compose-plugin
#5.启动
systemctl enable --now docker
#6.检查
docker version 检查
以阿里云为例:
sudo mkdir -p /etc/docker
#/etc/docker/daemon.json docker服务端的配置文件.
#配置docker下载镜像的加速地址.
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://bjjtv7cs.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
用于安装 Bash 自动补全以及额外的自动补全插件。它可以让您在使用 docker命令时更快地输入并减少输入错误的可能性。
yum install -y bash-completion bash-completion-extras
安装完成后,您需要重新启动 Bash 终端才能生效。然后,您可以开始在 Shell 命令中使用 Tab 键进行自动完成。
我为伙伴们准备了一些基础服务及系统镜像,以便于练习和使用,由于空间限制,无法上传,如有需要可私聊。
解压大礼包的useful_docker_images.tar.gz
cd oldboyedu_useful_docker_images/
for n in `ls` ;
do
docker load -i $n
done
4.docker C/S架构
启动容器
docker run -d -p 80:80 nginx:1.24-alpine
docker run:启动一个新的容器。
-d:以后台(守护进程)模式运行容器。
-p 80:80:将主机的端口80映射到容器的端口80,允许通过主机的IP和端口访问NGINX服务。
nginx:1.24-alpine:使用NGINX的1.24-alpine版本镜像创建容器。
docker客户端找dockerd服务端,问是否有nginx镜像
如果有,则启动这个镜像,后台运行,访问容器端口是80端口.
如果没有,则从远程仓库下载镜像,启动这个镜像,后台运行,访问容器端口是80端口.
1. 提示你本地没有nginx镜像 nginx:latest最新版
Unable to find image 'nginx:latest' locally
2. 找远程仓库下载
latest: Pulling from library/nginx
a2abf6c4d29d: Pull complete
a9edb18cadd1: Pull complete
589b7251471a: Pull complete
186b1aaa4aa6: Pull complete
b4df32aa5a72: Pull complete
a0bcbecc962e: Pull complete
3. 运行镜像,成为docker容器.
Digest:
sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c
9b31
Status: Downloaded newer image for nginx:latest
9020c66ace48effa904063f84c664535b8cc3aa2b95535df438c9f2f4952cc35
4.查看镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 4 months ago 141MB
5.查看容器
docker ps
6. 访问10.0.0.81:80--->容器的80端口
注意事项:此处使用了docker -p端口映射公共,需要使用IPtables的nat功能,(iptables -t nat -nl)需要开启系统的内核转发功能
# tail -1 /etc/sysctl.conf
net.ipv4.ip_forward = 1
# sysctl -p
net.ipv4.ip_forward = 1
#1. ※※※※※
docker pull 下载镜像
docker pull nginx:1.22-alpine
#2. ※※※※※
docker image ls 简写为docker images查看镜像
docker images -a 查看所有镜像包含隐藏镜像.
查找镜像:
docker search
访问hub.docker.com
#指定版本
只写服务名字一般下载服务的最新版本.
nginx 下载ngx最新版本 nginx:latest
下载ngx最新稳定的版本 nginx:stable
下载指定的版本 nginx:1.20.2
#指定系统
nginx镜像默认的系统是Debian系统
docker pull nginx:1.20.2-alpine 使用alpine系统更加节约空间
docker镜像使用的系统 | |
Ubuntu | |
Debian | bullseye,bluster,bookwom |
Centos | |
alpone | 镜像非常小(命令,依赖精简)Linux内核+busybox |
保存docker镜像(save),其他节点导入(load)。
集群规模大可以搭建本地私有镜像仓库
docker image save #docker save
docker image load #docker load
#1.1g个节点保存docker 镜像 -o输出到指定的文件.
docker save nginx:alpine -o nginx_alpine.tar
#2. 导入load
docker load -i nginx_alpine.tar
#通过awk取行,取列拼接处docker save xxx -o xxxx的命令
docker images |awk 'NR>1{print "docker save",$1":"$2,"- o",$1"_"$2".tar"}'
最后通过|bash运行
docker images:列出本地所有的Docker镜像。
awk命令:使用awk命令从表格中提取信息,NR>1表示从第二行开始,print表示输出结果。$1和$2表示第一列和第二列,用冒号连接起来,构成镜像名称和版本号。$1"_"$2".tar"则表示将镜像名称和版本号用下划线连接起来,并加上.tar扩展名,形成导出文件的名称。
|bash:通过管道将输出传递给bash解释器运行,实现批量导出Docker镜像的目的。
可以书写批量导出docker镜像脚本.
要批量导入Docker镜像,可以使用以下脚本:
#!/bin/bash
# 指定导入的目录
image_dir="/path/to/image/directory"
# 遍历目录中的所有tar文件
for file in $image_dir/*.tar; do
# 获取文件名(不含扩展名)
filename=$(basename "$file" .tar)
# 导入镜像
docker load -i "$file"
# 标签镜像
docker tag "$filename" myregistry.com/"$filename"
done
请根据实际情况修改image_dir变量的值,将其指定为包含要导入的镜像tar文件的目录。脚本将遍历该目录下的所有tar文件,并依次导入镜像并为其打上新的标签。
脚本中的myregistry.com是示例中的镜像仓库地址,你可以根据实际情况修改为你自己的镜像仓库地址。
要查找Docker镜像使用的镜像仓库地址,可以使用以下命令:
docker image inspect
将替换为你想要查找的镜像的名称或ID。执行以上命令后,会返回包含各种详细信息的JSON格式输出。在输出中,你可以找到"RepoTags"字段,其中包含了镜像的仓库地址和标签信息。
保存脚本为一个文件(例如import_images.sh),然后在终端中使用bash import_images.sh或./import_images.sh命令来运行脚本。脚本会逐个导入镜像并为其打上标签。
请注意,在运行脚本之前,确保目标镜像仓库已经存在,并且你具有上传镜像到该仓库的权限。
docker image rm === docker rmi
删除镜像
选项-f强制删除镜像.
docker image prune #命令用于清理本地系统中不再使用的Docker镜像。这些镜像可能是由于构建过程中产生的临时镜像、无标签的镜像或者已被停止的容器留下的悬空镜像。
docker images -a #可以查看系统中所有镜像,包含隐藏镜像.
该命令将会删除无用的镜像、停止的容器、未使用的网络和数据卷等。同样,如果您想在删除时跳过确认提示,可以使用 -f
标志。
docker image prune
docker tag nginx:1.22-alpine nginx:1.22-alpine-oldboy
docker 家目录/var/lib/docker/
下面是/var/lib/docker/目录中的一些重要子目录和文件:
containers/:该目录包含所有容器相关的文件,每个容器对应一个子目录。其中包括容器的元数据、日志、文件系统等。
image/:该目录包含所有镜像相关的文件,每个镜像对应一个子目录。其中包括镜像的元数据、层文件、配置等。
volumes/:该目录包含所有Docker卷(volumes)相关的文件,每个卷对应一个子目录。其中包括卷的数据和元数据。
networks/:该目录包含所有Docker网络相关的文件,每个网络对应一个子目录。其中包括网络的配置和状态信息。
swarm/:该目录包含Docker Swarm集群相关的文件,包括集群的状态、节点信息、服务定义等。
trust/:该目录包含与图像信任相关的文件,包括签名和信任数据库。
tmp/:该目录用于存储临时文件,例如构建镜像时产生的临时文件。
此外,/var/lib/docker/目录还包含一些其他重要的文件,如Docker引擎的配置文件、日志文件等。
#查看 nginx:alpine镜像的信息,输出的是json格式.
docker image inspect nginx:alpine
#jq专门过滤,json形式数据
docker inspect mysql:8.0-debian |jq .[].Id
docker login <仓库地址>
docker tag <本地镜像> <仓库地址>/<镜像名称>:<标签>
docker push <仓库地址>/<镜像名称>:<标签>
docker build -t <镜像名称>
执行该命令后,Docker 将会根据 Dockerfile 中的指令来构建镜像,并将其命名为指定的名称。
inspect结果是json形式
进行过滤可以用三剑客过滤
可以用jq过滤,jq是json格式数据处理工具
docker images
docker images -a显示所有镜像(包含隐藏的中间过程镜像,构建镜像的时候会有)
docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker container run -d -p 80:80 nginx
docker ps -a #显示所有状态容器.
docker ps #只显示运行中的容器.不会显示其他状态容器.
docker run -d -p 81:80 --name ngx_1.24_alpine_v2 --restart=always nginx:1.24-alpine-new
#1. 拉取镜像
docker pull nginx:1.24-alpine-new
#2. 创建容器
docker create -p 81:80 --name ngx_1.24_alpine_v2 --
restart=always nginx:1.24-alpine-new
#3. 启动容器
docker start ngx_1.24_alpine_v2
#4. 检查结果
docker ps
docker container rm == docker rm
docker rm 容器名字或id
docker rm -f 容器名字或id
#显示所有容器(-a)并只显示容器id (-q)
docker ps -a -q
#删除容器
docker rm -f `docker ps -a -q`
#连接到运行中的容器中
docker exec -it ngx_1.24_alpine /bin/sh #对于其他系统可以用/bin/bash
docker run的时候设置容器重启策略
docker run -d -p 80:80 --name ngx_1.24_alpine --restart=always nginx:1.24-alpine-new
docker cp index.html ngx_1.24_alpine:/usr/share/nginx/html/
保留修改,生成镜像.
docker commit ngx_1.24_alpine nginx:1.24_v2_conf_index
docker run -d -p 88:80 --name ngx_1.24_v2_conf_index --restart always nginx:1.24_v2_conf_index
docker kill 用于结束指定的容器. stop无法关闭,可以使用kill.
docker top 查看容器中进程信息.
资源限制通过docker run的时候加上资源限制的选项.
限制最大使用的内存50MB,最多使用1个cpu核心.
docker run -d -p 89:80 --name "ngx_1.24_limit" -m 50MB --cpus
1 nginx:1.24-alpine-new
docker stats查看.
一个一个写
docker run -d -p 8080:8080 -p 8081:8081 -p 8082:8082 -p 86:80
nginx:1.20.2-alpine
docker port hopeful_northcutt(容器名字或id)
docker run -d -P --name ngx_ports_v3 nginx:1.24-alpine-new
随机映射本质:根据镜像中的配置 EXPOSE配置映射端口.
docker inspect nginx:1.24-alpine-new |grep -i -A1 expose
docker run -d -p 172.16.1.81:8080:80 --name secure_nginx nginx:1.24-alpine-new
ss -lntup |grep 8080
1)如何解决数据持久化问题? 数据卷(挂载),让数据永久保存在宿主机中.
docker run -v
指定要挂载的目录/文件
-v 宿主机的路径:容器内部路径
docker run -d -p 8848:80 --name nginx_volumn --restart always \
-v `pwd`/index.html:/usr/share/nginx/html/index.html \
nginx:1.24-alpine
--restart=always与--rm冲突.
docker run -d -p 12306:80 --name nginx_game --rm \
-v `pwd`:/usr/share/nginx/html/ \
nginx:1.24-alpine-new
docker volume create data
docker run -d -P --name nginx_data -v data:/var/log/
nginx:1.24-alpine-new
docker inspect data
[
{
"CreatedAt": "2023-07-11T16:01:00+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/data/_data",
"Name": "data",
"Options": null,
"Scope": "local"
}
]
1. 准备目录及Dockerfile
[[email protected] /server/dockfile/01-centos-nginx]# cat
Dockerfile
FROM centos:7
LABEL author="mf996"
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum -y install nginx
RUN rm -rf /usr/share/nginx/html/index.html
RUN echo 'mf linux' > /usr/share/nginx/html/index.html
CMD ["nginx","-g","daemon off;"]
2. 根据Dockerfile构建镜像
docker build . -t 'nginx:1.20.2-centos7'
注意: .表示 Dockerfile在当前目录下面 -t 就是给自定义镜像命名.
3. 运行
docker run -d --name 'nginx-1.20.1-centos7-01' -p 81:80
nginx:1.20.2-centos7
4. 调试
Dockerfile指令 | 含义 | 应用 | 建议 |
---|---|---|---|
Dockerfile开头部分 | |||
FROM | 指定基本镜像类似于docker pull下载镜像 | FROM ubuntu:20.04 | 尽量少些Ubuntu或Ubuntu:latest,尽量指定具体的版本 |
LABEL | 用于指定容器的属性信息,(个人信息) | LABEL maintaline="mengfei996" | 推荐使用LABEL,不推荐使用下面的MAINTAINER |
MAINTAINER | 不再使用 | ||
ENV | 用于创建Dockerfile中使用的变量 | ENV Tengline_Version 2.3.3 | 软件版本可以创建使用变量。 |
Dokerfile中间处理部分 | |||
RUN | 制作镜像过程中需要执行的命令,通常系统配置,服务配置,部署。但不能出现阻塞当前终端的命令。 | RUN系统命令即可 | 不建议使用连续多个RUN,合并连续多个RUN.ADD |
ADD | 可以把指定文件或目录拷贝到容器中,会解压压缩包。相对于当前目录 | ADD restart.tar.gz /app/code/restart/ | 拷贝压缩包使用 |
COPY | 可以把指定文件或目录拷贝到容器中(指定目录),不支持自动解压,相当于当前目录。 | COPY nginx.conf /etc/nginx/nginx.conf | 拷贝文件或目录 |
WORKDIR | 指定容器的默认工作目录 | WORKDIR /app/code/restart/ ADD restart.tar.gz . | 一般用于配合ADD,COPY需要书写容器中路径指令。Dockerfile中使用相对路径操作容器。 |
VOLUME | 挂载数据卷 | VOLUME /usr/share/nginx/html | 创建随机数据卷挂载容器的目录。 未来推荐dockers run的时候指定 -v即可 |
Dockerfile结尾部书写的内容 | |||
EXPOSE | 指定镜像要对外暴露的端口 | EXPOSE 80 | 用于指定一或多个容器的端口. 未来这个端口可以-p识别.xxxx:80 |
CMD | 用于指定容器的入口命令。入口命令可以在docker run的时候替换,运行镜像启动容器的时候,容器默认运行的命令。 | CMD ["命令","参数01","参数02"] CMD ["nginx","-g","daemon off",] | 大部分都会使用CMD. |
ENTRYPOINT | 用于指定容器的入口命令,无法被docker run替换,docker run指定时候仅仅作为entrypoint命令的参数而已. | ENTRYPOINT ["executable","param1","param2"] | 使用不多 |