Docker 学习笔记

将容器保存为镜像

1
docker commit  容器名 复制镜像名    可加参数-a=“作者名”

将镜像打包成文件

1
docker save -o 文件名.tar 镜像名

查询 Images 镜像 latest 版本号

1
docker image inspect (docker image名称):latest|grep -i version

将文件导入镜像

1
docker load -i 文件名.tar

将容器导出为文件

1
docker export 容量名 > 文件名

创建自定义网络

docker network create –subnet=[自定义网络广播地址]/[子网掩码位数] [自定义网络名]

1
docker network create --subnet=192.168.11.0/24 testnet

删除自定义网络

1
docker network rm testnet

固定容器 IP 地址

docker run -it –name [容器名] –net [网络名] –ip [选定网络下固定 IP 地址] ubuntu:latest /bin/bash

1
docker run -it --rm --name=test --net=testnet --ip=192.168.11.99 alpine /bin/sh

使用容器网络

1
docker run -it --rm --name=lhwl --net=container:容器ID

更新 docker 参数

1
docker update --restart=always 容器ID

停止容器时自动删除掉容器

1
docker run -it --rm --name test 容器ID

控制容器的 CPU 优先级 (每个容器默认值为 1024)

1
docker run -it --cpu-shares 512 -name test 容器ID

绑定指定 CPU 到容器 (绑定 CPU0 和 1 两核)

1
docker run -it --cpuset-cpus 0-1 centos

控制容器使用的内存容量

1
docker run -it -m 128m centos 

控制容器写入速度

1
docker run -it -name test --device /dev/sda:/dev/sda --device-write-bps /dev/sda:1mb centos 

容器变量时区设置

1
docker run -e TZ="Asia/Shanghai"   #运行时添加上TZ选项

容器重命名

1
docker rename name1 name2

指定容器主机名 (-h)

1
docker run -it --name=test -h=test centos

清理所有无用镜像

1
docker image prune -a

清理所有无用数据卷

1
docker volume prune

清理所有停止的容器

1
docker container prune

Docker ps

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
docker ps -a    :会列出当前服务器中所有的容器,无论是否在运行。
docker ps -s :会列出容器的文件大小(容器增加的大小/容器的虚拟大小)
docker ps -q :仅列出CONTAINER ID 字段
docker ps -l : 显示最后一个运行的容器(无论该容器目前处于什么状态)
docker ps -n 5 :显示最后 x 个运行容器,当x为1时和 -l 含义相同。(无论该容器目前处于什么状态)
docker ps --no-trunc :不对输出进行截断操作,此时可以看到完整的COMMAND,CONTAINER
docker -f :使用过滤器来过滤输出
id (容器的id)
label
name(容器名称)
exited (整数-容器退出状态码,只有在使用-all才有用)
status 容器状态(created,restarting,running,paused,exited,dead)
ancestor 过滤从指定镜像创建的容器
before (容器的名称或id),过滤在给定id或名称之后创建的容器
isolation (default process hyperv) (windows daemon only)
volume (数据卷名称或挂载点),--过滤挂载有指定数据卷的容器
network(网络id或名称),过滤连接到指定网络的容器

批量导入镜像

1
ll *.tar|awk '{print $NF}'|sed -r 's#(.*)#docker load -i \1#' |bash

Docker 创建时自动建好 MYSQL 仓库

1
2
FROM mysql:5.7
COPY sql/*.sql /docker-entrypoint-initdb.d/

Dockerfile

1
2
3
4
FROM centos:8    基础镜像
LABEL name=zhuchuanliang power=NB 容器说明
ADD rtorrent.rt /rtorrent.rt 添加rtorrent.rt文件到容量
ESXPOSE 80 容器开放的端口

Docker Swarm

初始化 swarm manager 并制定网卡地址

1
docker swarm init --advertise-addr 182.48.115.237

查看 swarm worker 的连接令牌

1
docker swarm join-token worker

查看 swarm manager 的连接令牌

1
docker swarm join-token manager

加入 docker swarm 集群,作为 worker 节点

1
docker swarm join --token SWMTKN-1-4roc8fx10cyfgj1w1td8m0pkyim08mve578wvl03eqcg5ll3ig-f0apd81qfdwv27rnx4a4y9jej 182.48.115.237:2377

使旧令牌无效并生成新令牌

1
docker swarm join-token --rotate

查看集群中的节点

1
docker node ls

查看集群中节点信息

1
docker node inspect swarm-node1 --pretty

调度程序可以将任务分配给节点

1
docker node update --availability active swarm-node1

调度程序不向节点分配新任务,但是现有任务仍然保持运行

1
docker node update --availability pause swarm-node1

调度程序不会将新任务分配给节点。调度程序关闭任何现有任务并在可用节点上安排它们。也就是线下节点,不参与任务分配.

1
docker node update --availability drain swarm-node1

添加节点标签

1
docker node update --label-add label1 --label-add bar=label2 swarm-node1

删除节点标签

1
docker node update --label-rm label1 swarm-node1

将 worker 节点升级为 manager 节点

1
docker node promote swarm-node1

将 manager 节点降级为 worker 节点

1
docker node demote swarm-manager-node

查看服务列表

1
docker service ls

查看服务的具体信息

1
docker service ps my-test

创建一个不定义 name,不定义 replicas 的服务. (如下的 nginx 是 docker 的 nginx 镜像名称,不是服务名称)

1
docker service create nginx

创建一个指定 name 的服务

1
docker service create --name my-nginx nginx

创建一个指定 name、run cmd 的服务

1
docker service create --name my-nginx nginx ping www.baidu.com

使用 yaml 文件创建 test 容器

1
docker stack deploy -c deploy.yml test

重启 docker 集群

1
docker service scale srment_nacos=0 && docker service scale srment_nacos=1

创建一个指定 name、version、run cmd 的服务

1
2
docker service create --name my-redis redis:3.0.6
docker service create --name my-nginx nginx:1.8 /bin/bash

创建一个指定 name、port、replicas 的服务

1
docker service create --name my-nginx --replicas 3 -p 80:80 nginx

为指定的服务更新一个端口

1
docker service update --publish-add 80:80 my-nginx

为指定的服务删除一个端口

1
docker service update --publish-rm 80:80 my-nginx

将 redis:3.0.6 更新至 redis:3.0.7

1
docker service update --image redis:3.0.7 redis

配置运行环境,指定工作目录及环境变量

1
docker service create --name my-nginx --env MYVAR=myvalue --workdir /data/www --user my_user nginx ping www.baidu.com

创建一个 my-nginx 的服务

1
docker service create --name my-nginx nginx ping www.baidu.com

更新 my-nginx 服务的运行命令

1
docker service update --args "ping www.baidu.com" my-nginx

删除一个服务

1
docker service rm my-nginx

在每个群组节点上运行 web 服务

1
docker service create --name tomcat --mode global --publish mode=host,target=8080,published=8080 tomcat:latest

创建一个 overlay 网络

1
2
docker network create --driver overlay my-network
docker network create --driver overlay --subnet 10.10.10.0/24 --gateway 10.10.10.1 haha-network

创建服务并将网络添加至该服务

1
docker service create --name my-test --replicas 3 --network my-network redis

删除群组网络

1
docker service update --network-rm my-network my-test

更新群组网络

1
docker service update --network-add haha-network my-test

创建群组并配置 cpu 和内存

1
docker service create --name my_nginx --reserve-cpu 2 --reserve-memory 512m --replicas 3 nginx

更改所分配的 cpu 和内存

1
docker service update --reserve-cpu 1 --reserve-memory 256m my_nginx

创建服务时自定义的几个参数

  1. 指定每次更新的容器数量

--update-parallelism

  1. 指定容器更新的间隔

--update-delay

  1. 定义容器启动后监控失败的持续时间

--update-monitor

  1. 定义容器失败的百分比

--update-max-failure-ratio

  1. 定义容器启动失败之后所执行的动作

--update-failure-action

例: 比如:创建一个服务并运行 3 个副本,同步延迟 10 秒,10% 任务失败则暂停

1
docker service create --name mysql_5_6_36 --replicas 3 --update-delay 10s --update-parallelism 1 --update-monitor 30s --update-failure-action pause --update-max-failure-ratio 0.1 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.6.36

回滚至之前版本

1
2
3
4
5
docker service update --rollback mysql

# 自动回滚
# 如果服务部署失败,则每次回滚2个任务,监控20秒,回滚可接受失败率20%
docker service create --name redis --replicas 6 --rollback-parallelism 2 --rollback-monitor 20s --rollback-max-failure-ratio .2 redis:latest

创建服务并将目录挂在至 container 中

1
2
3
4
5
6
docker service create --name mysql --publish 3306:3306 --mount type=bind,src=/data/mysql,dst=/var/lib/mysql --replicas 3 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.6.36

# 需要注意使用bind绑定宿主机目录会带来的风险
# - 绑定的主机路径必须存在于每个集群节点上,否则会有问题;
# - 调度程序可能会在任何时候重新安排运行服务容器,如果目标节点主机变得不健康或无法访问;
# - 主机绑定数据不可移植,当你绑定安装时,不能保证你的应用程序开发方式与生产中的运行方式相同;

添加 swarm 配置

1
echo "this is a mysql config" | docker config create mysql -

查看配置

1
docker config ls

查看配置详细信息

1
docker config inspect mysql

删除配置

1
docker config rm mysql

添加配置

1
docker service update --config-add mysql mysql 

删除配置

1
docker service update --config-rm mysql mysql

添加配置

1
docker config create kevinpage index.html

启动容器的同时添加配置

1
docker service create --name nginx --publish 80:80 --replicas 3 --config src=kevinpage,target=/usr/share/nginx/html/index.html nginx