Dockerを0から勉強し直す(1) 「コンテナ技術とは?」

今日から「Dockerを0から勉強し直す」という記事をいくつか書いていきます。これはDockerを構成する技術とか内側の部分を調べてまとめていくものです。自分は今までDockerを使ってCI/CDのパイプラインとか、ちょっとしたWebアプリケーションの環境とかを構築してきましたが、Dockerを構成する部分や、そもそもDocker イメージとはどういうものなのかをちゃんと理解していませんでした。なんというか、このままではまずい気がしたので「0から」学び直したいと思ったわけです。

というわけで第1回は「コンテナ技術とは?」というテーマで書いていきます。(たぶん誤記があると思いますが、コメントで指摘して頂けたら嬉しいです。すぐ修正します)

f:id:tckw_aya:20170820002401p:plain

目次

コンテナ技術の概要

Linuxのユーザーランド上では複数のプロセスを走らせることが可能です。たとえばWebサーバーやデータベースサーバーを一緒に稼働させることができます。ただし、同じLinux上で稼働するプロセスはOSレベルの環境設定については基本的にすべて共通になってしまいます。ディスク(ファイルやディレクトリ)、NICIPアドレス、プロセステーブルなども共通です。この場合、たとえば同じTCP80番ポートを使用するプロセスを複数作れないですし、2つのアプリケーションが必要とするライブラリのバージョンが異なる場合、バージョンによってディレクトリを分けてライブラリのファイルを配置してやる必要があり面倒です。

Linuxコンテナはこのような問題を解決します。Linuxカーネルのnamespace(名前空間)の機能により、Linux上で稼働するプロセスを複数のグループで分割して、それぞれのグループに異なる環境設定を適用できます。複数のユーザーランドを作成し、それぞれに異なるディレクトリの内容を見せたり、異なるネットワークの設定をすることが可能です。このように実行環境が分離されたユーザーランドを「コンテナ」と呼びます。コンテナではプロセステーブルもそれぞれ作られるので、コンテナの外で走っているプロセスを見ることができなくなります。*1

f:id:tckw_aya:20170820002732p:plain

http://www.school.ctc-g.co.jp/columns/nakai/nakai41.htmlからイメージをお借りしました

LXC(Linux Contianer)

コンテナ技術の歴史としてよく聞くのは「chrootFreeBSDのjail → LXC → Docker」という流れで発展していったという話です。Dockerのことを書く前にchrootやLXCとはどういうもなのかということと、LXCを構成するcgroupやnamespaceについて整理して書きます。

chroot

chrootは古くからUNIXのシステムに備わっているファイルシステムの隔離機能です。chrootの特徴は以下の通りです。

  • ディレクトリーツリーの分離を行い、プロセスのルートディレクトリを変更する
  • chrootすると指定したディレクトリ以下に閉じ込めることが出来る。その場合、指定されたディレクトリが/(ルートディレクトリ)として見えるため、それより上のディレクトリにアクセスすることができない
  • chrootはプロセスやネットワークなどの隔離はしないので、プロセスリストが見えるし、ユーザーIDやネットワークインターフェイスも共通になる
  • root権限で使える
  • プロセスのルートを一旦変更すると当該プロセスと(その子孫)は元のルートディレクトリに戻れなくなる

1998年からFreeBSDにはjailという仮想化機構があり、これはchrootの拡張版のようなものでファイルシステムだけでなくプロセス空間の隔離も行います。LXC(Linux Container)はさらなる拡張版とも言え、cgroup、namespace、chrootを使ってコンテナを作成します。

namespace

namespaceはプロセスのグループに対して6種のOSのリソースを分離させて割り当てるというものです。ここで言うリソースには以下のようなものがあります。

名前空間 分離対象
IPC System V IPC, POSIX メッセージキュー
Network ネットワークデバイス、スタック、ポートなど
Mount マウントポイント
PID プロセス ID
User ユーザー ID とグループ ID
UTS ホスト名と NIS ドメイン

namespaceを設定すると別の名前空間のリソースには干渉できなくなります。

cgroup

cgroupはプロセスをグループ化し、グループに対して物理的なリソース(CPU、メモリ、ディスク I/O、ネットワーク等)を制限・隔離・監視するものです。cgroupのリソースを制御するにはサブシステムというものを使います。サブシステムには以下のようなものがあります。

サブシステム 機能
blkio 物理ドライブ (例: ディスク、ソリッドステート、USB) などのブロックデバイスの入出力アクセスの制限を設定する
cpu スケジューラーを使用してcgroupのタスクに割り当てるCPU時間を制御する
freezer cgroupのタスクを一時停止または再開する
memory cgroupのタスクによって使用されるメモリーに対する制限を設定し、それらのタスクによって使用されるメモリーリソースについての自動レポートを生成する

前述のnamespaceによるグループ化したプロセスに対してcgroupを適用することが可能です。

LXC

LXCは環境(プロセスの集合)ごとにリソースを分ける仮想化ソフトウェアで、cgroupやnamespace、chrootなどの技術を使っています。環境毎にプロセスやファイルシステムの隔離だけでなく、CPUやメモリの制限も行えます。LXCの関連技術には、LXDというLXCコンテナを操作するためのAPIを提供するデーモンもあるようです。

Dockerとは

超簡単に言えばDockerはlibcontainerという独自のドライバを利用してcgroupとnamespaceを使い、OSレベルで仮想化を行うソフトウェアです。Dockerはすこし前まではlxcやlibvirtというライブラリを使っていましたが、Docker 0.9からlibcontainerを使用するように変更されたようです。*2

ちなみにsystemd-nspawnはchrootの強化版みたいなものらしいです。

f:id:tckw_aya:20170819171726p:plain

libcontianer

Go言語のネイティブな実装であり、名前空間・cgroup・機能・ファイルシステムへのアクセス管理を持つコンテナを作成します。コンテナを作成後、コンテナに対してライフサイクル上の追加操作を可能にします。

Dockerの特徴

LXCでは実現できていない、Dockerの利点をいくつか書いていきます。

ポータビリティ

Dockerはポータビリティに優れており、簡単に言えば「Dockerさえインストールされていればどこでもアプリケーションコンテナを作成・実行可能」です。ユーザーが注意するべきなのはアプリケーションレベルの依存関係だけです。Dockerイメージにまとまったファイルシステムを使い、Docker上でコンテナを作動させるだけでサービスのデプロイは完了します。コンテナはホストの環境から独立しており共有するのはカーネルだけですが、たとえばWindowsであればDocker for WindowsMacであればDocker for Macがインストールされていれば「カーネルの違い」という問題は解決できます。

Dockerレジストリの存在

これの存在はかなり重要だと思います。たとえば私たちがdocker run centosを実行するとDocker HubというパブリックレジストリからCentOSのDockerイメージをpullし、簡単にコンテナを作成・実行することができます。Dockerレジストリリポジトリを作成し、イメージをpushすればあらゆる人々とイメージの共有ができます。

バージョン管理

DockerはDockerイメージに「タグ」をつけることでバージョンを分けることができます。そもそもDockerイメージはいくつもの層(ファイルやメタ情報)が重なったミルフィーユのような構造をしており、ここでいうバージョンの違いとは「積み重なっている層の違い」を意味します。DockerfileでDockerのイメージをビルドする際にレイヤのキャッシュが起こります。このDockerfileに何か命令を追加して新たにイメージをビルドする際には、このキャッシュを使って差分のレイヤを乗せるだけでできてしまいます。イメージ間で共通する層は共有できるので、ディスク容量の削減が可能です。docker tagによるロールバックも可能です。

Dockerをサポートする技術の多さ

有名なのだとDocker Composeがあります。これは複数のコンテナを使用するアプリケーション環境をdocker-compose.ymlというYAML形式のファイルに記述し、それを読み込むだけで環境のデプロイが可能です。他にもk8sやSwarmといったオーケストレーションツールがあり、これらを使用することでコンテナを使ったクラスタリングも容易にできます。

ドキュメントの多さ

流行と共にDockerについて書かれたドキュメントがどんどん増えていっています。日本語のドキュメントもいっぱいあるのがいいですよね。

まとめ

コンテナとは「プロセスを実行するために隔離され、リソースが制限されたユーザーランド」です。コンテナ技術って聞くと「LXCかDocker」みたいなところがあったんですが、FreeBSDのjalisや、OpenVZ、SolarisのZoneなんていうのもコンテナ技術の1種としてあるようです。

課題

ネットで1.5日かけて色々調べてこの記事を書いたんですが、曖昧な部分とか整理しきれてない部分が結構あります。特にnamespaceによるリソースの隔離だけでなくSELinuxによるMAC(強制アクセス制御)がなぜ必要になってくるのかがよくわかってないです。これから勉強会などに出向いて、コンテナ技術や仮想化について詳しい方々に話を聞いて「コンテナ完全に理解した」と言えるようになりたいと思いました。この記事はこれから少しずつ編集・改良を加えていくつもりです。

参考

*1:Docker実践入門――Linuxコンテナ技術の基礎から応用まで」に書いてあることとほぼ同じことを書いてしまいましたがお許しください。この本は「Dockerの勉強をこれから始める」という方にオススメなので是非購入してみてください!

*2:DOCKER 0.9: INTRODUCING EXECUTION DRIVERS AND LIBCONTAINER

Docker + Kerberos認証入門

「Dockerを使ってKerberosの環境を作ろう!」という内容です。Kerberos認証のことは参考書でちょっと読んだ程度で全然わかってないので、手を動かしながら勉強したいなと思った次第です。

目次


環境

単一ホスト上に合計3つのDockerコンテナを立てます。それぞれサービス、クライアント、KDCの役割があります。クライアントがサービスにSSHで接続する時、Kerberos認証をかけ、ログインまでできるようにするのが到達目標です。

以下、今回作成するコンテナです。

  • サービス(ホスト名: myservice)
  • クライアント(ホスト名: myclient)
  • KDC(ホスト名: mykdc)

また全てのコンテナはcentos:7.3.1611のイメージを使用して作り、新たに定義したネットワークkrb_networkに繋ぎます。DNSは使用しません。ちなみにDocker for Macを使ってます。

コンテナの起動まで

Kerberos用のネットワークの定義

コンテナに静的IPを割り当てたかったんですけどDockerのデフォルトのブリッジネットワークではそれができないので、新たにネットワークを作ってそこでIPを割り当てることにしました。

$ docker network create --subnet=192.168.1.0/24 krb_network

コンテナ作成

$ docker run -itd --name service1 -e TZ=Asia/Tokyo --net=krb_network --ip=192.168.1.10 --hostname myservice.mydomain.com --add-host=myclient.mydomain.com:192.168.1.11 --add-host=mykdc.mydomain.com:192.168.1.12 centos:7.3.1611

$ docker run -itd --name client1 -e TZ=Asia/Tokyo --net=krb_network --ip=192.168.1.11 --hostname myclient.mydomain.com --add-host=myservice.mydomain.com:192.168.1.10 --add-host=mykdc.mydomain.com:192.168.1.12 centos:7.3.1611 

$ docker run -itd --name kdc1 -e TZ=Asia/Tokyo --net=krb_network --ip=192.168.1.12 --hostname mykdc.mydomain.com --add-host=myservice.mydomain.com:192.168.1.10 --add-host=myclient.mydomain.com:192.168.1.11 centos:7.3.1611

このdocker runコマンドでは以下のようなことをやっています。

タイムゾーンは別に変更しなくてもいいです。

確認

コンテナがちゃんと動いているか

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
27e8658076c9        centos:7.3.1611     "/bin/bash"         5 minutes ago       Up 5 minutes                            kdc1
ec5a5306a0c3        centos:7.3.1611     "/bin/bash"         5 minutes ago       Up 5 minutes                            client1
db937ce4d851        centos:7.3.1611     "/bin/bash"         5 minutes ago       Up 5 minutes                            service1

hostsファイルと時刻の確認 (以下はmykdcで確認した場合)

$ docker attach kdc1 
[root@mykdc /]# 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
192.168.1.10    myservice.mydomain.com
192.168.1.11    myclient.mydomain.com
192.168.1.12    mykdc.mydomain.com mykdc
[root@mykdc /]# date
Mon Jul 17 10:03:45 JST 2017
[root@mykdc /]# 

Kerberos関係のパッケージのインストール

krb5-workstationのインストール

myserviceとmyclientで行います

[root@myclient /]# yum -y install krb5-workstation

krb5-serverのインストール

mykdcで行います

[root@mykdc /]#  yum -y install krb5-server

/etc/krb5.confの編集

全てのコンテナで編集し、以下のようにします。default_ccache_name = KEYRING:persistent:%{uid}コメントアウトも忘れずに。

/etc/krb5.conf

(省略)

[libdefaults]
 dns_lookup_realm = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true
 rdns = false
# default_realm = EXAMPLE.COM                                                                                                                                  
 default_realm = MYDOMAIN.COM
# default_ccache_name = KEYRING:persistent:%{uid}

[realms]
# EXAMPLE.COM = {                                                                                                                                              
#  kdc = kerberos.example.com                                                                                                                                  
#  admin_server = kerberos.example.com                                                                                                                         
# }                                                                                                                                                            

 MYDOMAIN.COM = {
  kdc = mykdc.mydomain.com
  admin_server = mykdc.mydomain.com
 }

[domain_realm]
# .example.com = EXAMPLE.COM
# example.com = EXAMPLE.COM
.mydomain.com = MYDOMAIN.COM
mydomain.com = MYDOMAIN.COM

KDCの設定

各種設定ファイルの編集

mykdcで/var/kerberos/krb5kdc/kdc.conf/var/kerberos/krb5kdc/kadm5.aclの編集をします。

/var/kerberos/krb5kdc/kdc.conf

[kdcdefaults]
 kdc_ports = 88
 kdc_tcp_ports = 88

[realms]
# EXAMPLE.COM = {                                                                                                                                              
  MYDOMAIN.COM = {
  #master_key_type = aes256-cts                                                                                                                                
  acl_file = /var/kerberos/krb5kdc/kadm5.acl
  dict_file = /usr/share/dict/words
  admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
  supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sh\
a1:normal des-cbc-md5:normal des-cbc-crc:normal
 }

/var/kerberos/krb5kdc/kadm5.acl

# */admin@EXAMPLE.COM     *
*/admin@MYDOMAIN.COM *  

Kerberosデータベースの作成

[root@mykdc /]# kdb5_util create -s
Loading random data
Initializing database '/var/kerberos/krb5kdc/principal' for realm 'MYDOMAIN.COM',
master key name 'K/M@MYDOMAIN.COM'
You will be prompted for the database Master Password.
It is important that you NOT FORGET this password.
Enter KDC database master key: 
Re-enter KDC database master key to verify: 

root/adminプリンシパル作成

[root@mykdc /]# kadmin.local
Authenticating as principal root/admin@MYDOMAIN.COM with password.
kadmin.local:  addprinc  root/admin
WARNING: no policy specified for root/admin@MYDOMAIN.COM; defaulting to no policy
Enter password for principal "root/admin@MYDOMAIN.COM": 
Re-enter password for principal "root/admin@MYDOMAIN.COM": 
Principal "root/admin@MYDOMAIN.COM" created.
kadmin.local:  exit
[root@mykdc /]# 

KDC起動

ではKDC管理サーバーとKDCサーバーを起動しましょう

[root@mykdc /]# kadmind
[root@mykdc /]# krb5kdc

出力が何もなくてめっちゃ不安になったので、プロセスが動いているか、何のポートが開いているかを確認しました。

ssnetstatも使えなかったので、とりあえず追加でnet-toolsをインストールしました。

[root@mykdc /]# ps ax
  PID TTY      STAT   TIME COMMAND
    1 pts/0    Ss     0:00 /bin/bash
   85 ?        Ss     0:00 kadmind
   87 ?        Ss     0:00 krb5kdc
   95 pts/0    R+     0:00 ps ax
[root@mykdc /]# netstat -atun
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:88              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.11:41085        0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:749             0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:464             0.0.0.0:*               LISTEN     
tcp6       0      0 :::88                   :::*                    LISTEN     
tcp6       0      0 :::749                  :::*                    LISTEN     
tcp6       0      0 :::464                  :::*                    LISTEN     
udp        0      0 0.0.0.0:88              0.0.0.0:*                          
udp        0      0 127.0.0.11:50525        0.0.0.0:*                          
udp        0      0 0.0.0.0:464             0.0.0.0:*                          
udp6       0      0 :::88                   :::*                               
udp6       0      0 :::464                  :::*   

OKですね。

サービスプリンシパルの作成

mysericeのコンテナで設定します。

[root@myservice /]# kadmin -p root/admin
Authenticating as principal root/admin with password.
Password for root/admin@MYDOMAIN.COM: 
kadmin:  addprinc -randkey host/myservice.mydomain.com
WARNING: no policy specified for host/myservice.mydomain.com@MYDOMAIN.COM; defaulting to no policy
Principal "host/myservice.mydomain.com@MYDOMAIN.COM" created.
kadmin:  ktadd host/myservice.mydomain.com
Entry for principal host/myservice.mydomain.com with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab FILE:/etc/krb5.keytab.
Entry for principal host/myservice.mydomain.com with kvno 2, encryption type aes128-cts-hmac-sha1-96 added to keytab FILE:/etc/krb5.keytab.
Entry for principal host/myservice.mydomain.com with kvno 2, encryption type des3-cbc-sha1 added to keytab FILE:/etc/krb5.keytab.
Entry for principal host/myservice.mydomain.com with kvno 2, encryption type arcfour-hmac added to keytab FILE:/etc/krb5.keytab.
Entry for principal host/myservice.mydomain.com with kvno 2, encryption type camellia256-cts-cmac added to keytab FILE:/etc/krb5.keytab.
Entry for principal host/myservice.mydomain.com with kvno 2, encryption type camellia128-cts-cmac added to keytab FILE:/etc/krb5.keytab.
Entry for principal host/myservice.mydomain.com with kvno 2, encryption type des-hmac-sha1 added to keytab FILE:/etc/krb5.keytab.
Entry for principal host/myservice.mydomain.com with kvno 2, encryption type des-cbc-md5 added to keytab FILE:/etc/krb5.keytab.
kadmin:  exit

klistでKerberos のキーテーブルを確認します。

[root@myservice /]# klist -e -k /etc/krb5.keytab 
Keytab name: FILE:/etc/krb5.keytab
KVNO Principal
---- --------------------------------------------------------------------------
   2 host/myservice.mydomain.com@MYDOMAIN.COM (aes256-cts-hmac-sha1-96) 
   2 host/myservice.mydomain.com@MYDOMAIN.COM (aes128-cts-hmac-sha1-96) 
   2 host/myservice.mydomain.com@MYDOMAIN.COM (des3-cbc-sha1) 
   2 host/myservice.mydomain.com@MYDOMAIN.COM (arcfour-hmac) 
   2 host/myservice.mydomain.com@MYDOMAIN.COM (camellia256-cts-cmac) 
   2 host/myservice.mydomain.com@MYDOMAIN.COM (camellia128-cts-cmac) 
   2 host/myservice.mydomain.com@MYDOMAIN.COM (des-hmac-sha1) 
   2 host/myservice.mydomain.com@MYDOMAIN.COM (des-cbc-md5) 

ユーザープリンシパルの作成

どこかのコンテナ内で以下のコマンドを実行します。

[root@myclient /]# kadmin -p root/admin
Authenticating as principal root/admin with password.
Password for root/admin@MYDOMAIN.COM: 
kadmin:  addprinc user1
WARNING: no policy specified for user1@MYDOMAIN.COM; defaulting to no policy
Enter password for principal "user1@MYDOMAIN.COM": 
Re-enter password for principal "user1@MYDOMAIN.COM": 
Principal "user1@MYDOMAIN.COM" created.
kadmin:  exit
[root@myclient /]# 

TGTの取得

myclientで行います。kinitコマンドでTGT(Ticket Granting Ticket)を取得します

[root@myclient /]# kinit user1
Password for user1@MYDOMAIN.COM: 
[root@myclient /]# 

klistでチケットを表示してみます。

[root@myclient /]# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: user1@MYDOMAIN.COM

Valid starting     Expires            Service principal
07/17/17 11:08:28  07/18/17 11:08:28  krbtgt/MYDOMAIN.COM@MYDOMAIN.COM

SSH接続まで

ログイン用ユーザー追加

myserviceでsshでログインするユーザーを作成します。ここで作成するユーザーはさっき作成したユーザープリンシパルと同じ名前にしてください。

 [root@myservice /]# adduser user1  

SSHサーバーのインストール

openssh-serverをインストールします。

[root@myservice /]# yum -y install openssh-server

このままsshdを実行するとCould not load host keyのエラーが発生するので鍵を作ります。

[root@myservice /]# ssh-keygen -A
ssh-keygen: generating new host keys: RSA1 RSA DSA ECDSA ED25519 

次に/etc/ssh/sshd_configを編集します。

/etc/ssh/sshd_config

(省略)
# Kerberos options
KerberosAuthentication yes
#KerberosOrLocalPasswd yes
KerberosTicketCleanup yes
#KerberosGetAFSToken no
#KerberosUseKuserok yes

# GSSAPI options
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
#GSSAPIStrictAcceptorCheck yes
#GSSAPIKeyExchange no
#GSSAPIEnablek5users no
(省略)

sshdを実行してサーバーを立てます。

[root@myserver /]# /usr/sbin/sshd

SSHクライアントのインストール

myclientで行います

[root@myclient /]# yum -y install openssh-clients

SSH接続

オプションで-o GSSAPIAuthentication=yesをつけてsshを実行します(オプションつけなくてもログインできるかも)

[root@myclient /]# ssh -o GSSAPIAuthentication=yes user1@myservice.mydomain.com
Last login: Mon Jul 17 11:09:37 2017 from myclient.mydomain.com
[user1@myservice ~]$ cat /etc/hostname
myservice.mydomain.com
[user1@myservice ~]$ 

ログインに成功しました〜!再度チケットを表示してみましょう。

[root@myclient /]# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: user1@MYDOMAIN.COM

Valid starting     Expires            Service principal
07/17/17 11:08:28  07/18/17 11:08:28  krbtgt/MYDOMAIN.COM@MYDOMAIN.COM
07/17/17 11:09:37  07/18/17 11:08:28  host/myservice.mydomain.com@MYDOMAIN.COM
[root@myclient /]# 

新たなチケットが追加されています。

これでDockerを使ったKerberos環境の構築を終わりたいと思います。お疲れ様でした。

参考

特定のバージョンのDockerをインストールする

単純にDockerを使う分には最新のバージョン使ってればいいと思います。しかし、たとえばRancherのようなものを扱いたい場合、最新のバージョンのDockerをサポートしていなくて扱えなかったりします。こういう時バージョンを指定してインストールしたいものですが、どうすればいいんだよという話。

Rancherのサイトにあるスクリプトを実行する

Rancherの公式サイトには実行するだけで任意のバージョンのDockerをインストールできるシェルスクリプトが用意されています。

下のリンクからRancherのページに飛んでください

rancher.com

たとえば

curl https://releases.rancher.com/install-docker/17.03.sh | sh

を実行するとホストに17.03系の最新のDockerがインストールされます。

この17.03.shは単純にyumやaptのリポジトリの追加とDocker CEのインストールをしているだけです。ついでにDockerのデーモンも起動します。

バージョンの変化とスクリプトの変化

上でDockerをインストールして満足した人はここから先読まなくていいです。

気づいた方もいるとは思いますが、17.03.sh以降と17.03.shより前のバージョンのスクリプトでは、追加するリポジトリとインストールするパッケージが違います。

たとえば以下はCentOS7でスクリプトを実行した時

リポジトリ パッケージ
17.03.sh以降 https://download.docker.com/linux/centos/docker-ce.repo docker-ce-${docker_version}.ce
17.03.shより前 https://yum.dockerproject.org/repo/main/centos/7 docker-engine-${docker_version}

以下はUbuntu16.04で実行した時

リポジトリ パッケージ
17.03.sh以降 deb [arch=$(dpkg –print-architecture)] https://download.docker.com/linux/ubuntu xenial stable docker-ce-${docker_version}.ce
17.03.shより前 deb [arch=$(dpkg –print-architecture)] https://apt.dockerproject.org/repo ubuntu-xenial main docker-engine=${docker-version}~[ubuntu-xenial|xenial]

17.03.shからyumもaptも同じドメインリポジトリを使用していますね。そしてどちらもDocker CEをインストールするようになりました。

Docker EngineとDocker CE

結局のところ両方ともDockerなんですが、最近Docker CE(無償版)とDocker EE(有償版)というものができたのでDocker Engineというくくりで扱わなくなった模様。以下は参考

kenoha.hatenablog.com

www.publickey1.jp

超余談

自分が確認しているところでは少なくとも6/28〜6/30にかけては17.03.shがうまく動作しませんでした。実行すると「パッケージが見つからない」ってエラーが出るんですよね。7/1からは新しいものに取り替えられたようで正常に動作するようになりました。

古い17.03.shをダウンロードしていて魚拓(笑)をとっていたので、新しい方の17.03.shと比較して、エラーが出る原因を探ってみてください。以下のgithubリポジトリに双方のスクリプトファイルをpushしました

github.com

初めまして

どもです。「立川」と言います。某大学の情報系の学部に通ってます。

このブログでは個人的にアウトプットしたいこととか、自分のメモ書き的なものを記事にしていきます。最初はブログじゃなくてQiitaに色々書いていこうと思ってたんですけど、あそこは適当なこととか間違ったことを書くとボコボコに叩かれる気がするんですよね。こわい

とりあえず今Dockerに興味があるのでこれ関係のことを書いていこうと思います。よろしくお願いします。