1.docker的安装

环境准备

Docker for Windows是一个Docker Community Edition(CE)应用程序。Docker for Windows安装包包含了在Windows系统上运行Docker所需的一切。如果你不想装虚拟机,想直接在你的Windows操作系统中安装与学习使用docker,那么你首先得查看你的系统是否满足Docker for Windows的安装与使用要求。

  1. Docker for Windows的当前版本运行在64位Windows 10 Pro,专业版、企业版和教育版(1607年纪念更新,版本14393或更高版本)上。Ps:家庭版是不行的,如果你是家庭版,那么一是升级到专业版,破解专业版推荐个地址:http://blog.csdn.net/SONGCHUNHONG/article/details/78006389 ,二是安装Docker Toolbox,自行网上百度http://blog.csdn.net/tina_ttl/article/details/51372604
  2. 如果你满足Docker for Windows的环境条件了,那么首先检查电脑的虚拟化开启了没有:进入任务管理器(ctrl+alt+delete),点击性能->cpu ,查看虚拟化是否已启用,如果虚拟化是已禁用,那么你需要重启电脑进入bios开启虚拟化(我们的发的笔记本cpu都是支持虚拟化的,重启时进入bios按esc -> 再按f12 -> 去开启虚拟化)
  3. 开启虚拟化重启后,进入任务管理器看虚拟化是否已启用。
    WIN10下DOCKER的安装与使用 - 图1
  4. 然后再是进入电脑的控制面板->程序->启用或关闭Windows功能->把Hyper-v勾上,启用后电脑会重启,后面就可以下载并安装Docker for Windows了。
    WIN10下DOCKER的安装与使用 - 图2

    下载安装

  5. 进入网址https://docs.docker.com/docker-for-windows/install/#download-docker-for-windows 下载并安装。我安装的是稳定版。安装过程没什么要注意的。
    WIN10下DOCKER的安装与使用 - 图3

  6. 启动以后会出现在桌面的右下角区域,鼠标放上去以后显示Docker is running表示启动成功,第一次安装启用好像是会弹出个Docker Cloud登录界面,去注册然后登录,使用和git有点类似,可以pull图像等等
    WIN10下DOCKER的安装与使用 - 图4

    2.docker的入门

    开始使用

  7. 检查Docker,Compose和Machine的版本
    WIN10下DOCKER的安装与使用 - 图5

  8. 检查版本信息,并确保docker命令正常工作
    WIN10下DOCKER的安装与使用 - 图6
    WIN10下DOCKER的安装与使用 - 图7
    WIN10下DOCKER的安装与使用 - 图8
  9. 运行docker run hello-world以测试从Docker Hub中拉取图像并启动容器
    WIN10下DOCKER的安装与使用 - 图9
  10. 使用命令docker run -it ubuntu bash运行一个Ubuntu容器,我之前已经拉取过这个容器了,大概是几十兆吧,所以直接启用了,输入exit命令停止容器
    WIN10下DOCKER的安装与使用 - 图10
  11. 运行命令docker run -d -p 80:80 –name webserver nginx 启动一个Dockerized webserver 会下载nginx容器图像并启动它,然后再打开浏览器键入http://localhost
    WIN10下DOCKER的安装与使用 - 图11
  12. 运行docker ps 命令,检查容器的详细信息
    WIN10下DOCKER的安装与使用 - 图12
  13. 停止或移除容器和图像。如果你想停止网络服务器,输入:docker stop webserver然后重新启动docker start webserver。要使用单个命令停止并删除正在运行的容器,请键入: docker rm -f webserver。这将删除容器,但不是 nginx图像。您可以列出本地图像docker images。你可能想要保留一些图片,这样你就不必再从Docker Hub中取出它们了。要删除不再需要的图像,请使用docker rmi后跟图像ID或图像名称。例如docker rmi nginx
    WIN10下DOCKER的安装与使用 - 图13

    3.docker的常用配置

    在PowerShell中设置 tab键自动补全(其实用的都是cmd.exe)

  14. 启动一个的PowerShell(即以管理员身份运行)。搜索PowerShell,右键单击,然后选择以管理员身份运行。在PowerShell提示符下键入:
    Set-ExecutionPolicy RemoteSigned

  15. 检查策略设置是否正确,运行:get-executionpolicy
    应该返回RemoteSigned。
  16. 安装posh-dockerPowerShell模块以自动完成Docker命令,键入:Install-Module posh-docker或者,要仅为当前用户安装模块,键入:
    Install-Module -Scope CurrentUser posh-docker
  17. 安装完成后,只能为当前PowerShell启用自动完成功能,输入:Import-Module posh-docker
  18. 为了在所有PowerShell会话中保持Tab完成状态$PROFILE,请在PowerShell提示符处输入:

    1. if (-Not (Test-Path $PROFILE)) {
    2. New-Item $PROFILE Type File Force
    3. }
    4. Add-Content $PROFILE "`nImport-Module posh-docker"

    这将创建一个$PROFILE如果不存在,并将此行添加到文件中:
    Import-Module posh-docker
    要检查文件是否已正确创建,或只需手动编辑,请在PowerShell中键入以下内容:
    Notepad $PROFILE
    打开一个新的PowerShell会话。现在,当你键入的前几个字母后按Tab键,Docker命令(如开始,停止,运行及其选项)以及容器和映像名称现在都应该自动完成。
    WIN10下DOCKER的安装与使用 - 图14

    Settings

    找到右下角的docker图标,右击选择settings进去

  19. General:这里是设置docker开机自启,应用程序启动时检查更新,发布使用情况统计信息
    WIN10下DOCKER的安装与使用 - 图15

  20. Advanced:分配cpu数量与内存量
    WIN10下DOCKER的安装与使用 - 图16
  21. Daemon:Docker for windows10 可以配置阿里云镜像,到https://cr.console.aliyun.com/ 注册一个账户,登录进去后再列表选择加速器,把你的专属加速器地址复制粘贴到Daemon的Registry mirrors中
    WIN10下DOCKER的安装与使用 - 图17
    WIN10下DOCKER的安装与使用 - 图18

    4.用Dockerfile定义一个镜像

    在过去,如果你要开始编写一个Python应用程序,你的第一步就是在你的机器上安装一个Python运行库。但是,这会造成您的机器上的环境必须满足一定条件以使您的应用程序可以运行。
    使用Docker,你可以将一个可移植的Python运行库作为一个映像,不需要安装。然后,您的构建可以将基础Python镜像与应用程序代码一起包括在内,确保您的应用程序,依赖项和运行时都一起运行。
    这些可移植的镜像是由一个叫做Dockerfile的东西来定义的

    新建目录文件

    创建一个空目录,我取名叫docker,然后分别在里面新建三个文件:Dockerfile,app.py,requirements.txt
    WIN10下DOCKER的安装与使用 - 图19
    三个文件中的内容分别设计为: ``` 1.Dockerfile:

    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

CMD [“python”, “app.py”]

2.app.py: from flask import Flask from redis import Redis, RedisError import os import socket

Connect to Redis

redis = Redis(host=”redis”, db=0, socket_connect_timeout=2, socket_timeout=2)

app = Flask(name)

@app.route(“/“) def hello(): try: visits = redis.incr(“counter”) except RedisError: visits = “cannot connect to Redis, counter disabled

html = “

Hello {name}!

“ \ “Hostname: {hostname}
“ \ “Visits: {visits}” return html.format(name=os.getenv(“NAME”, “world”), hostname=socket.gethostname(), visits=visits)

if name == “main“: app.run(host=’0.0.0.0’, port=80)

  1. requirements.txt: Flask Redis
    <a name="TE2bC"></a>
    ### 构建镜像
    在docker目录下打开cmd.exe运行命令(确保能够找到Dockerfile文件,镜像取名叫friendlyhello): <br />`docker build -t friendlyhello .`<br />ps:千万不要落了上面那行后面的那个点,曾经入过坑的。。命令包括后面的那个点 <br />![](https://cdn.nlark.com/yuque/0/2020/png/666645/1586679443082-84684c51-0318-4cc4-998d-2640b5c22615.png#align=left&display=inline&height=686&originHeight=686&originWidth=931&size=0&status=done&style=none&width=931)<br />然后再执行命令: <br />docker images <br />![](https://cdn.nlark.com/yuque/0/2020/png/666645/1586679443063-442af7c7-c64d-4eeb-bae0-517362477e2f.png#align=left&display=inline&height=227&originHeight=227&originWidth=714&size=0&status=done&style=none&width=714)<br />运行镜像程序: <br />docker run -p 4000:80 friendlyhello <br />![](https://cdn.nlark.com/yuque/0/2020/png/666645/1586679443067-de30352e-3154-42dd-9990-e474ca0fdfed.png#align=left&display=inline&height=125&originHeight=125&originWidth=598&size=0&status=done&style=none&width=598)<br />可以看到Python正在为应用程序提供消息的[http://0.0.0.0:80](http://0.0.0.0/)。但是,这个消息来自容器内部,它不知道我们将该容器的端口80映射到4000,从而打开URL: [http://localhost:4000](http://localhost:4000/)<br />![](https://cdn.nlark.com/yuque/0/2020/png/666645/1586679443060-ea567e45-46c8-461a-973e-86bdf101d224.png#align=left&display=inline&height=163&originHeight=163&originWidth=535&size=0&status=done&style=none&width=535)
    <a name="6Ikul"></a>
    ### 停止容器运行
    首先在接着上面的操作步骤后按下ctrl+c在终端退出,这并不意味着镜像停止运行了 <br />键入docker container ls 列出正在运行的容器 <br />![](https://cdn.nlark.com/yuque/0/2020/png/666645/1586679444029-3768cd72-08c4-419c-b0e7-9e247d3e86b7.png#align=left&display=inline&height=198&originHeight=198&originWidth=710&size=0&status=done&style=none&width=710)<br />![](https://cdn.nlark.com/yuque/0/2020/png/666645/1586679443054-d454675c-3701-47c1-87fe-1ff12efbe2e4.png#align=left&display=inline&height=100&originHeight=100&originWidth=1123&size=0&status=done&style=none&width=1123)<br />运行命令: <br />`docker container stop <Container NAME or ID>`<br />停止容器。否则,在下一步中重新运行容器时,将会收到错误响应。 <br />![](https://cdn.nlark.com/yuque/0/2020/png/666645/1586679443072-ede12bd7-18aa-4ef8-b242-8979b666d1b1.png#align=left&display=inline&height=179&originHeight=179&originWidth=734&size=0&status=done&style=none&width=734)
    <a name="et8C1"></a>
    ## 5.联系Docker Hub的常用操作
    <a name="K322X"></a>
    ### 登录到Docker Hub
    前面已经说过了,docker和git的操作有类似之处,所以docker也 <br />有远程仓库,如果前面已经注册过并登录了docker cloud,那么 <br />访问网址:[https://hub.docker.com](https://hub.docker.com/) 在里面创建存储库,否则先 <br />注册吧。 <br />![](https://cdn.nlark.com/yuque/0/2020/png/666645/1586679443072-68c6a7f3-32f5-4674-ba42-5aa13762bcb4.png#align=left&display=inline&height=473&originHeight=473&originWidth=1102&size=0&status=done&style=none&width=1102)
    <a name="TvgKs"></a>
    ### push镜像
    前面在本地创建了一个friendlyhello的镜像,现在要把它push到 <br />自己的docker hub的存储库中去,首先: <br />1. 登录docker hub (我已经登录过了。。再登录一次吧) <br />![](https://cdn.nlark.com/yuque/0/2020/png/666645/1586679443089-e468522b-41bc-4f2e-8817-bd39d383b60d.png#align=left&display=inline&height=121&originHeight=121&originWidth=691&size=0&status=done&style=none&width=691)<br />2. 标记镜像: <br />把镜像放入wangliguo存储库并标记为test <br />![](https://cdn.nlark.com/yuque/0/2020/png/666645/1586679443067-aa117a6e-4861-446b-881e-bab4bf873d10.png#align=left&display=inline&height=62&originHeight=62&originWidth=509&size=0&status=done&style=none&width=509)<br />3. 查看镜像: <br />![](https://cdn.nlark.com/yuque/0/2020/png/666645/1586679443679-a5eb1bd5-beee-4c07-ad35-196076f7224a.png#align=left&display=inline&height=160&originHeight=160&originWidth=708&size=0&status=done&style=none&width=708)<br />4. 发布镜像(推送镜像) <br />![](https://cdn.nlark.com/yuque/0/2020/png/666645/1586679443067-30cbc2d3-fc63-4e00-89cd-e915cb077023.png#align=left&display=inline&height=185&originHeight=185&originWidth=777&size=0&status=done&style=none&width=777)<br />5. Docker Hub上查看镜像: <br />![](https://cdn.nlark.com/yuque/0/2020/png/666645/1586679443050-5986f80b-3d43-46a5-b867-37b2a2cafc38.png#align=left&display=inline&height=417&originHeight=417&originWidth=890&size=0&status=done&style=none&width=890)<br />6. 从远程存储库中提取并运行镜像:现在当远程存储库有了镜像后,就可以从远程存储库提取并运行了 <br />![](https://cdn.nlark.com/yuque/0/2020/png/666645/1586679443051-4f82eec4-eaa7-4fe7-859f-bf838db60858.png#align=left&display=inline&height=155&originHeight=155&originWidth=727&size=0&status=done&style=none&width=727)<br />![](https://cdn.nlark.com/yuque/0/2020/png/666645/1586679443985-a583ac20-0f11-40f9-8d86-950ba2362a63.png#align=left&display=inline&height=204&originHeight=204&originWidth=585&size=0&status=done&style=none&width=585)
    <a name="GyNNr"></a>
    ## 6.服务
    在分布式应用程序中,应用程序的不同部分被称为“服务”。例如,想象一个视频共享站点,它可能包括用于将应用程序数据存储在数据库中的服务,用于用户上传东西的视频转码服务,为前端服务等等。 <br />服务实际上只是“生产中的容器”。服务只运行一个镜像,但它编码镜像运行的方式 - 应该使用哪个端口,容器应该运行多少个副本,以便服务具有所需的容量,以及等等。缩放服务会更改运行该软件的容器实例的数量,从而为流程中的服务分配更多的计算资源。 <br />使用Docker平台定义,运行和扩展服务非常简单 - 只需编写一个docker-compose.yml文件即可。
    <a name="5BKms"></a>
    ### 创建一个docker-compose.yml文件
    ![](https://cdn.nlark.com/yuque/0/2020/png/666645/1586679443056-1a674830-a3ce-4e85-9ad8-4f34abe6ddc9.png#align=left&display=inline&height=143&originHeight=143&originWidth=596&size=0&status=done&style=none&width=596)<br />键入:
    
    version: “3” services: web:

    replace username/repo:tag with your name and image details

    image: ko16078/lilinyi:test deploy: replicas: 5 resources:
     limits:
       cpus: "0.1"
       memory: 50M
    
    restart_policy:
     condition: on-failure
    
    ports:
    • “80:80” networks:
    • webnet networks: webnet: ``` 拉取的是上个步骤中的存储库的tag。
      运行该镜像的5个实例作为一个服务调用web,限制每个使用,最多10%的CPU(跨所有核心)和50MB的RAM。
      如果一个失败,立即重新启动容器。
      将主机上的端口80映射到web端口80。
      指导web容器通过一个负载平衡的网络共享80端口webnet。(在内部,容器本身将web在临时端口上发布到 端口80)。
      webnet使用默认设置(这是一个负载平衡覆盖网络)定义网络。

      运行新的负载均衡应用程序

      先运行命令:docker swarm init
      WIN10下DOCKER的安装与使用 - 图20
      然后再运行命令:docker stack deploy -c docker-compose.yml getstartedlab
      给它取名叫getstartedlab
      WIN10下DOCKER的安装与使用 - 图21
      服务堆栈在这台主机上运行了5个部署镜像的容器实例
      运行命令查看:docker service ls
      WIN10下DOCKER的安装与使用 - 图22
      在服务中运行的单个容器称为任务,可以看到上面有个getstartedlab_web的服务
      运行命令docker service ps getstartedlab_web 查看此服务下的任务:
      WIN10下DOCKER的安装与使用 - 图23
      如果只列出系统中的所有容器,也会显示任务,但不会被服务过滤:
      运行命令:docker container ls -q
      WIN10下DOCKER的安装与使用 - 图24
      然后打开浏览器,键入http://localhost
      WIN10下DOCKER的安装与使用 - 图25
      点击刷新多次,可以发现Hostname的更改,以循环方式选择5个任务中的一个来响应。容器ID将与前一个命令(docker container ls -q)的输出相匹配。

      更改应用程序

      比如更改docker-compose.yml中的replicas值,保存更改并重新运行docker stack deploy命令来更新应用程序:
      WIN10下DOCKER的安装与使用 - 图26
      运行命令:
      docker stack deploy -c docker-compose.yml getstartedlab
      WIN10下DOCKER的安装与使用 - 图27
      Docker会做一个就地更新,然后重新运行docker container ls -q以查看重新配置的已部署实例
      WIN10下DOCKER的安装与使用 - 图28
      可以看到之前是6个,现在是7个,刚好多了一个任务
      ps:电脑中还运行这之前步骤中从docker hub中拉取并运行着的那个任务,所以会看到6个和7个

      关闭应用程序和群

      关闭应用程序docker stack rm getstartedlab
      WIN10下DOCKER的安装与使用 - 图29
      关闭群docker swarm leave –force
      WIN10下DOCKER的安装与使用 - 图30
      现在服务中的任务都关闭了以后再运行命令:
      docker container ls -q
      WIN10下DOCKER的安装与使用 - 图31
      这就是上面说的那个之前步骤中从docker hub中拉取并运行着的那个任务