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 --username=1172648136@qq.com 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 }}' <container_name>
- 或在通过 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}}' <containername>
-
- 通过正则匹配容器
- 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 <container>
-
- 按 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:版本号 .