Linuxの仮想環境を用意したいときって、ありますよね。
VirtualBoxなどを使う方法もありますが、今回は比較的軽量に仮想環境を用意できるよう、DockerコンテナとしてLinuxを立ち上げます。
一口にLinuxといっても色々あるわけですが、今回はUbuntuを選択します。
この記事の目標
この記事の目標は、
ことです。
ただし、以下を前提とします。
前提
・Docker、docker-composeがインストールされていること
・Dockerとはどんなものかが分かる程度の基礎知識があること
Dockerは、WindowsかMacならDocker Desktopを用意すればよいでしょう。Linuxなら、以下の公式ドキュメントに従ってインストールしましょう。
Docker Engine を Linux にインストール — Docker-docs-ja 1.13.RC ドキュメント
この記事の内容ができれば、同時に「Dockerとはなにか」も何となく理解できると思います。
Linuxイメージを探す
Docker Hubから、Linux系のイメージを選びます。
Explore Docker’s Container Image Repository | Docker Hub
Linux系としてはUbuntuに馴染みがあるので、Ubuntuを選択します。
Ubuntu – Official Image | Docker Hub
今回は、ubuntu 22.04あたりにします。
Dockerファイル作成
以下のようなDockerfileを作ります。
FROM ubuntu:22.04
とりあえず、ubuntuのイメージでビルドするだけのファイルです。
これだけでもコマンドを叩けばubuntuを立ち上げることができますが、今回はdocker-compose経由で立ち上げます。
とりあえず、最低限の機能を持つファイルを作ります。
docker-compose.yml
version: '3'
services:
ubuntu:
build: .
container_name: 'ubuntu'
tty: true
作成したDockerfile, docker-compose.ymlファイルを、以下のようにディレクトリに置きます。
Ubuntu-env
├─ Dockerfile
└─ docker-compose.yml
コンテナ立ち上げ
docker-composeコマンドでコンテナを立ち上げます。
Ubuntu-env$ docker-compose up -d
こんな感じになると思います。
Ubuntu-env$ docker-compose up -d
Creating network "ubuntu-env_default" with the default driver
Building ubuntu
Step 1/1 : FROM ubuntu:22.04
22.04: Pulling from library/ubuntu
c610536171e3: Downloading [> ] 310.5kB/30.5c610536171e3: Downloading [=> ] 940.4kB/30.5c610536171e3: Downloading [==> ] 1.571MB/30.5c610536171e3: Downloading [===> ] 2.194MB/30.5c610536171e3: Downloading [====> ] 2.82MB/30.5c610536171e3: Downloading [=====> ] 3.451MB/30.5c610536171e3: Downloading [======> ] 4.074MB/30.5c610536171e3: Downloading [========> ] 5.008MB/30.5c610536171e3: Pull completeDigest: sha256:a02c32cf0c2a7e8743c74deef66637aa70e063c9bd40e9e1f8c0b3ea0750b0ba
Status: Downloaded newer image for ubuntu:22.04
---> 6795c0065f64
Successfully built 6795c0065f64
Successfully tagged ubuntu-env_ubuntu:latest
コンテナに入ってみる
以下のコマンドなどを使い、立ち上がっているDockerコンテナにアタッチします。
Ubuntu-env$ docker exec -it ubuntu bash
root@4dceb435369c:/#
色々見てみましょう。
root@4dceb435369c:/# ls -a
. .dockerenv boot etc lib lib64 media opt root sbin sys usr
.. bin dev home lib32 libx32 mnt proc run srv tmp var
最下層のディレクトリはこんな感じみたいです。Linuxとしては大体見たことがある感じですが、「.dockerenv」というファイルが気になりますね。
catで見てみましたが、空のようです。
root@4dceb435369c:/# cat .dockerenv
root@4dceb435369c:/#
まあ、たぶん名前的にDockerの環境ファイルでしょう。
次に、OSバージョンの確認でもしておきましょう。
root@4dceb435369c:/# cd /etc/os-release
bash: cd: /etc/os-release: Not a directory
root@4dceb435369c:/# cat /etc/os-release
PRETTY_NAME="Ubuntu Jammy Jellyfish (development branch)"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04 (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
当たり前ですが、ちゃんとUbuntuの22.04でした。
環境を整備する
とりあえずは上記まででUbuntu自体は用意出来ましたが、空っぽです。
コマンドに関して言えば、sudoもなければviもありません。
これだけだとつまらないので、コマンドを入れたり、ソースコードを書けるような環境にして見ましょう。
Dockerfileを編集します。
FROM ubuntu:22.04
# aptパッケージのアップデート
RUN apt-get update
# sudo, vimのインストール
RUN apt-get install sudo
RUN apt-get install -y vim
ついでに、ローカルでファイルを編集しやすいように、マウントしてしまいましょう。ubuntuには空のmntというディレクトリがあったので、そこにマウントします。
(もちろん、VS codeのRemote-Conntainerを使ってしまってもいいんですが、今回は勉強も兼ねて)
docker-compose.ymlを以下のように編集してください。
version: '3'
services:
ubuntu:
build: .
container_name: 'ubuntu'
tty: true
volumes:
- ./local_dir:/mnt
Dockerfileを編集したので、いったんコンテナを停止して、ビルドからやり直します。
Ubuntu-env$ docker-compose down
Ubuntu-env$ docker-compose build
デフォルトのUbuntuでのパッケージのアップデート/インストールは遅いので、以下のページを参考にすると良いと思います。
Ubuntuの高速化~リポジトリ参照先の変更 – Qiita
遅すぎて待てない人は、以下のコマンドをDockerfileに書き込んでからbuildしましょう。
RUN sudo sed -i.bak -r 's!deb \S+!deb mirror://mirrors.ubuntu.com/mirrors.txt!' /etc/apt/sources.list
ビルドが完了したら、マウントしたことによって、ローカルディレクトリが以下のようになっているか確認しましょう。
Ubuntu-env
├─ Dockerfile
├─ docker-compose.yml
└─ local_dir
コンテナの中に入ってコマンドがインストールされている環境になっているか確認します。
sudoが使えるか確認
root@58f48edddc7f:/# sudo -l
Matching Defaults entries for root on 58f48edddc7f:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User root may run the following commands on
58f48edddc7f:
(ALL : ALL) ALL
viが使えるか確認
root@58f48edddc7f:/# vi /mnt/test.txt
viで、適当な文字をtest.txtに書き、保存しましょう。
mntディレクトリに書いたので、ローカルのlocal_dirにもtest.txtができているはずです。確認しましょう。反対に、ローカルでtest.txtを編集しても、コンテナUbuntuに反映されるはずです。
これで、viを使用しなくても、ローカルのエディタでファイルを編集することができます。
コメント