zatsu na benkyou matome saito

勉強したことをまとめるだけのサイト、数学、プログラミング、機械学習とか

docker/CH1: Docker imagesとVolumeについて

Docker

このページではdockerのimageとvolumeについて捜査を交えながら説明します。 local環境で行うのですが、ローカル環境でdockerを使えるようにしておく必要があります。 もしまだインストールしていなかったら、「docker インストール mac」とかぐぐると色々やり方が出てくるともいます。

(base) y.nakata@MacBook-Pro-4 website % docker -v
Docker version 19.03.13, build 4484c46d9d

### Docker vs VM スクリーンショット 2020-11-21 15.39.36.png (226.9 kB)

Docker benefits

  • コンテナの起動が早い
  • 少ない容量で構築できるので無駄にサーバーのスペースを占有しない
  • モリーの使用率が低い
  • OS全てを使わないので、複数の環境を構築可能

Images

コンテナ操作

nginxのimageをpullする

(base) y.nakata@MacBook-Pro-4 docker_tutorial % docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
852e50cd189d: Pull complete 
a29b129f4109: Pull complete 
b3ddf1fa5595: Pull complete 
c5df295936d3: Pull complete 
232bf38931fc: Pull complete 
Digest: sha256:c3a1592d2b6d275bef4087573355827b200b00ffc2d9849890a4f3aa2128c4ae
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

Dockerのコンテナを立てる前にどのようなコンテナの中身にするかの設計が書かれているimageをdcoker hubよりダウンロードしてくる。

Docker Hub 色々なアプリケーションのimageがあるので使いたいものをpullして、対象のアプリケーションコンテナを構築することでそのアプリケーションが使えるようになる。

pullしてきたimageを確認する

(base) y.nakata@MacBook-Pro-4 docker_tutorial % docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              daee903b4e43        2 days ago          133MB

コンテナを建てる

(base) y.nakata@MacBook-Pro-4 docker_tutorial % docker run nginx:latest
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Configuration complete; ready for start up

コンテナを確認

(base) y.nakata@MacBook-Pro-4 docker_tutorial % docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
db548a38af4d        nginx:latest        "/docker-entrypoint.…"   49 seconds ago      Up 48 seconds       80/tcp              silly_lewin

Portを開く

(base) y.nakata@MacBook-Pro-4 docker_tutorial % docker run -d -p 8080:80 nginx:latest
22cf87a188980192a7771371c1c174202dbd3b530d98580a534f705541c4a71e

というコマンドを打つことで、localhostの8080ポートとコンテナの80ポートを接続できるようにしている。

この後にウェブブラウザでlocalhost:8080に接続するとコンテナのnginxに接続することができる。 スクリーンショット 2020-11-21 17.09.27.png (760.0 kB)

もちろん、8080以外も接続できるので、

(base) y.nakata@MacBook-Pro-4 docker_tutorial % docker run -d -p 3000:80 nginx:latest
22cf87a188980192a7771371c1c174202dbd3b530d98580a534f705541c4a71e

というコマンドでもOK

Volumesについて

スクリーンショット 2020-11-21 17.19.28.png (133.6 kB)

コンテナとホスト(ローカルPC)間のデータの共有を可能にするために使用する スクリーンショット 2020-11-21 17.21.01.png (161.5 kB)

nginx (docker hub): https://hub.docker.com/_/nginx

共有しているvolumeでhtmlファイルを表示させる

スクリーンショット 2020-11-21 17.40.48.png (192.9 kB)

(base) y.nakata@MacBook-Pro-4 docker_tutorial % docker run --name website -d -p 8080:80 nginx    
b86b995e912390fda2885ef65c89316d3ec4d80fb1cc1642a195351e16c8f7eb

imageの時と同様にlocalhostの8080とdockerコンテナの80ポートを接続する.

その後、websitelocalhost:8080に接続できるかを確認する。 スクリーンショット 2020-11-21 17.43.38.png (759.9 kB)

docker stopで一旦コンテナを止める

(base) y.nakata@MacBook-Pro-4 docker_tutorial % docker stop website 
website

Desktopに~/Desktop/website/index.htmlというhtmlファイルを作成する 中身は適当。

<h1> hello docker html </h1>
(base) y.nakata@MacBook-Pro-4 website % docker run --name website -v $(pwd):/usr/share/nginx/html:ro -d -p 8080:80 nginx

というコマンドで、-vでvolumをどこにマウントするかを指定して、pwdwebsiteであることを教えてあげる。

多分これでも良い。

(base) y.nakata@MacBook-Pro-4 website % docker run --name website -v ~/Desktop/website/index.html:/usr/share/nginx/html:ro -d -p 8080:80 nginx

この、/usr/share/nginx/html:roというのはdocker hubのnginxの公式READMEに書いてある。 (https://hub.docker.com/_/nginx ここの、Hosting some simple static contentというタイトルのところ)

:roというのはread onlyでファイルを共有する(マウントする)というのを指定している。 ・そのため、コンテナ内でtouchコマンドを使うことができない。 ・:roを外すと、read onlyでない状態でコンテナを起動できる。

表示する

コンテナを起動

(base) y.nakata@MacBook-Pro-4 website % docker run --name website -v $(pwd):/usr/share/nginx/html:ro -d -p 8080:80 nginx
1f6aab1df9e5566a817629ee9b7da93f00b4231772b6ece5d65e2599a4b26c06

すると、このようにhtmlファイルが表示される

スクリーンショット 2020-11-21 17.50.44.png (707.2 kB)

dockerコンテナを起動したまま、変更を加えても変更が反映されるようになる。 スクリーンショット 2020-11-21 17.51.29.png (712.1 kB)

dockerのコンテナ中で作業する

(base) y.nakata@MacBook-Pro-4 website % docker exec -it website bash
root@1f6aab1df9e5:/# ls
bin  boot  dev  docker-entrypoint.d  docker-entrypoint.sh  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@1f6aab1df9e5:/# ls -al
total 88
drwxr-xr-x   1 root root 4096 Nov 21 08:50 .
drwxr-xr-x   1 root root 4096 Nov 21 08:50 ..
-rwxr-xr-x   1 root root    0 Nov 21 08:50 .dockerenv
drwxr-xr-x   2 root root 4096 Nov 17 00:00 bin
drwxr-xr-x   2 root root 4096 Sep 19 21:39 boot
drwxr-xr-x   5 root root  340 Nov 21 08:50 dev
drwxr-xr-x   1 root root 4096 Nov 18 07:48 docker-entrypoint.d
-rwxrwxr-x   1 root root 1202 Nov 18 07:47 docker-entrypoint.sh
drwxr-xr-x   1 root root 4096 Nov 21 08:50 etc
drwxr-xr-x   2 root root 4096 Sep 19 21:39 home
drwxr-xr-x   1 root root 4096 Nov 18 07:48 lib
drwxr-xr-x   2 root root 4096 Nov 17 00:00 lib64
drwxr-xr-x   2 root root 4096 Nov 17 00:00 media
drwxr-xr-x   2 root root 4096 Nov 17 00:00 mnt
drwxr-xr-x   2 root root 4096 Nov 17 00:00 opt
dr-xr-xr-x 130 root root    0 Nov 21 08:50 proc
drwx------   2 root root 4096 Nov 17 00:00 root
drwxr-xr-x   1 root root 4096 Nov 21 08:50 run
drwxr-xr-x   2 root root 4096 Nov 17 00:00 sbin
drwxr-xr-x   2 root root 4096 Nov 17 00:00 srv
dr-xr-xr-x  13 root root    0 Nov 21 08:50 sys
drwxrwxrwt   1 root root 4096 Nov 18 07:48 tmp
drwxr-xr-x   1 root root 4096 Nov 17 00:00 usr
drwxr-xr-x   1 root root 4096 Nov 17 00:00 var

bootstrap のページを表示する

Bootstrap One Page Templates https://bootstrapmade.com/bootstrap-one-page-templates/

このサイトから好きなものを選んで、ソースをダウンロードしてくる。 今回はこれ。 スクリーンショット 2020-11-21 19.17.15.png (826.7 kB)

ファイル: Lonely.zip (4.2 MB)

website配下に中身をコピーする。

(base) y.nakata@MacBook-Pro-4 website % ls
Readme.txt      assets          changelog.txt       forms           index.html      inner-page.html     portfolio-details.html
(base) y.nakata@MacBook-Pro-4 website % pwd
/Users/y.nakata/Desktop/website

すると、index.htmlを表示するはず。。。

(base) y.nakata@MacBook-Pro-4 website % docker run --name website -v $(pwd):/usr/share/nginx/html:ro -d -p 8080:80 nginx
63af065d9ce329df04a2fbc0df8f61de393bca7bfcea666a4a7bf36de268aeef

見事ページが表示されました! スクリーンショット 2020-11-21 19.21.43.png (5.1 MB)