Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Dockerとは

yasu
July 10, 2019

 Dockerとは

Cloud Native Sendai #03 の資料です。

yasu

July 10, 2019
Tweet

More Decks by yasu

Other Decks in Technology

Transcript

  1. 無償版
 CentOS7.6 でのインストール例
 
 
 
 
 Docker CE(Community Edition)

    # yum install yum-utils device-mapper-persistent-data lvm2 # yum-config-manager --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo # yum install docker-ce
  2. 方法が複数あってややこしい。特に見かける2つを。
 
 ・Docker for Windows
 Windows 10 Professional または Enterprise

    64-bit
 で動作する。
 ・Docker Toolbox
 古いWindows環境で動作する。
 Virtual Boxを使うらしい。
 Dockerの種類(Windows)
  3. 論理的にリソースを隔離する仕組み。
 名前空間の異なる対象にアクセス出来なくする。
 
 
 namespace(名前空間) 名称 隔離対象 IPC名前空間 メモリ マウント名前空間

    ファイルシステム ネットワーク名前空間 ネットワークデバイスや IPアドレス等 PID名前空間 PID ユーザー名前空間 UID・GID UTS名前空間 ホスト名とNISドメイン名
  4. 「3008」はPID。
 要管理者権限。
 
 
 namespace(名前空間) # ls -l /proc/3008/ns/ 合計

    0 lrwxrwxrwx. 1 root root 0 7月 7 16:59 ipc -> ipc:[4026531839] lrwxrwxrwx. 1 root root 0 7月 7 16:59 mnt -> mnt:[4026531840] lrwxrwxrwx. 1 root root 0 7月 7 16:59 net -> net:[4026531956] lrwxrwxrwx. 1 root root 0 7月 7 16:59 pid -> pid:[4026531836] lrwxrwxrwx. 1 root root 0 7月 7 16:59 user -> user:[4026531837] lrwxrwxrwx. 1 root root 0 7月 7 16:59 uts -> uts:[4026531838]
  5. 用語 レジストリ リポジトリを管理しているサービス リポジトリ イメージを多数保持している管理単位 公式リポジトリ OSやパッケージの管理団体が出している公式なリポジトリ イメージ ルート・ファイルシステムに対する変更を1つのパッケージにしたもの。 Docker

    Hub などからダウンロードする。 イメージ名 基本は「リポジトリ名 :タグ名」を繋げたもの コンテナ イメージをDocker Engine上で起動したもの Dockerホスト Dockerデーモンが稼働しているサーバ Dockerデーモン イメージとコンテナを管理する Docker Engine Dockerデーモンのこと。厳密にはデーモン中のエンジン部分か?
  6. 用語(具体的に) レジストリ Docker Hub リポジトリ 例えば、Apacheリポジトリ リポジトリの中では、イメージの違いをタグでラベル付けする 公式リポジトリ CentOS公式リポジトリや、Apache公式リポジトリなど イメージ

    docker image pull コマンドでダウンロードするもの docker image ls コマンドで一覧を表示できる イメージ名 CentOS公式リポジトリ上のイメージ名 centos:latest、centos:7 Apache公式リポジトリ上のイメージ名 httpd:2.4 コンテナ docker container ls コマンドで一覧を表示できる Dockerデーモン dockerd
  7. コンテナの生存期間はサービス期間中のみ
 
 サービス開始 : イメージからコンテナを起動
 サービス停止 : コンテナを停止 = コンテナの削除


    
 コンテナの停止時に削除されるように、
 「--rm」オプションがある。
 
 コンテナのライフサイクル
  8. コマンド docker image pull イメージ名 イメージをダウンロードする docker image build イメージ名

    . Dockerfileを元にイメージを作成する docker image ls イメージの一覧を表示する docker image rm イメージ名 or イメージID イメージを削除する。対象イメージから起動したコンテナ が存在する場合は削除できない docker container run イメージ名 or イメージID コマンド イメージからコンテナを起動する docker container start コンテナ 名 or コンテナID 停止したコンテナを起動する usage : docker 操作対象 サブコマンド オプション

  9. コマンド docker container exec コンテナ名 or コンテナID コマンド コンテナに追加のプロセスを実行させる docker

    container stop コンテナ名 or コンテナID コンテナを停止する docker container ls コンテナの一覧を表示する 「-a」をつけると停止コンテナも表示する docker container rm コンテナ名 or コンテナID コンテナを削除する 起動しているコンテナは削除できない
  10. コマンド(具体的に) $ docker image pull centos:latest centos:latest イメージをダウンロードする $ docker

    image build -t centos:httpd . Dockerfileの記述に従ってイメージを作成する Dockerfileは、カレントディレクトリにある 作成元のイメージは、Dockerfileで指定する $ docker image rm centos:latest 指定したイメージを削除する
  11. コマンド(具体的に) $ docker container run --name=centos7 centos:latest centos:latestイメージ からコンテナを起動する コンテナ名をcentos7にする

    $ docker container exec --rm -it centos7 /bin/bash 指定したコンテナでbashプロセスを新しく起動する --rm がついているので、コンテナが停止すると削除される $ docker container stop centos7 指定したコンテナを停止する
  12. コマンド(具体的に) $ docker container ls コンテナの一覧を表示する $ docker container ls

    -a 停止したコンテナも含め一覧を表示する $ docker container rm centos7 指定したコンテナを削除する $ docker container rm $(docker container ls -aq) 停止したコンテナを全て停止する 起動しているコンテナはエラーになり停止できない 使用時は要注意!!
  13. コマンド(もっと具体的に) $ docker container run --rm \ --name=nginx \ --log-driver=journald

    \ -d \ -p 8080:80 \ -v /opt/nginx:/usr/share/nginx/html \ nginx $ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1a95aad91ed7 nginx "nginx -g 'daemon of…" 4 seconds ago Up 4 seconds 0.0.0.0:8080->80/tcp nginx
  14. よく使われる(であろう)オプション
 docker run のオプション -p ホストのポートをコンテナにマッピングする 記述順は、ホストのポート :コンテナのポート -v ホストのディレクトリをコンテナにマウントする

    記述順は、ホストのディレクトリ :コンテナのディレクトリ -e 環境変数をコンテナに渡す -i ホスト側の入力をコンテナに送る -t コンテナの出力をホスト側に出力する
  15. 起動中のコンテナに接続したい。
 
 コンテナに新しいプロセス(/bin/bash)を起動して、
 標準入出力をホストにつなぐ。
 docker container exec -it container01 /bin/bash


    
 
 
 この方法だと、exitで抜けてもコンテナは停止しない。
 起動中のコンテナ $ docker container exec -it container01 /bin/bash
  16. ファイル名を、「Dockerfile」として保存する。
 
 
 
 
 このDockerfileをビルドするコマンド
 Dockerfile(具体的に) FROM nginx
 COPY

    index.html /usr/share/nginx/html/index.html
 CMD ["nginx", "-g", "daemon off;"]
 $ docker image build . -t nginx_mybuild

  17. ビルドしたイメージを確認する
 
 
 
 
 ビルドしたイメージを実行する
 
 
 ブラウザで、ポート8080へアクセスして接続確認。
 Dockerfile(具体的に)

    $ docker image ls | grep build
 niginx_mybuild latest a7ad137979c7 10 seconds ago 109MB
 
 $ docker container run -d -p 8080:80 nginx_mybuild

  18. Dockerデーモンの再起動がイヤ!!な場合。
 
 1. Firewalldの停止
 ※あくまでもテスト環境の場合
 
 2. iptablesに入れ替える
 
 


    
 ※試してはいないので、自己責任でお願いします。
 DockerとFirewalld 対策編 # systemctl stop firewalld
 # yum erase firewalld
 # yum install iptables

  19. コンテナのhello-world
 
 一番簡単なコンテナ $ docker run hello-world
 Unable to find

    image 'hello-world:latest' locally
 latest: Pulling from library/hello-world
 d1725b59e92d: Pull complete
 Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde47097 1e499788
 Status: Downloaded newer image for hello-world:latest
 Hello from Docker!
 This message shows that your installation appears to be 

  20. コンテナのhello-world
 
 一番簡単なコンテナ working correctly.
 To generate this message, Docker

    took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 (amd64)
 3. The Docker daemon created a new container from that image which runs the
 executable that produces the output you are currently reading.
 

  21. コンテナのhello-world
 
 一番簡単なコンテナ 4. The Docker daemon streamed that output

    to the Docker client, which sent it
 to your terminal.
 To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash
 Share images, automate workflows, and more with a free Docker ID:
 For more examples and ideas, visit:
 https://hub.docker.com/
 https://docs.docker.com/get-started/