- 参考
- インストール
- 使い方
- イメージ管理
- コンテナ管理
- ネットワーク関連
- ボリューム関連
- コンテナからイメージ作成
- コンテナのエクスポート、インポート
- イメージのセーブ、ロード
- コンテナ内のsystemd環境でサービスを起動する
- vim等が文字化けする場合
- Dockerfileからbuildする
- コンテナとホストのユーザマッピング
- DockerのIPアドレス
- Dockerfile
- Docker Compose
- その他
参考
https://qiita.com/curseoff/items/a9e64ad01d673abb6866
http://www.atmarkit.co.jp/ait/articles/1407/08/news031.html
https://qiita.com/k1tajima/items/bf8a714e39e857963abc
https://qiita.com/silane1001/items/973f32e05defe254408c
https://qiita.com/haveAbook/items/09cc4f1e4b8c05364dad
https://andrewlock.net/creating-multi-arch-docker-images-for-arm64-from-windows/
インストール
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 |
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)をまとめて作成、起動ができる。
コンテナからホストのサービスにアクセスする
以下の設定をすることで、host.docker.internal でホストにアクセスできる
services: SERVICE: image: IMAGE extra_hosts: - host.docker.internal:host-gateway
コマンドライン補完
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(268)
mate-terminal、meld、mozcを使えるようにした環境。
xserverを事前に立てる必要あり。
make build make reset make up
sshで接続して
sh bin/start_terminal.sh
でmate-terminalが起動する。
サンプル5
docker_dev3.zip(79) centos
docker_dev4.zip(80) ubuntu
mate-terminal、meld、mozcを使えるようにした環境をsshを使わずにGUIを表示できるようにした環境
xserverを事前に立てる必要あり。
make build make reset make terminal
サンプル6
docker_dev5.zip(241) centos
docker_dev6.zip(255) 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などが設定される。
アーキテクチャの異なるイメージを作成する
sudo apt-get install -y qemu qemu-user-static docker buildx ls
でarmが追加されていることを確認。
docker build -t hello_arm64 --platform arm64 .
[カテゴリ: OS > Linux]
[カテゴリ: 仮想化]
[通知用URL]
Tweet
最終更新時間:2024年06月23日 18時51分19秒