主要翻译自docs.docker.com

镜像 容器

镜像和容器的关系可以理解为
镜像就像git中的仓库副本
而每次对镜像的操作都会生成新的容器 修改不断增加容器不断变更
容器可以定期保存,这样便可以选择性恢复
容器的变更并不会影响镜像,所以千万不要随便删除容器

用Dockerfile定义容器(part2)

Dockerfile类似nodejs的依赖配置文件,docker会自动根据依赖项下载需要的镜像、工具等。

# Use an official Python runtime as a parent image
FROM python:2.7-slim# Set the working directory to /app
WORKDIR /app# Copy the current directory contents into the container at /app
ADD . /app# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt# Make port 80 available to the world outside this container
EXPOSE 80# Define environment variable
ENV NAME World# Run app.py when the container launches
# 在容器启动时运行 app.py
CMD ["python", "app.py"]

requirements.txt和app.py内容略

Build the app

$ ls
Dockerfile      app.py          requirements.txt

现在运行Build命令。这将创建一个Docker镜像,我们使用-t 让它有个友好的名字。

docker build -t friendlyhello .

Where is your built image? It’s in your machine’s local Docker image registry:

$ docker image lsREPOSITORY            TAG                 IMAGE ID
friendlyhello         latest              326387cea398

设置代理服务器

# Set proxy server, replace host:port with values for your servers
ENV http_proxy host:port
ENV https_proxy host:port

DNS设置

修改/etc/docker/daemon.json中的dns

{"dns": ["your_dns_address", "8.8.8.8"]
}

在上面的示例中,列表的第一个元素是DNS服务器的地址。第二项是Google的DNS,它可以在第一项不可用时使用。
在继续之前,保存daemon.json重新启动docker服务。
sudo service docker restart
然后重新运行build命令

运行应用程序

Run the app, mapping your machine’s port 4000 to the container’s published port 80 using -p:

docker run -p 4000:80 friendlyhello
docker run -d -p 4000:80 friendlyhello //-d 以后台模式运行

Share your image

登入docker账号

$ docker login   //登入账号

Tag the image

将本地镜像打上远程仓库的标记

username/repository:tag

For example:

docker tag friendlyhello gordon/get-started:part2

发布镜像

将打了标记的镜像发布到远程仓库

docker push username/repository:tag

发布之后便可直接拉取并运行远程仓库的镜像

docker run -p 4000:80 username/repository:tag

docker常用命令

docker build -t friendlyhello .  # Create image using this directory's Dockerfile
docker run -p 4000:80 friendlyhello  # Run "friendlyname" mapping port 4000 to 80
docker run -d -p 4000:80 friendlyhello         # Same thing, but in detached mode
docker container ls                                # List all running containers
docker container ls -a             # List all containers, even those not running
docker container stop <hash>           # Gracefully stop the specified container
docker container kill <hash>         # Force shutdown of the specified container
docker container rm <hash>        # Remove specified container from this machine
docker container rm $(docker container ls -a -q)         # Remove all containers
docker image ls -a                             # List all images on this machine
docker image rm <image id>            # Remove specified image from this machine
docker image rm $(docker image ls -a -q)   # Remove all images from this machine
docker login             # Log in this CLI session using your Docker credentials
docker tag <image> username/repository:tag  # Tag <image> for upload to registry
docker push username/repository:tag            # Upload tagged image to registry
docker run username/repository:tag                   # Run image from a registry

服务(service) part3

关于服务

服务的层次位于容器之上
在分布式应用程序中,应用程序的不同部分被称为“服务”。例如,如果您想象一个视频共享站点,它可能包括一个用于将应用程序数据存储在数据库中的服务,一个用于在用户上传某个内容之后在后台进行视频转换的服务,一个用于前端的服务,等等。
服务实际上只是“生产中的容器”。服务只运行一个映像,但它编码了映像的运行方式-应该使用哪些端口,应该运行多少个容器副本,以便服务具有所需的容量,等等。扩展服务会改变运行该软件的容器实例的数量,为流程中的服务分配更多的计算资源。
使用Docker平台定义、运行和扩展服务非常容易-只需编写一个docker-compose.yml档案。

你的首个docker-compose.yml档案

docker-compose.yml文件是一个YAML文件,它定义了Docker容器在生产中的行为方式。

docker-compose.yml

将此文件保存为docker-compose.yml放在任意路径。利用之前推送的镜像,并更新.yml以下内容(替换username/repo:tag为你的镜像)

version: "3"
services:web:# replace username/repo:tag with your name and image detailsimage: username/repo:tagdeploy:replicas: 5resources:limits:cpus: "0.1"memory: 50Mrestart_policy:condition: on-failureports:- "4000:80"networks:- webnet
networks:webnet:

这个docker-compose.yml文件告诉Docker执行以下操作:

  • 拉取我们之前上传的镜像。
  • 将该映像部署5个名为web的实例,限制每个CPU最多使用10%(所有的核)和50 MB的内存。
  • 如果容器出错,立即重新启动容器。
  • 将主机上的端口4000映射到web的端口80。
  • 指示web容器在80端口上共享名为webnet的负载均衡的网络上(实际上,容器将自己短暂地发布到web的80端口上)

运行新创建的负载均衡应用

在执行docker stack deploy命令之前我们得先运行:

docker swarm init

命令的作用我们后面再做解释

现在我们便可以运行应用了.你需要给你的应用命名,这里我们将其命名为getstartedlab

docker stack deploy -c docker-compose.yml getstartedlab
docker service ls //获取服务列表

在服务中运行的单个容器称为任务(Task).任务被赋予唯一的ID.列出服务的所有任务:

docker service ps getstartedlab_web

你可以执行curl -4 http://localhost:4000连续几次,或者用浏览器访问URL.
无论哪种方式,容器ID都会改变,演示负载均衡;对于每个请求,将以循环方式选择5个任务中的一个来响应.容器ID与docker container ls -q的输出相匹配

复制应用程序

您可以通过在文件docker-compose.yml更改replicas的值,并重新运行docker stack deploy命令:

docker stack deploy -c docker-compose.yml getstartedlab

Docker执行会立即更新,不需要先下线(down)堆栈(stack)或杀死(kill)任何容器(container)。
现在,重新运行docker container ls -q查看重新部署的已重新配置的实例。如果您修改了replicas,就会看到更多的任务、容器。

下线应用(app)和集群(swarm)

docker stack rm getstartedlab //下线应用
docker swarm leave --force  //下线集群

在此阶段用到的一些命令:

docker stack ls                                            # List stacks or apps
docker stack deploy -c <composefile> <appname>  # Run the specified Compose file
docker service ls                 # List running services associated with an app
docker service ps <service>                  # List tasks associated with an app
docker inspect <task or container>                   # Inspect task or container
docker container ls -q                                      # List container IDs
docker stack rm <appname>                             # Tear down an application
docker swarm leave --force      # Take down a single node swarm from the manager

集群(swarm) part4

理解群集

集群是一组正在运行Docker并加入到集群中的机器。在这之后,您可以继续运行您习惯的Docker命令,但是现在这些命令在集群上由群管理器(swarm manager)执行。集群中的机器可以是物理的,也可以是虚拟的。加入集群后,它们被称为节点(nodes).

群管理器可以使用几种策略来运行容器,比如“最空的节点”-用容器填充利用率最低的机器。或者“全局”,它确保每台机器都得到指定容器的一个实例。您指示群管理器在撰写文件中使用这些策略,就像您已经使用过的策略一样

群管理器是群集中唯一能够执行命令或授权其他机器**工人(workers)**加入群集的机器.工人只是为了提供能力,没有权力告诉任何其他机器它能做什么和不能做什么。

到目前为止,您一直在本地计算机上以单一主机模式使用Docker。但是Docker也可以转换成集群模式(swarm mode)。启用群集模式将立即使当前机器成为群管理器。从那时起,Docker将运行您正在管理的群集上执行的命令,而不仅仅只是在当前机器上执行命令。

建立你的集群

群集由多个节点组成,这些节点可以是物理的,也可以是虚拟机。基本概念很简单:执行docker swarm init开启集群模式,并使当前主机成为集群管理者.然后在其他主机上执行docker swarm join让他们加入到集群中成为工人。

我们这里用虚拟机的形式来演示,首先建立两个虚拟机,使用VirtualBox驱动程序:

docker-machine create --driver virtualbox myvm1
docker-machine create --driver virtualbox myvm2

列出VM并获取它们的IP地址
现在您已经创建了两个VM,名为myvm1和myvm2.

使用此命令列出计算机并获取它们的IP地址。

docker-machine ls

下面是这个命令的输出示例。

$ docker-machine ls
NAME    ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
myvm1   -        virtualbox   Running   tcp://192.168.99.100:2376           v17.06.2-ce
myvm2   -        virtualbox   Running   tcp://192.168.99.101:2376           v17.06.2-ce

初始化群集并添加节点
第一台机器充当管理器,执行管理命令并验证工作人员加入群集,第二台是工作人员。
您可以使用docker-machine ssh。指示myvm1成为一名蜂群经理docker swarm init

$ docker-machine ssh myvm1 "docker swarm init --advertise-addr <myvm1 ip>"
Swarm initialized: current node <node ID> is now a manager.To add a worker to this swarm, run the following command:docker swarm join \--token <token> \<myvm ip>:<port>To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

端口2377将作为init和join的默认端口
端口2376是docker的守护进程端口
务必确保这两个端口对外开放
docker可以让您使用自己系统的ssh选项。只需指定--native-ssh调用ssh命令:

docker-machine --native-ssh ssh myvm1 ...

恭喜你,你创造了你的第一个群体!
执行docker node ls在管理器上查看该群集中的节点:

$ docker-machine ssh myvm1 "docker node ls"
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
brtu9urxwfd5j0zrmkubhpkbd     myvm2               Ready               Active
rihwohkh3ph38fhillhhb84sk *   myvm1               Ready               Active              Leader

你可以执行docker swarm leave离开集群

在群集集群上部署应用程序

困难的部分结束了。现在,您只需在新群集上部署重复您在第3部分中的进程。请记住,只有群管理员myvm1来执行Docker命令;工作人员只是提供能力。

配置docker-machine命令为集群管理员服务

到目前为止,我们一直在用docker-machine ssh封装Docker命令与虚拟机们交互。
另一种选择是通过docker-machine env <machine>来执行命令并与虚拟机们交互。这种工作方式更有利于我们下一步要做的事情,因为它运行你使用你本地的docker-compose.yml文件去“远程”部署应用,而不必将其复制到任何位置。
集群管理员输入docker-machine env myvm1,然后复制粘贴并执行命令来与myvm1交互。
linxu示例
执行docker-machine env myvm1来与myvm1交互

$ docker-machine env myvm1
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/sam/.docker/machine/machines/myvm1"
export DOCKER_MACHINE_NAME="myvm1"
# Run this command to configure your shell:
# eval $(docker-machine env myvm1)

执行docker-machine ls通过"*"来验证myvm1现在是活动的机器。

在集群管理器上部署应用

此刻你有myvm1,你

docker 中文文档相关推荐

  1. docker 中文文档_Kubernetes将弃用Docker,不必恐慌

    一切都如此悄悄地开始.作为广受欢迎的容器集群管理工具,在即将发行的Kubernetes 1.20版本说明文件中,Kubernetes(k8s)宣布:"kubelet放弃对Docker的支持, ...

  2. riak文件服务器,Docker中文文档

    这个例子的目的是向您展示如何构建一个预装Riak的docker镜象. 创建Dockerfile 创建一个空文件Dockerfile $ touch Dockerfile 接下来,定义你想要来建立你镜像 ...

  3. Get started with Docker 中文文档(2)——Part 2: Containers

    先决条件 安装Docker 1.13或更高版本. 阅读第1部分的方向. 让您的环境快速测试,以确保您全部设置:docker run hello-world 介绍 现在是开始构建Docker应用程序的时 ...

  4. Foundry 中文文档发布啦

    Foundry是一个Solidity智能合约开发工具链.Foundry管理您的依赖关系.编译项目.运行测试.部署,并允许您通过命令行和Solidity 脚本与链交互. Foundry 中文文档是基于官 ...

  5. Spring Cloud Dalston.RELEASE中文文档

    Spring Cloud Dalston.RELEASE中文文档 Spring Cloud 目录 特性 云原生应用程序 Spring Cloud上下文:应用程序上下文服务 引导应用程序上下文 应用程序 ...

  6. Solidity 最新 0.5.8 中文文档发布

    本文首发于深入浅出区块链社区 热烈祝贺 Solidity 最新 0.5.8 中文文档发布, 这不单是一份 Solidity 速查手册,更是一份深入以太坊智能合约开发宝典. 翻译说明 Solidity ...

  7. axios中文文档 - 内容详细层次合理

    axios 在线中文文档 axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中. !> 如果你使用node.js,使用axios和cheerio可以制作 ...

  8. 284页beego官方中文文档,Go语言进阶必备

    Go语言作为出身名门的后起之秀,大家所熟知的Docker和Kubernets(K8S)就是使用Go语言开发的,以其简单高效.高并发.跨平台的优势,称霸于容器领域. 根据 Stack Overflow ...

  9. Kibana 5.2 中文文档 | 片刻 ApacheCN(apache中文网)

    为什么80%的码农都做不了架构师?>>>    ApacheCN | apache中文网 官方文档 Kibana 5.2 中文文档 介绍 设置 安装 Kibana 配置 Kiban ...

  10. 后端开发常用官方中文文档整理

    后端开发常用官方文档.中文文档整理 名称 链接 Spring Framework 中文 Springboot 中文 Mybatis3 中文 Mybatis-plus 中文 JAVA 语言 中文 Mys ...

最新文章

  1. 锁的升级与synchronized锁的关系
  2. php 前端及时同步,php与前端界面的实时通信
  3. 检查类型是否包含iterator
  4. verilog 简单module_一个简单的verilog小程序
  5. Python---冒泡排序、选择排序
  6. 前端开发 选择器的优先级 0229
  7. 力扣836.矩形重叠
  8. Spring MVC实现Junit Case
  9. Java面试必问!2020-08-28(1)
  10. ubuntu下rar文件解压后文件名乱码
  11. Photon Release 4.8.0汉化(附图教程)
  12. 去哪儿app_58款APP遭点名,多家基金、银行产品上榜!
  13. SogouLabDic搜狗词库
  14. adb连接 vivo_vivo手机驱动
  15. Python超市商品管理系统
  16. 【iOS】一个方法读取图片中的二维码信息
  17. 手机丢了,微信、支付宝绑了银行卡,第一时间该怎么办?
  18. 2022年第十四届蓝桥杯模拟赛【核酸日期】C语言详解
  19. Mac文件编码格式转换
  20. SpringBoot+jdk1.8邮件发送

热门文章

  1. 不恢复余数除法原理_小学数学基础概念大全,家长收藏起来,一条一条讲给孩子听。能全背下来的,考试也不带怕的了!...
  2. 【RK2206】3. 处理迪文屏事件
  3. exsi添加gpu卡 v100s和a100 配置直通模式虚机电源启动失败
  4. android的keystore多个别名,关于android:KeyStore找不到我的别名的密钥
  5. 【bzoj2959】长跑【LCT+并查集】
  6. 2022年人工智能数据标注产业现状分析
  7. php网站设计国内外研究状况,毕业论文中的国内外研究现状怎么写啊
  8. GNU Radio Pythpn
  9. 马化腾:创建生物型组织,让企业组织自我进化
  10. oracle sql语句加减,Oracle sql 常用加减法