Docker详解
2024-01-21 22:00:40 1 举报
AI智能生成
Docker详解
作者其他创作
大纲/内容
部署流程繁琐
环境不一致
资源隔离问题
交付流程复杂
为什么要用docker
容器&虚拟机
容器的作用
容器-运行的软件
镜像=软件安装包
仓库-应用商店
什么是docker
docker client
docker server
engine
docker daemon
docker registry
docker的架构
核心概念
docker介绍
注意事项
社区版免费
docker-ce
企业版收费
docker-ee
docker版本
安装最新版本docker
yum install -y docker
Linux上安装docker
windows上安装docker
设置docker镜像
安装docker
docker search
查找本地镜像
阿里云平台申请一个个人的加速器
将这个配置写入到配置文件中\"registry-mirrors\": [\"https://trgj5cbe.mirror.aliyuncs.com\"]
vim /etc/docker/daemon.json
systemctl restart docker
重启docker
设置镜像加速
docker pull
拉取镜像
docker images
查看本地镜像
docker rmi
删除镜像
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
镜像打标签
镜像
docker --name 容器名称
指定容器名称
前面的容器外部也就是宿主机的端口后面是容器内服务的端口
docker -p 80:80
大P表示随机映射到宿主机中的一个端口
docker -P
端口映射
no:表示不重启
docker --restart on-failure:3
on-failure:当失败时重启,还可以加上:3 指定最多重启三次,如果三次重启都失败则不再重启
always:只要关闭就自动重启
重启策略
docker -e
docker --env
查看容器的所有配置信息
docker inspect
让容器执行一个命令
docker exec
环境变量
一般适用于测试场景,只要这个容器停止了不管是手动还是其他都会删除
docker run --rm
退出时删除
限制内存
docker -m
限制CPU
docker -cpus
常用的限制CPU、内存
限制容器资源
PS:运行的容器的前提是这个容器内必须有一个服务一直在运行,不然启动容器后,容器会自动退出,例如启动一个centos镜像的容器,容器就会自动退出
创建并运行一个容器
查看所有当前正在运行的容器
docker ps
查看所有容器,包括停止的
docker ps -a
查看一个容器当前的实时状态信息
docker stats
查看容器
docker rm
强制删除容器
docker rm -f
删除容器
docker stop
停止容器
docker start
启动容器
docker exec -itd /bin/bash
这个目录下会有 当前没删除的容器ID的目录
ls /var/run/docker/libcontainerd/
进入容器内部
这个是将容器从启动到当前的所有日志
docker logs
实时查看容器的日志
docker logs -f 896e0a7d
实时查看容器最近的20行日志
docker logs -f -n 20 896e0a7d
查看容器日志
可以通过这个命令去查更多的docker run的选项
docker run --help
容器
基础命令
docker基础操作
docker start myweb
docker stop myweb
docker restart myweb
docker kill -s kill myweb参数 -s #向容器发送信号
启动/停止/重启/杀掉容器docker start/stop/restart/kill
docker run -d --name nginx nginx:latest后台启动并运行一个名为nginx的容器,运行前它会自动去docker镜像站点下载最新的镜像文件
docker run -d -P 80:80 nginx:latest后台启动并运名为nginx的容器,然后将容器的80端口映射到物理机的80端口
docker run -it nginx:latest /bin/bash以交互式模式运行容器,然后在容器内执行/bin/bash命令
-d #后台运行容器,并返回容器ID-i #以交互式模式运行容器,常与-t参数同时使用-t #给容器重新分配一个伪终端,常与-i参数同时使用--name #给容器指定一个名称-m #指定容器使用内存的最大值--net #指定容器使用的网络类型--link #链接到另一个容器
创建并启动一个新的容器docker run
docker rm -f mydocker#强制删除容器mydocker
docker rm -f dockerA dockerB#强制删除容器dockerA,dockerB
docker rm -v mydocker#删除容器,并删除容器挂载的数据卷
-f #强制删除一个运行中的容器-l #删除指定的链接-v #删除与容器关联和卷
删除容器docker rm
docker create --name myserver nginx:latest#创建一个名为myserver的容器
创建一个新的容器但不启动它docker create
docker exec -it mydocker /bin/sh /server/scripts/docker.shhello world!!!!!!!!!!#以交互模式执行容器中的/server/scripts/docker.sh脚本
docker exec -it mydocker /bin/sh root@b1a0703e41e7:/##以交互模式给容器分配一个伪终端连接
-d #在后台运行-i #保持STDIN打开-t #分配一个伪终端
在运行的容器中执行命令docker exec
docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESbd96d72ed9c7 google/cadvisor \"/usr/bin/cadvisor...\" 47 hours ago Up 47 hours 0.0.0.0:8082->8080/tcp cadvisor665563143eb7 grafana/grafana \"/run.sh\" 2 days ago Up 2 days 0.0.0.0:3000->3000/tcp grafanaf2304dad5855 tutum/influxdb \"/run.sh\
docker ps -n 2CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESbd96d72ed9c7 google/cadvisor \"/usr/bin/cadvisor...\" 47 hours ago Up 47 hours 0.0.0.0:8082->8080/tcp cadvisor665563143eb7 grafana/grafana \"/run.sh\" 2 days ago Up 2 days 0.0.0.0:3000->3000/tcp grafana#列出最近创建的2个容器
docker ps -a -qbd96d72ed9c7665563143eb7f2304dad58559921d2660307#显示所有容器的ID
-a #列出所有容器包括停止的-f #根据条件过滤显示内容-l #列出最近创建的容器-n #列出最近创建的N个容器,N为数字-q #只显示容器ID-s #显示总文件大小
列出容器(正在运行)docker ps
docker inspect bd96d72ed9c7[ { \"Id\": \"bd96d72ed9c713591ba8db0ed4c0ae2689188255da71033c7bced6bb34aa8542\
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' influxdb172.17.0.2#获取容器名为influxdb\\cadvisor的IP地址
-f #指定返回值格式或模板文件-s #显示总文件大小--type #为指定类型返回JSON
获取容器的元数据docker inspect
docker logs -f cadvisorI0523 09:22:10.794233 1 storagedriver.go:48] Using backend storage type \"influxdb\"I0523 09:22:10.794295 1 storagedriver.go:50] Caching stats in memory for 2m0s#跟踪查看容器cadvisor的日志
-f #跟踪日志输出-t #显示时间戳--tail #只显示最新n条容器日志--since #显示某个开始时间的所有日志
获取容器的日志docker logs
docker port cadvisor8080/tcp -> 0.0.0.0:8082#显示cadvisor容器的端口映射信息
显示指定容器的端口映射docker port
docker commit -a \"mingongge\" -m \"add a new images\" bd96d72ed9c7 newdocker_images:v1.0.0sha256:20ee805752cb7cae660fbae89d7c6ea4a9c6372f16a6cb079ecf6c79f87ed8c9[root@docker ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEnewdocker_images v1.0.0 20ee805752cb 7 seconds ago 62.2 MB#将容器bd96d72ed9c7重新生成一个新的镜像名为newdocker_images
-a #提交的镜像作者-c #使用Dockerfile指令来创建镜像-m #提交时附上说明文字-p #在commit时,将容器暂停
用已存在的容器重新创建一个新的镜像docker commit
docker cp /data/index.html bd96d72ed9c7:/web/#将物理主机中的/data/index.html拷贝到容器bd96d72ed9c7:/web/目录下
docker cp /data/index.html bd96d72ed9c7:/web/index.php#将物理主机中的/data/index.html拷贝到容器bd96d72ed9c7:/web/目录下并改名为index.php
docker cp bd96d72ed9c7:/web /data/#拷贝容器bd96d72ed9c7:/web/目录到物理主机中的/data/目录下
用于容器与物理主机之间拷贝文件docker cp
docker login #登陆到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hubdocker logout #登出一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub
docker login -u username -p passwordLogin Succeeded[root@docker ~]# docker logoutRemoving login credentials for https://index.docker.io/v1/#登录与登出默认的容器镜像仓库
-u #登陆的用户名-p #登陆的密码
用于登录与登出容器镜像仓库docker login/logout
docker pull nginxUsing default tag: latestTrying to pull repository docker.io/library/nginx ... latest: Pulling from docker.io/library/nginxf2aa67a397c4: Already exists 3c091c23e29d: Pulling fs layer 4a99993b8636: Pulling fs layer#从镜像仓库中拉取或者更新指定镜像,输出信息如上[root@docker ~]# docker push newdocker_images:v1.0.0#上传镜像到镜像仓库上
docker pull/push
docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEnewdocker_images v1.0.0 20ee805752cb 28 minutes ago 62.2 MBdocker.io/grafana/grafana latest 4700307f41f2 9 days ago 238 MBregistry.jumpserver.org/public/guacamole 1.0.0 6300349f2642 2 months ago 1.23 GBdocker.io/google/cadvisor latest 75f88e3ec333 5 months ago 62.2 MBdocker.io/tutum/influxdb latest c061e5808198 19 months ago 290 MB#列出本地所有的镜像
docker images -q20ee805752cb4700307f41f26300349f264275f88e3ec333c061e5808198#只显示容器ID
docker images --digestsREPOSITORY TAG DIGEST IMAGE ID CREATED SIZEnewdocker_images v1.0.0 <none> 20ee805752cb 32 minutes ago 62.2 MBdocker.io/grafana/grafana latest sha256:364bec4a39ecbec744ea4270aae35f6554eb6f2047b3ee08f7b5f1134857c32c 4700307f41f2 9 days ago 238 MBregistry.jumpserver.org/public/guacamole 1.0.0 sha256:ea862bb2e83b648701655c27900bca14b0ab7ab9d4572e716c25a816dc55307b 6300349f2642 2 months ago 1.23 GBdocker.io/google/cadvisor latest sha256:9e347affc725efd3bfe95aa69362cf833aa810f84e6cb9eed1cb65c35216632a 75f88e3ec333 5 months ago 62.2 MBdocker.io/tutum/influxdb latest sha256:5b7c5e318303ad059f3d1a73d084c12cb39ae4f35f7391b79b0ff2c0ba45304b c061e5808198 19 months ago 290 MB[root@docker ~]# docker images --no-trunc REPOSITORY TAG IMAGE ID CREATED SIZEnewdocker_images v1.0.0 sha256:20ee805752cb7cae660fbae89d7c6ea4a9c6372f16a6cb079ecf6c79f87ed8c9 32 minutes ago 62.2 MBdocker.io/grafana/grafana latest sha256:4700307f41f249630f6d772638ad8d32c7d7e3ec86c324d449d5e21076991bb7 9 days ago 238 MBregistry.jumpserver.org/public/guacamole 1.0.0 sha256:6300349f264218e783cd2bd6f7863d356ac8d5ac05a62584cb4680af7ebec292 2 months ago 1.23 GBdocker.io/google/cadvisor latest sha256:75f88e3ec333cbb410297e4f40297ac615e076b4a50aeeae49f287093ff01ab1 5 months ago 62.2 MBdocker.io/tutum/influxdb latest sha256:c061e580819875fad91910841fd3fc53893524bbb9326a68b2470861633aebb1 19 months ago 290 MB#可以对比下两个参数显示的不同信息
-a #列出所有的镜像(含中间映像层,默认,过滤掉中间映像层);--digests #显示镜像的摘要信息;-f #显示满足条件的镜像;--format #指定返回值的模板文件;--no-trunc #显示完整的镜像信息;-q #只显示镜像ID。
显示系统本地容器镜像文件docker images
docker rmi 20ee805752cbUntagged: newdocker_images:v1.0.0Deleted: sha256:20ee805752cb7cae660fbae89d7c6ea4a9c6372f16a6cb079ecf6c79f87ed8c9#删除一个镜像
-f #强制删除
删除镜像docker rmi
docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEnewdocker_images v1.1.0 858cbd9ba687 39 seconds ago 62.2 MB[root@docker ~]# docker tag newdocker_images:v1.1.0 newdocker_images:v2[root@docker ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEnewdocker_images v1.1.0 858cbd9ba687 4 minutes ago 62.2 MBnewdocker_images v2 858cbd9ba687 4 minutes ago 62.2 MB#从结果可以看出两个容器的ID是一样的,只是TAG改变了,类似于linux中文件与文件的硬链接一样,其两者的inode号相同。
标记本地镜像docker tag
docker build https://github.com/nginxinc/docker-nginx/
-f #指定要使用的Dockerfile路径--label=[] #设置镜像使用的元数据;-m #设置内存最大值--memory-swap #设置Swap的最大值为内存+swap,\"-1\"表示不限swap--no-cache #创建镜像的过程不使用缓存--pull #尝试去更新镜像的新版本-q #安静模式,成功后只输出镜像ID--rm #设置镜像成功后删除中间容器--ulimit #Ulimit配置
使用Dockerfile创建镜像docker build
docker history newdocker_images:v2IMAGE CREATED CREATED BY SIZE COMMENT858cbd9ba687 32 minutes ago -storage_driver=influxdb -storage_driver_d... 0 B add new images75f88e3ec333 5 months ago /bin/sh -c #(nop) ENTRYPOINT [\"/usr/bin/c... 0 B <missing> 5 months ago /bin/sh -c #(nop) EXPOSE 8080/tcp 0 B <missing> 5 months ago /bin/sh -c #(nop) ADD file:e138bb5c0c12107... 26.5 MB <missing> 5 months ago /bin/sh -c apk --no-cache add ca-certifica... 30.9 MB <missing> 5 months ago /bin/sh -c #(nop) ENV GLIBC_VERSION=2.23-r3 0 B <missing> 5 months ago /bin/sh -c #(nop) MAINTAINER dengnan@goog... 0 B <missing> 5 months ago /bin/sh -c #(nop) CMD [\"/bin/sh\"] 0 B <missing> 5 months ago /bin/sh -c #(nop) ADD file:c05a199f603e2a9... 4.82 MB
-H #以可读的格式打印镜像大小和日期,默认为true;--no-trunc #显示完整的提交记录;-q #仅列出提交记录ID。
查看指定镜像的创建历史docker history
显示 Docker 系统信息,包括镜像和容器数docker info
显示 Docker 版本信息docker version
docker常用的20个命令
Docker 数据卷是 Docker 中用于持久化数据的机制。它们允许在容器之间或容器与宿主机之间共享、持久化数据,并且能够独立于容器的生命周期存在。
是什么
容器本身是临时性的,当容器停止或删除时,容器内的文件系统改动通常会丢失。数据卷允许数据持久化,确保数据不会随着容器的销毁而丢失。
数据持久性
容器之间可以通过共享数据卷来共享数据。这对于微服务架构或多个容器共享配置文件、日志、数据库等数据是很有用的。
数据共享
数据卷提供了方便的数据管理方式。你可以备份、恢复或迁移数据卷,使数据的管理更加便捷。
数据管理
为什么需要
数据卷允许你在容器停止或删除后保留数据,确保数据的持久性。
持久化存储
多个容器可以共享同一个数据卷,这对于共享配置、日志或其他共享数据很有用。
容器间数据共享
使用绑定挂载(Bind Mounts),你可以将宿主机上的目录挂载到容器中,使得容器可以访问主机的文件系统,也可以让主机操作容器内的数据。
宿主机与容器之间数据共享
通过将数据与容器解耦,数据卷可以简化容器的数据管理,使得备份、恢复和迁移更加容易。
简化容器数据管理
能干什么
基本概念
这里的文件路径是容器内的路径,这里会自动在宿主机上创建一个目录通常是这个路径/var/lib/docker/volumes/0b7a22927cc0a30b0f88c51547b24804c4d842daa9aca41e4970e8ec79bd017d/_data
docker run --rm -d -p 80:80 --name nginx_volume -v /usr/share/nginx/html nginx
匿名绑定方式由于不知道名称,因此如果需要查看数据卷在主机的哪儿个位置,可以通过docker inspect 容器ID来查看mounts下的内容
但只是临时存在了宿主机,但不会持久化存储,一旦容器删除,数据卷也会被删除
匿名绑定
但这边还没有自由的指定路径来关联容器内路径
前面的是宿主机文件路径,不写绝对路径默认是在:/var/lib/docker/volumes/nginx-html/_data
docker run --rm -d -p 80:80 --name nginx_volume -v nginx-html:/usr/share/nginx/html nginx
具名绑定
docker run --rm -d -p 80:80 --name nginx_volume -v /app/docker/nginxtest:/usr/share/nginx/html nginx
绑定并加载宿主机某个文件目录到容器中,这种方式是最常用的。
PS:这边需要先将Linux的防火墙关闭,不然没法挂载会提示没有权限
bind mount
绑定方式
数据卷是 Docker 管理的持久化数据存储,独立于容器。
存储在主机上的特定目录(通常在 /var/lib/docker/volumes 下)
数据卷的生命周期与容器无关,即使容器被删除,数据卷仍然存在
特点
docker run -v myvolume:/path/in/container my_image
示例:前面是宿主机的路径,后面是容器内的路径
数据卷(Volumes)
将主机上的特定目录挂载到容器内,直接映射到主机文件系统
挂载的数据与主机文件系统紧密关联,容器停止后仍然存在
docker run -v /host/path:/container/path my_image
示例
bind mount会覆盖目录里原本的内容
补充
挂载主机目录(Bind Mounts)
将一个 tmpfs 挂载到容器内,提供临时性的内存存储。
数据仅在容器运行时存在,容器停止后即被销毁。
仅存储在容器的内存中,永远不会写入文件系统
swarm服务使用tmpfs挂载将敏感信息挂载到容器中
tmpfs 挂载(tmpfs Mounts)
使用远程存储后端,如 NFS 或 Amazon EFS,将远程存储挂载到容器内
允许容器在不同主机之间共享数据。
docker run -v nfs-server:/path/in/container my_image
远程数据卷(Remote Volumes)
数据存储方式个人理解:对数据卷的另一种分类方式吧
Volumes 通常也优于容器的可写层,使用 Volumes 不会增加容器的体积,并且 Volumes 的内容存储在外部独立于容器的生命周期。如果容器不产生持久化数据,可以考虑使用 tmpfs 内存映射(只保存在容器的内存中)的方式来避免数据存储在其他可能的地方,避免增加容器的体积。
docker volume --help
查看当前机器上所有的volume
docker volume ls
docker volume create my-vol
创建一个数据卷
docker volume inspect my-vol
查看指定数据卷的信息
docker volume rm my-vol
移除指定数据卷的
docker volume prune
清除无主的数据卷
使用命令
数据卷管理
挂载主机目录是将主机中的特定目录直接挂在到容器内部使用
挂载主机目录 - bind mounts
内存映射是将内存映射到容器内供容器内部使用
内存映射 - tmpfs
Docker 网络是一种允许容器之间或容器与外部世界进行通信的基础设施。它提供了连接和通信的机制,使得 Docker 容器能够相互交流和访问外部资源。
容器之间可能需要相互通信,比如微服务架构中的各个服务之间需要交换数据或进行协作。
容器通信
有时容器需要访问外部资源,比如外部的数据库、API 或者其他网络服务。
外部访问
Docker 网络提供网络隔离的功能,确保容器之间的通信可以受到控制和管理。
隔离和安全
允许容器之间进行网络通信,这对于构建分布式应用程序或者服务至关重要。
容器间通信
某些 Docker 网络驱动程序允许不同主机上的容器进行通信,这使得在多主机环境下构建和管理分布式应用程序更为便捷。
跨主机通信
不同的网络可以提供不同级别的隔离,确保容器之间的通信受到控制,提高安全性。
网络隔离
允许容器访问外部资源,比如访问互联网、其他容器、宿主机上的服务等。
在主机上创建一个docker0的虚拟网桥,在docker0上创建一堆虚拟网卡,地址一般为172.17.0.1;一般在主机上一般在容器内主机上的命名方式通常是vethxxx,容器内的命名方式通常是eth0
桥接bridge默认模式
容器与宿主机共享网络空间,容器使用宿主机的网络栈,不进行端口映射,容器的网络性能更高,但可能会导致端口冲突问题。
host
Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
完全隔离,与外部任何机器都无法网络访问,只有自己的lo本地网络地址:127.0.0.1
如果想要访问只能通过docker exec进去容器的方式去访问
none
这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。
container
不用docker自带的网络模式,自己去定制自己的网络模式
命令:docker network command
docker network create --driver bridge --subnet 192.168.11.0/24 --gateway 192.168.11.1 docker-network-test
新建一个bridge模式的网卡
docker run -itd --rm -P --name centos-network --net docker-network-test centos
docker run -itd --rm -P --name centos-network01 --net docker-network-test centos
docker run -itd --rm -P --name centos-network02 --net docker-network-test centos
使用新建bridge模式的网卡去新建容器
docker network connect docker-network-test centos-network01
docker-network-test是我们自定义新建的bridge模式的网卡centos-network01是我们用默认模式启动的容器这边就是将容器连接到这个自定义的网卡上,这样docker就会在这个容器中新增一个这个自定义网卡的网口
自定义
网络模式
网络 network
Dockerfile 是一个文本文件,包含了一系列用于自动化构建 Docker 镜像的指令和命令。通过编写 Dockerfile,你可以定义一个容器镜像的配置和内容,使得可以自动化地构建出一个一致、可重复的容器镜像。
提供一个用于自定义构建镜像的配置文件,文件中描述如何构建一个对象利用docker build命令来启动指定的dockerfile文件,就可以按照配置的内容将镜像构建出来
Dockerfile 允许你将容器镜像的构建过程定义成一系列命令,从而实现自动化的构建流程。这样其他人或者团队可以重现相同的镜像,确保镜像的一致性和可重复性。
自动化构建
Dockerfile 是文本文件,可以被纳入版本控制系统,允许团队协作、共享和追踪镜像构建的变化。
版本控制
通过 Dockerfile,你可以定制容器镜像,安装特定的软件、配置环境变量、设置工作目录等,以满足特定应用程序的需求。
定制化镜像
通过 FROM 指令指定基础镜像,作为构建的起点。
定义基础镜像
使用 RUN 指令执行命令,例如安装软件包、下载文件等。
执行命令
使用 ENV 指令设置环境变量,定义容器运行时的环境。
设置环境变量
使用 EXPOSE 指令声明容器需要监听的端口。
暴露端口
使用 COPY 或 ADD 指令将文件从主机复制到容器内。
添加文件
使用 WORKDIR 指令设置容器内的工作目录。
定义工作目录
使用 CMD 或 ENTRYPOINT 指令定义容器启动时执行的命令或程序。
启动应用程序
FROM openjdk:11
指定一个基础镜像,只能写一个
FROM
MAINTAINER dockertest<dockertest@dockertest.com>
描述镜像的作者以及联系方式等信息(可选)
MAINTAINER
LABEL version=\"1.0\"
LABEL description=\"这是一个学习测试的dockerfile\"
镜像的标签信息(可选)可以写多个
LABEL
ENV JAVA_ENV envENV APP_NAME test-dockerfile
ENV JAVA_ENV=env APP_NAME=test-dockerfile
环境变量配置可以写多个
ENV
RUN ls -al
第一种写法就是直接写shell命令即可
RUN mdkri /www/dockerfile/test
第二种写法类似函数调用,第一个参数作为可执行的文件,后面都是参数
RUN [\"需要执行的sh文件\
在构建镜像时需要执行的shell命令
RUN
前面是是源后面是目的,前面是主机后面是容器
ADD /etc/hosts /etc/hosts
ADD [\"/etc/hosts\
将主机中的指定文件复制到容器中的目标位置,类似cp命令
ADD
WORKDIR /app
设置容器中的工作目录,如果该目录不存在会自动创建
WORKDIR
容器里也有这个目录
VOLUME [\"/app/config\"]
将宿主机中的指定目录挂载到容器内
VOLUME
需要将容器内的8080端口暴露到宿主机,但是这个端口还只是容器内,宿主机上没有与之绑定的端口
EXPOSE 8080
设置容器启动后需要暴露的端口
EXPOSE
CMD ping 127.0.0.1
作用是描述启动容器时默认执行的脚本
ENTRYPOINT 不会被运行容器时指定的命令所覆盖,而CMD会被覆盖
在整个dockerfile只能设置一次,如果有多个只生效最后一个
CMDENTRYPOINT两个命令任选其一即可
后续容器中的命令都是以appadmin去执行
USER appadmin
设置容器的用户,前提是容器中得有这个用户且有对应的文件权限
USER
在镜像中自定义一个变量,可以在docker build的使用,可以更灵活
ARG
当前镜像为A,我在创建在A的dockerfile中写上ONBUILD RUN ls -al那在镜像B里,我们写FROM 镜像A后,在构建镜像B时就会执行上面的ls -al
举例来说明下
ONBUILD
在这个例子中,容器的停止信号被设置为 SIGQUIT。当 Docker 停止容器时,它会发送 SIGQUIT 信号给容器内运行的应用程序。你可以根据你的应用程序需要选择适当的停止信号。
STOPSIGNAL SIGQUIT
STOPSIGNAL
在上面的例子中,HEALTHCHECK 指令用于定义容器的健康检查规则。这个规则使用了 curl 命令来检查容器中的某个服务是否处于健康状态。参数解释如下:--interval=30s:设置健康检查的时间间隔,默认为 30 秒。--timeout=10s:定义检查的超时时间,默认为 10 秒。--start-period=5s:容器启动后首次进行健康检查的等待时间,默认为 0 秒。--retries=3:在被标记为不健康前尝试检查的次数,默认为 3 次。
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \\ CMD curl -f http://localhost/ || exit 1
健康检查
HEALTHCHECK
拓展指令
常用指令
docker commit -a \"tianzhou\" -m \"tianzhou check again\" nginx_commit tianzhoungnginx
基于现有的一个容器构建一个新的镜像
commit
build
构建镜像
dockerfile
Docker Registry 是一个用于存储和管理 Docker 镜像的服务
Docker Registry 允许用户存储 Docker 镜像,并且可以分享这些镜像给团队中的其他成员。
镜像存储与分享
Registry 可以保存不同版本的镜像,让团队可以选择特定版本的镜像来构建容器。
私有 Docker Registry 允许组织内部存储和管理镜像,并且可以限制访问权限,保证镜像的安全性。
安全性
Registry 可以存储大量的 Docker 镜像,并且可以被用户检索和下载。
镜像存储和检索
它允许你管理和追踪镜像的不同版本,使得在需要时可以回滚到先前的版本。
版本管理
可以配置访问控制,保护镜像的安全性。私有 Registry 允许只有授权用户或团队能够访问和下载镜像。
访问控制
Docker Registry 可以根据需要进行扩展,以应对大规模的镜像存储和高并发的访问。
扩展性
https://hub.docker.com/
docker hub公共 Registry
https://cr.console.aliyun.com/cn-hangzhou/instances
aliyun
Amazon ECR
Google Container Registry
创建持久化存储镜像的目录
nexus
推荐使用更专业
安装前需要安装docker、docker compose
harbor
自有搭建(私服仓库)
常见的仓库
配置
认证
推送镜像到仓库
从仓库拉取镜像
仓库的使用
仓库 registry
容器编排是指管理和协调容器化应用程序的过程,通常涉及多个容器实例的部署、协调、扩展和管理。这是在一个或多个主机上同时运行多个容器,并确保它们能够有效地协同工作的一种技术。
现代应用往往由多个微服务组成,每个微服务都在自己的容器中运行。容器编排可以帮助统一管理这些微服务,并在它们之间建立联系。
复杂应用的管理
容器编排可以有效地管理资源,自动调整容器实例的数量以适应负载,并确保资源的最佳利用。
资源利用
通过容器编排,可以实现高可用性配置,确保即使某个容器实例失败,应用程序仍能保持可用。
高可用性
容器编排工具可以自动化地部署新的容器实例,并根据负载情况自动扩展或缩减应用程序的容量。
自动化部署和扩展
通过定义清单文件(比如 YAML 文件),容器编排工具可以自动化地部署多个容器,并确保它们之间的依赖关系和配置。
自动化部署
容器编排工具可以管理容器之间的网络通信,确保容器能够相互发现和通信,并在必要时实现负载均衡。
服务发现与负载均衡
容器编排工具可以定期检查容器的健康状态,并在需要时重新部署、替换故障容器。
健康检查与自愈
根据负载情况,容器编排工具可以自动增加或减少容器实例的数量,以适应应用程序的需求。
自动伸缩
可以方便地进行应用程序的版本控制,并在需要时进行回滚操作,确保系统的稳定性。
版本控制与回滚
需要与docker版本对应
版本简述
需要运行的容器配置,可以理解为原先docker run 命令后面跟的一系列的配置信息,都配在这个服务下面
服务 services
docker-compose公自定义的网络管理,配置好以后,可以直接在services中引用这个网络配置,这个配置可以被多个services引用
网络 networks
在docker-compoese下的统一数据卷管理,提供给多个services使用
数据卷 volumes
配置文件
构建服务
创建服务
容器的运行、启动、停止
查看管理的容器列表
查看日志
常用命令
docker compose (单机)
swarm
node
task
service
关键概念
初始化集群
增加工作节点
查看集群
集群搭建
新建服务
监控集群状态
部署服务
调整实例个数
调整集群大小
弹性伸缩
实战应用
swarm(分布式)
容器编排
Portainer 是一个轻量级的容器管理工具,提供了基于 Web 的用户界面,用于管理 Docker 容器、镜像、网络和数据卷等 Docker 组件。
Portainer 提供直观友好的 Web 界面,使得 Docker 的管理变得更加简单。即使对于不熟悉命令行的用户,也能轻松上手管理 Docker。
易用性
Portainer 允许你在一个地方管理多个 Docker 守护进程,可以轻松地管理和监控不同主机上的 Docker。
集中化管理
它提供了用户认证和角色管理功能,可以限制不同用户的访问权限,保证 Docker 环境的安全性。
权限控制
Portainer 提供了容器和服务的监控、日志查看等功能,方便用户查看容器的运行状态和日志信息。
监控和日志
通过图形界面管理容器,包括创建、启动、停止、删除等操作。
容器管理
可以浏览、搜索、拉取和上传 Docker 镜像,以及管理镜像的版本。
镜像管理
可以管理 Docker 网络和数据卷,进行网络配置和数据卷的创建、删除等操作。
网络和数据卷管理
支持用户认证和角色管理,可以设置不同用户的访问权限。
用户和权限管理
提供容器和服务的监控功能,可以查看实时日志信息,帮助用户监控容器的状态。
dashboard
运行的容器信息
下载过的镜像
容器资源监控
容器日志查看
web shell 操作容器
UI界面功能使用
portainer轻量级可视化工具
docker高级进阶
docker 实操
单体项目上线流程---编译、打包---上传到服务器---备份原项目---替换新项目---日志排查---项目启动上线
持续学习更新中
测试这三个容器间网络是否正常通信
Docker学习笔记
0 条评论
回复 删除
下一页