- 参考
- インストール
- 使い方
- イメージ管理
- コンテナ管理
- ネットワーク関連
- ボリューム関連
- コンテナからイメージ作成
- コンテナのエクスポート、インポート
- イメージのセーブ、ロード
- コンテナ内の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(322)
mate-terminal、meld、mozcを使えるようにした環境。
xserverを事前に立てる必要あり。
make build make reset make up
sshで接続して
sh bin/start_terminal.sh
でmate-terminalが起動する。
サンプル5
docker_dev3.zip(128) centos
docker_dev4.zip(138) ubuntu
mate-terminal、meld、mozcを使えるようにした環境をsshを使わずにGUIを表示できるようにした環境
xserverを事前に立てる必要あり。
make build make reset make terminal
サンプル6
docker_dev5.zip(551) centos
docker_dev6.zip(582) 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 run --privileged --rm tonistiigi/binfmt --install all
でQEMUの設定をする。2つ目の方がおすすめ。
docker buildx ls
でarmが追加されていることを確認。
docker build -t hello_arm64 --platform arm64 .
[カテゴリ: OS > Linux]
[カテゴリ: 仮想化]
[通知用URL]
Tweet
最終更新時間:2025年07月24日 19時57分00秒