Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker核心解决的问题是利用LXC来实现类似VM的功能,从而利用更加节省的硬件资源提供给用户更多的计算资源。同VM的方式不同, LXC 其并不是一套硬件虚拟化方法 - 无法归属到全虚拟化、部分虚拟化和半虚拟化中的任意一个,而是一个操作系统级虚拟化方法, 理解起来可能并不像VM那样直观。所以我们从虚拟化到docker要解决的问题出发,看看他是怎么满足用户虚拟化需求的。
安装docker
snap install docker
基本组成
镜像和容器的区别:1、镜像是包含了各种环境或者服务的一个模板,而容器是镜像的一个实例;2、镜像是不能运行的,是静态的,而容器是可以运行的,是动态的。
查看要安装的有哪些版本(tags),对应版本后可复制下载命令
修改镜像源
// 服务器
sudo nano /etc/docker/daemon.json
// 添加如下配置(这个是我windows电脑上的)
{
"builder": {
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
},
"experimental": false,
"features": {
"buildkit": true
},
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
命令字和help
docker --help
docker run --help 查看帮助(得到的内容第一列等同于同行第二列,否则用第二列名字)
第一例可以-后同时加多个命令,如下i为保持打开,t为分配一个tty
docker exec -it 9019bce34a84 cat /etc/onlyoffice/documentserver/local.json
docker exec 9019bce34a84 cat /etc/onlyoffice/documentserver/local.json
命令操作
仓管中心和仓库(Registry & Repository)
docker login 登入仓管中心
sudo docker login [email protected] registry.cn-hangzhou.aliyuncs.com
docker logout 登出仓管中心。
docker search 从仓管中心检索镜像。
docker pull 从仓管中心拉取镜像到本地。
docker pull nginx:1.17.8 下载对应版本
docker push 名字:镜像版本号 从本地推送镜像到仓管中心。结合tag命令使用
镜像
# 生命周期
docker images 查看所有镜像。
docker import 从归档文件创建镜像。
docker build 从 Dockerfile 创建镜像。
docker commit 为容器创建镜像,如果容器正在运行则会临时暂停。
docker commit 容器id 建立的镜像名:版本号(标签)
docker rmi image_id 删除镜像。id通过docker images获取,并且删除前需要将对应的容器停止运行删除后才能正常删除
docker load 从标准输入 (STDIN) 加载归档包 (tar archive) 作为镜像,包括镜像本身和标签 (tags, 0.7 起)。
docker save 将镜像打包为归档包,并输出至标准输出 (STDOUT),包括所有的父层、标签和版本 (parent layers, tags, versions, 0.7 起)。
# 其它信息
docker history 查看镜像的历史记录。
docker tag 给镜像打标签命名(本地或者仓库均可)。
docker tag image_id 名字:镜像版本号 出版本给push推送到服务器
# 加载 / 保存 / 导入 / 导出镜像
docker load < my_image.tar.gz 从文件中加载镜像
docker save my_image:my_tag | gzip > my_image.tar.gz 保存既有镜像
cat my_container.tar.gz | docker import - my_image:my_tag 从文件中导入容器镜像,import后为镜像用户名、镜像名
docker export my_container_id | gzip > my_container.tar.gz 导出既有容器,导出容器为当前正常运行的,可以用上一行再倒入使用
docker export my_container_id > my_container.tar 导出既有容器
容器
# 生命周期
docker create 创建容器但不启动它。
docker rename 用于重命名容器。
docker run 一键创建并同时启动该容器。docker run --help可以查看帮助(得到的内容第一列等同于同行第二列,否则用第二列名字),-d后台运行并且打印id,-p端口转发
docker run -d -p 9011:80 onlyoffice/documentserver
docker rm id 删除容器。id通过docker ps -a查询
docker update 调整容器的资源限制。
# 启动和停止
docker start 启动已存在的容器。
docker stop 停止运行中的容器,stop后加容器id(可以通过docker ps获得)
docker restart 容器id 重启容器。
docker pause 暂停运行中的容器,将其「冻结」在当前状态。
docker unpause 结束容器暂停状态。
docker wait 阻塞地等待某个运行中的容器直到停止。
docker kill 向运行中的容器发送 SIGKILL 指令。
docker attach 连接到运行中的容器。
# 信息
docker ps 查看运行中的所有容器。
docker ps -a 将显示所有容器,包括运行中和已停止的。
docker logs 从容器中读取日志。(你也可以使用自定义日志驱动,不过在 1.10 中,它只支持json-file和journald)。
docker inspect 查看某个容器的所有信息(包括 IP 地址)。
docker events 从容器中获取事件 (events)。
docker port 查看容器的公开端口。
docker top 查看容器中活动进程。
docker stats 查看容器的资源使用量统计信息。
docker stats --all 同样将显示所有容器,默认仅显示运行中的容器。
docker diff 查看容器文件系统中存在改动的文件。
# 导入、导出
docker cp 在容器和本地文件系统之间复制文件或目录。
docker export 将容器的文件系统打包为归档文件流 (tarball archive stream) 并输出至标准输出 (STDOUT)。
# 执行命令
docker exec 在容器内执行命令。
网络(Networks)
# 生命周期
docker network create
docker network rm
# 其它信息
docker network ls
docker network inspect
# 建立连接
docker network connect
docker network disconnect
卷标(Volumes)
# 生命周期
docker volume create
docker volume rm
# 信息
docker volume ls
docker volume inspect
其他
清理
最新的 数据管理命令 已在 Docker 1.13 实现:
docker system prune
docker volume prune
docker network prune
docker container prune
docker image prune
df 命令
docker system df 将显示当前 Docker 各部分占用的磁盘空间。
Heredoc 声明 Docker 容器
docker build -t htop - << EOFFROM alpineRUN apk --no-cache add htopEOF
最近一次的容器 ID
alias dl='docker ps -l -q'docker run ubuntu echo hello worlddocker commit $(dl) helloworld
带命令的提交(需要 Dockerfile)
docker commit -run='{"Cmd":["postgres", "-too -many -opts"]}' $(dl) postgres
获取 IP 地址
docker inspect $(dl) | grep -wm1 IPAddress | cut -d '"' -f 4
或使用 jq:
docker inspect $(dl) | jq -r '.[0].NetworkSettings.IPAddress'
或使用 go 模板:
docker inspect -f '{{ .NetworkSettings.IPAddress }}'
或在通过 Dockerfile 构建镜像时,通过构建参数 (build argument) 传入:
DOCKER_HOST_IP=`ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1`echo DOCKER_HOST_IP = $DOCKER_HOST_IPdocker build \ --build-arg ARTIFACTORY_ADDRESS=$DOCKER_HOST_IP -t sometag \ some-directory/
获取端口映射
docker inspect -f '{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}'
通过正则匹配容器
for i in $(docker ps -a | grep "REGEXP_PATTERN" | cut -f1 -d" "); do echo $i; done`
获取环境变量配置
docker run --rm ubuntu env
强行终止运行中的容器
docker kill $(docker ps -q)
删除所有容器(强行删除!无论容器运行或停止)
docker rm -f $(docker ps -qa)
删除旧容器
docker ps -a | grep 'weeks ago' | awk '{print $1}' | xargs docker rm
删除已停止的容器
docker rm -v `docker ps -a -q -f status=exited`
停止并删除容器
docker stop $(docker ps -aq) && docker rm -v $(docker ps -aq)
删除无用 (dangling) 的镜像
docker rmi $(docker images -q -f dangling=true)
删除所有镜像
docker rmi $(docker images -q)
删除无用 (dangling) 的卷标
Docker 1.9 版本起:
docker volume rm $(docker volume ls -q -f dangling=true)
1.9.0 中,参数 dangling=false 居然 没 用 - 它会被忽略然后列出所有的卷标。
查看镜像依赖
docker images -viz | dot -Tpng -o docker.png
Docker 容器瘦身
在某层 (RUN layer) 清理 APT
这应当和其他 apt 命令在同一层中完成。 否则,前面的层将会保持原有信息,而你的镜像则依旧臃肿。
RUN {apt commands} \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
压缩镜像
ID=$(docker run -d image-name /bin/bash)docker export $ID | docker import – flat-image-name
备份
ID=$(docker run -d image-name /bin/bash)(docker export $ID | gzip -c > image.tgz)gzip -dc image.tgz | docker import - flat-image-name
监视运行中容器的系统资源利用率
检查某个容器的 CPU、内存以及网络 I/O 使用情况,你可以:
docker stats
按 ID 列出所有容器:
docker stats $(docker ps -q)
按名称列出所有容器:
docker stats $(docker ps --format '{{.Names}}')
按指定镜像名称列出所有容器:
docker ps -a -f ancestor=ubuntu
常用功能
查看容器id
docker ps
查看所有容器id
docker ps -a
删除容器
docker rm container_id
查看镜像
docker images
删除镜像
docker rmi image_id
更改onlyoffice配置
docker exec 容器id /bin/bash nano /etc/onlyoffice/documentserver/default.json
docker exec 9019bce34a84 nano /etc/onlyoffice/documentserver/default.json
docker exec f5ea2621d95f cat /etc/onlyoffice/documentserver/local.json
更改配置后重启镜像ID
docker restart 9019bce34a84
将本地容器打包后发布版本到服务器,从服务器下载使用。先登录对应服务器
docker tag image_id 名字:镜像版本号
docker push 名字:镜像版本号
docker pull nginx:1.17.8(名字:镜像版本号)
虚悬镜像(误操作产生,一般有就删掉)
查看(查询后repository和tag为none)
docker image ls -f dangling=true
删除虚悬镜像
docker image prune
dockerfile将jar打包部署到docker中
# 基础镜像使用java
from java:8
# 作者
maintainer hgx
# volume指定临时文件目录为/temp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
volume /tmp
# 将jar包添加到容器中并更名
add 远来的jar文件名 新的jar文件名
# 运行jar包
run bash -c 'pwd'
entrypoint ["java", "-jar", "/xx.jar(新的jar文件名)"]
# 暴露端口作为微服务
expose 6666
dockerfile和java文件放在同一目录去执行构建,打包成镜像文件
docker build -t xx:版本号 .