官方文档
wget -qO- https://get.docker.com/ | sh
sudo usermod -aG docker your-user
sudo usermod -aG docker ${USER}
newgrp docker # 更新docker用户组
cat /etc/group | grep docker
docker --version
使用非root用户管理
docker run [OPTIONS] image [COMMAND]
docker create [OPTIONS] IMAGE [COMMAND] [ARG...] 创建容器,但不运行
docker ps # 罗列
docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.CreatedAt}}\t{{.Status}}\t{{.Names}}"
退出方式
docker start 容器ID或容器名 # 启动已停止运行的容器
docker restart 容器ID或容器名 # 重启容器
docker stop 容器ID或容器名 # 停止容器
docker kill 容器ID或容器名 # 强制停止容器
docker rm 容器ID或容器名 # 删除已停止的容器
docker logs XXX # 查看容器日志
docker logs -ft --tail 10 xxx
docker top XXX # 查看docker内部运行的进程
docker port XXX port # 查看容器映射端口
docker inspect XXX # 查看内部细节
docker image inspect --format='{{.RepoTags}} {{.Id}} {{.Parent}}' $(docker image ls -q --filter since=xxxxxx)
docker exec -it 容器ID bash地址 # 重新进入交互式
docker attach XXX # 重新进入容器
docker cp 容器ID:容器内部路径 目标外部路径 # 拷贝容器内部文件到外部
docker export 容器ID > xxx.tar # 导出容器 对应import
cat xxx.tar | docker import - 镜像用户/镜像名:版本号 # 导入容器
docker commit -m="描述" -a="作者" 容器ID 要创建的目标镜像名:[标签名] # 基于某容器实例,创建新的镜像
数据卷是在一个或者多个容器内被选定的目录,可以绕过分层的联合文件系统(Union File System),为Docker提供持久数据或者共享数据。
这意味着对卷的修改会直接生效,并绕过镜像,当提交或者创建镜像时,卷不被包含在镜像里。卷也可以在容器间共享。即便容器停止,卷里的内容依旧存在。
目录后面加上rw
或者ro
来指定容器内目录的读写状态。
前面是宿主机目录:后面是容器内目录:最后是读写状态
创建临时容器
通过Dockerfile文件定义的镜像,产生的容器尽可能的是临时的。所谓的临时,意思是,容器可停止,销毁,重建和替代为最小设置和配置。
不要安装不必要的包
为了降低复杂性,依赖性,文件大小和构建时间,请避免安装额外的或不必要的软件包,因为它们可能“很好”。例如,您不需要在数据库镜像中包含文本编辑器。
Docker
1 启动容器时限制容器内存
docker run -m 4g --memory-swap -1
2 限制已启动容器的内存
docker stop containerId
docker update containerId -m 4g --memory-swap -1
docker start containerId
3 查询是否配置成功
docker inspect containerId
备注:命令详解
--memory 或 -m 限制容器的内存使用量(如10m,200m等)
--memory-swap # 限制内存和 Swap 的总和,不设置的话默认为--memory的两倍
'''
如果只指定了 --memory 则 --memory-swap 默认为 --memory 的两倍
如果 --memory-swap 和 --memory 设置了相同值,则表示不使用 Swap
如果 --memory-swap 设置为 -1 则表示不对容器使用的 Swap 进行限制
如果设置了 --memory-swap 参数,则必须设置 --memory 参数
后期 update --memory 时数值不能超过 --memory-swap 的值,否则会报错 Memory limit should be smaller than already set memoryswap limit
参考:https://blog.csdn.net/m0_67266585/article/details/126580997
'''
docker-compose
airflow-triggerer:
<<: *airflow-common
command: triggerer
healthcheck:
test: ["CMD-SHELL", 'airflow jobs check --job-type TriggererJob --hostname "$${HOSTNAME}"']
interval: 10s
timeout: 10s
retries: 5
restart: always
deploy:
resources:
limits:
cpus: "1.00"
memory: 1G
reservations:
memory: 200M
查看资源使用情况
docker stats
docker image ls -f dangling=true # 查看所有虚悬镜像
docker image prune # 删除所有虚悬镜像
在 Docker 中删除 image 时有时会遇到类似
Error response from daemon: conflict: unable to delete 6ec9a5a0fc9f (cannot be forced) - image has dependent child images
这样的错误,原因是有另外的 image FROM 了这个 image,可以使用下面的命令列出所有在指定 image 之后创建的 image 的父 image
docker image inspect --format='{{.RepoTags}} {{.Id}} {{.Parent}}' $(docker image ls -q --filter since=xxxxxx)
使用一个文件来描述所有容器如何运行
sudo docker run -d -p 8090:8080 --name my_tomcat -v /data/app/tomcat:/usr/local/tomcat/webapps -v /data/logs:/data/logs tomcat:8.5-jdk8-corretto
阿里云容器镜像服务申请实例,创建仓库。
阿里云的机器可以按照地区使用专用网络registry-vpc.cn-hangzhou.aliyuncs.com/sajor/project
普通网络命令:
docker login --username=13171706376 registry.cn-hangzhou.aliyuncs.com
用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
您可以在访问凭证页面修改凭证密码。
vi /etc/docker/daemon.json
增加阿里云配置{
"registry-mirrors":["https://6kx4zyno.mirror.aliyuncs.com"]
}
docker pull registry.cn-hangzhou.aliyuncs.com/sajor/project:[镜像版本号]
docker login --username=13171706376 registry.cn-hangzhou.aliyuncs.com
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/sajor/project:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/sajor/project:[镜像版本号]
请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。
如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-hangzhou.aliyuncs.com 作为Registry的域名登录。
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
registry.aliyuncs.com/acs/agent 0.7-dfb6816 37bb9c63c8b2 7 days ago 37.89 MB
$ docker tag 37bb9c63c8b2 registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816
使用 "docker push" 命令将该镜像推送至远程。
$ docker push registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816
首先,我们需要了解当前Docker的存储路径。你可以通过运行以下命令来获取当前的存储路径:
docker info | grep "Docker Root Dir"
在修改存储路径之前,我们需要先停止并删除Docker服务。运行以下命令来停止并删除Docker服务:
sudo systemctl stop docker
sudo systemctl disable docker
接下来,我们需要修改Docker的配置文件。打开Docker的配置文件/etc/docker/daemon.json,并添加以下内容:
{
"data-root": "/path/to/new/docker/directory"
}
迁移Docker默认目录,在修改配置文件后,我们需要将现有的Docker目录迁移到新的存储路径。运行以下命令来迁移Docker目录:
sudo rsync -aP /var/lib/docker/ /path/to/new/docker/directory
确保将/path/to/new/docker/directory替换为你在上一步中设置的新的存储路径。
完成上述步骤后,我们可以重新启动Docker服务以使新的存储路径生效。运行以下命令来重新启动Docker服务:
sudo systemctl start docker
只读镜像层都是只读的,且以后永远不会发生变化。当创建一个新容器时,Docker会构建出一个镜像栈,并在栈的最顶层添加一个读写层。这个读写层加上其下面的镜像层以及一些配置信息,就构成了一个容器。
如果想修改某文件,这个文件首先会从该读写层下面的只读层复制到该读写层。该文件的只读版本仍然存在,但是已经被读写层中的该文件副本所隐藏。