MacでDockerイメージのダウンロード・コンテナの起動・イメージの作成・Docker Hubにプッシュするチュートリアル!

公開日:2018-12-21
最終更新:2018-12-22

こんにちわ!

今回は皆さんご存知のDockerを使えるようにしていきたいと思います!

難しそうでちょっと警戒していたのですが、調べてみると案外簡単に扱えたのでご紹介します!

この記事ではDockerのインストールは完了している前提で話を進めていきますので、公式サイトから会員登録を行い、こちらからMac用のDocker本体をインストールして、起動させておいてください!

MacでDockerを使ってみる

Dockerの使い方(公式):Get started with Docker for Mac

参考:【初心者向け】Docker for Macで開発環境を作る(アプリサーバとDBサーバのコンテナ間連携まで)

Dockerfileの使い方:開発環境をDockerに乗せる方法とメリットを3ステップで学ぶチュートリアル

そもそもDockerはDocker Engineを起動させホストOSを利用してプロセスの一つとして動作しているのですが、MacのOSは当然LinuxではないためホストOSは利用できません。

このため、Docker for Macは、Mac標準の仮想化ツールであるHyperKitを利用して仮想マシンを立ち上げ、Linuxを起動しているそうです。

Dockerイメージのダウンロード

まずはDockerイメージをインストールしていきます。

Dockerイメージは現実のディスクイメージのように、サーバーの状態(インストールされたミドルウェアの設定など)を保存しておける物のようです。

DockerHubというサービスからイメージをpullします。

# Dockerが起動しているか確認  
$ docker --version  
Docker version 18.09.0, build 4d60db4  

# Mysqlのイメージをダウンロード  
$ docker pull mysql  

# ubuntuのイメージをダウンロード  
# ubuntu  
$ docker pull ubuntu  

# ダウンロードしたDockerイメージの確認  
$ docker images  
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE  
ubuntu              latest              93fd78260bd1        4 weeks ago         86.2MB  
mysql               latest              f991c20cb508        4 weeks ago         486MB  

コンテナの起動

通常、仮想環境を作成する際にはホストOS上で専用のアプリケーションを利用してゲストOSを動かすか、ハードウェア上で直接ハイパーバイザ起動させ、ハイパーバイザ上でゲストOSを動作させる2パターンがありました。

しかし、前述の通りDockerの場合はホストOSを利用するためゲストOSのインストールが必要がなく、その代わりにDocker Engine上でホストOSを利用してゲストOSなしに1つのプロセスとして動作します。

この分離されたプロセスはDockerコンテナと呼ばれ、そこに環境を構築していくことで、実環境が汚染されません。

前項でダウンロードしたイメージファイルはコンテナのイメージファイルであり、ソフトウェアのパッケージとなってますので、イメージからコンテナを起動と停止を行ってみましょう!

# mysqlコンテナの起動  
$ docker run -it --name mysql -e MYSQL_ROOT_PASSWORD=password -d mysql:latest  

#コンテナが起動しているか確認  
# -aオプションで停止中のコンテナも含めて全て表示できる  
$ docker ps  
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES  
54530af45415        mysql:latest        "docker-entrypoint.s…"   29 seconds ago      Up 29 seconds       3306/tcp, 33060/tcp   mysql  

# コンテナの停止  
$ docker stop mysql  
mysql  

$ docker ps  
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES  

# コンテナの再起動  
$ docker start mysql  
mysql  

$ docker ps  
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES  
54530af45415        mysql:latest        "docker-entrypoint.s…"   4 minutes ago       Up 2 seconds        3306/tcp, 33060/tcp   mysql  

-itは-iオプションと-tオプションの併用です。(interactive+tty)このオプションがないと起動後、一瞬で終了してしまいます。

--nameオプションはDockerコンテナの起動コンテナ名を指定します。

-eオプションで環境変数の設定行います。MYSQL_ROOT_PASSWORDにはrootのパスワードを指定します。

-dオプションはバックグラウンド起動を行います。(イメージ名):(バージョン)を指定します。
【初心者向け】Docker for Macで開発環境を作る(アプリサーバとDBサーバのコンテナ間連携まで)

mysqlコンテナにログイン

コンテナは色々パッケージされたLinuxですので起動させると普通にbashにログイン出来たりデータベースにアクセスできます。

試しにmysqlコンテナにログインしてみます。

# docker execコマンドでmysqlコンテナにログイン  
# -itオプションでbashをにログイン  
$ docker exec -it mysql bash  

# パスワード(mysqlコンテナ起動時のコマンドで入力したもの)を入力してログイン  
[email protected]:/# mysql -u root -p  
Enter password:  

# SQLを叩いてデータベースの作成  
mysql>create database db;  

# データベースの確認  
mysql> show databases;  
+--------------------+  
| Database           |  
+--------------------+  
| db                 |  
| information_schema |  
| mysql              |  
| performance_schema |  
| sys                |  
+--------------------+  

# データベースからログアウト  
mysql> exit;  
Bye  

# コンテナからログアウト  
[email protected]:/# exit  
exit  
$  

ubuntuコンテナにログインしてnginxとmysql-serverをインストール

ubuntuコンテナにもログインして、今度はnginxとmysql-serverをインストールしてみます。

# ubuntuの起動  
$ docker run -it --name myubuntu -d ubuntu  

# ubuntuにログイン  
$ docker exec -it myubuntu bash  

# ubuntuのバージョン確認  
[email protected]:/# cat /etc/lsb-release  
DISTRIB_ID=Ubuntu  
DISTRIB_RELEASE=18.04  
DISTRIB_CODENAME=bionic  
DISTRIB_DESCRIPTION="Ubuntu 18.04.1 LTS"  

# aptのアップデート  
/# apt-get update  

# nginxのインストール  
/# apt-get install nginx  

# mysql-serverのインストール  
/# apt-get install mysql-server  

# ubuntuからログアウト  
/# exit  
exit  

コンテナをイメージ化

コンテナはイメージ化することで、現在の情報(アプリケーションの実行に必要な設定、ライブラリ、コード等)を保存し配布できるようになります。

# 起動しているコンテナを確認  
$ docker ps  
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES  
2a0b1a1a6b33        ubuntu              "/bin/bash"              5 hours ago         Up 5 hours                                myubuntu  
54530af45415        mysql:latest        "docker-entrypoint.s…"   5 hours ago         Up 5 hours          3306/tcp, 33060/tcp   mysql  

# 指定コンテナをDockerイメージ化  
# docker commit コンテナID ユーザ名(任意)/イメージ名(任意):バージョン(任意)のフォーマットで入力  
$ docker commit 2a0b1a1a6b33 myuser/ubuntu:1.0  

# イメージが作成されているか確認  
$ docker images  
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE  
myuser/ubuntu       1.0                 6cf99352ed8e        13 seconds ago      503MB  
ubuntu              latest              93fd78260bd1        4 weeks ago         86.2MB  
mysql               latest              f991c20cb508        4 weeks ago         486MB  

DockerイメージをDocker Hubにアップロード

作成したイメージはGithubのDocker版であるDocker Hubにアップロードすることで公開できます。

まずはDocker Hubに登録してリポジトリを作成
(今回は例としてユーザー名:nokonoko1203・コンテナ名:ubuntuでリポジトリを作成)

作成したリポジトリと作成したイメージは同じ名前でないとDockerHubにアップロードできないので修正していきます。

Dockerにコマンドラインからログインしたのち、docker tag イメージID リポジトリ名:タグのフォーマットでイメージを修正していきます。

$ docker login  
Login Succeeded  

# 作成したリポジトリ名に合わせてイメージ名を修正  
$ docker tag 6cf99352ed8e nokonoko1203/ubuntu:1.0  

# 修正されているか確認  
$ docker images  
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE  
nokonoko1203/ubuntu   1.0                 6cf99352ed8e        5 hours ago         503MB  
myuser/ubuntu         1.0                 6cf99352ed8e        5 hours ago         503MB  
ubuntu                latest              93fd78260bd1        4 weeks ago         86.2MB  
mysql                 latest              f991c20cb508        4 weeks ago         486MB  

# DockerHubにpush  
$ docker push nokonoko1203/ubuntu:1.0  

不要なイメージを削除

Dockerイメージは容量が大きいので不要になったイメージは削除していきましょう。

# 不必要なイメージを削除  
$ docker rmi ubuntu  
Error response from daemon: conflict: unable to remove repository reference "ubuntu" (must force) - container 2a0b1a1a6b33 is using its referenced image 93fd78260bd1  

# コンテナ2a0b1a1a6b33が93fd78260bd1イメージを使用しているらしいので、コンテナから削除  
$ docker rm -f 2a0b1a1a6b33  
2a0b1a1a6b33  

# 再度削除  
$ docker rmi ubuntu  
Untagged: ubuntu:latest  

# myuser/ubuntuも古いので削除  
$ docker rmi myuser/ubuntu  
Error: No such image: myuser/ubuntu  

# イメージが存在しているのにError: No such imageと怒られる時はタグを指定すれば削除できる  
$ docker rmi myuser/ubuntu:1.0  
Untagged: myuser/ubuntu:1.0  

# 綺麗さっぱり  
$ docker images  
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE  
nokonoko1203/ubuntu   1.0                 6cf99352ed8e        18 hours ago        503MB  

$ docker ps  
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES  

作成したイメージでコンテナを起動させてみる

作成したイメージを起動させてみましょう!

# 作成したイメージでコンテナを起動  
# -hオプションでホスト名をつけて起動します  
$ docker run -h ubuntu -it nokonoko1203/ubuntu:1.0  
e8c94cd3d931f805169a7acbebb791018be0ba3bc2e875b817be48586a19ee4b  

接続中のコンテナから抜ける場合は、Ctrl + P → Ctrl + Q の順番にキーを押してデタッチします。

exitでコンテナからログアウトしてしまうと、コンテナが停止されてしまうので、状態が保存されずにイメージを保存した段階まで戻されてしまいます。

# デタッチしたのちにコンテナがまだ起動しているか確認。  
$ docker ps  
CONTAINER ID        IMAGE                     COMMAND             CREATED             STATUS              PORTS               NAMES  
e8c94cd3d931        nokonoko1203/ubuntu   "/bin/bash"         16 seconds ago      Up 15 seconds                           ubuntu  

起動中のコンテナにアタッチするには以下の通りです。

$ docker attach ${CONTAINER ID}  
/#   

まだ十分に扱えているとは言えませんが、とりあえずの基本動作は抑えれたと思います!

お疲れ様でした!

困った時はこちらを参考にするといいと思います!
docker コマンド チートシート

おまけ:Dockerコンテナのubuntuを日本語化

参考:Dockerにubuntuのコンテナを作成・日本語化する

$ apt install language-pack-ja-base language-pack-ja  

$ locale-gen ja_JP.UTF-8  

$ echo export LANG=ja_JP.UTF-8 >> ~/.profile  

$ source ~/.profile  

$ date  
2018年 12月 22日 土曜日 13:29:29 UTC  

Dockerを扱う際に調べたキーワード

Docker

Docker入門(第一回)~Dockerとは何か、何が良いのか~

Top Docker / コンテナ / 仮想化 今からでも間に合うDockerの基礎。コンテナとは何か、Dockerfileとは何か。

Dockerは、Linuxのコンテナ技術を使ったもので、よく仮想マシンと比較されます。VirtualBoxなどの仮想マシンでは、ホストマシン上でハイパーバイザを利用しゲストOSを動かし、その上でミドルウェアなどを動かします。それに対し、コンテナはホストマシンのカーネルを利用し、プロセスやユーザなどを隔離することで、あたかも別のマシンが動いているかのように動かすことができます。そのため、軽量で高速に起動、停止などが可能です。

なぜDockerではホストOSと違うOSベースのコンテナイメージが動くのか

dockerはハイパーバイザ型の仮想環境とは違いOSのゲストOSのインストールが必要ない理由は、そもそもLinuxディストリビューションしか動かせず、Linuxディストリビューション同士はカーネルを共有できるから。

Linuxコンテナ

Linux上でコンテナを構築するには? 『Ubuntuサーバー徹底入門』からLinux Containerを紹介

15分で分かるLXC(Linux Containers)の仕組みと基本的な使い方

ミドルウェア

ミドルウェア(Web、AP、DB)について知ろう

ミドルウェア (middleware)

ミドルウェアとは、”middle”と名の付く通り、アプリケーションとOSの中間的な処理を行うソフトウェアのことです。「中間的な処理」と言われてもピンとこない方が多いと思いますが、あまり難しく考えず「ある機能に特化してOSとアプリケーションを補助するソフトウェア」と覚えておけば良いでしょう。

OSはサーバを動かす上で必須のものですが、あくまで基本機能しか持っておらず、業務で求められる機能までは備えていません。しかし、ミドルウェアをインストールすることで特定の処理や複雑な動作が可能になります。また、矛盾するようですがアプリケーションと比べて汎用的な機能を提供しています。まさしく「ミドル」の名にふさわしいソフトウェアなのです。

ハイパーバイザー

用語集|ハイパーバイザー

ハイパーバイザ (hypervisor)

ハイパーバイザはコンピューター仮想化のためのソフトで、ハードウェア上でプログラムを直接稼働する方式がある。OS上でアプリケーションソフトとして稼働し、その上で様々なOSを動作できるようにするものも含まれている。VirtualBoxなどは後者?

カーネル

【初心者向け】Linuxカーネルって一体なんだ?

OS:ハードウェアとソフトウェアの仲立ちをし、アプリケーションが動作するための基本環境を提供するソフトウェア

オペレーティングシステム(英語: Operating System、OS、オーエス)とは、コンピュータのオペレーション(操作・運用・運転)のために、ソフトウェアの中でも基本的、中核的位置づけのシステムソフトウェアである。

要するに、ハードウェアとソフトウェアの仲立ちをしてくれるものがOSです。
LinuxカーネルはそんなOSの基幹部分の機能である、

「アプリケーションが動作するための基本環境」

を提供しています。

具体的には例えば、
・メモリのどの場所にデータを保存すればいいか
・CPUのリソースをどの程度それぞれのアプリケーションに割り振ればいいか
・ハードウェアからの処理の依頼をどんな順番で行うか

カーネル:OSの中で動くソフトウェア。どのようなアプリケーションを動作させるためにも必要となる、共通の処理を担っているため、その性質上PC上の全てのリソースにアクセスできる特別な存在。

プロセス管理
 Linuxカーネルでは、プログラムの実行状態をプロセスという単位で管理しています。また、カーネルはプロセス一つ一つに対して、task_stract構造体というデータ構造を準備しています。
 task_stract構造体には、そのプロセスが動作するための様々な情報(PIDやプロセスが動作しているメモリアドレス 等)が記憶されており、Linuxカーネルがプロセスを操作する際は、このtask_stract構造体に対して操作を行います。

【初心者向け】プロセスについて【Linux】
https://qiita.com/uguis410/items/b568b28786516a105f34

プロセススケジューラ
 実行可能状態で待機しているプロセスを、どの順番で実行させるのが最適かを判断するものです。基本的にCPU数以上の数のプロセスを動かすことはできないため、いかに効率よくプロセスを稼働させていくかが重要です。
 プロセススケジューラは、プロセススケジューリング方針に従って実行優先度とタイムスライスを割り振り、スケジュールに従ってプロセスを実行していきます。また、実際にプロセスの切り替えを行う機能をプロセスディスパッチと呼びます。

メモリ管理
 Linuxカーネルでは、物理メモリと仮想メモリを用いてデータを管理しています。プロセス一つ一つに対して、実際に物理メモリのアドレスをそのまま割り当てるのではなく、物理メモリに対応した仮想アドレスを割り当てることで、実際の物理メモリの容量よりもはるかに大きな容量のメモリを利用可能にしています。また、各プロセスに対して固有の仮想アドレスを割り振っているため、それぞれのプロセスのメモリ空間は独立し、他のプロセスのメモリを犯さないようになっています。

ファイルシステム
 保存されているデータに対してのアクセス手段をファイルという形で提供しているものです。全てのデータをファイルと言う形で管理しています。/ディレクトリ(ルートディレクトリ)を頂点としたツリー状の構造をしており、カーネル自体もファイル、ディレクトリの集合体として存在しています。

仮想化全般のお話

今日からはじめるDocker - コンテナー仮想化の必要性を理解して、まず開発環境に導入してみよう!

記事が少しでもいいなと思ったらクラップを送ってみよう!
18
+1
@nokonoko1203の技術ブログ

よく一緒に読まれている記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる

技術ブログをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

技術ブログを開設する

Qrunchでアウトプットをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

Markdownで書ける

ログ機能でアウトプットを加速

デザインのカスタマイズが可能

技術ブログ開設

ここから先はアカウント(ブログ)開設が必要です

英数字4文字以上
.qrunch.io
英数字6文字以上
ログインする