かきスタンプ

福岡で物流系のエンジニアやってます

Docker:基本操作メモ

Dockerは、軽量な仮想化環境を実現するツール。
2017年8月現在、以下のエディションがある。
 - CE(Community Edition):無償
 - EE(Enterprise Edition):有償    
以下、OSは Ubuntu 14.04.5 を使用しています。

Docker CE をインストール

sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get -y install docker-ce

バージョン確認

docker --version

Docker Image検索

sudo docker search <検索ワード>

(例:centosのイメージを検索)
sudo docker search centos

Docker Hubからも検索できる。

Imageファイルの取得

sudo docker pull <イメージ名>

(例:centosのイメージを取得)
sudo docker pull centos

ローカルのイメージの一覧を確認

sudo docker images

イメージの詳細を確認

sudo docker inspect <REPOSITORY:TAG>

(例)
sudo docker inspect centos:latest

TAGは省略可能で、その時は latestとなる。
以下のようにIMAGE ID指定でもOK。

sudo docker inspect <IMAGE ID>

(例)
sudo docker inspect 328edcd84f1b

REPOSITORY、TAG、IMAGE IDは、上記のsudo docker imagesにて確認できる。

イメージの削除

sudo docker rmi <REPOSITORY:TAG>

または

sudo docker rmi <IMAGE ID>

コンテナ作成

sudo docker run <REPOSITORY:TAG>

または

sudo docker run <IMAGE ID>

オプション無しで runを実行した場合、起動後にすぐに終了する。
バックグラウンドで動作させたい場合、-tdオプションを使用する。

(よく使うオプション)
-t:疑似ターミナル (pseudo-TTY) を割り当て
-d:コンテナをバックグラウンドで実行(デタッチドモード)
-i:コンテナの STDIN にアタッチ
-p:コンテナのポートをホスト側に公開

実行中のコンテナ一覧を表示

sudo docker ps

実行終了したコンテナ一覧を表示

sudo docker ps -a

コンテナの削除

sudo docker rm <CONTAINER ID>

CONTAINER ID は、上記の docker psにて確認できる。
CONTAINER ID を指定する時は、先頭X文字を入力するだけでも判別してくれる。

実行中のコンテナのログを確認

sudo docker logs <CONTAINER ID>

バックグラウンドで実行中のコンテナを、フォアグラウンドに移動

sudo docker attach --sig-proxy=false <CONTAINER ID>

ctrl+C でコンテナを再びバックグランドに戻す。

バッググラウンドで実行中のコンテナにログイン

sudo docker exec -it <CONTAINER ID> /bin/bash

実行中のコンテナを停止

sudo docker kill <CONTAINER ID>

停止したコンテナを再開

sudo docker start <CONTAINER ID>

コンテナの削除

sudo docker rm <CONTAINER ID>

停止中のコンテナを全て削除

sudo docker rm `sudo docker ps -a -q`

コンテナを起動し、内部で作業する

sudo docker run -it <REPOSITORY:TAG> /bin/bash/bin/bash

イメージ作成

sudo docker commit <CONTAINER ID> <イメージ名>

イメージ名は、「ユーザ名/名称」とするのが慣習だそうな。
ユーザ名は、Docker Hubのアカウント名と同一にしておく。

ビルド

イメージからコンテナを立ち上げ、何らかの変更を加えたものをイメージ化する作業を、スクリプトに記述して自動化できる。
自動化する内容は、『Dockerfile』というファイルを作成して記述する。
(以下、Dockerfile 記述例)

# 何のイメージかを表す
FROM centos
# 誰が書いたかを表す
MAINTAINER kakisoft <sample@gmail.com>
# RUN: buildする時に実行される
RUN echo "now building..."
RUN yum install -y httpd
# ADD: ローカルのファイルをコンテナにコピー
ADD ./index.html /var/www/html/
# EXPOSE: 起動時に指定ポートをLISTEN 
EXPOSE 80
# CMD: runする時に実行される
CMD ["echo", "now running..."]
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]

Dockerfile作成後、以下を実行

sudo docker build -t <イメージ名> .

ホストのポートをコンテナのポートにリダイレクト

以下では、ホストのポート8080を、コンテナの80にリダイレクト。

sudo docker run -p 8080:80 -d <イメージ名>

Docker Hubへのログイン

sudo docker login

Docker Hubへプッシュ(アップロード)

ログイン後に実行する。

sudo docker push <DockerHubID/イメージ名>

入力例:sudo docker push kakisoft/httpd
イメージ名の先頭は、DockerHubIDでなければいけないのだろうか。
この辺はまだ良くわからないです。

プッシュしたイメージを取得する場合、 sudo docker pull <イメージ名> でOK。

1分で分かる Vagrant

Vagrant(ベイグラント)とは?

仮想マシンを簡単に立ち上げるためのツールです。

f:id:kakisoft:20170812115035p:plain
Boxファイルから仮想マシンを起動できます。
1つのBoxから、複数の仮想マシンを起動する事も可能です。
(図ではVirtualBoxを使用しています。実際には、ユーザの操作として VirtualBoxを起動する必要はありません。)
 
 

Boxファイルとは?

仮想マシンのひな形です。
f:id:kakisoft:20170812115038p:plain
Boxファイルは公式サイトや、Vagrantbox.esからダウンロードできます。
Boxを使用すると、OSのインストールを含め、1から環境を構築する必要はありません。  
 

Boxは、カスタマイズ可能です

f:id:kakisoft:20170812115041p:plain
 
 

ユーザ間で同じ環境を整える事が容易になります

f:id:kakisoft:20170812115045p:plain
Boxファイルは仮想マシンのサイズよりも遥かに軽量です。  
 

Dockerとの違いは?

Dockerは、OS(「仮想マシン」と読み替えた方が分かりやすいかもしれません)上で稼働します。
Vagrantは、仮想マシンの起動や終了を制御します。

Vagrant:基本操作メモ

Vagrantは、仮想マシンを簡単に立ち上げるためのツール。

以下では、仮想マシンVirtualBoxを使用しています。
他にも、VMwareHyper-V、EC2にも適用できます。
ホストには、Ubuntu 16.04.3 を使用しました。

インストール

sudo apt-get install vagrant

バージョン確認

vagrant --version

Box(テンプレート)を取得

vagrant box add  <box名, url, or path>

(入力例1)
vagrant box add hashicorp/precise64

(入力例2)
vagrant box add centos7 https://github.com/tommy-muehle/puppet-vagrant-boxes/releases/download/1.1.0/centos-7.0-x86_64.box

入力後、ダイアログにて「virtualbox」を選択。  
上記の「precise64」は、Ubuntu 64bitの事。
テンプレートは、公式サイトの Docs→Getting Started→Boxes や、 Vagrantbox.esなどで取得できる。
落としたBoxは、「~/.vagrant.d/boxes」にキャッシュされている。
1つのboxから、複数の仮想マシンを作成する事が出来る。

仮想マシン初期化

仮想マシンごとにディレクトリを作成する。
以下では、MyCentOSVMというフォルダを作成し、そのフォルダにて実行しました。

vagrant init <box名>

Vagrantfileという設定ファイルが作成される。
テキストエディタで内容を確認できる。
内容の詳細については公式サイトを参照。

仮想マシンを起動

Vagrantfileが存在するフォルダにて、以下を実行。

vagrant up

virtualboxを立ち上げると、仮想マシンが起動中であることを確認できる。

仮想マシンの状態確認

vagrant status

仮想マシンのスリープ

vagrant suspend

スリープからの復帰

vagrant resume

仮想マシンの終了

vagrant halt

再度、立ち上げたい場合、vagrant up

仮想マシン再起動

vagrant reload

仮想マシンの削除

vagrant destroy

Vagrantfileは残っているので、仮想マシンを削除しても、同じ設定で再作成できる。

仮想マシンへの接続

vagrant ssh

ユーザ名は「vagrant」となる

ホストから仮想マシンへの接続

Vagrantfileにて、以下のコメントアウトを解除(以下の内容があるので、先頭の「#」を削除)

# config.vm.network "private_network", ip: "192.168.33.10"

この例だと、192.168.33.10 でアクセスできる。
設定変更後は、vagrant reloadで再起動。

共有フォルダの設定

ゲストの/vagrantディレクトリは、ホストのVagrantfileが存在するディレクトリと共有されている。
ゲストがCentOSの場合、ゲストOSにて以下を実行すると、ホスト側で編集した内容を、ゲスト側に反映させる事ができる。

sudo rm -rf /var/www/html/
sudo ln -fs /vagrant /var/www/html

403 Forbiddenとなった場合、 SELinuxを無効化する等で対処する。
具体的には、/etc/selinux/configにて、以下のように変更。

SELINUX=enforcing → SELINUX=disbled

プロビジョン設定

仮想マシンを起動した時に、一連の処理を自動的に実行できる。
Vagrantfileに以下を追記することで設定できる。

<Vagrantfileに直接スクリプトを書く場合>

config.vm.provision :shell, :inline => "script xxxx"

<作成したスクリプトファイルを読む場合>

config.vm.provision :shell, :path => "provision.sh"

スクリプトファイル(上記では provision.sh)記述例】

sudo yum -y install httpd
sudo service httpd start
sudo chkconfig httpd on

仮想マシンが起動中の場合、vagrant provisionと実行することで、プロビジョンのみを実行できる。

Boxの作成

現在稼働中の仮想マシンをBox化する場合、以下のコマンドを使用する。

vagrant package

「package.box」というファイルが作成される。
仮想マシンが起動中の場合、自動的にシャットダウンしてくれる。
作成したBoxをリストに追加するには、以下を実行。

vagrant box add <ボックス名> package.box

Boxの一覧を確認

vagrant box list

Boxの削除

vagrant box remove <box名>

Box操作系コマンド一覧表示

vagrant box -h

VMware Player:ホストとゲストの共有フォルダ設定

VMware Playerにて、ホストとゲストの共有フォルダを設定する手順。
以下、ホストとゲストはWindowsでやってます。

  1. VMware Playerのメニューの、
     管理→仮想マシンの編集→オプション(タブ)→共有フォルダ
     にて
      ・常に有効
      ・Windowsゲストのネットワークドライブとしてマッチする
     を選択。

  2. [追加]ボタンを押し、ホストの共有対象フォルダを選択。

  3. ゲストOSを起動。
    「'vmware-host' の Shared Folders」
    というフォルダが出来ている。
     
     

上記のフォルダが出来ていない場合、ゲストOSのネットワークドライブの割り当てで以下を追加。

\\.host\Shared Folders\

※この内容を、そのまま使用する
 

それでも共有フォルダができない場合、VMware Toolsが正常に動いていない可能性があるので、VMware Playerのメニューより以下を実行。

Player→管理→VMware Toolsのアップデート

bootstrap:アイコンの上にバッジを表示する

こういう感じの。
f:id:kakisoft:20170718025617p:plain

ー html側 ー

<div class="container">
  <button class="btn btn-default btn-lg btn-link" style="text-decoration: none;font-size:45px;">
    <span class="glyphicon glyphicon-envelope"></span>
    <span class="badge badge-notify">5</span>
  </button>
</div>

CSS側 ー

.btn-default >.badge-notify{
   background:red;
   position:relative;
   top: 7px;
   left: -62px;
}

サイズを小さくしたい場合は、buttonでなく、aを使ったほうがよさそう。

AWS:rootユーザに切り替え

AWSは、通常 ec2-userでログインします。
rootユーザでログインを試みると、「Please login as the user “ec2-user” rather than the user “root”.」というメッセージが表示されますが、一度、ec2-userでログインした後、ユーザを切り替える事で、rootユーザでの実行が可能です。

  1. ec2-userにてログイン
  2. sudo passwd を実行し、パスワードを設定
  3. su - を実行。先ほど入力したパスワードを入力

Ubuntu 16:デバイスマネージャー起動方法

<環境>
Ubuntu 16.04.2 LTS】
 
Windowsで言う、デバイスマネージャーに相当するツール。
デフォルトのデスクトップ環境(Unity)の使用を前提としています。 

以下のコマンドでインストー

sudo apt-get install hardinfo

起動

hardinfo

 
起動画面はこんな感じ。 f:id:kakisoft:20170711134415p:plain  
 
簡易版にsysinfoというツールもありました。

sudo apt install sysinfo
sysinfo

起動画面はこんな感じ。 f:id:kakisoft:20170711142410p:plain