トップ 一覧 置換 検索 ヘルプ RSS ログイン

Dockerの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!参考
https://qiita.com/curseoff/items/a9e64ad01d673abb6866
http://www.atmarkit.co.jp/ait/articles/1407/08/news031.html

!!!インストール
!!CentOS7
!yum でインストール
 yum install docker

!グループ作成
 groupadd docker
 gpasswd -a user docker
dockerrootグループが自動で作成されるが、dockerグループは作成されない。
dockerグループがないと、
 /var/run/docker.sock
のグループがrootになるのでroot以外のユーザがdockerコマンドを実行できない。

!サービス
 $ sudo systemctl start docker
 $ sudo systemctl enable docker

!proxy を使う場合
systemdの起動ファイルで環境変数を定義する
 # cp /usr/lib/systemd/system/docker.service /etc/systemd/system/

docker.service
 Environment="HTTP_PROXY=http://user:pwd@proxy.example.com:8080"

サービス再起動
 # systemctl daemon-reload
 # systemctl restart docker

!!!使い方
!!イメージ管理
!イメージの検索
 docker search ubuntu
!イメージ取得
 docker pull centos
!ローカルイメージ一覧
 docker images
 docker image list
!イメージのCMDを確認する
 docker inspect imageID
のCMDの行。
 docker inspect imageID | grep CMD
でも良い。
!!コンテナ管理
!コンテナ起動
bash起動
 docker run -it centos:7 /bin/bash
バックグラウンド起動
 docker run -itd centos:7 /bin/bash
!プロセスを終了せずにコンテナから抜ける
 ctrl+p, ctrl+q
!コンテナ確認
起動中のコンテナ
 docker ps
全てのコンテナ
 docker ps -a
起動中のコンテナの端末取得
 docker attach コンテナIDまたは、コンテナ名
 docker attach TEST
!コンテナ削除
 docker rm コンテナIDまたは、コンテナ名
全て削除する場合は
 docker rm $(docker ps -aq)


!!ネットワーク関連
!ネットワークの種類
 docker network ls
!ネットワーク指定
 docker run -it --net=host centos:6 /bin/bash
docker network ls の NAMEを --net=xxx に指定する。
ネットワークなし、ブリッジ、ホストのネットワークを共有などが選択できる。
!ネットワーク(ポート転送)
 docker run -it -p 8080:80 centos:6 /bin/bash

!!ボリューム関連
!ホストとコンテナのマッピング
 docker run -it -v /var/www:/var/www centos:6 /bin/bash
 docker run -it -v /var/www:/var/www:Z centos:6 /bin/bash
:Z は SELinuxが有効な場合に適切なラベルを付与する
docker -v のuid,gidは読書したOSのユーザのuid,gidを使う。
そのため、ホストとコンテナでuid,gidを合わせたほうが無難。
いっそ、ユーザのマッピングをしたい場合はsshをマウントするほうが手っ取り早いかも

!!コンテナからイメージ作成
 docker commit コンテナID リポジトリ名:タグ
 docker commit コンテナID test:1

!!コンテナのエクスポート、インポート
!エクスポート
 docker export コンテナIDまたはコンテナ名 > mycontainer.tar
!インポート
 cat filename.tar | docker import - REPOSITORY[:TAG]

!!イメージのセーブ、ロード
!セーブ
 docker save IMAGE > filename.tar
!ロード
 docker load < filename.tar

!!コンテナ内のsystemd環境でサービスを起動する
コンテナ内のsystemd環境でサービスを起動しようとするとエラーになることがある
 docker run --privileged --name centos -d centos /sbin/init
でコンテナを起動して、
 docker exec -ti centos bash
で、起動したコンテナでbashを起動する。

!!vim等が文字化けする場合
 export LANG=en_US.UTF-8
または、
 localedef -f UTF-8 -i ja_JP ja_JP
 export LANG=ja_JP.UTF-8
!debian系の場合
 apt install language-pack-ja-base language-pack-ja
vim ~/.bashrc
 export LANG=ja_JP.UTF-8
 

!!Dockerfileからbuildする
 docker build
プロキシを使う場合は
  docker build --build-arg HTTP_PROXY=http://10.20.30.2:1234 .

!!!コンテナとホストのユーザマッピング
!!参考
https://docs.docker.com/engine/security/userns-remap
https://stackoverrun.com/ja/q/9729190
https://unskilled.site/%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E5%90%8D%E5%89%8D%E7%A9%BA%E9%96%93%E3%81%A7docker%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AEroot%E3%81%A8%E3%83%9B%E3%82%B9%E3%83%88%E3%81%AE%E3%83%A6%E3%83%BC/

!!注意
kernelがuser namespaceに対応している必要がある。

!!subuid、subgidの編集
コンテナのuidとホストのuidのマッピングを定義する。
コンテナの0(root)とホストの1000番以降65536までマッピングする。
,ホスト,ゲスト
,1000, 0
,1001, 1
,...,...
,66536, 65536
/etc/subuid
 user1:1000:65536
/etc/subgid
 user1:1000:65536

!!dockerの起動オプションを変更
2つ方法がある。どちらでもいい。
!方法1 daemon.jsonを編集
/etc/docker/daemon.json
 {
   "userns-remap": "user1"
 }
!方法2 /etc/sysconfig/docker を編集
/etc/sysconfig/docker
OPTIONSに
 --userns-remap=user1:user1
を追加。

!!確認
dockerサービスを再起動すると
 /var/lib/docker
に
 1000.1000
等のuid.gidのディレクトリができる。

!!!Dockerfile
コンテナ作成、実行を自動化できる。
例えば、php用のapacheサーバを立てるときは以下のようにする。
Dockerfile
  From php:7.1-apache-stretch
  
  RUN echo "RUNはbuild時に実行"
  RUN apt update
  RUN a2enmod rewrite
  RUN docker-php-ext-install pdo_mysql
  
  CMD echo "CMDはrun時に実行(一つだけ。複数ある場合は最後のものだけが実行される。"
イメージ作成
 docker build -t test.tag -f Dockerfile .
設定ファイル名がDockerfileの場合は、省略可。
コンテナ実行
 docker run --rm -it test.tag /bin/bash
実行時に引数が無ければimageのCMDが実行される。
imageのCMDを確認したいときは
 docker insepect imageID
の
 CMD
の行で確認できる。

!!!Docker Compose
複数のコンテナを作成、起動ができる。
例えば、cakephpの環境を作成したいときに、webサーバ、DBサーバ(mysql)、DB管理用(phpMyAdmin)をまとめて作成、起動ができる。
!!サンプル1
webサーバとmysql、phpmyadminを作成
!docker-compose.yml
  version: '3'
  services:
    web:
      build:
        context: .
        dockerfile: ./docker/web/Dockerfile
      # user: "1000:1000"
      # tty: true
      # 最後の:zはselinuxのラベル書き換え
      volumes:
        - ./src:/var/www/html:z
      ports:
        - 80:80
      depends_on:
        - mysql
    mysql:
      image: mysql:5.7
      environment:
        - MYSQL_ROOT_PASSWORD=root
      ports:
        - 3306:3306
      volumes:
        - dbdata:/var/lib/mysql
    phpmyadmin:
      image: phpmyadmin/phpmyadmin
      environment:
        - PMA_ARBITRARY=1
        - PMA_HOST=mysql
        - PMA_USER=root
        - PMA_PASSWORD=root
      depends_on:
        - mysql
      ports:
         - 81:80
  volumes:
    dbdata:
!./docker/web/Dockerfile
  From php:7.1-apache-stretch
  
  RUN echo "RUNはbuild時に実行"
  RUN apt update
  RUN a2enmod rewrite
  RUN docker-php-ext-install pdo_mysql

!!サンプル2
web、phpadmin、metabase等複数のwebサービスを立てつつ、reverse-proxyを立てる
!docker-compose.yml
  version: '3'
  services:
    reverse-proxy:
      image: nginx:latest
      ports:
        - 80:80
      volumes:
        - ./docker/reverse-proxy/default.conf:/etc/nginx/conf.d/default.conf:z
      depends_on:
        - web
        - phpmyadmin
        - metabase
    web:
      build:
        context: .
        dockerfile: ./docker/web/Dockerfile
      # user: "1000:1000"
      # tty: true
      # 最後の:zはselinuxのラベル書き換え
      volumes:
        - ./src:/var/www/html:z
      ports:
        - 8080:80
      depends_on:
        - mysql
    mysql:           
      image: mysql:5.7
      environment:
        - MYSQL_ROOT_PASSWORD=root
      ports:
        - 3306:3306
      volumes:          
        - dbdata:/var/lib/mysql
    phpmyadmin:
      image: phpmyadmin/phpmyadmin
      environment:
        - PMA_ARBITRARY=1
        - PMA_HOST=mysql
        - PMA_USER=root
        - PMA_PASSWORD=root
      depends_on:
        - mysql
      ports:
         - 81:80
    metabase:
      image: metabase/metabase
      ports:
        - "3000:3000"
      depends_on:
        - mysql
  volumes:
    dbdata:

!./docker/web/Dockerfile
  From php:7.1-apache-stretch
  
  RUN echo "RUNはbuild時に実行"
  RUN apt update
  RUN a2enmod rewrite
  RUN docker-php-ext-install pdo_mysql

!./Docker/reverse-proxy/default.conf
  server {
      listen       80;
      server_name  localhost;
  
      location /phpmyadmin/ {
         proxy_pass http://phpmyadmin:80/;
         proxy_set_header  Host  $http_host;
      }
      
      location /metabase/ {
         proxy_pass http://metabase:3000/;
         proxy_set_header  Host  $http_host;
      }
      
      location / {
         proxy_pass http://web:80/;
         proxy_set_header  Host  $http_host;
      }
  }

!!サンプル3
docker内にLinuxを同じUIDのユーザを作成する

!initEnv.sh
 echo UID=`id -u` > .env
 echo GID=`id -g` > .env
または、.envファイルを作っておく

!.env
UID=1000
GID=1000

!docker-compose.yml
  version: '3'
  services:
    web:
      build: 
        context: .
        dockerfile: ./docker/web/Dockerfile
        args:
          - UID=${UID}
          - GID=${GID}
      # user: "1000:1000"
      tty: true
      # 最後の:zはselinuxのラベル書き換え
      volumes: 
        - ./src:/var/www/html:z
      ports:
        - 80:80
      depends_on:
        - mysql
    mysql:  
      image: mysql:5.7
      environment:
        - MYSQL_ROOT_PASSWORD=root
      ports:
        - 3306:3306
      volumes:
        - dbdata:/var/lib/mysql
    phpmyadmin:
      image: phpmyadmin/phpmyadmin
      environment:
        - PMA_ARBITRARY=1
        - PMA_HOST=mysql
        - PMA_USER=root
        - PMA_PASSWORD=root
      depends_on:
        - mysql
      ports:
         - 81:80
  volumes:
    dbdata:

!docker/web/Dockerfile
  From centos:centos7
      
  RUN echo "RUNはbuild時に実行"
  # RUN yum -y install \
  #     epel-release \
  #     java-11-openjdk-devel \
  
  RUN yum -y install \
       sudo
  RUN echo '%wheel        ALL=(ALL)       NOPASSWD: ALL' >> /etc/sudoers
  
  ARG UID
  ARG GID
  RUN useradd -m -u ${UID} -U web
  RUN groupmod -g ${GID} web
  RUN gpasswd -a web wheel
  USER web
  
  # CMD echo "CMDはrun時に実行(一つだけ。複数ある場合は最後のものだけが実行される。"


{{category2 OS,Linux}}
{{category2 仮想化}}