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