在Windows 10 Pro 64位操作系统上安装Docker和Docker Compose
前提条件
-
- Windows 10 Pro 64bit メモリ 4G 以上を対象
Windows 10 以外だったり、Windows10 でも Home だったり 32bit の場合は対象外
环境
-
- Windows 10 Pro 64bit メモリ 8G
-
- Docker for Windows v18.09.1
- Docker Compose v1.23.2
Docker 的安装
在开始之前,需要做一些准备工作,包括启用 Hyper-V。
只要按照Microsoft的文件进行操作即可。
- Windows 10 上に Hyper-V をインストールする
做法可以大致分为三类。
-
- 使用PowerShell来启用Hyper-V
-
- 使用CMD和DISM来启用Hyper-V
- 在”设置”中启用Hyper-V角色
请用上述任意一种方法安装Hyper-V。
下载适用于Windows的Docker安装程序
可以从 download.docker.com 下载 公式-Install Docker for Windows 中的 Install Docker for Windows desktop app。
Docker for Windows 的安装
运行下载的安装程序,并按照向导完成安装。
确认版本
请在命令提示符中执行以下命令以确认版本。
$ docker version
执行结果如下所示。
Client: Docker Engine - Community
Version: 18.09.1
API version: 1.39
Go version: go1.10.6
Git commit: 4c52b90
Built: Wed Jan 9 19:34:26 2019
OS/Arch: windows/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 18.09.1
API version: 1.39 (minimum version 1.12)
Go version: go1.10.6
Git commit: 4c52b90
Built: Wed Jan 9 19:41:49 2019
OS/Arch: linux/amd64
Experimental: false
您好,世界的确认.
接下来执行以下命令以确认 Docker 的运行情况:
$ docker run hello-world
执行结果如下所示。
能够确认执行结果,而没有发生错误。
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.
(amd64)
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://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
Docker Compose 套件
由于Docker Compose的官方指南中也提供了步骤,因此按照官方指南进行操作。
官方指南中的步骤从”Install Docker Compose”的”Install Compose”开始,并选择”Windows”选项卡。
在实际执行中,
-
- 以管理员权限启动PowerShell。
执行以下命令以启用TLS 1.2。这是因为GitHub只接受TLS 1.2。
(参考:如果在PowerShell中无法使用wget(Invoke-WebRequest)访问GitHub的处理方法)
$ [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
执行以下命令以安装Docker Compose
$ Invoke-WebRequest “https://github.com/docker/compose/releases/download/1.23.2/docker-compose-Windows-x86_64.exe” -UseBasicParsing -OutFile $Env:ProgramFiles\docker\docker-compose.exe
这里“1.23.2”是要安装的Docker Compose版本。这次选择了当前稳定版1.23.2(docker/compose-release)。
请确认版本
当通过命令提示符执行以下命令并指定给docker-compose时,可以查看Docker Compose的版本信息。
$ docker-compose version
执行结果如下。
docker-compose version 1.23.2, build 1110ad01
docker-py version: 3.6.0
CPython version: 3.6.6
OpenSSL version: OpenSSL 1.0.2o 27 Mar 2018
确认版本(2)
根据@rapidliner00先生提供的评论,我已经补充了指定使用–version选项的情况。
非常感谢@rapidliner00先生的评论。
作为与上述不同的方法,您还可以在docker-compose中指定以下选项来检查版本。
$ docker-compose --version
这个执行结果如下所示。
docker-compose version 1.23.2, build 1110ad01
既经完成了Docker和Docker Compose的安装,现在可以通过Docker Compose启动容器进行实验。
通过Docker Compose启动容器
资产的构成和内容处理
以下是处理资产的组成:
(这些资产的组成和内容与[Docker] Docker Compose的引入和环境构建相同)
docker-sample/
├─ app.py
├─ docker-compose.yml
├─ Dockerfile
└─ requirements.txt
以下是每个文件的内容。
- app.py
from flask import Flask
from redis import Redis, RedisError
import os
import socket
# 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 = "<i>cannot connect to Redis, counter disabled</i>"
html = "<h3>Hello {name}!</h3>" \
"<b>Hostname:</b> {hostname}<br/>" \
"<b>Visits:</b> {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)
- docker-compose.yml
version: '3'
services:
web:
build: .
ports:
- "4000:80"
volumes:
- .:/app
redis:
image: "redis:alpine"
- Dockerfile
# ベースイメージとして python v3.6 を使用する
FROM python:3.6
# 以降の RUN, CMD コマンドで使われる作業ディレクトリを指定する
WORKDIR /app
# カレントディレクトリにある資産をコンテナ上の 「/app」 ディレクトリにコピーする
ADD . /app
# 「 requirements.txt 」にリストされたパッケージをインストールする
RUN pip install --trusted-host pypi.python.org -r requirements.txt
# Docker に対して「 80 番ポート 」で待受けするよう指定する
EXPOSE 80
# Docker イメージ中の環境変数を指定する
ENV NAME World
# コンテナが起動したときに実行される命令を指定する
# ここでは後述の 「app.py 」を実行するよう指示している
CMD ["python", "app.py"]
- requirements.txt
Flask
Redis
使用Docker Compose启动容器和服务
在接下来的内容中,我们将继续讨论[Docker] Docker Compose的安装和环境配置,与之前一样。本文也将重新确认这些内容。
通过执行以下命令,容器将启动。
$ docker-compose up -d
Starting docker-sample_web_1 ... done
Starting docker-sample_redis_1 ... done
在这里,“-d”选项表示在后台运行容器的意思。
在执行上述命令时,Docker Compose会根据本地环境的情况进行相应的处理。
换句话说,如果没有基础镜像,它将完成从获取基础镜像到启动容器的过程,或者如果镜像已经构建完成,它将仅启动容器。
至于 Docker Compose 的各种命令,可以在“docker-compose CLI 概览”中找到概要,并且还可以从左侧窗格中查看命令的详细信息。如果想要了解每个命令的作用,请参考上述链接。供参考之用。
检查容器是否已启动
在运行 $ docker-compose up 后,可以查看 Docker 镜像和容器的状态。
- Docker イメージ
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
docker-sample_web latest c6aceb937568 About a minute ago 932MB
python 3.6 55fb8aca33df 7 days ago 922MB
redis alpine b42dc832c855 3 weeks ago 40.9MB
可以确认Python、redis以及docker-sample_web的镜像已经被创建。
- Docker コンテナ
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8441040aecdc docker-sample_web "python app.py" 3 minutes ago Up 3 minutes 0.0.0.0:4000->80/tcp docker-sample_web_1
2295ecb5a3c1 redis:alpine "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 6379/tcp docker-sample_redis_1
可以看到 Redis 和 docker-sample_web 容器已经启动了。
访问 Web 应用

通过Docker Compose停止服务。
只使用以下命令可以停止已启动的服务,但此命令不会删除Docker容器。
$ docker-compose stop
Stopping docker-sample_web_1 ... done
Stopping docker-sample_redis_1 ... done
使用Docker Compose停止容器
要停止使用Docker Compose启动的容器,可以使用以下命令。此时,它将同时删除网络。
$ docker-compose down
Stopping docker-sample_web_1 ... done
Stopping docker-sample_redis_1 ... done
Removing docker-sample_web_1 ... done
Removing docker-sample_redis_1 ... done
Removing network docker-sample_default
沉溺的地方
共享驱动器的设置

ERROR: for docker-sample_web_1 Cannot create container for service web: b'Drive has not been shared'
ERROR: for web Cannot create container for service web: b'Drive has not been shared'
ERROR: Encountered errors while bringing up the project.
对策有两种选择。
or
解决方法有两种。
-
- 在画面显示时,点击“Share it”
- 预先设置好“Share drive”
2 的设置方法如下。
-
- 右键单击任务栏上的Docker图标
-
- 显示菜单后,点击设置选项
-
- 显示设置页面后,点击共享驱动器
在C盘复选框中勾选并点击应用按钮。

重新审查防火墙的设置。
如果安装了安全软件,可能会发生以下错误情况。
docker-sample_redis_1 is up-to-date
Creating docker-sample_web_1 ... error
ERROR: for docker-sample_web_1 Cannot create container for service web: b'Drive sharing seems blocked by a firewall'
ERROR: for web Cannot create container for service web: b'Drive sharing seems blocked by a firewall'
ERROR: Encountered errors while bringing up the project.
在这种情况下,只需要根据自己的环境重新审查防火墙的设置即可。
网页服务尚未启动。
如果在打开 http://localhost:4000 时出现无法访问该网站的消息,那么可能是因为 Web 服务未启动。此时,您可以尝试检查容器的启动情况,而不需要添加 -d 参数来运行 $ docker-compose up。
$ docker-compose up
# ... 省略
web_1 | python: can't open file 'app.py': [Errno 2] No such file or directory
docker-sample_web_1 exited with code 2
# ... 省略
如果出现类似上述的消息,请按照以下方式修改docker-compose.yaml文件。
(参考:python: can’t open file ‘app.py’ 中的注释)
version: '3'
services:
web:
build: .
ports:
- "4000:80"
# volumes をコメントアウト or 削除
# volumes:
# - .:/app
redis:
image: "redis:alpine"
如果在这种情况下再次执行 $ docker-compose up
$ docker-compose up
# ... 省略
web_1 | * Serving Flask app "app" (lazy loading)
web_1 | * Environment: production
web_1 | WARNING: Do not use the development server in a production environment.
web_1 | Use a production WSGI server instead.
web_1 | * Debug mode: off
web_1 | * Running on http://0.0.0.0:80/ (Press CTRL+C to quit)
# ... 省略
と、正常に起動したことが確認できて( あくまで導入記事なので WARNING は無視 )、更に http://localhost:4000 にブラウザでアクセスすれば Web アプリへのアクセス で添付した画面が表示されることが確認できる。
给你额外的东西
如果要停止和删除 Docker 容器以及删除 Docker 镜像,请执行以下命令。
停止 Docker 容器
$ docker stop 4b3ca0a2590c
4b3ca0a2590c 是通过 $ docker ps -a 输出的容器ID,在多个容器ID之间可以使用空格进行分隔指定。
删除Docker容器
$ docker rm 4b3ca0a2590c
4b3ca0a2590c是Docker容器停止的ID,就像使用”docker ps -a”命令输出的CONTAINER ID一样。这个ID也可以用空格分隔来指定多个。
如果不先停止容器,删除操作可能不会成功,所以请注意。
删除 Docker 镜像
$ docker rmi 2f1c802f322f
2f1c802f322f 是由 $ docker image ls 命令输出的 IMAGE ID。同样,可以使用空格进行多项指定。
请参考
-
- Overview of docker-compose CLI
-
- PowerShell で GitHub に wget(Invoke-WebRequest) できない場合の対処方法
- docker-compose コマンドまとめ