Docker入門12. namespace
リソースを区切って、 お互いが認識できないようにするもの
(仮想ネットワークの実験でお世話になる)
- IPC : プロセス間通信リソースの分離
- mount : ファイルシステムツリーの分離
- network : ネットワークデバイス、IP、ルーティングテーブル、iptablesの分離
- PID : プロセスID空間の分離
- UID : UID・GIDの分離
- UTS : ホスト名
IPC mnt net
PID UTSUID
namespace_1
IPC mnt net
PID UTSUID
namespace_2
※namespaceの実体は
/proc/<PID>/ns配下に存在
1と2は同一ホスト内にあるにも関わらずお互いのユーザー、
プロセス、ネットワーク、マウントされているデバイスを認識できない
18. インストール
# ルートユーザーになる
sudo su
# インストール
wget -qO- http://get.docker.com/ | sh
# インストールできたか確認
docker -v
# ユーザーをdockerグループに追加
gpasswd -a <user-name> docker
# グループに追加したユーザーでdockerが操作できるか確認
su - <user-name>
docker ps
21. コンテナにnginxをインストール
■ここからコンテナ内の操作■
# コンテナのプロセスを確認
ps aux
# nginxをインストール
yum check-update
yum install -y http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-
centos-7-0.el7.ngx.noarch.rpm
yum install -y --enablerepo=nginx nginx
# nginx起動スクリプトを作成
vi start.sh
----
#!/bin/bash
/usr/sbin/nginx
while true; do sleep 10; done
----
chmod 755 start.sh
./start.sh&
# 確認
ps aux
curl localhost
# コンテナをデタッチ
exit
■ここまでコンテナ内の操作■
27. Dockerfileを作成
# docker buildでsystemdで起動するイメージを作成する
mkdir dockerfile_test
cd dockerfile_test
vi Dockerfile
--
FROM centos:7
ENV container docker
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $
{i}==systemd-tmpfiles-setup.service ] || rm -f $i; done);
rm -f /lib/systemd/system/multi-user.target.wants/*;
rm -f /etc/systemd/system/*.wants/*;
rm -f /lib/systemd/system/local-fs.target.wants/*;
rm -f /lib/systemd/system/sockets.target.wants/*udev*;
rm -f /lib/systemd/system/sockets.target.wants/*initctl*;
rm -f /lib/systemd/system/basic.target.wants/*;
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]
CMD ["/usr/sbin/init"]
--
30. コンテナをイメージに固めて再起動
# コンテナをイメージに固める
docker stop systemd
docker commit systemd systemd_nginx
# イメージからコンテナを再起動
docker run -d --name=systemd_nginx --privileged -p 8080:80
systemd_nginx
docker ps
# リクエストを投げてみる
curl localhost:8080