トップ 差分 一覧 ソース 置換 検索 ヘルプ PDF RSS ログイン

Docker

参考

https://qiita.com/curseoff/items/a9e64ad01d673abb6866
http://www.atmarkit.co.jp/ait/articles/1407/08/news031.html
https://qiita.com/k1tajima/items/bf8a714e39e857963abc

インストール

 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.jp/engine/security/userns-remap.html#rootless-distribution-specific-hint
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/

 ディストリビューションごとの設定

ユーザ名前空間を利用するにはディストリビューションごとに設定が必要なことがある。

Ubuntu

  • 特に設定は不要
  • Ubuntu 16.04、18.04、20.04 は動作確認済

CentOS 8

  • sudo dnf install -y iptables が必要になる場合があります。

CentOS7

  • /etc/sysctl.conf (または /etc/sysctl.d )に user.max_user_namespaces=28633 を追加し、 sudo sysctl --system を実行。
  • CentOS 7.7 で動作確認済

CentOS7.6以前

  • COPR パッケージ vbatts/shadow-utils-newxidmap をインストール。

CentOS7.5以前

sudo grubby --update-kernel=ALL --args="user_namespace.enable=1" の実行と、有効化のために再起動が必要。

 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のディレクトリができる。

DockerのIPアドレス

デフォルトのIPアドレス

dockerのIPアドレス割り振りはデフォルトで下記のようになっている

基底IPアドレス :172.16.0.0/12
ゾーン割当サイズ:/16ごと

もし、172.16/12 と同じネットワークが存在すると通信に支障がでる

デフォルトのIPアドレスを変更する

Docker標準のブリッジ docker0 のIPアドレスとnetworksのブリッジのIPを変更するには以下のようにする。

{
    "bip":"192.168.0.1/24",
    "default-address-pools":[  
        {  
            "base":"192.168.0.0/16",
            "size":24
        }
    ]
}

bipがdocker0の設定、default-address-poolsはnetworksの設定。

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)をまとめて作成、起動ができる。

 コマンドライン補完

https://docs.docker.jp/compose/completion.html

curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

 サンプル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
       - TZ=Asia/Tokyo
       - LANG=C.UTF-8
     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
       - TZ=Asia/Tokyo
       - LANG=C.UTF-8
     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
       - TZ=Asia/Tokyo
       - LANG=C.UTF-8
     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時に実行(一つだけ。複数ある場合は最後のものだけが実行される。"

 サンプル4

docker_dev2.zip(243)
mate-terminal、meld、mozcを使えるようにした環境。
xserverを事前に立てる必要あり。

make build
make reset
make up

sshで接続して

sh bin/start_terminal.sh

でmate-terminalが起動する。

 サンプル5

docker_dev3.zip(52) centos
docker_dev4.zip(52) ubuntu
mate-terminal、meld、mozcを使えるようにした環境をsshを使わずにGUIを表示できるようにした環境
xserverを事前に立てる必要あり。

make build
make reset
make terminal

 サンプル6

docker_dev5.zip(44) centos
docker_dev6.zip(45) ubuntu
mate-terminal、meld、mozcを使えるようにした環境をWSLgでGUIを表示できるようにした環境
WSLgを使うので、xserver不要

make build
make reset
make terminal

その他

 デタッチ等のキーを変更する

https://qiita.com/hironobu_s/items/358b0ba5a7089521b60e

~/.docker/config.json に detachKeys を追加する

{
  "detachKeys": "ctrl-q,ctrl-q" 
}

とか

 コンテナにまとめて設定を適用する

https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/commandline/cli/
ホストの ~/.docker/config.json に設定を記載することでコンテナ作成、起動時に自動的に設定を適用する。
例えば、プロキシを設定する場合は以下のようにする。

 {
   "proxies": {
     "default": {
       "httpProxy":  "http://user:pass@example.com:3128",
       "httpsProxy": "http://user:pass@example.com:3128",
       "noProxy":    "http://user:pass@example.com:3128",
       "ftpProxy":   "http://user:pass@example.com:3128"
     }
   }
 }

上記の設定をすることで、コンテナのHTTP_PROXY, HTTPS_PROXY, https_proxy, https_proxyなどが設定される。


[カテゴリ: OS > Linux]
[カテゴリ: 仮想化]

[通知用URL]



  • Hatenaブックマークに追加
  • livedoorクリップに追加
  • del.icio.usに追加
  • FC2ブックマークに追加

最終更新時間:2023年01月29日 12時31分34秒