EC2にubuntuのインスタンスを作成し、キーペアを作る
インスタンス作成は割愛
-# キーペアの権限を変える
% chmod 400 キーペア.pem
-# ubuntuのインスタンスにssh接続する
% ssh -i キーペア.pem ubuntu@EC2のパブリックDNS
yes
キーペアの権限を変える目的は、間違って書き換えた場合、ssh接続できないので「400」と読み取り専用のキーペアとする。EC2のパブリックDNSはインスタンスを停止、起動で変わるので注意!
EC2にdockerをインストール
-# アクセス権限がないので、sudoを使いupdateする。
$ sudo apt-get update
-# dockerのインストール
$ sudo apt-get install docker.io
-# Yを押す
-# dockerのバージョンの確認
$ docker -—version
このままだとubuntuはdockerに権限がないため、コマンドの頭に**「sudo」**を毎回つけなければならない。なので「docker」というグループを作り、「ubuntu」を入れる。すると「docker」グループに「ubuntu」は属しているため、dockerが使えるようになり、「sudo」なしにコマンドが使えるようになる。
-# 「docker」というグループに「ubuntu」をいれる
$ sudo glassed -a ubuntu docker
Adding user ubuntu to group docker
-# 一度抜けないと反映されない
$ exit
-# ssh接続する
% ssh -i キーペア.pem ubuntu@EC2のパブリックDNS
-# dockerコマンドの確認
$ docker images
dockerコマンドが使えることが確認できる。
Docker imageをtarに圧縮してEC2に送る
-# EC2に送るDocker imageの作成
% mkdir temp_folder
% cd temp_folder
% vim Dockerfile
FROM alpine
RUN touch test
% docker build .
軽量のalpineを作成し、そこに「test」というファイルを作成する。
tarファイルに変換
-# docker save イメージ名 > 新しい名前.tar
% docker save b3fc1a6f13e6 > myimage.tar
-# tarファイルの確認
% ls
SFTPを使ってEC2にアクセスする。
ファイルを転送する時に使うコマンド。
-# sftpに入る(ホストとインスタンスが接続している状態)
% sftp -I キーペア.pem ubuntu@EC2のパブリックDNS
-# put 送るファイルのパス 送り先のファイルパス
sftp> put temp_folder /home/ubuntu
-# 別のターミナルを開き、キーペアがあるディレクトリに移動し、ssh接続する。
% ssh -i mydocker.pem ubuntu@ec2-18-183-94-137.ap-northeast-1.compute.amazonaws.com
-# ファイルがあるか確認
$ ls
ファイルがホストからEC2に転送されていることが確認できる。
EC2からホストへファイルを転送する
-# EC2にファイルの作成
$ touch test
-# 別のターミナルを開き、ホスト側へ移動、sftpに入る
% sftp -I キーペア.pem ubuntu@EC2のパブリックDNS
-# testファイルがあることを確認する
sftp> ls
-# testファイルを取得する
sftp> get test
-# sftpを抜ける
sftp> exit
デスクトップに「test」ファイルがあることを確認する
tatファイルをdockerimageに戻す
# ssh接続する
% ssh -i キーペア.pem ubuntu@EC2のパブリックDNS
# docker load < tarファリルでimageに戻す
$ docker load < my image.tar
# imageの確認
$ docker images
# docker run(alpineはbashがないのでsh)
$ docker run -it イメージID sh
# lsコマンドでtestファイルがあることを確認
ls
DockerfileをEC2に直接送り立ち上げる。
-# sftpに入る
% sftp -I キーペア.pem ubuntu@EC2のパブリックDNS
-# putでDockerfileを送る、送り先を指定しない場合はubuntuのホームディレクトリにputされる
% put Dockerfileの絶対パス
-# ssh接続する
% ssh -i mydocker.pem ubuntu@ec2-18-183-94-137.ap-northeast-1.compute.amazonaws.com
-# Dockerfileの確認
$ ls
-# ビルドコンテキストの作成
$ mkdir dsenv_build
-# Dockerfileの移動
$ mv Dockerfile dsenv_build/
$ cd dsenv_build
-# コンテナを立ち上げる
$ docker build .
しかし、**ストレージ(8GB)**が足りずビルドすることができない。
コンピュータのディスク要領の確認
# -hでM,Gバイト表示になる
$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 476M 0 476M 0% /dev
tmpfs 98M 768K 98M 1% /run
/dev/xvda1 7.7G 5.1G 2.7G 66% /
tmpfs 490M 0 490M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 490M 0 490M 0% /sys/fs/cgroup
/dev/loop0 97M 97M 0 100% /snap/core/9804
/dev/loop1 29M 29M 0 100% /snap/amazon-ssm-agent/2012
tmpfs 98M 0 98M 0% /run/user/1000
8GBで「/」はすでに5.1G使っており、残りは2.7GBしかなくbuildする際に、ストレージが足りずにBuildできない。ちなみにLinuxの場合、Dockerオブジェクトの保存場所は「/var/lib/docker/」にある。
EC2のストレージを変更する。
1.EC2のインスタンスのページで「Elastic Block Store」のボリュームをクリックする。
2.任意のインスタンスにチェックし、「アクション」でボリュームの変更を行う。
3.サイズで20GBと設定する。
4.画面を更新し、サイズが20GBになっていることを確認する。
5.インスタンスに反映されていない可能性があるので、インスタンスを再起動しておく。
再度buildする。
-# ssh接続
% ssh -i mydocker.pem ubuntu@ec2-18-183-94-137.ap-northeast-1.compute.amazonaws.com
-# Dockerfileの場所まで移動する
$ cd dsenv_build
-# 再度build
$ docker build .
-# ストレージが20GBになったので、異常なくbuildできる。
$ docker run -v~:/work -p 8888:8888 イメージID
EC2のパブリックDNS:8888で接続できることが確認できる。
コンテナのアクセス権限
-# $ sudo adduser —uid 任意のID ユーザー名(ユーザーはsudo権限がないと作成できないので注意)
-# いろいろ聞かれるが今回は全てエンターで省略
$ sudo adduser --uid 1111 aaa
-# /home/aaaというディレクトリが作成されているので移動
$ cd /home/aaa
-# もう1人のユーザー作成
$ sudo adduser --uid 2222 bbb
-# ホームディレクトリに戻る
$ cd /home
-# ファイルの権限を確認する。
$ ls -la
-# aaaとbbbのファイルの権限が確認でき、aaaはbbbのディレクトリに書き込みができないことが確認できる。
-# aaaのユーザーで入る
docker run -u 1111 -v /home/aaa:/home/aaa -v /home/bbb:/home/bbb -it ubuntu bash
-# idの確認
1111
aaaのユーザーで入っていることが確認できる。
-# bbbディレクトリに移動
$ cd /home/bbb
-# ファイルを作成
$ touch test
しかし書き込み権限がないため、作成できないことが確認できる。