• 沒有找到結果。

05-容器常⽤命令

N/A
N/A
Protected

Academic year: 2021

Share "05-容器常⽤命令"

Copied!
117
0
0

加載中.... (立即查看全文)

全文

(1)

(2) Table of Contents 简介. 1.1. 01-Docker简介. 1.2. 02-Docker安装. 1.3. 03-配置镜像加速器. 1.4. 04-镜像常⽤命令. 1.5. 05-容器常⽤命令. 1.6. 06-实战:修改Nginx⾸⻚. 1.7. 07-Dockerfile指令详解. 1.8. 08-实战:使⽤Dockerfile修改Nginx⾸⻚. 1.9. 09-实战:巩固-阅读常⽤软件的Dockerfile. 1.10. 10-使⽤Docker Hub管理镜像. 1.11. 11-使⽤Docker Registry管理Docker镜像. 1.12. 12-使⽤Nexus管理Docker镜像. 1.13. 13-Docker可视化管理⼯具. 1.14. 14-Docker数据持久化. 1.15. 15-端⼝映射. 1.16. 16-遗留⽹络. 1.17. 17-Docker⽹络. 1.18. 18-network命令. 1.19. 19-默认bridge⽹络中配置DNS. 1.20. 20-⽤户定义⽹络中的内嵌DNS服务器. 1.21. 21-Docker Compose简介. 1.22. 22-安装Docker Compose. 1.23. 23-Docker Compose快速⼊⻔. 1.24. 24-docker-compose.yml常⽤命令. 1.25. 25-docker-compose常⽤命令. 1.26. 26-Docker Compose⽹络设置. 1.27. 27-实战:使⽤Docker Compose编排WordPress博客. 1.28. 28-控制服务启动顺序. 1.29. 29-在⽣产环境中使⽤Docker Compose. 1.30. 30-实战:使⽤Docker Compose运⾏ELK. 1.31. 31-使⽤Docker Compose伸缩应⽤. 1.32. 2.

(3) 3.

(4) 简介. Docker开源书 Docker开源书,旨在帮助⼤家熟悉Docker、使⽤Docker。 GitHub地址:https://github.com/itmuch/docker-book Gitee地址:https://gitee.com/itmuch/docker-book 欢迎star、fork,⼀起讨论! QQ群:731548893 微信群:加jumping_me,注明加群。 内容主要包括: ⼊⻔ Dockerfile详解 镜像管理 ⼯具 持久化 ⽹络 Docker Compose 七⼤主题,涵盖Docker常⽤命令、Dockerfile常⽤命令、⽹络、存储、Docker Compose等常⻅知识 点,知识体系应该是⽐较完备的。如果学习完,你应该具备如下能⼒: 常⽤的命令信⼿拈来 Dockerfile编写⽆压⼒ 能⽤Docker Compose快速构建容器环境 理解Docker⽹络、存储等知识点是怎么回事。. 4.

(5) 01-Docker简介. Docker简介 1.1 Docker简介 Docker是⼀个开源的容器引擎,它可以帮助我们更快地交付应⽤。Docker可将应⽤程序和基础设施层 隔离,并且能将基础设施当作程序⼀样进⾏管理。使⽤Docker,可更快地打包、测试以及部署应⽤程 序,并可减少从编写到部署运⾏代码的周期。 TIPS (1) Docker官⽅⽹站:https://www.docker.com/ (2) Docker GitHub:https://github.com/docker/docker. 1.2 版本与迭代计划 近⽇,Docker发布了Docker 17.06。进⼊Docker 17时代后,Docker分成了两个版本:Docker EE和 Docker CE,即:企业版(EE)和社区版(CE)。. 1.2.1 版本区别 Docker EE(企业版) Docker EE由公司⽀持,可在经过认证的操作系统和云提供商中使⽤,并可运⾏来⾃Docker Store的、 经过认证的容器和插件。 Docker EE提供三个服务层次: 服务层级. 功能. Basic. 包含⽤于认证基础设施的Docker平台 Docker公司的⽀持 经过 认证的、来⾃Docker Store的容器与插件. Standard. 添加⾼级镜像与容器管理 LDAP/AD⽤户集成 基于⻆⾊的访问控制(Docker Datacenter). Advanced. 添加Docker安全扫描 连续漏洞监控. ⼤家可在该⻚查看各个服务层次的价⽬:https://www.docker.com/pricing 。 Docker CE Docker CE是免费的Docker产品的新名称,Docker CE包含了完整的Docker平台,⾮常适合开发⼈员 和运维团队构建容器APP。事实上,Docker CE 17.03,可理解为Docker 1.13.1的Bug修复版本。因 此,从Docker 1.13升级到Docker CE 17.03⻛险相对是较⼩的。 ⼤家可前往Docker的RELEASE log查看详情https://github.com/docker/docker/releases 。. 5.

(6) 01-Docker简介. Docker公司认为,Docker CE和EE版本的推出为Docker的⽣命周期、可维护性以及可升级性带来了巨 ⼤的改进。. 1.2.2 版本迭代计划 Docker从17.03开始,转向基于时间的 YY.MM 形式的版本控制⽅案,类似于Canonical为Ubuntu所使 ⽤的版本控制⽅案。 Docker CE有两种版本: edge版本每⽉发布⼀次,主要⾯向那些喜欢尝试新功能的⽤户。 stable版本每季度发布⼀次,适⽤于希望更加容易维护的⽤户(稳定版)。 edge版本只能在当前⽉份获得安全和错误修复。⽽stable版本在初始发布后四个⽉内接收关键错误修 复和安全问题的修补程序。这样,Docker CE⽤户就有⼀个⽉的窗⼝期来切换版本到更新的版本。举 个例⼦,Docker CE 17.03会维护到17年07⽉;⽽Docker CE 17.03的下个稳定版本是CE 17.06,这 样,6-7⽉这个时间窗⼝,⽤户就可以⽤来切换版本了。 Docker EE和stable版本的版本号保持⼀致,每个Docker EE版本都享受为期⼀年的⽀持与维护期,在 此期间接受安全与关键修正。. 1.2.3 参考⽂档 ANNOUNCING DOCKER ENTERPRISE EDITION:https://blog.docker.com/2017/03/dockerenterprise-edition/. 1.3 Docker的发展历程 发展历程 Docker版本. Docker基于{}实现. Docker 0.7之前. 基于LXC. Docker0.9后. 改⽤libcontainer. Docker 1.11后. 改⽤runC和containerd. 表格名词对应官⽹ LXC:https://linuxcontainers.org/lxc/introduction/ libcontainer:https://github.com/docker/libcontainer runC:https://github.com/opencontainers/runc containerd:https://github.com/containerd/containerd 各名词之间的关系 OCI:定义了容器运⾏的标准,该标准⽬前由libcontainer和appc的项⽬负责⼈(maintainer) 进⾏维护和制定,其规范⽂档作为⼀个项⽬在GitHub上维护。. 6.

(7) 01-Docker简介. runC(标准化容器执⾏引擎):根据根据OCI规范编写的,⽣成和运⾏容器的CLI⼯具,是按 照开放容器格式标准(OCF, Open Container Format)制定的⼀种具体实现。由libcontainer 中迁移⽽来的,实现了容器启停、资源隔离等功能。 containerd:⽤于控制runC的守护进程,构建在OCI规范和runC之上。⽬前內建在Docker Engine中,参考⽂档:https://blog.docker.com/2015/12/containerd-daemon-to-control-runc/ ,译⽂:http://dockone.io/article/914 浅谈发展历程 时序:Docker⼤受欢迎 - 与CoreOS相爱相杀 - rkt诞⽣ - 各⼤⼚商不爽 - OCI制定(2015-06) - 成⽴CNCF(2015-07-21) - Kubernetes 1.0发布; CNCF:云原⽣计算基⾦会,由⾕歌联合发起,现⾪属于Linux基⾦会。 拓展阅读 Docker背后的标准化容器执⾏引擎——runC:http://www.infoq.com/cn/articles/dockerstandard-container-execution-engine-runc Docker、Containerd、RunC...:你应该知道的所 有:http://www.infoq.com/cn/news/2017/02/Docker-Containerd-RunC Google宣布成⽴CNCF基⾦会,Kubernetes 1.0正式发布:http://dockone.io/article/518. 1.4 Docker快速⼊⻔ 执⾏如下命令,即可启动⼀个Nginx容器 docker run -d -p 91:80 nginx. 1.5 Docker架构 我们来看⼀下来⾃Docker官⽅⽂档的架构图,如图12-1所示。. 图12-1 Docker架构图. 7.

(8) 01-Docker简介. 我们来讲解图中包含的组件。 (1) Docker daemon(Docker守护进程) Docker daemon是⼀个运⾏在宿主机(DOCKER_HOST)的后台进程。我们可通过Docker客户端与 之通信。 (2) Client(Docker客户端) Docker客户端是Docker的⽤户界⾯,它可以接受⽤户命令和配置标识,并与Docker daemon通信。图 中,docker build等都是Docker的相关命令。 (3) Images(Docker镜像) Docker镜像是⼀个只读模板,它包含创建Docker容器的说明。它和系统安装光盘有点像——我们使⽤ 系统安装光盘安装系统,同理,我们使⽤Docker镜像运⾏Docker镜像中的程序。 (4) Container(容器) 容器是镜像的可运⾏实例。镜像和容器的关系有点类似于⾯向对象中,类和对象的关系。我们可通过 Docker API或者CLI命令来启停、移动、删除容器。 (5) Registry Docker Registry是⼀个集中存储与分发镜像的服务。我们构建完Docker镜像后,就可在当前宿主机上 运⾏。但如果想要在其他机器上运⾏这个镜像,我们就需要⼿动拷⻉。此时,我们可借助Docker Registry来避免镜像的⼿动拷⻉。 ⼀个Docker Registry可包含多个Docker仓库;每个仓库可包含多个镜像标签;每个标签对应⼀个 Docker镜像。这跟Maven的仓库有点类似,如果把Docker Registry⽐作Maven仓库的话,那么Docker 仓库就可理解为某jar包的路径,⽽镜像标签则可理解为jar包的版本号。 Docker Registry可分为公有Docker Registry和私有Docker Registry。最常⽤的Docker Registry莫过于 官⽅的Docker Hub,这也是默认的Docker Registry。Docker Hub上存放着⼤量优秀的镜像,我们可使 ⽤Docker命令下载并使⽤。. 1.6 Docker与虚拟机. 8.

(9) 01-Docker简介. Hypervisor层被Docker Engine取代。 Hypervisor:https://baike.baidu.com/item/hypervisor/3353492 虚拟化粒度不同 虚拟机利⽤Hypervisor虚拟化CPU、内存、IO设备等实现的,然后在其上运⾏完整的操作系 统,再在该系统上运⾏所需的应⽤。资源隔离级别:OS级别 运⾏在Docker容器中的应⽤直接运⾏于宿主机的内核,容器共享宿主机的内核,容器内部运 ⾏的是Linux副本,没有⾃⼰的内核,直接使⽤物理机的硬件资源,因此CPU/内存利⽤率上有 ⼀定优势。资源隔离级别:利⽤Linux内核本身⽀持的容器⽅式实现资源和环境隔离。 拓展阅读 《Docker、LXC、Cgroup的结构关 系》:http://speakingbaicai.blog.51cto.com/5667326/1359825/. 1.7 Docker应⽤场景 ⼋个Docker的真实应⽤场景:http://dockone.io/article/126. 9.

(10) 02-Docker安装. Docker安装 2.1 CentOS 2.1.1 系统要求 CentOS 7或更⾼版本 centos-extras 仓库必须处于启⽤状态,该仓库默认启⽤,但如果您禁⽤了该仓库,请按. 照https://wiki.centos.org/AdditionalResources/Repositories 中的描述重新启⽤。 建议使⽤ overlay2 存储驱动. 2.1.2 yum安装 2.1.2.1 卸载⽼版本的Docker 在CentOS中,⽼版本Docker名称是 docker 或 docker-engine ,⽽Docker CE的软件包名称 是 docker-ce 。因此,如已安装过⽼版本的Docker,需使⽤如下命令卸载。 sudo yum remove docker \ docker-common \ docker-selinux \ docker-engine. 需要注意的是,执⾏该命令只会卸载Docker本身,⽽不会删除Docker存储的⽂件,例如镜像、容器、 卷以及⽹络⽂件等。这些⽂件保存在 /var/lib/docker ⽬录中,需要⼿动删除。. 2.1.2.2 安装仓库 1. 执⾏以下命令,安装Docker所需的包。其中, yum-utils 提供了 yum-config-manager ⼯ 具; device-mapper-persistent-data 及 lvm2 则是 devicemapper 存储驱动所需的包。 sudo yum install -y yum-utils device-mapper-persistent-data lvm2. 2. 执⾏如下命令,安装 stable 仓库。必须安装 stable 仓库,即使你想安装 edge 或 test 仓 库中的Docker构建版本。 sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo. 3. [可选] 执⾏如下命令,启⽤ edge 及 test 仓库。edge/test仓库其实也包含在了 docker.repo ⽂件中,但默认是禁⽤的,可使⽤以下命令来启⽤。. 10.

(11) 02-Docker安装. sudo yum-config-manager --enable docker-ce-edge # 启⽤edge仓库 sudo yum-config-manager --enable docker-ce-test # 启⽤test仓库. 如需再次禁⽤,可加上 --disable 标签。例如,执⾏如下命令即可禁⽤edge仓库。 sudo yum-config-manager --disable docker-ce-edge. TIPS:从Docker 17.06起,stable版本也会发布到edge以及test仓库中。. 2.1.2.3 安装Docker CE 1. 执⾏以下命令,更新 yum 的包索引 sudo yum makecache fast. 2. 执⾏如下命令即可安装最新版本的Docker CE sudo yum install docker-ce. 3. 在⽣产环境中,可能需要指定想要安装的版本,此时可使⽤如下命令列出当前可⽤的Docker版 本。 yum list docker-ce.x86_64 --showduplicates | sort -r. 这样,列出版本后,可使⽤如下命令,安装想要安装的Docker CE版本。 sudo yum install docker-ce-<VERSION>. 4. 启动Docker sudo systemctl start docker. 5. 验证安装是否正确。 sudo docker run hello-world. 这样,Docker将会下载测试镜像,并使⽤该镜像启动⼀个容器。如能够看到类似如下的输出,则 说明安装成功。 Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world b04784fba78d: Pull complete Digest: sha256:f3b3b28a45160805bb16542c9531888519430e9e6d6ffc09d72261b0d26ff74f. 11.

(12) 02-Docker安装. Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://cloud.docker.com/ For more examples and ideas, visit: https://docs.docker.com/engine/userguide/. 2.1.2.4 升级Docker CE 如需升级Docker CE,只需执⾏如下命令: sudo yum makecache fast. 然后按照安装Docker的步骤,即可升级Docker。. 2.1.2.5 参考⽂档 CentOS 7安装Docker官⽅⽂档:https://docs.docker.com/engine/installation/linux/docker-ce/centos/ ,⽂档中还讲解了在CentOS 7中安装Docker CE的其他⽅式,本⽂不作赘述。. 2.1.3 shell⼀键安装 curl -fsSL get.docker.com -o get-docker.sh sudo sh get-docker.sh. 搞定⼀切。. 2.2 Ubuntu 2.2.1 系统要求. 12.

(13) 02-Docker安装. Docker⽀持以下版本的Ubuntu,要求64位。 Zesty 17.04 Xenial 16.04 (LTS) Trusty 14.04 (LTS) ⽀持运⾏的平台: x86_64 、 armhf 、 s390x(IBM Z) 。其中,如选择IBM Z,那么只⽀持 Ubuntu Xenial以及Zesty。 本⽂使⽤Ubuntu 16.04 LTS,下载地址:http://cn.ubuntu.com/download/. 2.2.2 安装步骤 2.2.2.1 卸载⽼版本Docker 在Ubuntu中,⽼版本的软件包名称是 docker 或者 docker-engine ,⽽Docker CE的软件包名称 是 docker-ce 。因此,如已安装过⽼版本的Docker,需要先卸载掉。执⾏以下命令,即可卸载⽼版 本的Docker及其依赖。 sudo apt-get remove docker docker-engine docker.io. 需要注意的是,执⾏该命令只会卸载Docker本身,⽽不会删除Docker内容,例如镜像、容器、卷以及 ⽹络。这些⽂件保存在 /var/lib/docker ⽬录中,需要⼿动删除。. 2.2.2.2 Ubuntu Trusty 14.04 额外建议安装的包 除⾮你有不得已的苦衷,否则强烈建议安装 linux-image-extra-* 软件包,以便于Docker使 ⽤ aufs 存储驱动。执⾏如下命令,即可安装 linux-image-extra-* 。 sudo apt-get update sudo apt-get install \ linux-image-extra-$(uname -r) \ linux-image-extra-virtual. 对于Ubuntu 16.04或更⾼版本,Linux内核包含了对OverlayFS的⽀持,Docker CE默认会使 ⽤ overlay2 存储驱动。. 2.2.2.3 安装仓库 1. 执⾏如下命令,更新 apt 的包索引。 sudo apt-get update. 2. 执⾏如下命令,从⽽允许 apt 使⽤HTTPS仓库。 sudo apt-get install \ apt-transport-https \. 13.

(14) 02-Docker安装. ca-certificates \ curl \ software-properties-common. 3. 添加Docker官⽅的GPG key curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -. 确认指纹是 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 。 sudo apt-key fingerprint 0EBFCD88. 4. 执⾏如下命令,安装 stable 仓库。⽆论如何都必须安装 stable 仓库,即使你想安装 edge 或 test 仓库中的Docker构建。如需添加 edge 或 test 仓库,可在如下命令中的“stable" 后,添加 edge 或 test 或两者。请视⾃⼰Ubuntu所运⾏的平台来执⾏如下命令。 NOTE:如 下命令中的 lsb_release -cs ⼦命令⽤于返回您Ubuntu的发⾏版名称,例如 xenial 。有时, 在例如Linux Mint这样的发⾏版中,您可能需要将如下命令中的 $(lsb_release -cs) 更改为系 统的⽗级Ubuntu发⾏版。例如,如果您使⽤的是Linux Mint Rafaela,则可以使⽤ trusty 。 amd64: $ sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable". armhf: $ sudo add-apt-repository \ "deb [arch=armhf] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable". s390x: $ sudo add-apt-repository \ "deb [arch=s390x] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable". NOTE:从Docker 17.06起,stable版本也会发布到edge以及test仓库中。. 2.2.2.4 安装Docker CE 1. 执⾏如下命令,更新 apt 包索引。. 14.

(15) 02-Docker安装. sudo apt-get update. 2. 执⾏如下命令,即可安装最新版本的Docker CE。任何已存在的Docker将会被覆盖安装。 sudo apt-get install docker-ce. WARNING:如启⽤了多个Docker仓库,使⽤命令apt-get install 或apt-get update 命令安装或升 级时,如未指定版本,那么将会安装最新的版本。这可能不适合您的稳定性要求。 3. 在⽣产环境中,我们可能需要指定想要安装的版本,此时可使⽤如下命令列出当前可⽤的Docker 版本。 apt-cache madison docker-ce. 这样,列出版本后,可使⽤如下命令,安装想要安装的Docker CE版本。 sudo apt-get install docker-ce=<VERSION>. Docker daemon会⾃动启动。 4. 验证安装是否正确。 sudo docker run hello-world. 2.2.2.5 升级Docker CE 如需升级Docker CE,只需执⾏如下命令: sudo apt-get update. 然后按照安装Docker的步骤,即可升级Docker。. 2.2.2.6 参考⽂档 Ubuntu安装Docker官⽅⽂档:https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/ , ⽂档还讲解了在Ubuntu中安装Docker CE的其他⽅式,本⽂不作赘述。. 2.3 macOS 2.3.1 系统要求 macOS Yosemite 10.10.3或更⾼版本. 2.3.2 安装步骤 15.

(16) 02-Docker安装. 前往https://store.docker.com/editions/community/docker-ce-desktop-mac ,点击⻚⾯右侧的“Get Docker”按钮,下载安装包; 双击即可安装。. 2.4 Windows(docker for windows) 2.4.1 系统要求 Windows 10 Professional 或 Windows 10 Enterprise X64 对于Win 7,可使⽤Docker Toolbox(不建议使⽤). 2.4.2 安装步骤 前往https://store.docker.com/editions/community/docker-ce-desktop-windows ,点击⻚⾯右侧 的“Get Docker”按钮,下载安装包; 双击即可安装。. 2.5 其他系统 详⻅官⽅⽂档:https://docs.docker.com/engine/installation/. 2.6 加速安装 注册阿⾥云,参考该⻚⾯的内容安装即可:https://cr.console.aliyun.com/#/accelerator. 16.

(17) 03-配置镜像加速器. 配置镜像加速器 国内访问Docker Hub的速度很不稳定,有时甚⾄出现连接不上的情况。本节我们来为Docker配置镜像 加速器,从⽽解决这个问题。⽬前国内很多云服务商都提供了镜像加速的服务。 常⽤的镜像加速器有:阿⾥云加速器、DaoCloud加速器等。各⼚商镜像加速器的使⽤⽅式⼤致类似, 笔者以阿⾥云加速器为例进⾏讲解。 1. 注册阿⾥云账号后,即可在阿⾥云控制台(https://cr.console.aliyun.com/#/accelerator)看到类似 如下的⻚⾯。. 2. 按照图中的说明,即可配置镜像加速器。. 17.

(18) 04-镜像常⽤命令. Docker镜像常⽤命令 我们⾸先来讨论Docker镜像的常⽤命令。. 搜索镜像 可使⽤ docker search 命令搜索存放在Docker Hub中的镜像。 命令格式: docker search [OPTIONS] TERM. 参数: Name, shorthand --automated. Default false. Description 只列出⾃动构建的镜像 根据指定条件过滤结果. --filter, -f --limit. 25. 搜索结果的最⼤条数. --no-trunc. false. 不截断输出,显示完整的输出. --stars, -s. 0. 只展示Star不低于该数值的结果. 示例1: docker search java. 执⾏该命令后,Docker就会在Docker Hub中搜索含有“java”这个关键词的镜像仓库。执⾏该命令后, 可看到类似于如下的表格: NAME DESCRIPTION STARS OFFICIAL AUTOMATED java Java is a concurrent, ... 1281 [OK] anapsix/alpine-java Oracle Java 8 (and 7) ... 190 [OK] isuper/java-oracle This repository conta ... 48 [OK] lwieske/java-8 Oracle Java 8 Contain ... 32 [OK] nimmis/java-centos This is docker images ... 23 [OK] .... 该表格包含五列,含义如下: ① NAME:镜像仓库名称。 ② DESCRIPTION:镜像仓库描述。 ③ STARS:镜像仓库收藏数,表示该镜像仓库的受欢迎程度,类似于GitHub的Stars。. 18.

(19) 04-镜像常⽤命令. ④ OFFICAL:表示是否为官⽅仓库,该列标记为[OK]的镜像均由各软件的官⽅项⽬组创建和维护。由 结果可知,java这个镜像仓库是官⽅仓库,⽽其他的仓库都不是镜像仓库。 ⑤ AUTOMATED:表示是否是⾃动构建的镜像仓库。 示例2: docker search -s 10 java. 下载镜像[重要] 使⽤命令 docker pull 命令即可从Docker Registry上下载镜像。 命令格式: docker pull [OPTIONS] NAME[:TAG|@DIGEST]. 参数: Name, shorthand. Default. Description. --all-tags, -a. false. 下载所有标签的镜像. --disable-content-trust. true. 忽略镜像的校验. 示例1: docker pull java. 执⾏该命令后,Docker会从Docker Hub中的java仓库下载最新版本的Java镜像。 示例2: 该命令还可指定想要下载的镜像标签以及Docker Registry地址,例如: docker pull reg.itmuch.com/java:7. 这样就可以从指定的Docker Registry中下载标签为7的Java镜像。. 列出镜像[重要] 使⽤ docker images 命令即可列出已下载的镜像。 执⾏该命令后,将会看到类似于如下的表格: REPOSITORY TAG IMAGE ID CREATED SIZ E java latest 861e95c114d6 4 weeks ago 643. 19.

(20) 04-镜像常⽤命令. .1 MB hello-world latest c54a2cc56cbb 5 months ago 1.8 48 kB. 该表格包含了5列,含义如下: ① REPOSITORY:镜像所属仓库名称。 ② TAG:镜像标签。默认是latest,表示最新。 ③ IMAGE ID:镜像ID,表示镜像唯⼀标识。 ④ CREATED:镜像创建时间。 ⑤ SIZE:镜像⼤⼩。 命令格式: docker images [OPTIONS] [REPOSITORY[:TAG]]. 参数: Name, shorthand. Default. Description. --all, -a. false. 列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间 映像层). --digests. false. 显示摘要信息. --filter, -f. 显示满⾜条件的镜像. --format. 通过Go语⾔模板⽂件展示镜像. --no-trunc. false. 不截断输出,显示完整的镜像信息. --quiet, -q. false. 只显示镜像ID. 示例: docker images docker images java docker images java:8 docker images --digests docker images --filter "dangling=true" # 展示虚悬镜像. 删除本地镜像[重要] 使⽤ docker rmi 命令即可删除指定镜像。 命令格式: docker rmi [OPTIONS] IMAGE [IMAGE...]. 20.

(21) 04-镜像常⽤命令. 参数: Name, shorthand. Default. Description. --force, -f. false. 强制删除. --no-prune. false. 不移除该镜像的过程镜像,默认移除. 例1:删除指定名称的镜像。 docker rmi hello-world. 表示删除hello-world这个镜像。 例2:删除所有镜像。 docker rmi -f $(docker images). -f参数表示强制删除。. 保存镜像 使⽤ docker save 即可保存镜像。 命令格式: docker save [OPTIONS] IMAGE [IMAGE...]. 参数: Name, shorthand. Default. --output, -o. Description Write to a file, instead of STDOUT. 例1: docker save busybox > busybox.tar docker save --output busybox.tar busybox. 加载镜像 使⽤ docker load 命令即可加载镜像。 命令格式: docker load [OPTIONS]. 21.

(22) 04-镜像常⽤命令. 参数: Name, shorthand. Default. Description 从⽂件加载⽽⾮STDIN. --input, -i --quiet, -q. false. 静默加载. 例1: docker load < busybox.tar.gz docker load --input fedora.tar. 构建镜像[重要] 通过Dockerfile构建镜像。 命令格式: docker build [OPTIONS] PATH | URL | -. 参数: Name, shorthand. Default. Description. --add-host. 添加⾃定义从host到IP的映射,格式为(host:ip). --build-arg. 设置构建时的变量. --cache-from. 作为缓存源的镜像. --cgroup-parent. 容器可选的⽗cgroup. --compress. false. 使⽤gzip压缩构建上下⽂. --cpu-period. 0. 限制CPU CFS (Completely Fair Scheduler) 周期. --cpu-quota. 0. 限制CPU CFS (Completely Fair Scheduler) 配额. --cpu-shares, -c. 0. CPU使⽤权重(相对权重). --cpuset-cpus. 指定允许执⾏的CPU. --cpuset-mems. 指定允许执⾏的内存. --disable-contenttrust. true. 指定Dockerfile的名称,默认是‘PATH/Dockerfile’. --file, -f --force-rm. 忽略校验. false. 删除中间容器. --iidfile. 将镜像ID写到⽂件中. --isolation. 容器隔离技术. --label. 设置镜像使⽤的元数据. 22.

(23) 04-镜像常⽤命令. --memory, -m. 0. 设置内存限制. --memory-swap. 0. 设置Swap的最⼤值为内存+swap,如果设置为-1表 示不限swap. --network. default. 在构建期间设置RUN指令的⽹络模式. --no-cache. false. 构建镜像过程中不使⽤缓存. --pull. false. 总是尝试去更新镜像的新版本. --quiet, -q. false. 静默模式,构建成功后只输出镜像ID. --rm. true. 构建成功后⽴即删除中间容器 安全选项. --security-opt --shm-size. 0. 指定 /dev/shm ⽬录的⼤⼩. --squash. false. 将构建的层压缩成⼀个新的层. --tag, -t. 设置标签,格式:name:tag,tag可选. --target. 设置构建时的⽬标构建阶段. --ulimit. Ulimit 选项. 拓展阅读 Docker命令:https://docs.docker.com/engine/reference/commandline/docker/. 23.

(24) 05-容器常⽤命令. 容器常⽤命令 本节我们来讨论Docker容器的常⽤命令。. 新建并启动容器[重要] 使⽤以下 docker run 命令即可新建并启动⼀个容器。该命令是我们最常⽤的命令了,它有很多选 项,下⾯笔者列举⼀些常⽤的选项。 ① -d选项:表示后台运⾏ ② -P选项:随机端⼝映射 ③ -p选项:指定端⼝映射,有以下四种格式。 ip:hostPort:containerPort ip::containerPort hostPort:containerPort containerPort ④ --network选项:指定⽹络模式,该选项有以下可选参数: --network=bridge: 默认选项,表示连接到默认的⽹桥。 --network=host:容器使⽤宿主机的⽹络。 --network=container:NAME_or_ID:告诉Docker让新建的容器使⽤已有容器的⽹络配置。 --network=none:不配置该容器的⽹络,⽤户可⾃定义⽹络配置。 示例1: docker run java /bin/echo 'Hello World'. 这样终端会打印Hello World的字样,跟在本地直接执⾏ /bin/echo 'Hello World' ⼀样。 示例2: docker run -d -p 91:80 nginx. 这样就能启动⼀个Nginx容器。在本例中,我们为docker run添加了两个参数,含义如下: -d # 后台运⾏ -p 宿主机端⼝:容器端⼝ # 开放容器端⼝到宿主机端⼝. 访问http://Docker宿主机IP:91/ ,将会看到如图12-3的界⾯:. 24.

(25) 05-容器常⽤命令. 图12-3 Nginx⾸⻚ TIPS 需要注意的是,使⽤docker run命令创建容器时,会先检查本地是否存在指定镜像。如果本地不存在该 名称的镜像,Docker就会⾃动从Docker Hub下载镜像并启动⼀个Docker容器。. 列出容器[重要] 使⽤ docker ps 命令即可列出运⾏中的容器。执⾏该命令后,可看到类似于如下的表格。 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 784fd3b294d7 nginx "nginx -g 'daemon off" 20 minutes ago Up 2 seconds 443/tcp, 0.0.0.0:91->80/tcp backstabbing_archimedes. 如需列出所有容器(包括已停⽌的容器),可使⽤-a参数。 该表格包含了七列,含义如下: ① CONTAINER_ID:表示容器ID。 ② IMAGE:表示镜像名称。 ③ COMMAND:表示启动容器时运⾏的命令。 ④ CREATED:表示容器的创建时间。 ⑤ STATUS:表示容器运⾏的状态。Up表示运⾏中,Exited表示已停⽌。 ⑥ PORTS:表示容器对外的端⼝号。 ⑦ NAMES:表示容器名称。该名称默认由Docker⾃动⽣成,也可使⽤docker run命令的--name选项 ⾃⾏指定。 命令格式: docker ps [OPTIONS]. 25.

(26) 05-容器常⽤命令. 参数: Name, shorthand. Default. --all, -a. false. Description 列出所有容器,包括未运⾏的容器,默认只展示运⾏的容器. --filter, -f. 根据条件过滤显示内容. --format. 通过Go语⾔模板⽂件展示镜像. --last, -n. -1. 显示最近创建n个容器(包含所有状态). --latest, -l. false. 显示最近创建的容器(包含所有状态). --no-trunc. false. 不截断输出. --quiet, -q. false. 静默模式,只展示容器的编号. --size, -s. false. 显示总⽂件⼤⼩. 示例: docker ps -n 5 docker ps -a -q. 停⽌容器[重要] 使⽤ docker stop 命令,即可停⽌容器。 命令格式: docker stop [OPTIONS] CONTAINER [CONTAINER...]. 参数: Name, shorthand --time, -t. Default 10. Description 强制杀死容器前等待的时间,单位是秒. 示例: docker stop 784fd3b294d7. 其中 784fd3b294d7 是容器ID,当然也可使⽤ docker stop 容器名称 来停⽌指定容器。. 强制停⽌容器[重要] 可使⽤ docker kill 命令停⽌⼀个或更多运⾏着的容器。 命令格式:. 26.

(27) 05-容器常⽤命令. docker kill [OPTIONS] CONTAINER [CONTAINER...]. 参数: Name, shorthand. Default. --signal, -s. Description 向容器发送⼀个信号. KILL. 例如: docker kill 784fd3b294d7. 启动已停⽌的容器[重要] 使⽤ docker run 命令,即可新建并启动⼀个容器。对于已停⽌的容器,可使⽤ docker start 命 令来启动。 命令格式: docker start [OPTIONS] CONTAINER [CONTAINER...]. 参数: Name, shorthand --attach, -a. Default false. Description 连接STDOUT/STDERR并转发信号. --checkpoint. 从该检查点还原. --checkpoint-dir. 使⽤⾃定义的检查点存储⽬录. --detach-keys. 覆盖断开容器的关键顺序. --interactive, -i. false. 连接容器的STDIN. 例如: docker start 784fd3b294d7. 重启容器[重要] 可使⽤ docker restart 命令来重启容器。该命令实际上是先执⾏了 docker stop 命令,然后执⾏ 了 docker start 命令。 命令格式: docker restart [OPTIONS] CONTAINER [CONTAINER...]. 27.

(28) 05-容器常⽤命令. 参数: Name, shorthand --time, -t. Default 10. Description 关闭容器前等待的时间,单位是秒. 进⼊容器[重要] 某场景下,我们可能需要进⼊运⾏中的容器。 ① 使⽤ docker attach 命令进⼊容器。 例如: docker attach 784fd3b294d7. 很多场景下,使⽤ docker attach 命令并不⽅便。当多个窗⼝同时attach到同⼀个容器时,所有窗⼝ 都会同步显示。同理,如果某个窗⼝发⽣阻塞,其他窗⼝也⽆法执⾏操作。 ② 使⽤ nsenter 进⼊容器 nsenter⼯具包含在util-linux 2.23或更⾼版本中。为了连接到容器,我们需要找到容器第⼀个进程的 PID,可通过以下命令获取: docker inspect --format "{{.State.Pid}}" $CONTAINER_ID. 获得PID后,就可使⽤nsenter命令进⼊容器了: nsenter --target "$PID" --mount --uts --ipc --net --pid. 下⾯给出⼀个完整的例⼦: [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 784fd3b294d7 nginx "nginx -g 'daemon off" 55 minutes ago Up 3 minutes 443/tcp, 0.0.0.0:91->80/tcp backstabbing_archimedes [root@localhost ~]# docker inspect --format "{{.State.Pid}}" 784fd3b294d7 95492 [root@localhost ~]# nsenter --target 95492 --mount --uts --ipc --net --pid root@784fd3b294d7:/#. 读者也可将以上两条命令封装成⼀个Shell,从⽽简化进⼊容器的过程。 ③ docker exec docker exec -it 容器id /bin/bash. 28.

(29) 05-容器常⽤命令. 删除容器[重要] 使⽤ docker rm 命令即可删除指定容器。 命令格式 docker rm [OPTIONS] CONTAINER [CONTAINER...]. 参数: Name, shorthand. Default. Description. --force, -f. false. 通过SIGKILL信号强制删除正在运⾏中的容器. --link, -l. false. 删除容器间的⽹络连接. --volumes, -v. false. 删除与容器关联的卷. 例1:删除指定容器。 docker rm 784fd3b294d7. 该命令只能删除已停⽌的容器,如需删除正在运⾏的容器,可使⽤-f参数。 例2:删除所有的容器。 docker rm -f $(docker ps -a -q). 导出容器 将容器导出成⼀个压缩包⽂件。 命令格式: docker export [OPTIONS] CONTAINER. 参数: Name, shorthand. Default. --output, -o. Description 将内容写到⽂件⽽⾮STDOUT. 示例: docker export red_panda > latest.tar docker export --output="latest.tar" red_panda. 导⼊容器 29.

(30) 05-容器常⽤命令. 使⽤ docker import 命令即可从归档⽂件导⼊内容并创建镜像。 命令格式: docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]. 参数: Name, shorthand. Default. Description. --change, -c. 将Dockerfile指令应⽤到创建的镜像. --message, -m. 为导⼊的镜像设置提交信息. 示例: docker import nginx2.tar nginx. 拓展阅读 Docker的⽹络:https://docs.docker.com/engine/userguide/networking/ Docker命令:https://docs.docker.com/engine/reference/commandline/docker/. 30.

(31) 06-实战:修改Nginx⾸⻚. 实战:修改Nginx⾸⻚ 6.1 需求 启动⼀个Nginx容器。 将Nginx容器的⾸⻚改为 Welcome to 51CTO docker class 。 将容器保存下来。. 6.2 提示 Nginx默认⾸⻚⽬录在: /usr/share/nginx/html/index.html. 答案 docker exec -it nginx容器ID /bin/bash # 进⼊容器. 执⾏如下命令,修改/usr/share/nginx/html/index.html tee index.html <<-'EOF' Welcome to 51CTO docker class EOF. 31.

(32) 07-Dockerfile指令详解. Dockerfile指令详解 在前⾯的例⼦中,我们提到了FROM、RUN指令。事实上,Dockerfile有⼗多个指令。本节我们来系统 讲解这些指令,指令的⼀般格式为 指令名称 参数 。. ADD 复制⽂件 ADD指令⽤于复制⽂件,格式为: ADD <src>... <dest> ADD ["<src>",... "<dest>"]. 从src⽬录复制⽂件到容器的dest。其中src可以是Dockerfile所在⽬录的相对路径,也可以是⼀个 URL,还可以是⼀个压缩包 注意: ① src必须在构建的上下⽂内,不能使⽤例如: ADD ../somethine /something 这样的命令,因 为 docker build 命令⾸先会将上下⽂路径和其⼦⽬录发送到docker daemon。 ② 如果src是⼀个URL,同时dest不以斜杠结尾,dest将会被视为⽂件,src对应内容⽂件将会被下载到 dest。 ③ 如果src是⼀个URL,同时dest以斜杠结尾,dest将被视为⽬录,src对应内容将会被下载到dest⽬ 录。 ④ 如果src是⼀个⽬录,那么整个⽬录下的内容将会被拷⻉,包括⽂件系统元数据。 ⑤ 如果⽂件是可识别的压缩包格式,则docker会⾃动解压。 示例: ADD microservice-discovery-eureka-0.0.1-SNAPSHOT.jar app.jar. ARG 设置构建参数 ARG指令⽤于设置构建参数,类似于ENV。和ARG不同的是,ARG设置的是构建时的环境变量,在容 器运⾏时是不会存在这些变量的。 格式为: ARG <name>[=<default value>]. 示例: ARG user1=someuser. 32.

(33) 07-Dockerfile指令详解. 详细介绍⽂档:https://www.centos.bz/2016/12/dockerfile-arg-instruction/. CMD 容器启动命令 CMD指令⽤于为执⾏容器提供默认值。每个Dockerfile只有⼀个CMD命令,如果指定了多个CMD命 令,那么只有最后⼀条会被执⾏,如果启动容器的时候指定了运⾏的命令,则会覆盖掉CMD指定的命 令。 ⽀持三种格式: CMD ["executable","param1","param2"] (推荐使⽤) CMD ["param1","param2"] (为ENTRYPOINT指令提供预设参数) CMD command param1 param2 (在shell中执⾏). 示例: CMD echo "This is a test." | wc -. COPY 复制⽂件 复制⽂件,格式为: COPY <src>... <dest> COPY ["<src>",... "<dest>"]. 复制本地端的src到容器的dest。COPY指令和ADD指令类似,COPY不⽀持URL和压缩包。. ENTRYPOINT ⼊⼝点 格式为: ENTRYPOINT ["executable", "param1", "param2"] ENTRYPOINT command param1 param2. ENTRYPOINT和CMD指令的⽬的⼀样,都是指定Docker容器启动时执⾏的命令,可多次设置,但只 有最后⼀个有效。ENTRYPOINT不可被重写覆盖。 ENTRYPOINT、CMD区别:http://blog.csdn.net/newjueqi/article/details/51355510. ENV 设置环境变量 ENV指令⽤于设置环境变量,格式为: ENV <key> <value> ENV <key>=<value> .... 33.

(34) 07-Dockerfile指令详解. 示例: ENV JAVA_HOME /path/to/java. EXPOSE 声明暴露的端⼝ EXPOSE指令⽤于声明在运⾏时容器提供服务的端⼝,格式为: EXPOSE <port> [<port>...]. 需要注意的是,这只是⼀个声明,运⾏时并不会因为该声明就打开相应端⼝。该指令的作⽤主要是帮 助镜像使⽤者理解该镜像服务的守护端⼝;其次是当运⾏时使⽤随机映射时,会⾃动映射EXPOSE的 端⼝。示例: # 声明暴露⼀个端⼝示例 EXPOSE port1 # 相应的运⾏容器使⽤的命令 docker run -p port1 image # 也可使⽤-P选项启动 docker run -P image # 声明暴露多个端⼝示例 EXPOSE port1 port2 port3 # 相应的运⾏容器使⽤的命令 docker run -p port1 -p port2 -p port3 image # 也可指定需要映射到宿主机器上的端⼝号 docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3 image. FROM 指定基础镜像 使⽤FROM指令指定基础镜像,FROM指令有点像Java⾥⾯的“extends”关键字。需要注意的是, FROM指令必须指定且需要写在其他指令之前。FROM指令后的所有指令都依赖于该指令所指定的镜 像。 ⽀持三种格式: FROM <image> FROM <image>:<tag> FROM <image>@<digest>. LABEL 为镜像添加元数据 LABEL指令⽤于为镜像添加元数据。 格式为: LABEL <key>=<value> <key>=<value> <key>=<value> .... 34.

(35) 07-Dockerfile指令详解. 使⽤ ”"“和”\“转换命令⾏,示例: LABEL "com.example.vendor"="ACME Incorporated" LABEL com.example.label-with-value="foo" LABEL version="1.0" LABEL description="This text illustrates \ that label-values can span multiple lines.". MAINTAINER 指定维护者的信息(已过时) MAINTAINER指令⽤于指定维护者的信息,⽤于为Dockerfile署名。 格式为: MAINTAINER <name>. 示例: MAINTAINER 周⽴<[email protected]>. 注:该指令已过时,建议使⽤如下形式: LABEL maintainer="[email protected]". RUN 执⾏命令 该指令⽀持两种格式: RUN <command> RUN ["executable", "param1", "param2"] RUN <command> 在shell终端中运⾏,在Linux中默认是 /bin/sh -c ,在Windows中是 cmd /s /c ,使⽤这种格式,就像直接在命令⾏中输⼊命令⼀样。 RUN ["executable", "param1", "param2"] 使⽤exec执⾏,这种⽅式类似于函数调⽤。指定其他终端可以通过该⽅式操作,例. 如: RUN ["/bin/bash", "-c", "echo hello"] ,该⽅式必须使⽤双引号["]⽽不能使⽤单引号['], 因为该⽅式会被转换成⼀个JSON 数组。. USER 设置⽤户 该指令⽤于设置启动镜像时的⽤户或者UID,写在该指令后的RUN、CMD以及ENTRYPOINT指令都将 使⽤该⽤户执⾏命令。 格式为: USER ⽤户名. 35.

(36) 07-Dockerfile指令详解. 示例: USER daemon. VOLUME 指定挂载点 该指令使容器中的⼀个⽬录具有持久化存储的功能,该⽬录可被容器本身使⽤,也可共享给其他容 器。当容器中的应⽤有持久化数据的需求时可以在Dockerfile中使⽤该指令。格式为: VOLUME ["/data"]. 示例: VOLUME /data. 使⽤示例: FROM nginx VOLUME /tmp. 当该Dockerfile被构建成镜像后,/tmp⽬录中的数据即使容器关闭也依然存在。如果另⼀个容器也有持 久化的需求,并且想使⽤以上容器/tmp⽬录中的内容,则可使⽤如下命令启动容器: docker run -volume-from 容器ID 镜像名称 # 容器ID是di⼀个容器的ID,镜像是第⼆个容器所使⽤的 镜像。. WORKDIR 指定⼯作⽬录 格式为: WORKDIR /path/to/workdir. 切换⽬录指令,类似于cd命令,写在该指令后的 RUN , CMD 以及 ENTRYPOINT 指令都将该⽬录作为 当前⽬录,并执⾏相应的命令。. 其他 Dockerfile还有⼀些其他的指令,例如STOPSINGAL、HEALTHCHECK、SHELL等。由于并不是很常 ⽤,本书不作赘述。有兴趣的读者可前往https://docs.docker.com/engine/reference/builder/ 扩展阅 读。. CMD/ENTRYPOINT/RUN区别 参考:https://segmentfault.com/q/1010000000417103. 36.

(37) 07-Dockerfile指令详解. 拓展阅读 Dockerfile官⽅⽂档:https://docs.docker.com/engine/reference/builder/#dockerfile-reference Dockerfile最佳实践:https://docs.docker.com/engine/userguide/eng-image/dockerfile_bestpractices/#build-cache. 37.

(38) 08-实战:使⽤Dockerfile修改Nginx⾸⻚. 实战:使⽤Dockerfile修改Nginx⾸⻚ 创建⼀个Dockerfile,内容如下: FROM nginx RUN echo '<h1>Spring Cloud与Docker微服务实战</h1>' > /usr/share/nginx/html/index.html. 38.

(39) 09-实战:巩固-阅读常⽤软件的Dockerfile. 巩固-阅读常⽤软件的Dockerfile Nginx:https://github.com/nginxinc/dockernginx/blob/849fed0093112cd9f55491fccd2f861eb9fad5f9/stable/alpine/Dockerfile Tomcat:https://github.com/dockerlibrary/tomcat/blob/0e9a915bf893faa9160ab1a144c7ba5049a4fe27/7/jre7-alpine/Dockerfile 关于Alpine Linux:http://www.cnblogs.com/zhangmingcheng/p/7122386.html. 39.

(40) 10-使⽤Docker Hub管理镜像. 使⽤Docker Hub管理镜像 Docker Hub是Docker官⽅维护的Docker Registry,上⾯存放着很多优秀的镜像。不仅如此,Docker Hub还提供认证、⼯作组结构、⼯作流⼯具、构建触发器等⼯具来简化我们的⼯作。 前⽂已经讲过,我们可使⽤ docker search 命令搜索存放在Docker Hub中的镜像。本节我们来详细 探讨Docker Hub的使⽤。. 注册与登录 Docker Hub的使⽤⾮常简单,只需注册⼀个Docker Hub账号,就可正常使⽤了。登录后,我们可看到 Docker Hub的主⻚,如图所示。. 我们也可使⽤ docker login 命令登录Docker Hub。输⼊该命令并按照提示输⼊账号和密码,即可完 成登录。例如: $ docker login Login with your Docker ID to push and pull images from Docker Hub. If you don't hav e a Docker ID, head over to https://hub.docker.com to create one. Username: itmuch Password: Login Succeeded. 创建仓库 点击Docker Hub主⻚上的"Create Repository"按钮,按照提示填⼊信息即可创建⼀个仓库。. 40.

(41) 10-使⽤Docker Hub管理镜像. 如图,我们只需填⼊相关信息,并点击Create按钮,就可创建⼀个名为microservice-discovery-eureka 的公共仓库。. 推送镜像 下⾯我们来将前⽂构建的镜像推送到Docker Hub。使⽤以下命令即可,例如: docker push itmuch/microservice-discovery-eureka:0.0.1. 经过⼀段时间的等待,就可推送成功。这样,我们就可在Docker Hub查看已推送的镜像。. 41.

(42) 11-使⽤Docker Registry管理Docker镜像. 使⽤Docker Registry管理镜像 很多场景下,我们需使⽤私有仓库管理Docker镜像。相⽐Docker Hub,私有仓库有以下优势: (1) 节省带宽,对于私有仓库中已有的镜像,⽆需从Docker Hub下载,只需从私有仓库中下载即可; (2) 更加安全; (3) 便于内部镜像的统⼀管理。 本节我们来探讨如何搭建、使⽤私有仓库。可使⽤docker-registry项⽬或者Docker Registry 2.0来搭建 私有仓库,但docker-registry已被官⽅标记为过时,并且已有2年不维护了,不建议使⽤。 我们先⽤Docker Registry 2.0搭建⼀个私有仓库,然后将Docker镜像推送到私有仓库。. 原理图. 搭建Docker Registry 2.0 Docker Registry 2.0的搭建⾮常简单,只需执⾏以下命令即可新建并启动⼀个Docker Registry 2.0。 docker run -d -p 5000:5000 --restart=always --name registry2 registry:2. 将镜像推送到Docker Registry 2.0 42.

(43) 11-使⽤Docker Registry管理Docker镜像. 前⽂我们使⽤ docker push 命令将镜像推送到了Docker Hub,现在我们将前⽂构建的 itmuch/microservice-discovery-eureka:0.0.1推送到私有仓库。 只需指定私有仓库的地址,即可将镜像推送到私有仓库。 docker push localhost:5000/itmuch/microservice-discovery-eureka:0.0.1. 执⾏以上命令,我们发现推送并没有成功,且提示以下内容: The push refers to a repository [localhost:5000/itmuch/microservice-discovery-eurek a] An image does not exist locally with the tag: localhost:5000/itmuch/microservice-di scovery-eureka. 我们知道,Docker Hub是默认的Docker Registry,因此,itmuch/microservice-discovery-eureka:0.0.1 相当于docker.io/itmuch/microservice-discovery-eureka:0.0.1。因此,要想将镜像推送到私有仓库,需 要修改镜像标签,命令如下: docker tag itmuch/microservice-discovery-eureka:0.0.1 localhost:5000/itmuch/microse rvice-discovery-eureka:0.0.1. 修改镜像标签后,再次执⾏以下命令,即可将镜像推送到私有仓库。 docker push localhost:5000/itmuch/microservice-discovery-eureka:0.0.1. TIPS (1) docker-registry的GitHub:https://github.com/docker/docker-registry (2) Docker Registry 2.0的GitHub:https://github.com/docker/distribution (3) 本节中“私有仓库”表示私有Docker Registry,并⾮Docker中仓库的概念。 (4) Docker Registry 2.0需要Docker版本⾼于1.6.0。 (5) 我们还可为私有仓库配置域名、SSL登录、认证等。限于篇幅,本书不作赘述。有兴趣的读者可参 考笔者的开源书:https://gitee.com/itmuch/spring-cloudbook/blob/master/3%20%E4%BD%BF%E7%94%A8Docker%E6%9E%84%E5%BB%BA%E5%BE% AE%E6%9C%8D%E5%8A%A1/3.5%20Docker%E7%A7%81%E6%9C%89%E4%BB%93%E5%BA %93%E7%9A%84%E6%90%AD%E5%BB%BA%E4%B8%8E%E4%BD%BF%E7%94%A8.md。 (6) Docker Registry 2.0能够满⾜我们⼤部分场景下的需求,但它不包含界⾯、⽤户管理、权限控制等 功能。如果想要使⽤这些功能,可使⽤Docker Trusted Registry。. 43.

(44) 11-使⽤Docker Registry管理Docker镜像. 44.

(45) 12-使⽤Nexus管理Docker镜像. 使⽤Nexus管理Docker镜像 Nexus简介 Nexus是⼀个多功能的仓库管理器,是企业常⽤的私有仓库服务器软件。⽬前常被⽤来作为Maven私 服、Docker私服。本⽂基于 Nexus 3.5.2-01 版本进⾏讲解。. Nexus下载 前往:https://www.sonatype.com/download-oss-sonatype ,根据操作系统,下载对应操作系统下的安 装包即可。. 安装 Nexus在不同系统中安装略有区别,但总体⼀致。下⾯以在Linux系统中的安装为例说明: 创建⼀个Linux⽤户,例如:nexus useradd nexus. 解压Nexus安装包,为将解压后的⽂件设置权限,并修改属主为nexus⽤户 chmod -R 755 * chown -R nexus:nexus *. 将⽬录切换到 $NEXUS_HOME/nexus-3.5.2-01/bin ⽬录 需改 nexus.rc ⽂件,将其内容改为: run_as_user="nexus". 表示使⽤nexus⽤户启动Nexus。 如提示⽂件限制,可参考博⽂:http://www.cnblogs.com/zengkefu/p/5649407.html 进⾏修改。 执⾏如下命令,查看Nexus为我们提供哪些命令。 ./nexus --help. 可显示类似如下的内容: Usage: ./nexus {start|stop|run|run-redirect|status|restart|force-reload}. 45.

(46) 12-使⽤Nexus管理Docker镜像. 指定如下命令,即可启动Nexus ./nexus start. 稍等⽚刻,Nexus即可成功启动。. 账户 Nexus提供了默认的管理员账户,账号密码分别是admin/admin123。⽤户可⾃⾏修改该默认账号密 码。. 创建Docker仓库 访问http://localhost:8081 并登录 点击“Create repository”按钮,创建仓库。Nexus⽀持多种仓库类型,例如:maven、npm、 docker等。本⽂创建⼀个docker仓库。⼀般来说,对于特定的仓库类型(例如docker),细分了 三类,分别是proxy、hosted、group,含义如下: hosted,本地代理仓库,通常我们会部署⾃⼰的构件到这⼀类型的仓库,可以push和pull。 proxy,代理的远程仓库,它们被⽤来代理远程的公共仓库,如maven中央仓库,只能pull。 group,仓库组,⽤来合并多个hosted/proxy仓库,通常我们配置maven依赖仓库组,只能 pull。 本⽂创建⼀个hosted类型的仓库 配置仓库,如图,填⼊如下结果:. 46.

(47) 12-使⽤Nexus管理Docker镜像. 这样,仓库就创建完毕了。. Docker配置 下⾯,我们需要为Docker指定使⽤Nexus仓库。 修改 /etc/docker/daemon.json ,在其中添加类似如下的内容。 { "insecure-registries" : [ "192.168.1.101:8082" ] ... }. 重启Docker. 47.

(48) 12-使⽤Nexus管理Docker镜像. 登录私有仓库 docker login 192.168.1.101:8082. 即可登录私有仓库。然后,我们就可进⾏pull、push操作了。. 容器启动Nexus 地址:https://store.docker.com/community/images/sonatype/nexus3 docker run -d -p 8081:8081 --name nexus sonatype/nexus3. 为启动的容器映射端⼝:http://blog.csdn.net/github_29237033/article/details/46632647. 48.

(49) 13-Docker可视化管理⼯具. Docker可视化管理⼯具 DockerUI(ui for Docker) 官⽅GitHub:https://github.com/kevana/ui-for-docker 项⽬已废弃,现在转投Portainer项⽬。. Portainer 简介:Portainer是⼀个轻量级的管理界⾯,可以让您轻松地管理不同的Docker环境(Docker主机或 Swarm集群)。Portainer提供状态显示⾯板、应⽤模板快速部署、容器镜像⽹络数据卷的基本操作、 事件⽇志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录⽤户管理和控制等功 能。功能⼗分全⾯,基本能满⾜中⼩型单位对容器管理的全部需求。 官⽅GitHub:https://github.com/portainer/portainer 使⽤: docker run -d --privileged -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.soc k -v /opt/portainer:/data portainer/portainer. 如开启了SELinux,可执⾏如下命令启动: docker run -d --privileged -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.soc k -v /opt/portainer:/data portainer/portainer. 官⽅⽂档:https://portainer.readthedocs.io/en/latest/deployment.html. Kitematic 简介:Kitematic是⼀个Docker GUI。 官⽅GitHub:https://github.com/docker/kitematic 使⽤:演示. Shipyard 简介:Shipyard 是⼀个基于 Web 的 Docker 管理⼯具,⽀持多 host,可以把多个 Docker host 上的 containers 统⼀管理;可以查看 images,甚⾄ build images;并提供 RESTful API 等。 官⽅GitHub:https://github.com/shipyard/shipyard 安装:. 49.

(50) 13-Docker可视化管理⼯具. curl -s https://shipyard-project.com/deploy | bash -s. 展示所有参数: curl -s https://shipyard-project.com/deploy | bash -s -- -h. 使⽤:访问http://localhost:8080 ,输⼊账号/密码:admin/shipyard即可访问Shipyard。 官⽅⽂档:https://shipyard-project.com/. 各种可视化界⾯的⽐较 参考:http://m.blog.csdn.net/qq273681448/article/details/75007828. 50.

(51) 14-Docker数据持久化. Docker数据持久化 容器中数据持久化主要有两种⽅式: 数据卷(Data Volumes) 数据卷容器(Data Volumes Dontainers). 数据卷 数据卷是⼀个可供⼀个或多个容器使⽤的特殊⽬录,可以绕过UFS(Unix File System)。 数据卷可以在容器之间共享和重⽤ 对数据卷的修改会⽴⻢⽣效 对数据卷的更新,不会影响镜像 数据卷默认会⼀直存在,即使容器被删除 ⼀个容器可以挂载多个数据卷 注意:数据卷的使⽤,类似于 Linux 下对⽬录或⽂件进⾏ mount。. 创建数据卷 示例: docker run --name nginx-data -v /mydir nginx. 执⾏如下命令即可查看容器构造的详情: docker inspect 容器ID. 由测试可知: Docker会⾃动⽣成⼀个⽬录作为挂载的⽬录。 即使容器被删除,宿主机中的⽬录也不会被删除。. 删除数据卷 数据卷是被设计来持久化数据的,因此,删除容器并不会删除数据卷。如果想要在删除容器时同时删 除数据卷,可使⽤如下命令: docker rm -v 容器ID. 这样既可在删除容器的同时也将数据卷删除。. 51.

(52) 14-Docker数据持久化. 挂载宿主机⽬录作为数据卷 docker run --name nginx-data2 -v /host-dir:/container-dir nginx. 这样既可将宿主机的/host-dir路径加载到容器的/container-dir中。 需要注意的是: 宿主机路径尽量设置绝对路径——如果使⽤相对路径会怎样? 测试给答案 如果宿主机路径不存在,Docker会⾃动创建 TIPS Dockerfile暂时不⽀持这种形式。. 挂载宿主机⽂件作为数据卷 docker run --name nginx-data3 -v /⽂件路径:/container路径 nginx. 指定权限 默认情况下,挂载的权限是读写权限。也可使⽤ :ro 参数指定只读权限。 示例: docker run --name nginx-data4 -v /host-dir:/container-dir:ro nginx. 这样,在容器中就只能读取/container-dir中的⽂件,⽽不能修改了。. 数据卷容器 如果有数据需要在多个容器之间共享,此时可考虑使⽤数据卷容器。 创建数据卷容器: docker run --name nginx-volume -v /data nginx. 在其他容器中使⽤ -volumes-from 来挂载nginx-volume容器中的数据卷。 docker run --name v1 --volumes-from nginx-volume nginx docker run --name v2 --volumes-from nginx-volume nginx. 这样:. 52.

(53) 14-Docker数据持久化. v1、v2两个容器即可共享nginx-volume这个容器中的⽂件。 即使nginx-volume停⽌,也不会有任何影响。. 53.

(54) 15-端⼝映射. 端⼝映射 在前⾯的内容中,我们很多地⽅使⽤了-p参数来实现端⼝映射。本节我们来详细讲解Docker中的端⼝ 映射。. 随机映射:-P 当启动时使⽤-P参数时,即可让Docker随机映射⼀个端⼝到容器内部开放的端⼝ docker run -P nginx. 指定端⼝映射:-p 指定端⼝映射有如下⼏种格式: ip:hostPort:containerPort:映射到指定IP的指定端⼝ ip::containerPort:映射到指定IP的随机端⼝ hostPort:containerPort:映射到宿主机所有IP的指定端⼝ containerPort:映射到宿主机所有IP的随机端⼝. 查看端⼝映射 有多种⽅式可以查看端⼝映射的详情。 ⽅法1: docker ps. ⽅法2: docker port 容器ID. 54.

(55) 16-遗留⽹络. 遗留特性:容器互联 端⼝映射实现了外部与容器的⽹络通信,下⾯我们来探讨容器之间如何通信。使⽤ --link 参数即可 实现容器之间的互联。该参数的格式为: --link name:alias ,其中,name是容器的名称,alias则 是这个连接的别名。 docker run --link nginx:nginx eureka # 使⽤eureka镜像启动容器,并将其连接上nginx这个容器 。. 注:该特性未来可能被删除,不做赘述。相关⽂ 档:https://docs.docker.com/engine/userguide/networking/default_network/dockerlinks/. 55.

(56) 17-Docker⽹络. Docker容器⽹络 本节概述了Docker默认的⽹络⾏为,包括默认情况下创建的⽹络类型以及如何创建⽤户⾃定义⽹络。 本⽂也描述了在单个主机或集群上创建⽹络所需的资源。 有关Docker如何在Linux主机上与 iptables 进⾏交互的详细信息,请参阅Docker和 iptables 。. 默认⽹络 当您安装Docker时,它会⾃动创建三个⽹络,可使⽤ docker network ls 命令列出这些⽹络: $ docker network ls NETWORK ID NAME DRIVER 7fca4eb8c647 bridge bridge 9f904ee27bf5 none null cf03ee007fb4 host host. Docker内置如上三个⽹络。 运⾏容器时,可使⽤ --network 标志来指定容器应连接到哪些⽹络。 bridge ⽹络代表所有Docker安装中存在的 docker0 ⽹络。 除⾮您使⽤ docker run --network= <NETWORK> 选项,否则Docker守护程序默认将容器连接到此⽹络。 可使⽤ ip addr show 命令(或. 简写形式, ip a ),xia显示该⽹桥的信息。 ( ifconfig 命令已被弃⽤,根据系统的不同,还可 能会 command not found 错误。) $ ip addr show docker0 Link encap:Ethernet HWaddr 02:42:47:bc:3a:eb inet addr:172.17.0.1 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr: fe80::42:47ff:febc:3aeb/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:9001 Metric:1 RX packets:17 errors:0 dropped:0 overruns:0 frame:0 TX packets:8 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:1100 (1.1 KB) TX bytes:648 (648.0 B). 如何在Docker for Mac或Docker for Windows上运⾏? 如果您使⽤Docker for Mac(或在Docker for Windows上运⾏Linux容器), docker network ls 命令将按照上述⽅式⼯作,但 ip addr show 和 ifconfig 命令可能会展示结果,但会给. 你本地主机的IP地址信息,⽽不是Docker容器⽹络。 这是因为Docker使⽤虚拟机中运⾏的⽹ 卡,⽽并⾮在宿主机的⽹卡。. 56.

(57) 17-Docker⽹络. 要使⽤ ip addr show 或 ifconfig 命令浏览Docker⽹络,请前往Docker Machine 查看相关⽂ 档;如您使⽤的是云提供商,如AWS上的Docker Machine或Digital Ocean上的Docker Machine 。可使⽤ docker-machine ssh <machine-name> 登录到本地或云托管的机器,也可根据云提供 商站点上的描述,直接 ssh 。 none ⽹络将容器添加到容器特定的⽹络,该容器缺少⽹卡。Attach到⼀个⽹络为 none 模式的容. 器,将会看到类似如下的内容: $ docker attach nonenetcontainer root@0cb243cd1293:/# 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 root@0cb243cd1293:/# ifconfig lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) root@0cb243cd1293:/#. 注意 :可使⽤ CTRL-p CTRL-q 断开容器连接并离开。 host ⽹络模式将容器添加到在宿主机的⽹络栈上。就⽹络⽽⾔,宿主机和容器之间没有隔离。例. 如,如果您使⽤ host ⽹络运⾏在80端⼝上运⾏⼀个Web服务器容器,则该容器可在宿主机的80端⼝ 上使⽤。 在Docker中, none 和 host ⽹络模式不能直接配置。 但是,您可以配置默认的 bridge ⽹络, 以及⽤户⾃定义的⽹桥。. 默认⽹桥 所有Docker主机上都有默认的 bridge ⽹络。 如不指定⽹络,容器将⾃动连接到默认的 bridge ⽹ 络。 docker network inspect 命令返回有关⽹络的信息:. $ docker network inspect bridge [. 57.

(58) 17-Docker⽹络. { "Name": "bridge", "Id": "f7ab26d71dbd6f557852c7156ae0574bbf62c42f539b50c8ebde0f728a253b6f", "Scope": "local", "Driver": "bridge", "IPAM": { "Driver": "default", "Config": [ { "Subnet": "172.17.0.1/16", "Gateway": "172.17.0.1" } ] }, "Containers": {}, "Options": { "com.docker.network.bridge.default_bridge": "true", "com.docker.network.bridge.enable_icc": "true", "com.docker.network.bridge.enable_ip_masquerade": "true", "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", "com.docker.network.bridge.name": "docker0", "com.docker.network.driver.mtu": "9001" }, "Labels": {} } ]. 运⾏以下两个命令启动两个 busybox 容器,两个容器都连接到默认的 bridge ⽹络。 $ docker run -itd --name=container1 busybox 3386a527aa08b37ea9232cbcace2d2458d49f44bb05a6b775fba7ddd40d8f92c $ docker run -itd --name=container2 busybox 94447ca479852d29aeddca75c28f7104df3c3196d7b6d83061879e339946805c. 启动两个容器后再检查 bridge ⽹络。 这两个 busybox 容器都连接到⽹络。 可看到类似如下的结 果: $ docker network inspect bridge {[ { "Name": "bridge", "Id": "f7ab26d71dbd6f557852c7156ae0574bbf62c42f539b50c8ebde0f728a253b6f", "Scope": "local", "Driver": "bridge", "IPAM": {. 58.

(59) 17-Docker⽹络. "Driver": "default", "Config": [ { "Subnet": "172.17.0.1/16", "Gateway": "172.17.0.1" } ] }, "Containers": { "3386a527aa08b37ea9232cbcace2d2458d49f44bb05a6b775fba7ddd40d8f92c": { "EndpointID": "647c12443e91faf0fd508b6edfe59c30b642abb60dfab890b4bd ccee38750bc1", "MacAddress": "02:42:ac:11:00:02", "IPv4Address": "172.17.0.2/16", "IPv6Address": "" }, "94447ca479852d29aeddca75c28f7104df3c3196d7b6d83061879e339946805c": { "EndpointID": "b047d090f446ac49747d3c37d63e4307be745876db7f0ceef7b3 11cbba615f48", "MacAddress": "02:42:ac:11:00:03", "IPv4Address": "172.17.0.3/16", "IPv6Address": "" } }, "Options": { "com.docker.network.bridge.default_bridge": "true", "com.docker.network.bridge.enable_icc": "true", "com.docker.network.bridge.enable_ip_masquerade": "true", "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", "com.docker.network.bridge.name": "docker0", "com.docker.network.driver.mtu": "9001" }, "Labels": {} } ]. 连接到默认 bridge ⽹络的容器可通过IP地址进⾏通信。 Docker不⽀持在默认⽹桥上⾃动发现服 务。如果您希望容器能够通过容器名称来解析IP地址,那么可使⽤⽤户⾃定义⽹络 。您可以使⽤遗留 的 docker run --link 选项将两个容器连接在⼀起,但在⼤多数情况下不推荐使⽤。 您可以 attach 到正在运⾏的容器,查看容器内部的IP是什么。 $ docker attach container1 root@3386a527aa08:/# ifconfig eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:02 inet addr:172.17.0.2 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:9001 Metric:1. 59.

(60) 17-Docker⽹络. RX packets:16 errors:0 dropped:0 overruns:0 frame:0 TX packets:8 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:1296 (1.2 KiB) TX bytes:648 (648.0 B) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B). 从容器内部,使⽤ ping 命令测试与其他容器的⽹络连接。 root@3386a527aa08:/# ping -w3 172.17.0.3 PING 172.17.0.3 (172.17.0.3): 56 data bytes 64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.096 ms 64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.080 ms 64 bytes from 172.17.0.3: seq=2 ttl=64 time=0.074 ms --- 172.17.0.3 ping statistics --3 packets transmitted, 3 packets received, 0% packet loss round-trip min/avg/max = 0.074/0.083/0.096 ms. 使⽤ cat 命令查看容器上的 /etc/hosts ⽂件。 该命令显示容器识别的主机名和IP地址。 root@3386a527aa08:/# cat /etc/hosts 172.17.0.2 3386a527aa08 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. 要从 container1 容器离开,并保持容器的运⾏,请依次使⽤CTRL-p CTRL-q 。 如果你愿意,也可 attch到 container2 ,并重复上⾯的命令。 默认的 docker0 桥接⽹络⽀持使⽤端⼝映射和 docker run --link ,以便在 docker0 ⽹络中的 容器之间进⾏通信。 不推荐这种⽅法。 如果可以,请使⽤⽤户定义的桥接⽹络。. ⽤户⾃定义的⽹络. 60.

(61) 17-Docker⽹络. 建议使⽤⽤户⾃定义⽹桥来控制哪些容器可以相互通信,这样也可启⽤⾃动DNS去解析容器名称到IP 地址。 Docker提供了创建这些⽹络的默认⽹络驱动程序。您可以创建⼀个新的桥接⽹络, 覆盖⽹络或 MACVLAN⽹络 。 您还可以创建⼀个⽹络插件或远程⽹络进⾏完整的⾃定义和控制。 您可以根据需要创建任意数量的⽹络,并且可在任意时间将容器连接到这些⽹络中的零个或多个。 此 外,您可以将运⾏着的容器连接或断开⽹络,⽽⽆需重启容器。当容器连接到多个⽹络时,其外部连 接通过第⼀个⾮内部⽹络以词汇顺序提供。 接下来的⼏节将详细介绍Docker的内置⽹络驱动程序。. ⽹桥⽹络 bridge ⽹络是Docker中最常⻅的⽹络类型。 桥接⽹络类似于默认的 bridge ⽹络,但添加⼀些新. 功能并删除⼀些旧的能⼒。 以下示例创建了桥接⽹络,并对这些⽹络上的容器执⾏⼀些实验。 $ docker network create --driver bridge isolated_nw 1196a4c5af43a21ae38ef34515b6af19236a3fc48122cf585e3f3054d509679b $ docker network inspect isolated_nw [ { "Name": "isolated_nw", "Id": "1196a4c5af43a21ae38ef34515b6af19236a3fc48122cf585e3f3054d509679b", "Scope": "local", "Driver": "bridge", "IPAM": { "Driver": "default", "Config": [ { "Subnet": "172.21.0.0/16", "Gateway": "172.21.0.1/16" } ] }, "Containers": {}, "Options": {}, "Labels": {} } ] $ docker network ls NETWORK ID NAME DRIVER 9f904ee27bf5 none null cf03ee007fb4 host host 7fca4eb8c647 bridge bridge c5ee82f76de3 isolated_nw bridge. 61.

(62) 17-Docker⽹络. 创建⽹络后,您可以使⽤ docker run --network=<NETWORK> 选项启动容器。 $ docker run --network=isolated_nw -itd --name=container3 busybox 8c1a0a5be480921d669a073393ade66a3fc49933f08bcc5515b37b8144f6d47c $ docker network inspect isolated_nw [ { "Name": "isolated_nw", "Id": "1196a4c5af43a21ae38ef34515b6af19236a3fc48122cf585e3f3054d509679b", "Scope": "local", "Driver": "bridge", "IPAM": { "Driver": "default", "Config": [ {} ] }, "Containers": { "8c1a0a5be480921d669a073393ade66a3fc49933f08bcc5515b37b8144f6d47c": { "EndpointID": "93b2db4a9b9a997beb912d28bcfc117f7b0eb924ff91d48cfa25 1d473e6a9b08", "MacAddress": "02:42:ac:15:00:02", "IPv4Address": "172.21.0.2/16", "IPv6Address": "" } }, "Options": {}, "Labels": {} } ]. 您启动到此⽹络的容器必须驻留在同⼀个Docker主机上。⽹络中的每个容器可以⽴即与其他容器通 信。 虽然⽹络本身将容器与外部⽹络隔离开来。. 62.

(63) 17-Docker⽹络. 在⽤户定义的桥接⽹络中,不⽀持链接(link)。 您可以在此⽹络中的容器上暴露和发布容器端⼝ 。 如果您希望使⼀部分 bridge ⽹络可⽤于外部⽹络,这将⾮常有⽤。. 如果您希望在单个主机上运⾏相对较⼩的⽹络,桥接⽹络将⾮常有⽤。 但是,您可以通过创 建 overlay ⽹络来创建更⼤的⽹络。. docker_gwbridge ⽹络 docker_gwbridge 是由Docker在两种不同情况下⾃动创建的本地桥接⽹络:. 当您初始化或加⼊swarm时,Docker会创建 docker_gwbridge ⽹络,并将其⽤于不同主机上 swarm节点之间的通信。 当容器⽹络不能提供外部连接时,除了容器的其他⽹络之外,Docker将容器连接 到 docker_gwbridge ⽹络,以便容器可以连接到外部⽹络或其他swarm节点。 如果您需要⾃定义配置,您可以提前创建 docker_gwbridge ⽹络,否则Docker会根据需要创建它。 以下示例使⽤⼀些⾃定义选项创建 docker_gwbridge ⽹络。 $ docker network create --subnet 172.30.0.0/16 \ --opt com.docker.network.bridge.name=docker_gwbridge \ --opt com.docker.network.bridge.enable_icc=false \ docker_gwbridge. 当您使⽤ overlay ⽹络时, docker_gwbridge ⽹络始终存在。. swarm模式下的覆盖⽹络. 63.

(64) 17-Docker⽹络. 当Docker在swarm模式下运⾏时,您可以在管理节点上创建覆盖⽹络,⽽⽆需外部key-value存储。 swarm使覆盖⽹络仅可⽤于需要服务的swarm节点。 当您创建使⽤覆盖⽹络的服务时,管理节点会⾃ 动将覆盖⽹络扩展到运⾏服务任务的节点。 要了解有关在swarm模式下运⾏Docker Engine的更多信息,请参阅Swarm模式概述 。 下⾯的示例显示了如何创建⽹络并将其⽤于来⾃swarm管理节点的服务: $ docker network create \ --driver overlay \ --subnet 10.0.9.0/24 \ my-multi-host-network 400g6bwzd68jizzdx5pgyoe95 $ docker service create --replicas 2 --network my-multi-host-network --name my-web nginx 716thylsndqma81j6kkkb5aus. 只有swarm服务可以连接到覆盖⽹络,⽽不是独⽴的容器。 有关群集的更多信息,请参阅Docker swarm模式覆盖⽹络安全模型 以及 将服务附加到覆盖⽹络 。. ⾮swarm模式下的覆盖⽹络 如果您不是在swarm模式下使⽤Docker Engine,那么 overlay ⽹络需要有效的key-value存储。 ⽀持 的key-value存储包括Consul,Etcd和ZooKeeper(分布式存储)。 在以这种⽅式创建⽹络之前,您必 须安装并配置您所选择的key-value存储服务。 ⽹络中的Docker宿主机、服务必须能够进⾏通信。 注意 :以swarm模式运⾏的Docker Engine与使⽤外部key-value存储的⽹络不兼容。 对于⼤多数Docker⽤户,不推荐这种使⽤覆盖⽹络的⽅法。它可以与独⽴的swarm⼀起使⽤,可能对 在Docker顶部构建解决⽅案的系统开发⼈员有⽤。 将来可能会被弃⽤。 如果您认为可能需要以这种⽅ 式使⽤覆盖⽹络,请参阅本指南 。. ⾃定义⽹络插件 如果任何上述⽹络机制⽆法满⾜您的需求,您可以使⽤Docker的插件基础架构编写⾃⼰的⽹络驱动插 件。 该插件将在运⾏Docker deamon的主机上作为单独的进程运⾏。 使⽤⽹络插件是⼀个⾼级主题。 ⽹络插件遵循与其他插件相同的限制和安装规则。 所有插件都使⽤插件API,并具有包含了安装,启 动,停⽌和激活的⽣命周期。 创建并安装⾃定义⽹络驱动后,您可以使⽤ --driver 标志创建⼀个使⽤该驱动的⽹络。 $ docker network create --driver weave mynet. 64.

(65) 17-Docker⽹络. 您可以检查该⽹络、让容器连接或断开该⽹络,删除该⽹络。 特定的插件为特定的需求⽽⽣。 检查插 件⽂档的具体信息。 有关编写插件的更多信息,请参阅扩展Docker 以及 编写⽹络驱动程序插件 。. 内嵌DNS服务器 Docker daemon运⾏⼀个嵌⼊式的DNS服务器,从⽽为连接到同⼀⽤户⾃定义⽹络的容器之间提供 DNS解析——这样,这些容器即可将容器名称解析为IP地址。 如果内嵌DNS服务器⽆法解析请求,它 将被转发到为容器配置的任意外部DNS服务器。 为了⽅便,当容器创建时,只有 127.0.0.11 可访 问的内嵌DNS服务器会列在容器的 resolv.conf ⽂件中。 有关在⽤户⾃定义⽹络的内嵌DNS服务器 的更多信息,请参阅⽤户定义⽹络中的内嵌DNS服务器. 暴露和发布端⼝ 在Docker⽹络中,有两种不同的机制可以直接涉及⽹络端⼝:暴露端⼝和发布端⼝。 这适⽤于默认⽹ 桥和⽤户定义的⽹桥。 您使⽤ Dockerfile 中的 EXPOSE 关键字或 docker run 命令中的 --expose 标志来暴露端 ⼝。 暴露端⼝是记录使⽤哪些端⼝,但实际上并不映射或打开任何端⼝的⼀种⽅式。 暴露端⼝是 可选的。 您可以使⽤ Dockerfile 中的 PUBLISH 关键字或 docker run 命令中的 --publish 标志来发 布端⼝。 这告诉Docker在容器的⽹络接⼝上打开哪些端⼝。当端⼝发布时,它将映射到宿主机上 可⽤的⾼阶端⼝(⾼于 30000 ),除⾮您在运⾏时指定要映射到宿主机的哪个端⼝。 您不能在 Dockerfile中指定要映射的端⼝,因为⽆法保证端⼝在运⾏image的宿主机上可⽤。 此示例将容器中的端⼝80发布到宿主机上的随机⾼阶端⼝(在这种情况下为 32768 )。 -d 标 志使容器在后台运⾏,因此您可以发出 docker ps 命令。 $ docker run -it -d -p 80 nginx $ docker ps 64879472feea nginx "nginx -g 'daemon ..." 43 hours ago Up About a minute 443/tcp, 0.0.0.0:32768->80/tcp blissful_mclean. 下⼀个示例指定80端⼝应映射到宿主机上的8080端⼝。 如果端⼝8080不可⽤,将失败。 $ docker run -it -d -p 8080:80 nginx $ docker ps b9788c7adca3 nginx "nginx -g 'daemon ..." 43 hours ago Up 3 seconds 80/tcp, 443/tcp, 0.0.0.0:8080->80/tcp goofy_brahmag upta. 65.

(66) 17-Docker⽹络. 容器与代理服务器 如果您的容器需要使⽤HTTP、HTTPS或者FTP代理,你可以使⽤如下两种⽅式进⾏配置: 对于Docker 17.07或更⾼版本,你可以配置Docker客户端从⽽将代理信息⾃动传递给容器。 对于Docker 17.06或更低版本,你必须在容器内设置环境变量。你可以在构建镜像(这样不太好 移植)或启动容器时执⾏此操作。. 配置Docker客户端 仅限Edge版本 :此选项仅适⽤于Docker CE Edge版本。 请参阅Docker CE Edge 。 1. 在Docker客户端上,在启动容器所使⽤的⽤户的主⽬录中创建或编辑 ~/.config.json ⽂件。在 其中添加如类似下所示的JSON,如果需要,使⽤ httpsproxy 或 ftpproxy 替换代理类型,然 后替换代理服务器的地址和端⼝。 您可以同时配置多个代理服务器。 您可以通过将 noProxy 键设置为⼀个或多个逗号分隔的IP地址或主机名来选择将指定主机或指定 范围排除使⽤代理服务器。 ⽀持使⽤ * 字符作为通配符,如此示例所示。 { "proxies": { "httpProxy": "http://127.0.0.1:3001", "noProxy": "*.test.example.com,.example2.com" } }. 保存⽂件。 2. 当您创建或启动新容器时,环境变量将在容器内⾃动设置。. ⼿动设置环境变量 在构建映像时,或在创建或运⾏容器时使⽤ --env 标志,可将下表中的⼀个或多个变量设置为适当 的值。 这种⽅法使镜像不太可移植,因此如果您使⽤Docker 17.07或更⾼版本,则应该配置Docker客 户端。 变量. Dockerfile示例. docker run 示例. HTTP_PROXY. ENV HTTP_PROXY "http://127.0.0.1:3001". --env HTTP_PROXY "http://127.0.0.1:3001". HTTPS_PROXY. ENV HTTPS_PROXY "https://127.0.0.1:3001". --env HTTPS_PROXY "https://127.0.0.1:3001". FTP_PROXY. ENV FTP_PROXY "ftp://127.0.0.1:3001". --env FTP_PROXY "ftp://127.0.0.1:3001". NO_PROXY. `ENV NO_PROXY "*.test.example.com,.example2.com". -env NO_PROXY“* .test.example.com,.example2.com”. 66.

參考文獻

相關文件

9-1 D 型正反器激勵表 ( Excitation table

如圖,已知平行四邊形 EFGH 是平行四邊形 ABCD 的縮放圖形,則:... 阿美的房間長 3.2 公尺,寬

[r]

年青的學生如能把體育活動融入日常生活,便可提高自己的體育活動能

之意,此指依照命令動作的意義。所謂伺服 系統,就是依照指示命令動作所構成的控制

常識科的長遠目標是幫助學生成為終身學習者,勇於面對未來的新挑 戰。學校和教師將會繼續推展上述短期與中期發展階段的工作

[r]

[r]