🙆

そもそも、Dockerって何者なん?

2023/11/19に公開

Web界隈だと必須の技術らしいdockerなんだけど、今だ何ができるのかがよくわかってないので整理してみた。linuxが必要ってことなんで、Ubuntu22.02で。

前提

動作確認はUbuntuでやってます。

Abstract

  • dockerが何者かが分かります。
  • 基本的な使い方が分かります。

Dockerとは

ココ読んで、自分遅れてるって思ったから調べ始めたんだけど、今どきのWebエンジニアだと必須の技術らしい。

DockerはLinuxマシンで使うものらしい

どっかにLinuxが入る。
windows向けにもdockerはあるけど、linuxは入っている。

イメージとコンテナがあるらしい

金型と製品みたいな関係で、金型がイメージ、製品がコンテナみたいな関係かな。

イメージからコンテナを生成して使う。
オブジェクト指向でいうなら
イメージがクラス
コンテナがインスタンス
みたいな感じ。

ライフサイクルがあるらしい


生成→起動→停止→破棄のライフサイクルがあって、サクっと作って、サクっと削除する使い方がいいらしい。

開発環境をばら撒くのに好都合らしい。


環境構築は、最初の一人が頑張って、あとはそれを配布すれば、みんなハッピー。

Dockerインストール

ここまで特徴をつらつらと書き連ねてけども、実際の使い方は、インストールして使う従来のソフトと何も変わらない。

Ubuntu22.02へのインストール

ここ見てね。

Docker Engineの起動と終了

Dockerを動かす=Docker Engineを動かすことで、下記手順で操作する。

docker起動
$ sudo systemctl start docker
docker停止
$ sudo systemctl stop docker
自動起動の設定
$ sudo systemctl enable docker

Dockerのライフサイクル


こんな感じで使うらしい。

  • docker run ... 生成と起動
  • docker stop ... 停止
  • docker rm ... コンテナ破棄
  • docker rmi ... イメージ破棄

  • docker ps -a ... コンテナ状態を見る
  • docker images ... イメージの状態を見る

Docker生成→起動→停止→破棄の具体例(WordPressとMySQLを連携させて起動する)

WordPressとMySQLのコンテナを動かすときの具体例

1.dockerネットワーク生成

WordPressはMySQLと連携して動かす必要があって、その連携のために、dockerネットワークって機能を使う必要がある。

先にdockerネットワークを生成する(名前はaaanet)。
$ docker network create aaanet
無事できた!!
$ docker network ls

NETWORK ID     NAME      DRIVER    SCOPE
dfa7c8f3fcd4   aaanet    bridge    local  ← これが生成したもの。OK。
ccf4e56ab5f1   bridge    bridge    local
3e7f2d2a5045   host      host      local
c6a5bd7d2df8   none      null      local

2.MySQL起動

名前はaaaaamysql。
$ docker run --name aaaaamysql -dit --net=aaanet            -e MYSQL_ROOT_PASSWORD=aaaaapass -e MYSQL_DATABASE=aaaaadb    -e MYSQL_USER=aaaaauser        -e MYSQL_PASSWAORD=aaaaapass2 mysql  --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password

Unable to find image 'mysql:latest' locally
latest: Pulling from library/mysql
8e0176adc18c: Pull complete 
2d2c52718f65: Pull complete 
d88d03ce139b: Pull complete 
4a7d7f11aa1e: Pull complete 
ce5949193e4c: Pull complete 
f7f024dfb329: Pull complete 
5fc3c840facc: Pull complete 
509068e49488: Pull complete 
cbc847bab598: Pull complete 
942bef62a146: Pull complete 
Digest: sha256:1773f3c7aa9522f0014d0ad2bbdaf597ea3b1643c64c8ccc2123c64afd8b82b1
Status: Downloaded newer image for mysql:latest
587176e4a4a0604d39432b9bb31636e459420c5b4d71caa38b79a300bbfcd47f
--name aaaaamysql コンテナ名。適当で。docker psコマンドでNAMESに表示される。
-dit 常駐で起動した時にキーボードから操作するためのオプション。※-dはデタッチモード。
--net=aaanet dockerネットワーク名。docker network createで作った名前と同じにする。
-e MYSQL_USER=aaaaauser -eは環境変数を設定するオプション。mysqlが必要とするらしい。
-e MYSQL_ROOT_PASSWORD=aaaaapass 上記同様。
-e MYSQL_DATABASE=aaaaadb 上記同様。
-e MYSQL_PASSWAORD=aaaaapass2 上記同様。
mysql イメージ名。DockerHubにはこの名前で登録されている。
--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password mysqlを起動するときの引数。

3.WordPress起動

名前はaaaaawp。
docker run --name aaaaawp    -dit --net=aaanet -p 8085:80 -e WORDPRESS_DB_HOST=aaaaamysql  -e WORDPRESS_DB_NAME=aaaaadb -e WORDPRESS_DB_USER=aaaaauser -e WORDPRESS_DB_PASSWAORD=aaaaapass2 wordpress

Unable to find image 'wordpress:latest' locally
latest: Pulling from library/wordpress
0bc8ff246cb8: Pull complete 
6450c8e22862: Pull complete 
67202b5712dc: Pull complete 
296e480d34df: Pull complete 
2eda4d478e98: Pull complete 
ef28c0608bd5: Pull complete 
41e60e5acc0c: Pull complete 
52a466685717: Pull complete 
035408df74c4: Pull complete 
59874af597ed: Pull complete 
8bec4d11c750: Pull complete 
d977868bfb2d: Pull complete 
0261d3a57bb7: Pull complete 
14b986fa4fae: Pull complete 
b06710174a63: Pull complete 
08b7a85690d7: Pull complete 
03f6e9715a42: Pull complete 
1d9c12479402: Pull complete 
b0ab1c53358f: Pull complete 
8d8b1ee2016e: Pull complete 
9c9c3cabaadb: Pull complete 
Digest: sha256:bb47f8d43fc2e8ce0aa3f2121c6a82a1a8020286e6cddbfe62eb34ee07fc1b6d
Status: Downloaded newer image for wordpress:latest
49cc1b42248b0231deb471be89fa93d8ba49fcd54aec031bbfe5546793a5efce
--name aaaaawp コンテナ名。適当で。docker psコマンドでNAMESに表示される。
-dit 常駐で起動した時にキーボードから操作するためのオプション。※-dはデタッチモード。
--net=aaanet dockerネットワーク名。docker network createで作った名前と同じにする。
-p 8085:80 ポート番号指定。ホスト(windows)で8085で受けて、ゲスト(ubuntu)には80に渡す。
-e WORDPRESS_DB_HOST=aaaaamysql -eは環境変数を設定するオプション。wordpressが必要とするらしい。mysql側のコンテナ名と合わせる。
-e WORDPRESS_DB_NAME=aaaaadb 上記同様。mysql側のMYSQL_DATABASEと合わせる。
-e WORDPRESS_DB_USER=aaaaauser 上記同様。mysql側のMYSQL_USERと合わせる。
-e WORDPRESS_DB_PASSWAORD=aaaaapass2 上記同様。mysql側のMYSQL_PASSWAORDと合わせる。

4.起動確認

aaaaawpとaaaaamysqlが起動OK.
$ docker ps -a

CONTAINER ID   IMAGE       COMMAND                   CREATED         STATUS         PORTS                                   NAMES
49cc1b42248b   wordpress   "docker-entrypoint.s…"   2 minutes ago   Up 2 minutes   0.0.0.0:8085->80/tcp, :::8085->80/tcp   aaaaawp
587176e4a4a0   mysql       "docker-entrypoint.s…"   4 minutes ago   Up 4 minutes   3306/tcp, 33060/tcp                     aaaaamysql

出来た!!

5.WordPressとMySQLを停止

aaaaawpとaaaaamysqlが起動OK.
$ docker stop aaaaawp aaaaamysql
$ docker rm aaaaawp aaaaamysql 
停止を確認.
$ docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

6.WordPressとMySQLを破棄

wordpressとmysqlを破棄.
$ docker rmi wordpress:latest mysql:latest
破棄を確認.
$ docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

後片付けまで完了!!

7.(Appendix)アタッチについて

wordpressとmysqlは、アタッチを想定してないようだけど、ubuntuなどは、アタッチするとshellコマンドで操作できるようになる。
以下、アタッチの例。

ubuntu起動.
$ docker run -dit ubuntu 
確認.コンテナ名
$ docker ps 

CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS         PORTS     NAMES
93dcd0eca92b   ubuntu    "/bin/bash"   10 seconds ago   Up 7 seconds             tender_franklin
起動したubuntuにアタッチ-> lsコマンド.
$ docker attach tender_franklin 
root@93dcd0eca92b:/# ls -l
total 48
lrwxrwxrwx   1 root root    7 Oct  4 02:08 bin -> usr/bin
drwxr-xr-x   2 root root 4096 Apr 18  2022 boot
drwxr-xr-x   5 root root  360 Nov 19 05:45 dev
drwxr-xr-x   1 root root 4096 Nov 19 05:45 etc

出来た!!


Appendix1.コンテナとホスト間でファイルをコピーする。

1.1.ファイルコピー(コンテナ -> ホスト)

1.1.1 準備

1.1.1.1. ubuntu起動

ubuntu起動.
$ docker run -dit --name aaaubt ubuntu
起動確認.
$ docker ps -a

CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
63b80f523a33   ubuntu    "/bin/bash"   26 seconds ago   Up 23 seconds             aaaubt

aaaubtで起動できた!!

1.1.1.2. ubuntuにアタッチ

ubuntu起動.
$ docker attach aaaubt

1.1.1.3. ファイルを準備

ファイル作成.
# cd /usr/local/
# mkdir aaaaa && cd aaaaa
# echo abcde-aaaaa >> aaaaa.txt
# cat aaaaa.txt 
abcde-aaaaa
# exit

準備完了。コンテナ名:aaaubtの/usr/local/aaaaa/aaaaa.txtに、文字列"abcde-aaaaa"が書き込まれた。

コピー先(ホスト側)を準備.
$ pwd
/home/aaa

ホスト(ubuntu)に、/home/aaaフォルダを準備した。

1.1.2 ファイルコピー(コンテナ -> ホスト)

ファイルなしを確認.
$ ls -l /home/aaa/
合計 0
dockerコピーを実行.
$ docker cp aaaubt:/usr/local/aaaaa/aaaaa.txt /home/aaa
Successfully copied 2.05kB to /home/aaa

1.1.3 コピー(コンテナ -> ホスト)ができた事を確認

ファイルがあることを確認.
$ ls -l /home/aaa/
合計 4
-rw-r--r-- 1 jun jun 12 1119 15:24 aaaaa.txt
ファイルの中身も確認.
$ cat /home/aaa/aaaaa.txt 
abcde-aaaaa

出来た!!
期待通り、"abcde-aaaaa"が表示されている。

(次は反対方向)1.2.ファイルコピー(コンテナ <- ホスト)

1.2.1 ホストにファイルを準備

ファイルの中身も確認.
# echo zzzzzyyyyy >> /home/aaa/zzzzz.txt
# ls -l
合計 8
-rw-r--r-- 1 jun jun 12 1119 15:24 aaaaa.txt
-rw-rw-r-- 1 jun jun 11 1119 15:50 zzzzz.txt
# cat /home/aaa/zzzzz.txt 
zzzzzyyyyy

/home/aaa/zzzzz.txtファイルを作成。中身は、"zzzzzyyyyy"。
準備完了!!

1.2.2.ファイルコピー(コンテナ -> ホスト)

dockerコピーを実行.
$ docker cp /home/aaa/zzzzz.txt aaaubt:/usr/local/aaaaa/
Successfully copied 2.05kB to aaaubt:/usr/local/aaaaa/

1.2.3.コピー(コンテナ -> ホスト)の確認

ファイルの存在確認.
$ docker attach aaaubt
# ls -l /usr/local/aaaaa/
total 8
-rw-r--r-- 1 root root 12 Nov 19 06:24 aaaaa.txt
-rw-rw-r-- 1 1000 1000 11 Nov 19 06:50 zzzzz.txt
# cat /usr/local/aaaaa/zzzzz.txt 
zzzzzyyyyy

出来た!!
期待通り、"zzzzzyyyyy"が表示されている。

Discussion