镜像

获取镜像

docker pull

查看镜像信息

docker images

docker inspect <images id> # 获取镜像的详细信息

搜寻镜像

docker search

删除镜像

docker rmi

当一个镜像拥有多个标签,docker rmi 只是删除该镜像指定的标签,并不影响镜像文件

当镜像只剩下一个标签时,再使用会彻底删除该镜像

先删除该镜像的所有容器,再删除镜像

创建镜像

2 种方法:

  • 基于已有镜像的容器创建
  • 基于 Dockerfile 创建(推荐)

基于已有镜像的容器创建

docker commit

-a: 作者信息

-m: 提交信息

-p 提交时暂停容器运行

-c changelist

存出和载入镜像

存出sudo docker save -o ubuntu_16.04.tar ubuntu:16.04

载入sudo docker load --input ubuntu_16.04.tar 或者 sudo docker load < ubuntu_16.04.tar

导入镜像,以及其相关的元数据信息(包括标签等)

容器

创建容器

使用交互式来运行容器:sudo docker run -it ubuntu:latest /bin/bash

docker run在后台执行的标准操作:

  1. 检查本地是否存在指定的镜像, 不存在就从公有仓库下载
  2. 利用镜像创建启动一个容器
  3. 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
  4. 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去。
  5. 从地址池配置一个 IP 地址给容器
  6. 执行用户指定的应用程序
  7. 执行完毕后容器被终止

守护态运行

sudo docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

通过docker logs命令获取容器的输出信息:sudo docker -tf logs 2855b4d76ccb

-t: 打印时间戳

-f: 刷新日志到最后

2855b4d76ccb: 容器id

终止容器

sudo docker stop 2855b4d76ccb

查看所有容器的信息:sudo docker ps -a

处于终止状态的容器,可以通过 docker start 命令来重新启动:sudo docker start 2855b4d76ccb

重启容器:sudo docker restart 2855b4d76ccb

进入容器

attach指令

sudo docker attach 2855b4d76ccb

当多个窗口同时 attach 到同一个容器时, 所有窗口会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作。

exec 命令

sudo docker exec -ti 2855b4d76ccb /bin/bash

删除容器

sudo docker rm 2855b4d76ccb

-f 强制删除运行中的容器

-l 删除容器链接,但保留容器

-v 删除容器挂载的数据卷

导入/导出容器

导出

sudo docker export 2855b4d76ccb > test.tar

可以将这些文件传输到其他机器上, 在其他机器上通过导入命令实现容器迁移

导入

cat test.tar | sudo docker import - test/ubuntu:v1.0

docker load 导入镜像存储文件到本地的镜像库

docker import 导入一个容器快照到本地镜像库

区别:

容器快照文件将丢弃所有的历史记录和元数据信息(仅保存容器当时的快照状态),导入时可以重新指定标签等元数据信息。

镜像存储文件将保存完整记录, 体积也大。

仓库

Docker Hub

登录

docker login

搜索

docker search

docker tag

sudo docker tag ubuntu:14.04 10.0.2.2:5000/test

自动创建

步骤:

  1. 登录 Docker Hub, 连接 GitHub 到 Docker
  2. 在Docker Hub 中配置自动创建:https://hub.docker.com/add/automated-build/caseycui/
  3. 选取一个目标网站项目(需要含 Dockerfile)和分支
  4. 指定 Dockerfile 的位置,并提交创建
  5. 之后,可以在 Docker Hub 的“自动创建”页面中跟踪每次创建的状态。

创建和使用私有仓库

使用 registry 镜像创建私有仓库

sudo docker -d -p 5000:5000 -v /opt/docker/registry/:/tmp/registry registry

监听端口映射到 5000,docker 容器中的 /tmp/registry 被映射到本地的 /opt/docker/registry/ 上。

管理私有仓库镜像

  • 修改 tag 的 REGISTRYHOST sudo docker tag ubuntu:latest 172.17.0.1:5000/test
  • 使用 docker push 上传 sudo docker push 172.17.0.1:5000/test
  • 使用docker pull 下载 sudo docker pull 172.17.0.1:5000/test

数据管理

两种方式:

  • 数据卷(Data Volumes)
  • 数据卷容器(Data Volume Containers)

数据卷

特性:

  • 可以在容器间共享和重用
  • 对数据卷的修改会立马生效
  • 对数据卷的更新, 不会影响容器
  • 卷会一直存在, 直到没有容器使用

类似 Linux 的 mount 操作

挂载一个主机目录作为数据卷

sudo docker run -v /src/webapp:/opt/webapp training/webapp python app.py

加载主机的/src/webapp 目录到容器的 /opt/webapp 目录.

主机目录必须是绝对路径

默认权限是读写(rw), 可以设置为只读(ro) /src/webapp:/opt/webapp:ro

数据卷容器

数据卷容器其实就是普通的容器, 专门用它提供数据卷供其他容器挂载使用.

  1. 创建一个数据卷容器: sudo docker run -it -v /dbdata --name dbdata ubuntu

  2. 在其他容器中使用 volumes-from 来挂载 dbdata 容器中的数据卷.

    
    
    sudo docker run -it --volumes-from dbdata --name db1 ubuntu
    
    sudo docker run -it --volumes-from dbdata --name db2 ubuntu
    
    

    3个容器任何一方在该目录写入, 其他容器都可以看到。

    如果删除了容器, 数据卷并不会自动删除. 如果要删除数据卷, 必须在删除最后一个挂载着它的容器时显式使用 docker rm -v 命令来指定同时删除关联的容器

利用数据卷容器迁移数据

备份

sudo docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata

恢复

sudo docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
sudo docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar

网络基础配置

端口映射实现访问容器

sudo docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py

-P: 映射到随机端口

查看端口映射配置

sudo docker port loving_montalcini

容器互联实现容器间通信

容器的连接(linking)系统, 它会在源和接收容器之间创建一个隧道, 接收容器可以看到源容器指定的信息.

连接系统依据容器的名称来执行.

在执行 docker run 的时候如果添加 --rm 标记, 则容器在终止后会立即删除. --rm-d 无法同时使用.

容器互联

sudo docker run -d --name db training/postgres  # 创建一个新的数据库容器
sudo docker run -d -P --name web --link db:db training/webapp python app.py # --link name:alias alias是连接的别名

Docker通过2种方式为容器公开连接信息:

  • 环境变量
  • 更新 /etc/hosts 文件

使用 env 命令查看web容器的环境变量:

$ docker exec web env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=62b19d3b5add
DB_PORT=tcp://172.17.0.2:5432
DB_PORT_5432_TCP=tcp://172.17.0.2:5432
DB_PORT_5432_TCP_ADDR=172.17.0.2
DB_PORT_5432_TCP_PORT=5432
DB_PORT_5432_TCP_PROTO=tcp
DB_NAME=/web/db
DB_ENV_PG_VERSION=9.3
HOME=/root

/etc/hosts 文件:

$ docker exec web cat /etc/hosts

127.0.0.1       localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters 172.17.0.2 db 4288c4f9ad47 172.17.0.3 62b19d3b5add # 本容器

也可以通过 ping 来测试:

$ docker exec web ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.083 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.054 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.054 ms
64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.053 ms
64 bytes from 172.17.0.2: icmp_seq=5 ttl=64 time=0.055 ms
64 bytes from 172.17.0.2: icmp_seq=6 ttl=64 time=0.057 ms

使用 Dockerfile 创建镜像

基本结构

  • 基础镜像信息
  • 维护者信息
  • 镜像操作指令
  • 容器启动时执行指令

指令

FROM

第一条指令必须为 FROM 指令

MAINTAINER(已弃用)

制定维护者信息. 以后可以用 LABEL maintainer="CaseyCui cuikaidong@foxmail.com"

RUN

两种格式:

  • RUN <command> bash格式, 命令在bash中运行, 默认在Linux是 /bin/sh -c 在windows上是 cmd /S /C
  • RUN ["executable", "param1", "param2"] (用 docker exec 执行)

每条RUN指令将在当前镜像基础上执行指定命令, 并提交为新的镜像.

最佳实践:

apt-get安装:

RUN apt-get update && apt-get install -y --no-install-recommends \
aufs-tools \
automake \
build-essential \
curl \
dpkg-sig \
libcap-dev \
libsqlite3-dev \
mercurial \
reprepro \
ruby1.9.1 \
ruby1.9.1-dev \
s3cmd=1.1.* \
&& rm -rf /var/lib/apt/lists/*

apt-get update && apt-get install 合用

apt-get install -y --no-install-recommends 不安装其他推荐的包, -no-install-suggests 也可以加上

ruby1.9.1 s3cmd=1.1.* 安装指定版本的包

rm -rf /var/lib/apt/lists/* 删除软件包残留

## a few minor docker-specific tweaks
## see https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap
RUN set -xe \
\
## https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L40-L48
&& echo '#!/bin/sh' > /usr/sbin/policy-rc.d \
&& echo 'exit 101' >> /usr/sbin/policy-rc.d \
&& chmod +x /usr/sbin/policy-rc.d \
\
## https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L54-L56
&& dpkg-divert --local --rename --add /sbin/initctl \
&& cp -a /usr/sbin/policy-rc.d /sbin/initctl \
&& sed -i 's/^exit.*/exit 0/' /sbin/initctl \
\
## https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L71-L78
&& echo 'force-unsafe-io' > /etc/dpkg/dpkg.cfg.d/docker-apt-speedup \
\
## https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L85-L105
&& echo 'DPkg::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' > /etc/apt/apt.conf.d/docker-clean \
&& echo 'APT::Update::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' >> /etc/apt/apt.conf.d/docker-clean \
&& echo 'Dir::Cache::pkgcache ""; Dir::Cache::srcpkgcache "";' >> /etc/apt/apt.conf.d/docker-clean \
\
## https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L109-L115
&& echo 'Acquire::Languages "none";' > /etc/apt/apt.conf.d/docker-no-languages \
\
## https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L118-L130
&& echo 'Acquire::GzipIndexes "true"; Acquire::CompressionTypes::Order:: "gz";' > /etc/apt/apt.conf.d/docker-gzip-indexes \
\
## https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L134-L151
&& echo 'Apt::AutoRemove::SuggestsImportant "false";' > /etc/apt/apt.conf.d/docker-autoremove-suggests

set -xe 调试模式, 返回非 0 (即不成功) 就退出

CMD

支持三种格式:

  • CMD ["executable","param1","param2"] 使用 docker exec 执行, 推荐方式
  • CMD ["param1","param2"] 作为 ENTRYPOINT 的默认参数
  • CMD command param1 param2 bash

指定启动容器时执行的命令, 每个 Dockerfile 只能有一条 CMD 命令.

EXPOSE

EXPOSE 80 8443

暴露的端口号, 供互联系统使用. 在启动时可以通过 -P-p 来指定映射

ENV

ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && …
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH

ADD

推荐只在 src 为 tar 文件时(会自动解压)使用. 其他时候使用 COPY. 不推荐使用 URL 的方式.

COPY

COPY <src> <dest> 当使用本例目录为 src 时, 推荐使用 COPY

ENTRYPOINT

两种格式:

  • ENTRYPOINT ["executable", "param1", "param2"] exec 格式
  • ENTRYPOINT command param1 param2 bash 格式

VOLUME

创建一个可以从本地主机或其他容器挂载的挂载点, 一般用来存放数据库和需要保持的数据等.

USER

指定运行容器时的用户名或 UID, 后续的 RUN 也会使用指定用户.

当服务不需要管理员权限时, 可以通过该命令指定运行用户.

要临时获取管理员权限推荐使用 gosu , 不推荐sudo

WORKDIR

为后续的 RUN CMD ENTRYPOINT 指令配置工作目录.

ONBUILD

ONBUILD [Dockerilfe的指令]

配置当所创建的镜像作为其他新创建镜像的基础镜像时, 所执行的操作指令.

使用 ONBUILD 指令的镜像, 推荐在 tag 中注明, 如 ruby:1.9-onbuild

创建镜像

docker build [选项] 路径

实现:

  1. 读取指定路径下(包括子目录)的 Dockerfile
  2. 将该路径下所有内容发送给 Docker 服务端
  3. 由服务端来创建镜像

一般建议放置 Dockerfile 的目录为空目录

可以通过 .dockerignore 文件来让 Docker 忽略路径下的目录和文件.

## comment
*/temp*
*/*/temp*
temp?

指令示例: sudo docker build -t build_repo/first_image /tmp/docker_builder/

三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.

Docker 基础 - 1的更多相关文章

  1. Docker - Docker基础命令及使用

    Docker Docker - 官网 Docker - Hub GitHub - Docker Docker中文社区 Docker基础命令 Docker 查看帮助信息:docker --help 查看 ...

  2. 【云计算】Docker云平台—Docker基础

    Docker云平台系列共三讲,此为第一讲:Docker基础 参考资料: Docker官方文档:https://docs.docker.com/ Docker从入门到实践:https://yeasy.g ...

  3. Docker基础技术:Linux Namespace(下)

    在 Docker基础技术:Linux Namespace(上篇)中我们了解了,UTD.IPC.PID.Mount 四个namespace,我们模仿Docker做了一个相当相当山寨的镜像.在这一篇中,主 ...

  4. Docker 基础技术:Linux Namespace(下)

    导读 在Docker基础技术:Linux Namespace(上篇)中我们了解了,UTD.IPC.PID.Mount 四个namespace,我们模仿Docker做了一个相当相当山寨的镜像.在这一篇中 ...

  5. Docker基础入门及示例

    Docker近几年的发展可谓一日千里,特别从是2013年随着一个基于LXC的高级容器引擎开源,到现在,其在linux和windows上都有了很好的支持,并且已经有很多公司将docker用于实际的生产环 ...

  6. Docker 基础 : 镜像

    目录 获取镜像 查看镜像信息 搜索镜像 删除镜像 创建镜像 导出和导入镜像 上传镜像 总结 镜像是 Docker 的三大核心概念之一.Docker 运行容器前需要本地存在对应的镜像,如果本地没有对应的 ...

  7. Docker 基础技术之 Linux cgroups 详解

    PS:欢迎大家关注我的公众号:aCloudDeveloper,专注技术分享,努力打造干货分享平台,二维码在文末可以扫,谢谢大家. 推荐大家到公众号阅读,那里阅读体验更好,也沉淀了很多篇干货. 前面两篇 ...

  8. docker 基础知识分享ppt

    给团队做的docker基础分享ppt, 见下面的附件. https://files.cnblogs.com/files/harrychinese/docker_intro.pptx

  9. 中标麒麟龙芯平台--docker基础镜像制作

    Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源.Docker 的出现为开发人员和运维人员带来了极大的便利.Docker在X86下常见的发行版Linux如Ub ...

  10. Docker系列03—Docker 基础入门

    本文收录在容器技术学习系列文章总目录 1.概念介绍 1.1 容器 1.1.1 介绍 容纳其它物品的工具,可以部分或完全封闭,被用于容纳.储存.运输物品.物体可以被放置在容器中,而容器则可以保护内容物. ...

随机推荐

  1. 3.pytest断言assert

    pytest使用的python自带的断言assert关键字,和unittest封装的assert断言不一样 原理:用来测试某个断言条件,如果断言条件为True,则程序将继续正常执行:但如果断言条件为假 ...

  2. C# 7.0 添加和增强的功能【基础篇】

    C# 7.0 版是与 Visual Studio 2017 一起发布. 虽然该版本继承和发展了C# 6.0,但不包含编译器即服务. 一.out 变量 以前我们使用out变量必须在使用前进行声明,C# ...

  3. 云原生之旅 - 6)不能错过的一款 Kubernetes 应用编排管理神器 Kustomize

    前言 相信经过前一篇文章的学习,大家已经对Helm有所了解,本篇文章介绍另一款工具 Kustomize,为什么Helm如此流行,还会出现 Kustomize?而且 Kustomize 自 kubect ...

  4. ES6 学习笔记(十二)代理器Proxy的简单使用

    1.前言 以前在学习react时做了个仿手机端的QQ音乐项目.当时的数据是通过proxy代理的QQ音乐数据接口,直接写在package.json里面.Proxy 对象(Proxy)是 ES6的特性,只 ...

  5. 学习ASP.NET Core Blazor编程系列十——路由(上)

    学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...

  6. Azure DevOps Server 设置项目管理用户,用户组

    一,引言 Azure DevOps Server 搭建完成后,关于如何进行项目管理,项目成员管理等,我们接着上一篇文章,继续讲解 Azure DevOps Server 的用户,用户组.首先,我们需要 ...

  7. vulnhub靶场之DOUBLETROUBLE: 1

    准备: 攻击机:虚拟机kali.本机win10. 靶机:DOUBLETROUBLE: 1,网段地址我这里设置的桥接,所以与本机电脑在同一网段,下载地址:https://download.vulnhub ...

  8. mybatis中association和collection使用

    mybatis中association和collection使用 一.概述 association:一个复杂的类型关联.许多结果将包成这种类型 collection:复杂类型的集合 这2个属性的使用, ...

  9. SSH(四)控制层、业务层、dao层类的创建以及applicationcontext.xml和struts.xml配置

    ssh框架的运作方式就是页面请求控制层,控制层调用dao层的方法,dao层完成对数据的操作的一个过程. 现在我们初步简单编写各层的class. action控制层: ActionSupport:实现了 ...

  10. JavaEE Day07 HTML

    今日内容 Web概念概述 HTML 一.Web概念概述 1. JavaWeb:使用Java语言开发的基于互联网的项目 2.软件架构 C/S架构:Client/Server--- 客户端/服务器端(安卓 ...