8
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Docker for Windowのインストールから利用までの(ほぼ)CUI手順

Last updated at Posted at 2019-03-29

普通にDocker for Windowsのインストーラ使うのが良い

Scoopを整理した時にDockerをアンインストールしてDocker for Windowsで入れなおしてみたら普通に使いやすかった。宗教上の理由でCUIしか触れない人くらい意味のない記事になっているが、いつかどこかで加工して再利用するかも知れないのでまだ残しとくのである。

Dockerって何が嬉しいの?

百聞は一見に如かず、百見は一触に如かず。
という事で触れてみて欲しい。

概念とかは置いといてまずは触ってみる

WindowsでDockerを取り敢えず触ってみようじゃないかという人向けに、理解は後工程でいいというコンセプトでこの記事を書いている。プロキシ環境を想定している。

目次

  • 1 PowerShellのプロキシ設定
  • 2 scoopのインストール
  • 3 docker-machineのインストール
  • 4 docker-machineへのプロキシ設定
  • 5 Docker HubからCentOSイメージを取得
  • 6 コンテナの起動
  • 7 プライベートレジストリの構築
  • 8 イメージ作成とプライベートレジストリへのpush
  • 9 プライベートレジストリからのpull

こんな感じで、説明を最小限に抑えただただ手順を羅列していく。

前提条件

  • OSはWindows7以降。
  • VirtualBoxが必要なのでなければここからインストールしておく。
  • 仮想化支援機能を有効にする。(進めていってdocker-machineの作成時にエラーが出てからでも良い)
  • PowerShellのバージョンは3以降が必要。

powershell $PSVersionTableで確認してPSVersionが2.xの場合はPowerShellのバージョンアップを先にする必要がある。

筆者はクリーンインストールしたWindows7 SP1で手順を確認しながらこの記事を書いているため、PowerShell更新で要求された.NETのインストールも行った。

まずはPowerShellのプロキシ設定

PowerShellを管理者権限で起動。
ここではコマンドプロンプトから起動する。まずはこいつが認証プロキシを潜れるようにする。

C:\>@powershell -NoProfile -ExecutionPolicy unrestricted -Command "Start-Process powershell.exe -Verb runas"

profile.ps1を作成する。
※既にprofile.ps1を作っている人はNew-Item~をすると消えるので注意。

PS C:\> New-Item -path $profile -type file -force

メモ帳で開く。

PS C:\> notepad $profile

Microsoft.PowerShell_profile.ps1を編集する。プロキシの設定を書こう。yourusernameとyourpasswordとyourproxyhostとポート番号を編集して保存する。
その他環境に合わせて。実はここでno_proxyの設定が後々重要になってくる。

認証ありProxy

Microsoft.PowerShell_profile.ps1
# Encoding::Shift-JIS
$user = "yourusername"
$password = "yourpassword"
$proxyhost = "yourproxyhost:8080"
$proxyaddress = "http://$($proxyhost)/"
$env:http_proxy = "http://$($user):$($password)@$($proxyhost)"
$env:https_proxy = "http://$($user):$($password)@$($proxyhost)"
$env:no_proxy = "192.168.99.100"
$env:ftp_proxy = "http://$($user):$($password)@$($proxyhost)"
$password_secure = ConvertTo-SecureString $password -AsPlainText -Force
$creds = New-Object System.Management.Automation.PSCredential $user, $password_secure
$proxy = New-Object System.Net.WebProxy $proxyaddress
$proxy.Credentials = $creds
[System.Net.WebRequest]::DefaultWebProxy = $proxy
echo 'Set-Proxy OK.'

認証なしProxy

Microsoft.PowerShell_profile.ps1
# Encoding::Shift-JIS
$proxyhost = "yourproxyhost:8080"
$proxyaddress = "http://$($proxyhost)/"
$env:http_proxy = "http://$($proxyhost)"
$env:https_proxy = "http://$($proxyhost)"
$env:no_proxy = "192.168.99.100"
$env:ftp_proxy = "http://$($proxyhost)"
$proxy = New-Object System.Net.WebProxy $proxyaddress
$proxy.Credentials = $creds
[System.Net.WebRequest]::DefaultWebProxy = $proxy
echo 'Set-Proxy OK.'

スクリプトの実行を許可する。

Set-ExecutionPolicy RemoteSigned

実行ポリシーの変更 → Y

実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies のヘルプ トピックで説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [N] いいえ(N)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): Y

スクリプトを走らせる。

.$profile

Set-Proxy OK.と出る。
これで毎回プロキシ設定がされた状態でPowerShellが立ち上がる。

scoopをインストールする

scoopはWindows用のyumみたいな奴だ。

iex (new-object net.webclient).downloadstring('https://get.scoop.sh')

docker-machineをインストール

scoopのbucket追加に必要なためgitをインストールしてextras bucketを追加してdockerをインストールするという手順になる。

// Gitをインストール
PS C:\> scoop install git

// extras bucketを追加
PS C:\> scoop bucket add extras

// インストール
PS C:\> scoop install docker docker-compose docker-machine

docker-machineの作成とプロキシ設定

PowerShellに設定してあるプロキシ情報を使ってdocker-machineを作成する。docker-machineはdockerのインストールされたTiny Core Linuxだ。

生成コマンドは以下。defaultというdocker-machineを作成している。UACが有効だと何回か許可を求めるダイアログが出てくるが、気付きにくいので注意。

PS C:\> docker-machine create --engine-env  http_proxy=$env:http_proxy --engine-env https_proxy=$env:https_proxy default

これで作成できたら以下の様にしてdocker-machineに繋いでみよう。

PS C:\> docker-machine ssh

これでdocker@default~$といった具合にプロンプトが表示されれば話は早いのだが、ASCII エスケープコードをそのまま表示しているかも知れない。

こんな感じで
[1;32mdocker@default[0m:[1;34m~[0m$ 

自分のマシンでは色が解釈されて表示されるのだが、実はどうやったのか忘れた。(誰か教えて)
というわけで今回はcmderを使う。

PS > scoop install cmder
PS > cmder

まあcmder使いやすいから「今回は」って話じゃなくずっと使えるんだけど。どうやったのか、わかんなくなったのが気持ち悪いだけで。

Docker HubからCentOSイメージを取得

ここから先、$のプロンプトはdocker-machine内でのコマンドを表す。
どこで入力しているコマンドなのかはプロンプトで判別して頂きたい。

プロンプト 対象
> PowerShell
$ docker-machine
# コンテナ内
$ docker pull centos

これが取れればプロキシの設定などは上手く行っている。

コンテナの起動

$ docker run -it --name hoge centos

これでコンテナに接続できた。試しにcat /etc/redhat-releaseとかコマンドを叩いて見ると、バージョンが表示されるはずである。

コンテナを終了せず抜けるにはCtrlを押しながらpとqで抜けてこれる。Ctrl+dだとコンテナを終了する。

今回は終了させずに抜けて、docker psとしてみて欲しい。今作ったhogeコンテナがあるはずだ。

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
ac3e84fba733        centos              "/bin/bash"         3 minutes ago       Up 3 minutes                            hoge

ではdocker stop hogeで停止させよう。
docker ps -aとすると動いていないコンテナも見れる。Exitedとなっているはずである。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                        PORTS               NAMES
ac3e84fba733        centos              "/bin/bash"         4 minutes ago       Exited (137) 44 seconds ago                       hoge

もう一度このコンテナを起動してみよう。

$ docker start hoge

稼働中のコンテナにはattachでアタッチする。

$ docker attach hoge

今度はexitと打って抜ける。docker ps -aで見るとコンテナは停止している。

プライベートレジストリの構築

dockerのイメージはレジストリに登録して共有できる。そのdockerのレジストリもコンテナを使う。

業務で使うにはプライベートレジストリを用意したい所である。実際にはみんながアクセスできるlinuxサーバーに構築するところなのだが、今回はローカルで立ててみる。

registryというイメージを使う。pullは省略できる。無ければ勝手に取ってくるからだ。よってrunでいきなりコンテナを起動させよう。

$ docker run -d -p 5000:5000 registry

ポートフォワーディングの関係でパラメータが増えているが、今は説明を省く。
これでプライベートレジストリが起動した。

イメージ作成とプライベートレジストリへのpush

折角なのでhogeコンテナにちょっといたずらしよう。
今hogeは止まっているので'run -it'で接続する。

$ docker run -it hoge

適当なテキストファイルを作ってコンテナを止める。

# echo helohelo > /opt/f.txt
# exit

commitコマンドでイメージにする。この時に登録するレジストリのホストとポートも書いておく。

$ docker commit hoge localhost:5000/fuga

pushでプッシュ。実に分かりやすい。

$ docker push localhost:5000/fuga

これでレジストリにhogeコンテナのイメージが登録された。

プライベートレジストリからのpull

確認の為にregistry以外のイメージを全部消しておこう。

$ docker images

これでイメージが列挙される。イメージの削除はrmiを使う。

$ docker images

REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
localhost:5000/fuga   latest              43821587a2f1        10 minutes ago      202MB

$ docker rmi 43821587a2f1        

centosも新しく作られているlocalhost:5000/fugaも消してしまう。
registryだけが残っている状態だ。
ではlocalhost:5000/fugaをpullしてみる。

$ docker pull localhost:5000/fuga

うまく取れただろうか?
起動して中にさっき作ったテキストファイルがあるかを確認しよう。

$ docker run -it localhost:5000/fuga

ここでcat /opt/f.txtとしてheloheloとふざけたテキストが出ただろうか?

さっきイタズラしたコンテナが、ちゃんとレジストリに登録されていて取得できる事が確認できれば成功である。

付録:出やすいエラーとその対処

docker psでForbidden

exitでdocker-machineから抜けてPowerShellに戻って欲しい。
今度はPowerShell上から直接dockerを触ってみよう。

ここまでの手順だとプロキシ環境の人は、

PS > docker ps
error during connect: Get https://192.168.99.100:2376/v1.39/containers/json: Forbidden

こんな事になってる人もいるんじゃないかと思う。
これはプロキシを潜ろうとしているためだ。

PS > $env:no_proxy = "192.168.99.100"
PS > docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
cf53abe18d8a        registry            "/entrypoint.sh /etc"   17 hours ago        Up 17 hours         0.0.0.0:5000->5000/tcp   romantic_bardeen

docker-machine envでTLSなんちゃら

PS > docker-machine env
Error checking TLS connection: Error checking and/or regenerating the certs:
(略)

これはTLS証明書を再生成すればよい。

PS > docker-machine regenerate-certs default

scoopからインストールしたらdocker.jsonはどこにおけばいいの?

~/scoop/apps/docker/current/config

この辺に置けばOKだ。configディレクトリは自分で作ろう。これでプライベートからの取得も怖くないぜ。

おわりに

このくらい触るとなんとなく**Dockerって何が嬉しいの?**という疑問に対して、多少なりとも分かりかけてきたような気がしないでもない可能性があると言えなくもないかも知れない、程度にはなったのではないだろうか? という気がしないでもないと言えなくもないと思うって高畑充希が言ってたかも知れないという夢を見たという人が隣に住んでいるらしい。

聞くより見るより触るのが早い。因みに百見は一触に如かずは俺の尊敬する格闘家の範馬勇次郎さんの言葉で、百見は一験に如かずは経営者の松下幸之助さんの言葉である。

余談の余談であるが、百聞は一見に如かずには続きがある。
百聞は一見に如かず、百見は一考に如かず、百考は一行に如かず、百行は一果に如かず、と続くのである。

ちょっとした豆知識を載せる事でそれっぽい記事のように見せかけたところで、オチを有耶無耶にして記事を終わる高度な作戦である。

8
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?