Docker

コンピュータ
コンピュータ

Dockerとはコンテナ型のアプリケーションの実行環境です。

Home
Docker is a platform designed to help developers build, share, and run container applications. We handle the tedious set...

DockerコンテナはDockerイメージから稼働します。
Dockerイメージには、さまざまなアプリケーションやLinux OSが保管されています。

Dockerはミドルウェアのインストールや各種環境設定をコード化して管理できます。
コード化されたファイルを共有することで、どこでも、誰でも同じ環境が作れます。

開発の中で使っていた環境をそのまま本番環境に持っていくことも可能なため、環境の違いによる問題を減らすことができます。

インストール

Windows・MacではDocker Desktopを使用します。
VirtualBox・Vagrantの環境にインストールすることも可能です。

Windows 10 Homeの場合、WSL2の環境があればDocker Desktopを使用することが可能です。

Debian

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

ユーザーを docker グループに追加

sudo usermod -aG docker $USER

Docker Compose

sudo curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

Ubuntu

sudo apt-get -y 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 グループに追加

sudo usermod -aG docker $USER

Docker Compose

sudo curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

イメージ

Docker Hub(Docker公式のレジストリ)にはさまざまなイメージが公開されています。

Docker Hub Container Image Library | App Containerization
Welcome to the world's largest container registry built for developers and open source contributors to find, use, and sh...

DockerのOfficialのイメージと、その他一般ユーザが作った、イメージが上がっています。

イメージの検索

docker search debian

Docker Hubサイトから検索しても大丈夫です。

イメージのダウンロード

docker pull debian:buster

ダウンロードしたイメージの一覧

docker images

debianイメージのサイズは114MB、VagrantのBoxだと400MBくらいになります。

イメージの削除

docker rmi [イメージID]

コンテナ

Debian(buster)のイメージからコンテナを作成・起動してdateコマンドを実行します。

docker run debian:buster /bin/date

イメージを持っていない場合はこの時点でダウンロードします。
1秒程度でコンテナが起動し、コマンド(dateコマンド)実行後、停止します。

コンテナを作成・起動してbashで動かします。

docker run -it debian:buster /bin/bash
> ls
> exit

exitで終了。コンテナ停止。

-dオプションで、バックグラウンドで動きます。

docker run -d -it debian:buster

起動中のコンテナ一覧

docker ps

--nameオプションをつけない場合は、自動的にコンテナに名前がつきます。

起動中のコンテナをbashで動かします。

docker exec -it [コンテナ名] /bin/bash
> exit

exitで終了。コンテナは停止しない。

コンテナの停止

docker stop [コンテナ名]

起動中・停止中のコンテナ一覧

docker ps -a

今まで作ったコンテナが表示されるます。
--nameオプションをつけないとどんどんできる。

コンテナを作るだけであれば容量はほぼ使用しません。

Disk使用量

docker system df

コンテナを削除

docker rm [コンテナ名]

※起動中はrmでは消せません。

名前を付けてコンテナ起動

docker run -d -it --name test_container debian:buster

コンテナ停止

docker stop test_container

コンテナ起動

docker start test_container

構築済みコンテナの例

主要なアプリケーションのイメージはDockerHubオフィシャルとして存在します。
nginx mariadb postgres wordpressなど。

nginx

docker run -d --name nginx_container -p 8000:80 nginx:1.18
  • Nginxイメージを使用 (nginx:1.18)
  • コンテナ起動 (docker run)
  • バックグランド (-d)
  • 名前をnginx_container
  • ポート番号:8000 コンテナ側ポート番号:80 (-p 8080:80)

Nginxが立ち上がっていることを確認できます。
http://<ホスト名>:8000/

ログインして、test.htmlを作成します。

docker exec -it nginx_container /bin/bash
> echo 'test' > /usr/share/nginx/html/test.html
> exit

http://<ホスト名>:8000/test.html

docker stop nginx_container
docker rm nginx_container

コンテナが削除されると中身のデータもなくなります。

WordPress

docker run --name my-mysql -e MYSQL_ROOT_PASSWORD=password -d mysql
docker run --name my-wordpress --link my-mysql:mysql -d -p 9000:80 wordpress

http://<ホスト名>:9000/

wordpressイメージにPHP・Webサーバ(apache or nginx)・WordPressが構築されています。
データベースは構築されていないので別途構築します。

--linkオプションで連携しています。※現在--linkオプションは非推奨

wordpressイメージは、PHPのバージョンやWebサーバなどを選べます。

https://hub.docker.com/_/wordpress

まとめ

このように、素早くアプリケーションが構築できます。
バージョンなども手軽に変更でき、ホストOSにも依存しません。

イメージの作成

DockerHubにはさまざまDockerイメージが配布されています。
当てはまる環境がなければ、Dockerイメージをカスタマイズしたり、新規に作成することで、オリジナルの環境を構築できます。

イメージ作成例

プロジェクト作成

mkdir myimage
cd myimage

Dockerfileで定義。

FROM debian:buster

RUN apt update
RUN apt install apache2 -y

EXPOSE 80

CMD /usr/sbin/apachectl -D FOREGROUND
  • FROM にイメージ元を指定。
  • RUN にイメージ作成時のコマンド。
  • EXPOSE に開けるポートを指定。
  • CMD にコンテナ起動時のコマンド。

Dockerfileを元にイメージの作成。

docker build -t myimage:1.0 .

docker images でイメージが作成できていることを確認。

起動

docker run -d --name myimage_container -p 8001:80 myimage:1.0

http://<ホスト名>:8001/

まとめ

イメージ元はさまざまなイメージを使用できます。
debian ubuntu centos などメジャーなディストリビューションや、軽量な alpine、最小限の環境 busyboxなどのOSイメージがあります。
php ruby などあらかじめ固有のアプリケーションが入ったものでも可能です。
※セキュリティ的にOfficialのイメージを使用したほうが良いでしょう。

コンテナ起動時に-it オプションを指定することにより、コンテナ内で作業を行えるので、Dockerfileを作成する場合は、コンテナ内でコマンドを試しながら作成を行うと良いです。

docker run -it debian:buster-slim /bin/bash

※すべての環境でbashが使えるとは限りません。 /bin/ash /bin/sh

ちなみに、debian:buster-slimは、通常のdebian:busterよりさらに絞り込んで軽量化されています。(70MB弱)

https://hub.docker.com/_/debian

Dockerイメージは軽量化するため余分なコマンドなどは入っていません。
viなどエディタは入っていない場合がほとんどです。

レジストリ

作成したイメージをDocker Hubに登録すれば、誰でもそのイメージを使用できます。
なので、Docker Hubにはさまざまなイメージが存在します。

イメージを保存できる場所をレジストリといい、Docker Hubは、Docker社公式のレジストリになります。
レジストリは個人的に立ち上げることも可能です。その他レジストリサービスも存在します。

イメージを登録しておけば、その他の人に配布することが可能でイメージ作成の手間が省けます。
個人的な使用に関してはDockerfileでその都度イメージを作成する形も可能です。
※イメージを作成するタイミングでイメージの内容が異なる可能性はある。

データの保持

Dockerのコンテナを破棄するとデータも消えてしまいます。
データを保存する場合は、コンテナ外に保存します。

ホスト同期

mkdir ~/html
docker run -d --name nginx_sync -v ~/html:/usr/share/nginx/html -p 8002:80 nginx:1.18
echo 'test' > ~/html/test.html

http://<ホスト名>:8002/test.html

ホストOSとゲストOSのファイルを同期させます。

Data Volume

docker run -d --name nginx_data -v html:/usr/share/nginx/html -p 8003:80 nginx:1.18

-vオプションの先頭のパスがフルパスでない場合、Data Volumeが作成されます。

Data Volume一覧
docker volume ls

VOLUME NAMEがhtmlで作成されます。

実体は以下にあります。

sudo ls -la /var/lib/docker/volumes/

Data Volume Container

データ保存専用のコンテナを作成します。

使用例

FTPサーバ

docker run -d --net host -e FTP_LIST="user1:pass1" -v ~/:/home/user1 kibatic/proftpd

FTPサーバ構築されます。
ftp://user1:pass1@<ホスト名>

コメント

タイトルとURLをコピーしました