そもそも、Dockerって何者なん?
Web界隈だと必須の技術らしいdockerなんだけど、今だ何ができるのかがよくわかってないので整理してみた。linuxが必要ってことなんで、Ubuntu22.02で。
前提
動作確認はUbuntuでやってます。
Abstract
- dockerが何者かが分かります。
- 基本的な使い方が分かります。
Dockerとは
ココ読んで、自分遅れてるって思ったから調べ始めたんだけど、今どきのWebエンジニアだと必須の技術らしい。
DockerはLinuxマシンで使うものらしい
どっかにLinuxが入る。
windows向けにもdockerはあるけど、linuxは入っている。
イメージとコンテナがあるらしい
金型と製品みたいな関係で、金型がイメージ、製品がコンテナみたいな関係かな。
イメージからコンテナを生成して使う。
オブジェクト指向でいうなら
イメージがクラス
コンテナがインスタンス
みたいな感じ。
ライフサイクルがあるらしい
生成→起動→停止→破棄のライフサイクルがあって、サクっと作って、サクっと削除する使い方がいいらしい。
開発環境をばら撒くのに好都合らしい。
環境構築は、最初の一人が頑張って、あとはそれを配布すれば、みんなハッピー。
Dockerインストール
ここまで特徴をつらつらと書き連ねてけども、実際の使い方は、インストールして使う従来のソフトと何も変わらない。
Ubuntu22.02へのインストール
ここ見てね。
Docker Engineの起動と終了
Dockerを動かす=Docker Engineを動かすことで、下記手順で操作する。
$ sudo systemctl start 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 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起動
$ 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起動
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.起動確認
$ 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を停止
$ docker stop aaaaawp aaaaamysql
$ docker rm aaaaawp aaaaamysql
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6.WordPressとMySQLを破棄
$ docker rmi wordpress:latest mysql:latest
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
後片付けまで完了!!
7.(Appendix)アタッチについて
wordpressとmysqlは、アタッチを想定してないようだけど、ubuntuなどは、アタッチするとshellコマンドで操作できるようになる。
以下、アタッチの例。
$ 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
$ 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起動
$ 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にアタッチ
$ 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 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 11月 19 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 11月 19 15:24 aaaaa.txt
-rw-rw-r-- 1 jun jun 11 11月 19 15:50 zzzzz.txt
# cat /home/aaa/zzzzz.txt
zzzzzyyyyy
/home/aaa/zzzzz.txtファイルを作成。中身は、"zzzzzyyyyy"。
準備完了!!
1.2.2.ファイルコピー(コンテナ -> ホスト)
$ 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