昨日内容回顾:
- docker架构
- 是C/S架构
C:
docker
S:
docker daemon
- image:
- docker hub仓库
- 高可用企业级私有仓库部署!
- container
- volume
- network
- ...
- image
docker image ...
ls
rm
pull
tag
save
load
...
build
history
- container
docker container ...
ls|ps|list
run
rm
logs
prune
cp
inspect
top
attach
cp
exec
logs
ls
rm
run
top
prune
inspect
第二梯队:
create
创建容器
docker container create -it alpine
docker container create --name test02 -e SCHOOL=oldboyedu -w /oldboyedu-linux82 alpine sleep 10
start ***
启动容器
docker container start test02
stop ***
停止容器
docker stop -t 1 test01
-t:
等待多久后发送kill信号杀死容器,0代表不等待。
kill ***
杀死容器。
docker container kill test01 # 等效于"docker container stop -t 0 test01"
restart ***
重启容器
docker container restart -t 0 test01 # 一般情况下,在修改了配置文件时,需要重启容器。
-t:
等待多久后发送kill信号杀死容器,0代表不等待。
重启后,容器的运行时间会被重置。
pause
暂停容器运行,容器被暂停时,不会对外提供服务,也不会重置时间。
docker container pause myweb
unpause
恢复容器运行
docker container unpause myweb
rename ***
表示对容器的名称进行重命名。
docker container rename myweb linux82_web01
stats ***
表示查看容器的状态信息。
docker container stats --no-stream --no-trunc linux82_web01
--no-stream:
不实时输出监控信息,仅打印第一次的即可。
--no-trunc
不截断输出内容。
update:
更新容器的配置,包括但不限于: 内存,磁盘,CPU,重启策略等限制。
docker container update -m 100000000 --memory-swap 100000000 linux82_web01
commit ***
将一个容器手动提交为一个镜像。
docker container commit -a "oldboyedu-linux82" -m "add nginx service..." myweb linux82-web:v0.1
手动提交镜像。此案例就是将myweb容器提交未一个名为"linux82-web:v0.1"的新镜像。
-a:
声明作者信息。
-m:
提交注释信息。
注意:
(1)若基于咱们手动提交的镜像可以指定自定义的启动命令参数;
docker run -d linux82-web:v0.1 tail -f /etc/hosts
(2)若没有指定自定义的启动命令,则会使用该镜像基于哪个容器启动时的"COMMAND"来运行哟;
(3)基于commit提交的镜像,一般情况下仅用于测试,生产环境中,我们会使用dockerfile来自动构建镜像;
了解即可:
diff:
比较容器和镜像的文件差异。
docker container diff condescending_johnson
export:
将容器的文件系统导出到一个tar包文件中。
docker container export peaceful_rosalind > docker-export.tar.gz
docker container export -o docker-export02.tar.gz condescending_johnson
docker image import docker-export02.tar.gz
导入镜像,但不会导入镜像的tag,会重新创建一个新的镜像。
port
查看容器到宿主机的端口映射信息。若容器没有配置端口映射,则没有任何输出。
docker container port web02
wait
等待容器退出的状态码。
删除容器
docker container rm -f `docker container ps -qa`
容器的重启策略:
no
当容器退出时不自动重启,这是默认的配置。
案例:
docker container run -d --restart no --name restart-no custom_linux:v0.2
on-failure[:max-retries]
若不指定max-retries,则默认值为0,表示不设限制次数的重启。
使用max-retries定义一个最大重试重启次数,当容器异常退出时,可以自动重启指定的max-retries次数后就不再重启。
容器重启后,max-retries值也会被重置。
案例:
docker container run -d --restart on-failure --name restart-on-failure custom_linux:v0.2
docker container run -d --restart on-failure:3 --name restart-on-failure-3 custom_linux:v0.2
unless-stopped
除非在停止docker服务之前,容器已经停止了,否则重启docker服务时,会自动重启。
案例:
docker container run -d --restart unless-stopped --name unless-stopped custom_linux:v0.2
always
每当容器停止或者重启docker服务时,都会自动重启容器。
案例:
docker container run -d --restart always --name always custom_linux:v0.2
温馨提示:
查看重启策略和重启次数姿势1:
docker container inspect `docker ps -lq` | grep RestartPolicy -A 3
docker container inspect `docker ps -lq` | grep RestartCount
查看重启策略和重启次数姿势2:
docker container inspect -f '{{.RestartCount}}' `docker ps -lq`
docker container inspect -f '{{.HostConfig.RestartPolicy}}' `docker ps -lq`
参考链接:
https://docs.docker.com/engine/reference/commandline/run/#restart-policies---restart
端口映射常见写法:
docker container run -d -p 88:80 nginx:1.20.1
最常见的写法,将容器的80端口映射到宿主机的88端口。
docker container run -d -p 89:80/tcp nginx:1.20.1
端口映射指定协议为tcp,默认情况下,使用就是tcp,因此通常对于tcp的服务可以不指定。
docker container run -d -p 53:53/udp nginx:1.20.1
端口映射指定为udp,对于服务本身使用的是udp协议的服务而言,此处需要显式指定。
docker container run -d -p 10.0.0.101:99:80/tcp nginx:1.20.1
将端口映射明确绑定到具体的网卡上。
docker container run -d -p 10.0.0.101::80/tcp nginx:1.20.1
将端口映射明确绑定到具体的网卡上,并且宿主机的端口是随机的。
docker container run -idp 10.0.0.101:20-21:20-21 alpine
端口范围映射,将宿主机的20,21端口映射到容器的20,21端口。
docker container run -idp 127.0.0.1:9200:9200 -p 10.0.0.101:9300:9300 alpine
映射连续的端口,可以使用多个-p参数即可。
docker container run -dP nginx:1.20.1
随机端口映射。
温馨提示:
(1)对短选项进行合并时,需要注意短选项是否需要传参数,若需要穿参数,应该尽量往后靠;
(2)当我们使用-p选项时,会自动进行端口映射,底层对应的是iptables的DNAT规则;
(3)若有多个不连续的端口进行映射时,需要写多个"-p"选项即可;
(4)使用"-P"(大写)时会自动进行端口映射,这个容器映射的端口取决于镜像对外暴露的服务端口(EXPOSE指令);
(5)端口映射的语法格式为"-p 宿主机的IP地址:宿主机的端口号:容器的端口号:协议"。
(6)docker外部节点访问容器时,底层采用的是DNAT技术,而容器访问外部服务,采用的是forward转发功能哟,并没有使用SNAT技术;
存储卷的基础管理:
增:
docker volume create oldboyedu-linux82
创建一个自定义名称的存储卷。
docker volume create
创建一个随机的存储卷。
删:
docker volume prune -f
移除所有未使用的本地存储卷。
docker volume rm test01 test02
移除一个或多个的存储卷。
查
docker volume ls
查看存储卷列表。
docker volume inspect oldboyedu-linux82
查看存储卷的详细信息。
容器使用存储卷: (容器使用存储卷后,数据不会被丢失!)
docker container run -itdp 88:80 -v oldboyedu-linux82:/usr/share/nginx/html nginx:1.20.1
将名为"oldboyedu-linux82"存储卷挂载到容器的"/usr/share/nginx/html"路径。如果存储卷名称不存在,则会自动创建。
docker container run -itdp 99:80 -v oldboyedu-linux82:/usr/share/nginx/html -v test01:/oldboyedu-linux82/docker nginx:1.20.1
如果一个容器需要多个挂载点,可以使用多个-v选项即可。
docker container run -dv /usr/share/nginx/html nginx:1.20.1
若不指定存储卷的名称,则会自动创建一个随机存储卷与其对应哟!
docker run -idv test01:/oldboyedu-linux01:rw -v test02:/oldboyedu-linux02 -v test03:/oldboyedu-linux03:ro alpine
存储卷可以指定挂载点。
docker run -id --volumes-from focused_mendel alpine
启动容器时使用和"focused_mendel"容器相同的存储卷挂载信息。
docker container run -dv /oldboyedu/docker-2022:/usr/share/nginx/html nginx:1.20.1
也可以不使用存储卷,直接使用宿主机的一个路径。
温馨提示:
(1)若容器使用了随机存储卷,我们在删除时,可以使用"-v"选项去删除随机存储卷(匿名存储卷)。
docker container rm -vf thirsty_wozniak
(2)如果存储卷中有数据,且容器的挂载点之前也是有数据的,容器的数据并不会覆盖掉存储卷的数据;
(3)如果存储卷中没有数据,且容器的挂载点之前也是有数据的,容器的数据会直接存储在存储卷中;
(4)若不使用-v显示指定存储卷,并不能证明该容器不会进行持久化,这取决于镜像是否有VOLUME的指令;
(5)我们也可以不适用存储卷,而是使用宿主机的路径挂在到容器中;
将"jasonyin2020/oldboyedu-games:v0.2"的游戏使用Centos借鉴一份,如何实现?
1.将源代码拷贝出来;
...
2.使用centos将nginx部署并存放游戏代码;
...
3.提交镜像;
...
今日内容回顾:
- docker容器命令的进阶
- start
- stop
- restart
- pause
- unpause
- create
- kill
- diff
- export (docker image import ...)
- wait
- update
- commit
....
- docker容器的重启策略
- no
- always
- on-failure[:max-retries]
- unless-stopped
- docker网络映射的原理
- 外网访问容器时,"-p"本质上底层采用iptables的nat表实现DNAT
- 容器访问外网时,通过ip_forward参数转发数据报文
- "-p"参数的常见写法: "-p 宿主机的IP地址:宿主机的端口号:容器的端口号/协议",-P表示随机端口映射。
- docker存储卷使用
- docker volume ..
ls
inspect
rm
prune
- 容器使用存储卷:
-v 存储卷名称:容器的路径[:权限]
--volumes-from:
- 直接将宿主机的路径挂在到容器中。
- 手动制作有戏案例。